diff --git a/.clang-tidy b/.clang-tidy index 860e7b3189f..532b0f37b81 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -22,6 +22,8 @@ Checks: '*, -bugprone-implicit-widening-of-multiplication-result, -bugprone-narrowing-conversions, -bugprone-not-null-terminated-result, + -bugprone-unchecked-optional-access, + -bugprone-assignment-in-if-condition, -cert-dcl16-c, -cert-err58-cpp, @@ -103,6 +105,7 @@ Checks: '*, -misc-no-recursion, -misc-non-private-member-variables-in-classes, + -misc-const-correctness, -modernize-avoid-c-arrays, -modernize-concat-nested-namespaces, @@ -114,6 +117,7 @@ Checks: '*, -modernize-use-nodiscard, -modernize-use-override, -modernize-use-trailing-return-type, + -modernize-macro-to-enum, -performance-inefficient-string-concatenation, -performance-no-int-to-ptr, @@ -135,6 +139,7 @@ Checks: '*, -readability-suspicious-call-argument, -readability-uppercase-literal-suffix, -readability-use-anyofallof, + -readability-simplify-boolean-expr, -zirkon-*, ' diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 00000000000..06e893fabb3 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,15 @@ +# This is a file that can be used by git-blame to ignore some revisions. +# (git 2.23+, released in August 2019) +# +# Can be configured as follow: +# +# $ git config blame.ignoreRevsFile .git-blame-ignore-revs +# +# For more information you can look at git-blame(1) man page. + +# Changed tabs to spaces in code [#CLICKHOUSE-3] +137ad95929ee016cc6d3c03bccb5586941c163ff + +# dbms/ → src/ +# (though it is unlikely that you will see it in blame) +06446b4f08a142d6f1bc30664c47ded88ab51782 diff --git a/.github/workflows/backport_branches.yml b/.github/workflows/backport_branches.yml index a1086452184..4c8d023f2ec 100644 --- a/.github/workflows/backport_branches.yml +++ b/.github/workflows/backport_branches.yml @@ -112,10 +112,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ######################################################################################### #################################### ORDINARY BUILDS #################################### @@ -162,10 +160,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebAarch64: needs: [DockerHubPush] @@ -209,10 +205,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebAsan: needs: [DockerHubPush] @@ -254,10 +248,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebTsan: needs: [DockerHubPush] @@ -299,10 +291,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebDebug: needs: [DockerHubPush] @@ -344,10 +334,98 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinDarwin: + needs: [DockerHubPush] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_darwin + EOF + - name: Download changed images + uses: actions/download-artifact@v2 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + with: + fetch-depth: 0 # otherwise we will have no info about contributors + - name: Build + run: | + git -C "$GITHUB_WORKSPACE" submodule sync --recursive + git -C "$GITHUB_WORKSPACE" submodule update --depth=1 --recursive --init --jobs=10 + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v2 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinDarwinAarch64: + needs: [DockerHubPush] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_darwin_aarch64 + EOF + - name: Download changed images + uses: actions/download-artifact@v2 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + with: + fetch-depth: 0 # otherwise we will have no info about contributors + - name: Build + run: | + git -C "$GITHUB_WORKSPACE" submodule sync --recursive + git -C "$GITHUB_WORKSPACE" submodule update --depth=1 --recursive --init --jobs=10 + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v2 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" ############################################################################################ ##################################### Docker images ####################################### @@ -374,10 +452,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################ ##################################### BUILD REPORTER ####################################### @@ -420,10 +496,46 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + BuilderSpecialReport: + needs: + - BuilderBinDarwin + - BuilderBinDarwinAarch64 + runs-on: [self-hosted, style-checker] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/report_check + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=ClickHouse special build check + NEEDS_DATA_PATH=${{runner.temp}}/needs.json + EOF + - name: Download json reports + uses: actions/download-artifact@v2 + with: + path: ${{ env.REPORTS_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Report Builder + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cat > "$NEEDS_DATA_PATH" << 'EOF' + ${{ toJSON(needs) }} + EOF + cd "$GITHUB_WORKSPACE/tests/ci" + python3 build_report_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ########################### FUNCTIONAl STATELESS TESTS ####################################### @@ -460,10 +572,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ############################ FUNCTIONAl STATEFUL TESTS ####################################### @@ -500,10 +610,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ######################################### STRESS TESTS ####################################### @@ -543,10 +651,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################# ############################# INTEGRATION TESTS ############################################# @@ -582,16 +688,15 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FinishCheck: needs: - DockerHubPush - DockerServerImages - BuilderReport + - BuilderSpecialReport - FunctionalStatelessTestAsan - FunctionalStatefulTestDebug - StressTestTsan diff --git a/.github/workflows/cherry_pick.yml b/.github/workflows/cherry_pick.yml index e6a10479c7e..3e6f9e76c56 100644 --- a/.github/workflows/cherry_pick.yml +++ b/.github/workflows/cherry_pick.yml @@ -40,8 +40,6 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" diff --git a/.github/workflows/docs_check.yml b/.github/workflows/docs_check.yml index b50584a2c01..7a15e77becb 100644 --- a/.github/workflows/docs_check.yml +++ b/.github/workflows/docs_check.yml @@ -125,10 +125,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" DocsCheck: needs: DockerHubPush @@ -158,10 +156,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FinishCheck: needs: diff --git a/.github/workflows/docs_release.yml b/.github/workflows/docs_release.yml index e0fdb0c2f7b..da67edd4aa1 100644 --- a/.github/workflows/docs_release.yml +++ b/.github/workflows/docs_release.yml @@ -116,8 +116,6 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" diff --git a/.github/workflows/jepsen.yml b/.github/workflows/jepsen.yml index 1682cd1e812..a8b04af5773 100644 --- a/.github/workflows/jepsen.yml +++ b/.github/workflows/jepsen.yml @@ -36,8 +36,6 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index e8e3deceef5..3d22cb984dd 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -112,10 +112,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" CompatibilityCheck: needs: [BuilderDebRelease] @@ -146,10 +144,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" SharedBuildSmokeTest: needs: [BuilderDebShared] @@ -180,10 +176,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ######################################################################################### #################################### ORDINARY BUILDS #################################### @@ -230,10 +224,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" BuilderDebAarch64: needs: [DockerHubPush] @@ -273,10 +265,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinRelease: needs: [DockerHubPush] @@ -320,56 +310,9 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" - # BuilderBinGCC: - # needs: [DockerHubPush] - # runs-on: [self-hosted, builder] - # steps: - # - name: Set envs - # run: | - # cat >> "$GITHUB_ENV" << 'EOF' - # TEMP_PATH=${{runner.temp}}/build_check - # IMAGES_PATH=${{runner.temp}}/images_path - # REPO_COPY=${{runner.temp}}/build_check/ClickHouse - # CACHES_PATH=${{runner.temp}}/../ccaches - # BUILD_NAME=binary_gcc - # EOF - # - name: Download changed images - # uses: actions/download-artifact@v2 - # with: - # name: changed_images - # path: ${{ env.IMAGES_PATH }} - # - name: Clear repository - # run: | - # sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" - # - name: Check out repository code - # uses: actions/checkout@v2 - # - name: Build - # run: | - # git -C "$GITHUB_WORKSPACE" submodule sync --recursive - # git -C "$GITHUB_WORKSPACE" submodule update --depth=1 --recursive --init --jobs=10 - # sudo rm -fr "$TEMP_PATH" - # mkdir -p "$TEMP_PATH" - # cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" - # cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" - # - name: Upload build URLs to artifacts - # if: ${{ success() || failure() }} - # uses: actions/upload-artifact@v2 - # with: - # name: ${{ env.BUILD_URLS }} - # path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json - # - name: Cleanup - # if: always() - # run: | - # # shellcheck disable=SC2046 - # docker kill $(docker ps -q) ||: - # # shellcheck disable=SC2046 - # docker rm -f $(docker ps -a -q) ||: - # sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebAsan: needs: [DockerHubPush] runs-on: [self-hosted, builder] @@ -410,10 +353,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebUBsan: needs: [DockerHubPush] @@ -455,10 +396,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebTsan: needs: [DockerHubPush] @@ -500,10 +439,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebMsan: needs: [DockerHubPush] @@ -545,10 +482,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebDebug: needs: [DockerHubPush] @@ -590,10 +525,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" ########################################################################################## ##################################### SPECIAL BUILDS ##################################### @@ -638,10 +571,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinClangTidy: needs: [DockerHubPush] @@ -683,10 +614,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinDarwin: needs: [DockerHubPush] @@ -730,10 +659,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinAarch64: needs: [DockerHubPush] @@ -777,10 +704,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinFreeBSD: needs: [DockerHubPush] @@ -824,10 +749,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinDarwinAarch64: needs: [DockerHubPush] @@ -871,10 +794,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinPPC64: needs: [DockerHubPush] @@ -918,10 +839,98 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinAmd64SSE2: + needs: [DockerHubPush] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_amd64sse2 + EOF + - name: Download changed images + uses: actions/download-artifact@v2 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + with: + fetch-depth: 0 # otherwise we will have no info about contributors + - name: Build + run: | + git -C "$GITHUB_WORKSPACE" submodule sync --recursive + git -C "$GITHUB_WORKSPACE" submodule update --depth=1 --recursive --init --jobs=10 + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v2 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinAarch64V80Compat: + needs: [DockerHubPush] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_aarch64_v80compat + EOF + - name: Download changed images + uses: actions/download-artifact@v2 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + with: + fetch-depth: 0 # otherwise we will have no info about contributors + - name: Build + run: | + git -C "$GITHUB_WORKSPACE" submodule sync --recursive + git -C "$GITHUB_WORKSPACE" submodule update --depth=1 --recursive --init --jobs=10 + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v2 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" ############################################################################################ ##################################### Docker images ####################################### @@ -948,10 +957,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################ ##################################### BUILD REPORTER ####################################### @@ -998,10 +1005,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" BuilderSpecialReport: needs: @@ -1011,6 +1016,8 @@ jobs: - BuilderBinFreeBSD # - BuilderBinGCC - BuilderBinPPC64 + - BuilderBinAmd64SSE2 + - BuilderBinAarch64V80Compat - BuilderBinClangTidy - BuilderDebShared runs-on: [self-hosted, style-checker] @@ -1044,10 +1051,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ########################### FUNCTIONAl STATELESS TESTS ####################################### @@ -1084,10 +1089,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestReleaseDatabaseOrdinary: needs: [BuilderDebRelease] @@ -1121,10 +1124,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestReleaseDatabaseReplicated0: needs: [BuilderDebRelease] @@ -1160,10 +1161,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestReleaseDatabaseReplicated1: needs: [BuilderDebRelease] @@ -1199,10 +1198,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestReleaseS3: needs: [BuilderDebRelease] @@ -1236,10 +1233,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestAarch64: needs: [BuilderDebAarch64] @@ -1273,10 +1268,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestAsan0: needs: [BuilderDebAsan] @@ -1312,10 +1305,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestAsan1: needs: [BuilderDebAsan] @@ -1351,10 +1342,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestTsan0: needs: [BuilderDebTsan] @@ -1390,10 +1379,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestTsan1: needs: [BuilderDebTsan] @@ -1429,10 +1416,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestTsan2: needs: [BuilderDebTsan] @@ -1468,10 +1453,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestUBsan: needs: [BuilderDebUBsan] @@ -1505,10 +1488,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestMsan0: needs: [BuilderDebMsan] @@ -1544,10 +1525,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestMsan1: needs: [BuilderDebMsan] @@ -1583,10 +1562,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestMsan2: needs: [BuilderDebMsan] @@ -1622,10 +1599,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestDebug0: needs: [BuilderDebDebug] @@ -1661,10 +1636,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestDebug1: needs: [BuilderDebDebug] @@ -1700,10 +1673,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestDebug2: needs: [BuilderDebDebug] @@ -1739,10 +1710,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ############################ FUNCTIONAl STATEFUL TESTS ####################################### @@ -1779,10 +1748,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestAarch64: needs: [BuilderDebAarch64] @@ -1816,10 +1783,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestAsan: needs: [BuilderDebAsan] @@ -1853,10 +1818,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestTsan: needs: [BuilderDebTsan] @@ -1890,10 +1853,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestMsan: needs: [BuilderDebMsan] @@ -1927,10 +1888,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestUBsan: needs: [BuilderDebUBsan] @@ -1964,10 +1923,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestDebug: needs: [BuilderDebDebug] @@ -2001,10 +1958,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ######################################### STRESS TESTS ####################################### @@ -2040,10 +1995,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestTsan: needs: [BuilderDebTsan] @@ -2080,10 +2033,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestMsan: needs: [BuilderDebMsan] @@ -2116,10 +2067,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestUBsan: needs: [BuilderDebUBsan] @@ -2152,10 +2101,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestDebug: needs: [BuilderDebDebug] @@ -2188,10 +2135,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################# ############################# INTEGRATION TESTS ############################################# @@ -2229,10 +2174,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsAsan1: needs: [BuilderDebAsan] @@ -2267,10 +2210,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsAsan2: needs: [BuilderDebAsan] @@ -2305,10 +2246,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan0: needs: [BuilderDebTsan] @@ -2343,10 +2282,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan1: needs: [BuilderDebTsan] @@ -2381,10 +2318,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan2: needs: [BuilderDebTsan] @@ -2419,10 +2354,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan3: needs: [BuilderDebTsan] @@ -2457,10 +2390,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsRelease0: needs: [BuilderDebRelease] @@ -2495,10 +2426,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsRelease1: needs: [BuilderDebRelease] @@ -2533,10 +2462,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ##################################### AST FUZZERS ############################################ @@ -2572,10 +2499,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ASTFuzzerTestTsan: needs: [BuilderDebTsan] @@ -2608,10 +2533,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ASTFuzzerTestUBSan: needs: [BuilderDebUBsan] @@ -2644,10 +2567,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ASTFuzzerTestMSan: needs: [BuilderDebMsan] @@ -2680,10 +2601,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ASTFuzzerTestDebug: needs: [BuilderDebDebug] @@ -2716,10 +2635,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################# #################################### UNIT TESTS ############################################# @@ -2755,10 +2672,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" UnitTestsReleaseClang: needs: [BuilderBinRelease] @@ -2791,10 +2706,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" # UnitTestsReleaseGCC: # needs: [BuilderBinGCC] @@ -2827,10 +2740,8 @@ jobs: # - name: Cleanup # if: always() # run: | - # # shellcheck disable=SC2046 - # docker kill $(docker ps -q) ||: - # # shellcheck disable=SC2046 - # docker rm -f $(docker ps -a -q) ||: + # docker ps --quiet | xargs --no-run-if-empty docker kill ||: + # docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: # sudo rm -fr "$TEMP_PATH" UnitTestsTsan: needs: [BuilderDebTsan] @@ -2863,10 +2774,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" UnitTestsMsan: needs: [BuilderDebMsan] @@ -2899,10 +2808,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" UnitTestsUBsan: needs: [BuilderDebUBsan] @@ -2935,10 +2842,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################# #################################### PERFORMANCE TESTS ###################################### @@ -2976,10 +2881,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonX86-1: needs: [BuilderDebRelease] @@ -3014,10 +2917,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonX86-2: needs: [BuilderDebRelease] @@ -3052,10 +2953,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonX86-3: needs: [BuilderDebRelease] @@ -3090,10 +2989,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FinishCheck: needs: diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index e712ada1551..801f7eda94a 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -119,8 +119,6 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 6dd28215d78..2795dc62d6d 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -141,10 +141,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FastTest: needs: DockerHubPush @@ -177,10 +175,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" CompatibilityCheck: needs: [BuilderDebRelease] @@ -211,10 +207,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" SharedBuildSmokeTest: needs: [BuilderDebShared] @@ -245,10 +239,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ######################################################################################### #################################### ORDINARY BUILDS #################################### @@ -295,10 +287,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" BuilderBinRelease: needs: [DockerHubPush, FastTest, StyleCheck] @@ -340,10 +330,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebAarch64: needs: [DockerHubPush, FastTest, StyleCheck] @@ -387,10 +375,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebAsan: needs: [DockerHubPush, FastTest, StyleCheck] @@ -432,10 +418,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebUBsan: needs: [DockerHubPush, FastTest, StyleCheck] @@ -477,10 +461,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebTsan: needs: [DockerHubPush, FastTest, StyleCheck] @@ -522,10 +504,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebMsan: needs: [DockerHubPush, FastTest, StyleCheck] @@ -567,10 +547,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebDebug: needs: [DockerHubPush, FastTest, StyleCheck] @@ -612,10 +590,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" ########################################################################################## ##################################### SPECIAL BUILDS ##################################### @@ -660,10 +636,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinClangTidy: needs: [DockerHubPush, FastTest, StyleCheck] @@ -705,10 +679,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinDarwin: needs: [DockerHubPush, FastTest, StyleCheck] @@ -750,10 +722,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinAarch64: needs: [DockerHubPush, FastTest, StyleCheck] @@ -795,10 +765,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinFreeBSD: needs: [DockerHubPush, FastTest, StyleCheck] @@ -840,10 +808,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinDarwinAarch64: needs: [DockerHubPush, FastTest, StyleCheck] @@ -885,10 +851,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderBinPPC64: needs: [DockerHubPush, FastTest, StyleCheck] @@ -930,10 +894,94 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinAmd64SSE2: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_amd64sse2 + EOF + - name: Download changed images + uses: actions/download-artifact@v2 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Build + run: | + git -C "$GITHUB_WORKSPACE" submodule sync --recursive + git -C "$GITHUB_WORKSPACE" submodule update --depth=1 --recursive --init --jobs=10 + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v2 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinAarch64V80Compat: + needs: [DockerHubPush, FastTest, StyleCheck] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_aarch64_v80compat + EOF + - name: Download changed images + uses: actions/download-artifact@v2 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Build + run: | + git -C "$GITHUB_WORKSPACE" submodule sync --recursive + git -C "$GITHUB_WORKSPACE" submodule update --depth=1 --recursive --init --jobs=10 + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v2 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" ############################################################################################ ##################################### Docker images ####################################### @@ -960,10 +1008,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################ ##################################### BUILD REPORTER ####################################### @@ -1010,10 +1056,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" BuilderSpecialReport: needs: @@ -1023,6 +1067,8 @@ jobs: - BuilderBinFreeBSD # - BuilderBinGCC - BuilderBinPPC64 + - BuilderBinAmd64SSE2 + - BuilderBinAarch64V80Compat - BuilderBinClangTidy - BuilderDebShared runs-on: [self-hosted, style-checker] @@ -1057,10 +1103,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ########################### FUNCTIONAl STATELESS TESTS ####################################### @@ -1097,10 +1141,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestReleaseDatabaseReplicated0: needs: [BuilderDebRelease] @@ -1136,10 +1178,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestReleaseDatabaseReplicated1: needs: [BuilderDebRelease] @@ -1175,10 +1215,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestReleaseWideParts: needs: [BuilderDebRelease] @@ -1212,10 +1250,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestReleaseS3: needs: [BuilderDebRelease] @@ -1249,10 +1285,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestS3Debug0: needs: [BuilderDebDebug] @@ -1288,8 +1322,8 @@ jobs: - name: Cleanup if: always() run: | - docker kill "$(docker ps -q)" ||: - docker rm -f "$(docker ps -a -q)" ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestS3Debug1: needs: [BuilderDebDebug] @@ -1325,8 +1359,8 @@ jobs: - name: Cleanup if: always() run: | - docker kill "$(docker ps -q)" ||: - docker rm -f "$(docker ps -a -q)" ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestS3Debug2: needs: [BuilderDebDebug] @@ -1362,8 +1396,8 @@ jobs: - name: Cleanup if: always() run: | - docker kill "$(docker ps -q)" ||: - docker rm -f "$(docker ps -a -q)" ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestS3Tsan0: needs: [BuilderDebTsan] @@ -1399,8 +1433,8 @@ jobs: - name: Cleanup if: always() run: | - docker kill "$(docker ps -q)" ||: - docker rm -f "$(docker ps -a -q)" ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestS3Tsan1: needs: [BuilderDebTsan] @@ -1436,8 +1470,8 @@ jobs: - name: Cleanup if: always() run: | - docker kill "$(docker ps -q)" ||: - docker rm -f "$(docker ps -a -q)" ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestS3Tsan2: needs: [BuilderDebTsan] @@ -1473,8 +1507,8 @@ jobs: - name: Cleanup if: always() run: | - docker kill "$(docker ps -q)" ||: - docker rm -f "$(docker ps -a -q)" ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestAarch64: needs: [BuilderDebAarch64] @@ -1508,10 +1542,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestAsan0: needs: [BuilderDebAsan] @@ -1547,10 +1579,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestAsan1: needs: [BuilderDebAsan] @@ -1586,10 +1616,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestTsan0: needs: [BuilderDebTsan] @@ -1625,10 +1653,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestTsan1: needs: [BuilderDebTsan] @@ -1664,10 +1690,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestTsan2: needs: [BuilderDebTsan] @@ -1703,10 +1727,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestUBsan: needs: [BuilderDebUBsan] @@ -1740,10 +1762,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestMsan0: needs: [BuilderDebMsan] @@ -1779,10 +1799,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestMsan1: needs: [BuilderDebMsan] @@ -1818,10 +1836,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestMsan2: needs: [BuilderDebMsan] @@ -1857,10 +1873,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestDebug0: needs: [BuilderDebDebug] @@ -1896,10 +1910,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestDebug1: needs: [BuilderDebDebug] @@ -1935,10 +1947,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestDebug2: needs: [BuilderDebDebug] @@ -1974,10 +1984,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestFlakyCheck: needs: [BuilderDebAsan] @@ -2011,10 +2019,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" TestsBugfixCheck: runs-on: [self-hosted, stress-tester] @@ -2058,10 +2064,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ############################ FUNCTIONAl STATEFUL TESTS ####################################### @@ -2098,10 +2102,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestAarch64: needs: [BuilderDebAarch64] @@ -2135,10 +2137,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestAsan: needs: [BuilderDebAsan] @@ -2172,10 +2172,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestTsan: needs: [BuilderDebTsan] @@ -2209,10 +2207,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestMsan: needs: [BuilderDebMsan] @@ -2246,10 +2242,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestUBsan: needs: [BuilderDebUBsan] @@ -2283,10 +2277,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestDebug: needs: [BuilderDebDebug] @@ -2320,10 +2312,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ######################################### STRESS TESTS ####################################### @@ -2359,10 +2349,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestTsan: needs: [BuilderDebTsan] @@ -2399,10 +2387,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestMsan: needs: [BuilderDebMsan] @@ -2435,10 +2421,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestUBsan: needs: [BuilderDebUBsan] @@ -2471,10 +2455,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestDebug: needs: [BuilderDebDebug] @@ -2507,10 +2489,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ##################################### AST FUZZERS ############################################ @@ -2546,10 +2526,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ASTFuzzerTestTsan: needs: [BuilderDebTsan] @@ -2582,10 +2560,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ASTFuzzerTestUBSan: needs: [BuilderDebUBsan] @@ -2618,10 +2594,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ASTFuzzerTestMSan: needs: [BuilderDebMsan] @@ -2654,10 +2628,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ASTFuzzerTestDebug: needs: [BuilderDebDebug] @@ -2690,10 +2662,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################# ############################# INTEGRATION TESTS ############################################# @@ -2731,10 +2701,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsAsan1: needs: [BuilderDebAsan] @@ -2769,10 +2737,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsAsan2: needs: [BuilderDebAsan] @@ -2807,10 +2773,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan0: needs: [BuilderDebTsan] @@ -2845,10 +2809,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan1: needs: [BuilderDebTsan] @@ -2883,10 +2845,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan2: needs: [BuilderDebTsan] @@ -2921,10 +2881,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan3: needs: [BuilderDebTsan] @@ -2959,10 +2917,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsRelease0: needs: [BuilderDebRelease] @@ -2997,10 +2953,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsRelease1: needs: [BuilderDebRelease] @@ -3035,10 +2989,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsFlakyCheck: needs: [BuilderDebAsan] @@ -3071,10 +3023,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################# #################################### UNIT TESTS ############################################# @@ -3110,10 +3060,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" UnitTestsReleaseClang: needs: [BuilderBinRelease] @@ -3146,10 +3094,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" UnitTestsTsan: needs: [BuilderDebTsan] @@ -3182,10 +3128,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" UnitTestsMsan: needs: [BuilderDebMsan] @@ -3218,10 +3162,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" UnitTestsUBsan: needs: [BuilderDebUBsan] @@ -3254,10 +3196,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################# #################################### PERFORMANCE TESTS ###################################### @@ -3295,10 +3235,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonX86-1: needs: [BuilderDebRelease] @@ -3333,10 +3271,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonX86-2: needs: [BuilderDebRelease] @@ -3371,10 +3307,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonX86-3: needs: [BuilderDebRelease] @@ -3409,10 +3343,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonAarch-0: needs: [BuilderDebAarch64] @@ -3447,10 +3379,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonAarch-1: needs: [BuilderDebAarch64] @@ -3485,10 +3415,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonAarch-2: needs: [BuilderDebAarch64] @@ -3523,10 +3451,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" PerformanceComparisonAarch-3: needs: [BuilderDebAarch64] @@ -3561,10 +3487,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################# ###################################### JEPSEN TESTS ######################################### diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7e12695990c..0b0f125d641 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,8 +29,13 @@ jobs: rm -rf "$TEMP_PATH" && mkdir -p "$TEMP_PATH" cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" cd "$REPO_COPY" - python3 ./tests/ci/push_to_artifactory.py --release "${{ github.ref }}" \ - --commit '${{ github.sha }}' --artifactory-url "${{ secrets.JFROG_ARTIFACTORY_URL }}" --all + # Download and push packages to artifactory + python3 ./tests/ci/push_to_artifactory.py --release '${{ github.ref }}' \ + --commit '${{ github.sha }}' --artifactory-url '${{ secrets.JFROG_ARTIFACTORY_URL }}' --all + # Download macos binaries to ${{runner.temp}}/download_binary + python3 ./tests/ci/download_binary.py --version '${{ github.ref }}' \ + --commit '${{ github.sha }}' binary_darwin binary_darwin_aarch64 + mv '${{runner.temp}}/download_binary/'clickhouse-* '${{runner.temp}}/push_to_artifactory' - name: Upload packages to release assets uses: svenstaro/upload-release-action@v2 with: @@ -61,8 +66,6 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" diff --git a/.github/workflows/release_branches.yml b/.github/workflows/release_branches.yml index 6403d00157f..8f42ca92646 100644 --- a/.github/workflows/release_branches.yml +++ b/.github/workflows/release_branches.yml @@ -103,10 +103,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ######################################################################################### #################################### ORDINARY BUILDS #################################### @@ -153,10 +151,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebAarch64: needs: [DockerHubPush] @@ -196,10 +192,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebAsan: needs: [DockerHubPush] @@ -241,10 +235,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebUBsan: needs: [DockerHubPush] @@ -286,10 +278,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebTsan: needs: [DockerHubPush] @@ -331,10 +321,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebMsan: needs: [DockerHubPush] @@ -376,10 +364,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" BuilderDebDebug: needs: [DockerHubPush] @@ -421,10 +407,98 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinDarwin: + needs: [DockerHubPush] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_darwin + EOF + - name: Download changed images + uses: actions/download-artifact@v2 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + with: + fetch-depth: 0 # otherwise we will have no info about contributors + - name: Build + run: | + git -C "$GITHUB_WORKSPACE" submodule sync --recursive + git -C "$GITHUB_WORKSPACE" submodule update --depth=1 --recursive --init --jobs=10 + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v2 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" + BuilderBinDarwinAarch64: + needs: [DockerHubPush] + runs-on: [self-hosted, builder] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/build_check + IMAGES_PATH=${{runner.temp}}/images_path + REPO_COPY=${{runner.temp}}/build_check/ClickHouse + CACHES_PATH=${{runner.temp}}/../ccaches + BUILD_NAME=binary_darwin_aarch64 + EOF + - name: Download changed images + uses: actions/download-artifact@v2 + with: + name: changed_images + path: ${{ env.IMAGES_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + with: + fetch-depth: 0 # otherwise we will have no info about contributors + - name: Build + run: | + git -C "$GITHUB_WORKSPACE" submodule sync --recursive + git -C "$GITHUB_WORKSPACE" submodule update --depth=1 --recursive --init --jobs=10 + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cp -r "$GITHUB_WORKSPACE" "$TEMP_PATH" + cd "$REPO_COPY/tests/ci" && python3 build_check.py "$BUILD_NAME" + - name: Upload build URLs to artifacts + if: ${{ success() || failure() }} + uses: actions/upload-artifact@v2 + with: + name: ${{ env.BUILD_URLS }} + path: ${{ env.TEMP_PATH }}/${{ env.BUILD_URLS }}.json + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" "$CACHES_PATH" ############################################################################################ ##################################### Docker images ####################################### @@ -451,10 +525,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################ ##################################### BUILD REPORTER ####################################### @@ -500,10 +572,46 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: + sudo rm -fr "$TEMP_PATH" + BuilderSpecialReport: + needs: + - BuilderBinDarwin + - BuilderBinDarwinAarch64 + runs-on: [self-hosted, style-checker] + steps: + - name: Set envs + run: | + cat >> "$GITHUB_ENV" << 'EOF' + TEMP_PATH=${{runner.temp}}/report_check + REPORTS_PATH=${{runner.temp}}/reports_dir + CHECK_NAME=ClickHouse special build check + NEEDS_DATA_PATH=${{runner.temp}}/needs.json + EOF + - name: Download json reports + uses: actions/download-artifact@v2 + with: + path: ${{ env.REPORTS_PATH }} + - name: Clear repository + run: | + sudo rm -fr "$GITHUB_WORKSPACE" && mkdir "$GITHUB_WORKSPACE" + - name: Check out repository code + uses: actions/checkout@v2 + - name: Report Builder + run: | + sudo rm -fr "$TEMP_PATH" + mkdir -p "$TEMP_PATH" + cat > "$NEEDS_DATA_PATH" << 'EOF' + ${{ toJSON(needs) }} + EOF + cd "$GITHUB_WORKSPACE/tests/ci" + python3 build_report_check.py "$CHECK_NAME" + - name: Cleanup + if: always() + run: | + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ########################### FUNCTIONAl STATELESS TESTS ####################################### @@ -540,10 +648,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestAarch64: needs: [BuilderDebAarch64] @@ -577,10 +683,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestAsan0: needs: [BuilderDebAsan] @@ -616,10 +720,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestAsan1: needs: [BuilderDebAsan] @@ -655,10 +757,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestTsan0: needs: [BuilderDebTsan] @@ -694,10 +794,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestTsan1: needs: [BuilderDebTsan] @@ -733,10 +831,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestTsan2: needs: [BuilderDebTsan] @@ -772,10 +868,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestUBsan: needs: [BuilderDebUBsan] @@ -809,10 +903,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestMsan0: needs: [BuilderDebMsan] @@ -848,10 +940,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestMsan1: needs: [BuilderDebMsan] @@ -887,10 +977,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestMsan2: needs: [BuilderDebMsan] @@ -926,10 +1014,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestDebug0: needs: [BuilderDebDebug] @@ -965,10 +1051,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestDebug1: needs: [BuilderDebDebug] @@ -1004,10 +1088,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatelessTestDebug2: needs: [BuilderDebDebug] @@ -1043,10 +1125,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ############################ FUNCTIONAl STATEFUL TESTS ####################################### @@ -1083,10 +1163,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestAarch64: needs: [BuilderDebAarch64] @@ -1120,10 +1198,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestAsan: needs: [BuilderDebAsan] @@ -1157,10 +1233,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestTsan: needs: [BuilderDebTsan] @@ -1194,10 +1268,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestMsan: needs: [BuilderDebMsan] @@ -1231,10 +1303,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestUBsan: needs: [BuilderDebUBsan] @@ -1268,10 +1338,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FunctionalStatefulTestDebug: needs: [BuilderDebDebug] @@ -1305,10 +1373,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################## ######################################### STRESS TESTS ####################################### @@ -1344,10 +1410,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestTsan: needs: [BuilderDebTsan] @@ -1384,10 +1448,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestMsan: needs: [BuilderDebMsan] @@ -1420,10 +1482,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestUBsan: needs: [BuilderDebUBsan] @@ -1456,10 +1516,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" StressTestDebug: needs: [BuilderDebDebug] @@ -1492,10 +1550,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" ############################################################################################# ############################# INTEGRATION TESTS ############################################# @@ -1533,10 +1589,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsAsan1: needs: [BuilderDebAsan] @@ -1571,10 +1625,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsAsan2: needs: [BuilderDebAsan] @@ -1609,10 +1661,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan0: needs: [BuilderDebTsan] @@ -1647,10 +1697,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan1: needs: [BuilderDebTsan] @@ -1685,10 +1733,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan2: needs: [BuilderDebTsan] @@ -1723,10 +1769,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsTsan3: needs: [BuilderDebTsan] @@ -1761,10 +1805,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsRelease0: needs: [BuilderDebRelease] @@ -1799,10 +1841,8 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" IntegrationTestsRelease1: needs: [BuilderDebRelease] @@ -1837,16 +1877,15 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" FinishCheck: needs: - DockerHubPush - DockerServerImages - BuilderReport + - BuilderSpecialReport - FunctionalStatelessTestDebug0 - FunctionalStatelessTestDebug1 - FunctionalStatelessTestDebug2 diff --git a/.github/workflows/tags_stable.yml b/.github/workflows/tags_stable.yml index 9711f7688cb..a9172a8a2e2 100644 --- a/.github/workflows/tags_stable.yml +++ b/.github/workflows/tags_stable.yml @@ -43,6 +43,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.ROBOT_CLICKHOUSE_COMMIT_TOKEN }} run: | ./utils/list-versions/list-versions.sh > ./utils/list-versions/version_date.tsv + ./utils/list-versions/update-docker-version.sh GID=$(id -g "${UID}") docker run -u "${UID}:${GID}" -e PYTHONUNBUFFERED=1 \ --volume="${GITHUB_WORKSPACE}:/ClickHouse" clickhouse/style-test \ diff --git a/.github/workflows/woboq.yml b/.github/workflows/woboq.yml index dd29131e9dc..b928a4a8d3d 100644 --- a/.github/workflows/woboq.yml +++ b/.github/workflows/woboq.yml @@ -37,8 +37,6 @@ jobs: - name: Cleanup if: always() run: | - # shellcheck disable=SC2046 - docker kill $(docker ps -q) ||: - # shellcheck disable=SC2046 - docker rm -f $(docker ps -a -q) ||: + docker ps --quiet | xargs --no-run-if-empty docker kill ||: + docker ps --all --quiet | xargs --no-run-if-empty docker rm -f ||: sudo rm -fr "$TEMP_PATH" diff --git a/.gitignore b/.gitignore index e517dfd63c2..dd632eba85d 100644 --- a/.gitignore +++ b/.gitignore @@ -58,6 +58,10 @@ cmake_install.cmake CTestTestfile.cmake *.a *.o +*.so +*.dll +*.lib +*.dylib cmake-build-* # Python cache diff --git a/.gitmodules b/.gitmodules index 62b2f9d7766..f372a309cad 100644 --- a/.gitmodules +++ b/.gitmodules @@ -259,6 +259,10 @@ [submodule "contrib/minizip-ng"] path = contrib/minizip-ng url = https://github.com/zlib-ng/minizip-ng +[submodule "contrib/annoy"] + path = contrib/annoy + url = https://github.com/ClickHouse/annoy.git + branch = ClickHouse-master [submodule "contrib/qpl"] path = contrib/qpl url = https://github.com/intel/qpl.git diff --git a/CHANGELOG.md b/CHANGELOG.md index 3198c15b15c..56d117d05dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ### Table of Contents +**[ClickHouse release v22.9, 2022-09-22](#229)**
**[ClickHouse release v22.8, 2022-08-18](#228)**
**[ClickHouse release v22.7, 2022-07-21](#227)**
**[ClickHouse release v22.6, 2022-06-16](#226)**
@@ -10,6 +11,213 @@ **[Changelog for 2021](https://clickhouse.com/docs/en/whats-new/changelog/2021/)**
+### ClickHouse release 22.9, 2022-09-22 + +#### Backward Incompatible Change +* Upgrade from 20.3 and older to 22.9 and newer should be done through an intermediate version if there are any `ReplicatedMergeTree` tables, otherwise server with the new version will not start. [#40641](https://github.com/ClickHouse/ClickHouse/pull/40641) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Remove the functions `accurate_Cast` and `accurate_CastOrNull` (they are different to `accurateCast` and `accurateCastOrNull` by underscore in the name and they are not affected by the value of `cast_keep_nullable` setting). These functions were undocumented, untested, unused, and unneeded. They appeared to be alive due to code generalization. [#40682](https://github.com/ClickHouse/ClickHouse/pull/40682) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a test to ensure that every new table function will be documented. See [#40649](https://github.com/ClickHouse/ClickHouse/issues/40649). Rename table function `MeiliSearch` to `meilisearch`. [#40709](https://github.com/ClickHouse/ClickHouse/pull/40709) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a test to ensure that every new function will be documented. See [#40649](https://github.com/ClickHouse/ClickHouse/pull/40649). The functions `lemmatize`, `synonyms`, `stem` were case-insensitive by mistake. Now they are case-sensitive. [#40711](https://github.com/ClickHouse/ClickHouse/pull/40711) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Make interpretation of YAML configs to be more conventional. [#41044](https://github.com/ClickHouse/ClickHouse/pull/41044) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### New Feature +* Support `insert_quorum = 'auto'` to use majority number. [#39970](https://github.com/ClickHouse/ClickHouse/pull/39970) ([Sachin](https://github.com/SachinSetiya)). +* Add embedded dashboards to ClickHouse server. This is a demo project about how to achieve 90% results with 1% effort using ClickHouse features. [#40461](https://github.com/ClickHouse/ClickHouse/pull/40461) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added new settings constraint writability kind `changeable_in_readonly`. [#40631](https://github.com/ClickHouse/ClickHouse/pull/40631) ([Sergei Trifonov](https://github.com/serxa)). +* Add support for `INTERSECT DISTINCT` and `EXCEPT DISTINCT`. [#40792](https://github.com/ClickHouse/ClickHouse/pull/40792) ([Duc Canh Le](https://github.com/canhld94)). +* Add new input/output format `JSONObjectEachRow` - Support import for formats `JSON/JSONCompact/JSONColumnsWithMetadata`. Add new setting `input_format_json_validate_types_from_metadata` that controls whether we should check if data types from metadata match data types from the header. - Add new setting `input_format_json_validate_utf8`, when it's enabled, all `JSON` formats will validate UTF-8 sequences. It will be disabled by default. Note that this setting doesn't influence output formats `JSON/JSONCompact/JSONColumnsWithMetadata`, they always validate utf8 sequences (this exception was made because of compatibility reasons). - Add new setting `input_format_json_read_numbers_as_strings ` that allows to parse numbers in String column, the setting is disabled by default. - Add new setting `output_format_json_quote_decimals` that allows to output decimals in double quotes, disabled by default. - Allow to parse decimals in double quotes during data import. [#40910](https://github.com/ClickHouse/ClickHouse/pull/40910) ([Kruglov Pavel](https://github.com/Avogar)). +* Query parameters supported in DESCRIBE TABLE query. [#40952](https://github.com/ClickHouse/ClickHouse/pull/40952) ([Nikita Taranov](https://github.com/nickitat)). +* Add support to Parquet Time32/64 by converting it into DateTime64. Parquet time32/64 represents time elapsed since midnight, while DateTime32/64 represents an actual unix timestamp. Conversion simply offsets from `0`. [#41333](https://github.com/ClickHouse/ClickHouse/pull/41333) ([Arthur Passos](https://github.com/arthurpassos)). +* Implement set operations on Apache Datasketches. [#39919](https://github.com/ClickHouse/ClickHouse/pull/39919) ([Fangyuan Deng](https://github.com/pzhdfy)). Note: there is no point of using Apache Datasketches, they are inferiour than ClickHouse and only make sense for integration with other systems. +* Allow recording errors to specified file while reading text formats (`CSV`, `TSV`). [#40516](https://github.com/ClickHouse/ClickHouse/pull/40516) ([zjial](https://github.com/zjial)). + +#### Experimental Feature + +* Add ANN (approximate nearest neighbor) index based on `Annoy`. [#40818](https://github.com/ClickHouse/ClickHouse/pull/40818) ([Filatenkov Artur](https://github.com/FArthur-cmd)). [#37215](https://github.com/ClickHouse/ClickHouse/pull/37215) ([VVMak](https://github.com/VVMak)). +* Add new storage engine `KeeperMap`, that uses ClickHouse Keeper or ZooKeeper as a key-value store. [#39976](https://github.com/ClickHouse/ClickHouse/pull/39976) ([Antonio Andelic](https://github.com/antonio2368)). This storage engine is intended to store a small amount of metadata. +* Improvement for in-memory data parts: remove completely processed WAL files. [#40592](https://github.com/ClickHouse/ClickHouse/pull/40592) ([Azat Khuzhin](https://github.com/azat)). + +#### Performance Improvement +* Implement compression of marks and primary key. Close [#34437](https://github.com/ClickHouse/ClickHouse/issues/34437). [#37693](https://github.com/ClickHouse/ClickHouse/pull/37693) ([zhongyuankai](https://github.com/zhongyuankai)). +* Allow to load marks with threadpool in advance. Regulated by setting `load_marks_asynchronously` (default: 0). [#40821](https://github.com/ClickHouse/ClickHouse/pull/40821) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Virtual filesystem over s3 will use random object names split into multiple path prefixes for better performance on AWS. [#40968](https://github.com/ClickHouse/ClickHouse/pull/40968) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Account `max_block_size` value while producing single-level aggregation results. Allows to execute following query plan steps using more threads. [#39138](https://github.com/ClickHouse/ClickHouse/pull/39138) ([Nikita Taranov](https://github.com/nickitat)). +* Software prefetching is used in aggregation to speed up operations with hash tables. Controlled by the setting `enable_software_prefetch_in_aggregation`, enabled by default. [#39304](https://github.com/ClickHouse/ClickHouse/pull/39304) ([Nikita Taranov](https://github.com/nickitat)). +* Better support of `optimize_read_in_order` in case when some of sorting key columns are always constant after applying `WHERE` clause. E.g. query like `SELECT ... FROM table WHERE a = 'x' ORDER BY a, b`, where `table` has storage definition: `MergeTree ORDER BY (a, b)`. [#38715](https://github.com/ClickHouse/ClickHouse/pull/38715) ([Anton Popov](https://github.com/CurtizJ)). +* Filter joined streams for `full_sorting_join` by each other before sorting. [#39418](https://github.com/ClickHouse/ClickHouse/pull/39418) ([Vladimir C](https://github.com/vdimir)). +* LZ4 decompression optimised by skipping empty literals processing. [#40142](https://github.com/ClickHouse/ClickHouse/pull/40142) ([Nikita Taranov](https://github.com/nickitat)). +* Speedup backup process using native `copy` when possible instead of copying through `clickhouse-server` memory. [#40395](https://github.com/ClickHouse/ClickHouse/pull/40395) ([alesapin](https://github.com/alesapin)). +* Do not obtain storage snapshot for each INSERT block (slightly improves performance). [#40638](https://github.com/ClickHouse/ClickHouse/pull/40638) ([Azat Khuzhin](https://github.com/azat)). +* Implement batch processing for aggregate functions with multiple nullable arguments. [#41058](https://github.com/ClickHouse/ClickHouse/pull/41058) ([Raúl Marín](https://github.com/Algunenano)). +* Speed up reading UniquesHashSet (`uniqState` from disk for example). [#41089](https://github.com/ClickHouse/ClickHouse/pull/41089) ([Raúl Marín](https://github.com/Algunenano)). +* Fixed high memory usage while executing mutations of compact parts in tables with huge number of columns. [#41122](https://github.com/ClickHouse/ClickHouse/pull/41122) ([lthaooo](https://github.com/lthaooo)). +* Enable the vectorscan library on ARM, this speeds up regexp evaluation. [#41033](https://github.com/ClickHouse/ClickHouse/pull/41033) ([Robert Schulze](https://github.com/rschu1ze)). +* Upgrade vectorscan to 5.4.8 which has many performance optimizations to speed up regexp evaluation. [#41270](https://github.com/ClickHouse/ClickHouse/pull/41270) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix incorrect fallback to skip the local filesystem cache for VFS (like S3) which happened on very high concurrency level. [#40420](https://github.com/ClickHouse/ClickHouse/pull/40420) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If row policy filter is always false, return empty result immediately without reading any data. This closes [#24012](https://github.com/ClickHouse/ClickHouse/issues/24012). [#40740](https://github.com/ClickHouse/ClickHouse/pull/40740) ([Amos Bird](https://github.com/amosbird)). +* Parallel hash JOIN for Float data types might be suboptimal. Make it better. [#41183](https://github.com/ClickHouse/ClickHouse/pull/41183) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Improvement +* During startup and ATTACH call, `ReplicatedMergeTree` tables will be readonly until the ZooKeeper connection is made and the setup is finished. [#40148](https://github.com/ClickHouse/ClickHouse/pull/40148) ([Antonio Andelic](https://github.com/antonio2368)). +* Add `enable_extended_results_for_datetime_functions` option to return results of type Date32 for functions toStartOfYear, toStartOfISOYear, toStartOfQuarter, toStartOfMonth, toStartOfWeek, toMonday and toLastDayOfMonth when argument is Date32 or DateTime64, otherwise results of Date type are returned. For compatibility reasons default value is ‘0’. [#41214](https://github.com/ClickHouse/ClickHouse/pull/41214) ([Roman Vasin](https://github.com/rvasin)). +* For security and stability reasons, CatBoost models are no longer evaluated within the ClickHouse server. Instead, the evaluation is now done in the clickhouse-library-bridge, a separate process that loads the catboost library and communicates with the server process via HTTP. [#40897](https://github.com/ClickHouse/ClickHouse/pull/40897) ([Robert Schulze](https://github.com/rschu1ze)). [#39629](https://github.com/ClickHouse/ClickHouse/pull/39629) ([Robert Schulze](https://github.com/rschu1ze)). +* Add more metrics for on-disk temporary data, close [#40206](https://github.com/ClickHouse/ClickHouse/issues/40206). [#40239](https://github.com/ClickHouse/ClickHouse/pull/40239) ([Vladimir C](https://github.com/vdimir)). +* Add config option `warning_supress_regexp`, close [#40330](https://github.com/ClickHouse/ClickHouse/issues/40330). [#40548](https://github.com/ClickHouse/ClickHouse/pull/40548) ([Vladimir C](https://github.com/vdimir)). +* Add setting to disable limit on kafka_num_consumers. Closes [#40331](https://github.com/ClickHouse/ClickHouse/issues/40331). [#40670](https://github.com/ClickHouse/ClickHouse/pull/40670) ([Kruglov Pavel](https://github.com/Avogar)). +* Support `SETTINGS` in `DELETE ...` query. [#41533](https://github.com/ClickHouse/ClickHouse/pull/41533) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Detailed S3 profile events `DiskS3*` per S3 API call split for S3 ObjectStorage. [#41532](https://github.com/ClickHouse/ClickHouse/pull/41532) ([Sergei Trifonov](https://github.com/serxa)). +* Two new metrics in `system.asynchronous_metrics`. `NumberOfDetachedParts` and `NumberOfDetachedByUserParts`. [#40779](https://github.com/ClickHouse/ClickHouse/pull/40779) ([Sema Checherinda](https://github.com/CheSema)). +* Allow CONSTRAINTs for ODBC and JDBC tables. [#34551](https://github.com/ClickHouse/ClickHouse/pull/34551) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Don't print `SETTINGS` more than once during query formatting if it didn't appear multiple times in the original query. [#38900](https://github.com/ClickHouse/ClickHouse/pull/38900) ([Raúl Marín](https://github.com/Algunenano)). +* Improve the tracing (OpenTelemetry) context propagation across threads. [#39010](https://github.com/ClickHouse/ClickHouse/pull/39010) ([Frank Chen](https://github.com/FrankChen021)). +* ClickHouse Keeper: add listeners for `interserver_listen_host` only in Keeper if specified. [#39973](https://github.com/ClickHouse/ClickHouse/pull/39973) ([Antonio Andelic](https://github.com/antonio2368)). +* Improve recovery of Replicated user access storage after errors. [#39977](https://github.com/ClickHouse/ClickHouse/pull/39977) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add support for TTL in `EmbeddedRocksDB`. [#39986](https://github.com/ClickHouse/ClickHouse/pull/39986) ([Lloyd-Pottiger](https://github.com/Lloyd-Pottiger)). +* Add schema inference to `clickhouse-obfuscator`, so the `--structure` argument is no longer required. [#40120](https://github.com/ClickHouse/ClickHouse/pull/40120) ([Nikolay Degterinsky](https://github.com/evillique)). +* Improve and fix dictionaries in `Arrow` format. [#40173](https://github.com/ClickHouse/ClickHouse/pull/40173) ([Kruglov Pavel](https://github.com/Avogar)). +* More natural conversion of `Date32`, `DateTime64`, `Date` to narrower types: upper or lower normal value is considered when out of normal range. [#40217](https://github.com/ClickHouse/ClickHouse/pull/40217) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix the case when `Merge` table over `View` cannot use index. [#40233](https://github.com/ClickHouse/ClickHouse/pull/40233) ([Duc Canh Le](https://github.com/canhld94)). +* Custom key names for JSON server logs. [#40251](https://github.com/ClickHouse/ClickHouse/pull/40251) ([Mallik Hassan](https://github.com/SadiHassan)). +* It is now possible to set a custom error code for the exception thrown by function `throwIf`. [#40319](https://github.com/ClickHouse/ClickHouse/pull/40319) ([Robert Schulze](https://github.com/rschu1ze)). +* Improve schema inference cache, respect format settings that can change the schema. [#40414](https://github.com/ClickHouse/ClickHouse/pull/40414) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow parsing `Date` as `DateTime` and `DateTime64`. This implements the enhancement proposed in [#36949](https://github.com/ClickHouse/ClickHouse/issues/36949). [#40474](https://github.com/ClickHouse/ClickHouse/pull/40474) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow conversion from `String` with `DateTime64` like `2022-08-22 01:02:03.456` to `Date` and `Date32`. Allow conversion from String with DateTime like `2022-08-22 01:02:03` to `Date32`. This closes [#39598](https://github.com/ClickHouse/ClickHouse/issues/39598). [#40475](https://github.com/ClickHouse/ClickHouse/pull/40475) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Better support for nested data structures in Parquet format [#40485](https://github.com/ClickHouse/ClickHouse/pull/40485) ([Arthur Passos](https://github.com/arthurpassos)). +* Support reading Array(Record) into flatten nested table in Avro. [#40534](https://github.com/ClickHouse/ClickHouse/pull/40534) ([Kruglov Pavel](https://github.com/Avogar)). +* Add read-only support for `EmbeddedRocksDB`. [#40543](https://github.com/ClickHouse/ClickHouse/pull/40543) ([Lloyd-Pottiger](https://github.com/Lloyd-Pottiger)). +* Validate the compression method parameter of URL table engine. [#40600](https://github.com/ClickHouse/ClickHouse/pull/40600) ([Frank Chen](https://github.com/FrankChen021)). +* Better format detection for url table function/engine in presence of a query string after a file name. Closes [#40315](https://github.com/ClickHouse/ClickHouse/issues/40315). [#40636](https://github.com/ClickHouse/ClickHouse/pull/40636) ([Kruglov Pavel](https://github.com/Avogar)). +* Disable projection when grouping set is used. It generated wrong result. This fixes [#40635](https://github.com/ClickHouse/ClickHouse/issues/40635). [#40726](https://github.com/ClickHouse/ClickHouse/pull/40726) ([Amos Bird](https://github.com/amosbird)). +* Fix incorrect format of `APPLY` column transformer which can break metadata if used in table definition. This fixes [#37590](https://github.com/ClickHouse/ClickHouse/issues/37590). [#40727](https://github.com/ClickHouse/ClickHouse/pull/40727) ([Amos Bird](https://github.com/amosbird)). +* Support the `%z` descriptor for formatting the timezone offset in `formatDateTime`. [#40736](https://github.com/ClickHouse/ClickHouse/pull/40736) ([Cory Levy](https://github.com/LevyCory)). +* The interactive mode in `clickhouse-client` now interprets `.` and `/` as "run the last command". [#40750](https://github.com/ClickHouse/ClickHouse/pull/40750) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix issue with passing MySQL timeouts for MySQL database engine and MySQL table function. Closes [#34168](https://github.com/ClickHouse/ClickHouse/issues/34168). [#40751](https://github.com/ClickHouse/ClickHouse/pull/40751) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Create status file for filesystem cache directory to make sure that cache directories are not shared between different servers or caches. [#40820](https://github.com/ClickHouse/ClickHouse/pull/40820) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add support for `DELETE` and `UPDATE` for `EmbeddedRocksDB` storage. [#40853](https://github.com/ClickHouse/ClickHouse/pull/40853) ([Antonio Andelic](https://github.com/antonio2368)). +* ClickHouse Keeper: fix shutdown during long commit and increase allowed request size. [#40941](https://github.com/ClickHouse/ClickHouse/pull/40941) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix race in WriteBufferFromS3, add TSA annotations. [#40950](https://github.com/ClickHouse/ClickHouse/pull/40950) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Grouping sets with group_by_use_nulls should only convert key columns to nullable. [#40997](https://github.com/ClickHouse/ClickHouse/pull/40997) ([Duc Canh Le](https://github.com/canhld94)). +* Improve the observability of INSERT on distributed table. [#41034](https://github.com/ClickHouse/ClickHouse/pull/41034) ([Frank Chen](https://github.com/FrankChen021)). +* More low-level metrics for S3 interaction. [#41039](https://github.com/ClickHouse/ClickHouse/pull/41039) ([mateng915](https://github.com/mateng0915)). +* Support relative path in Location header after HTTP redirect. Closes [#40985](https://github.com/ClickHouse/ClickHouse/issues/40985). [#41162](https://github.com/ClickHouse/ClickHouse/pull/41162) ([Kruglov Pavel](https://github.com/Avogar)). +* Apply changes to HTTP handlers on fly without server restart. [#41177](https://github.com/ClickHouse/ClickHouse/pull/41177) ([Azat Khuzhin](https://github.com/azat)). +* ClickHouse Keeper: properly close active sessions during shutdown. [#41215](https://github.com/ClickHouse/ClickHouse/pull/41215) ([Antonio Andelic](https://github.com/antonio2368)). This lowers the period of "table is read-only" errors. +* Add ability to automatically comment SQL queries in clickhouse-client/local (with `Alt-#`, like in readline). [#41224](https://github.com/ClickHouse/ClickHouse/pull/41224) ([Azat Khuzhin](https://github.com/azat)). +* Fix incompatibility of cache after switching setting `do_no_evict_index_and_mark_files` from 1 to 0, 0 to 1. [#41330](https://github.com/ClickHouse/ClickHouse/pull/41330) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add a setting `allow_suspicious_fixed_string_types` to prevent users from creating columns of type FixedString with size > 256. [#41495](https://github.com/ClickHouse/ClickHouse/pull/41495) ([Duc Canh Le](https://github.com/canhld94)). +* Add `has_lightweight_delete` to system.parts. [#41564](https://github.com/ClickHouse/ClickHouse/pull/41564) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Build/Testing/Packaging Improvement +* Enforce documentation for every setting. [#40644](https://github.com/ClickHouse/ClickHouse/pull/40644) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enforce documentation for every current metric. [#40645](https://github.com/ClickHouse/ClickHouse/pull/40645) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enforce documentation for every profile event counter. Write the documentation where it was missing. [#40646](https://github.com/ClickHouse/ClickHouse/pull/40646) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow minimal `clickhouse-local` build by correcting some dependencies. [#40460](https://github.com/ClickHouse/ClickHouse/pull/40460) ([Alexey Milovidov](https://github.com/alexey-milovidov)). It is less than 50 MiB. +* Calculate and report SQL function coverage in tests. [#40593](https://github.com/ClickHouse/ClickHouse/issues/40593). [#40647](https://github.com/ClickHouse/ClickHouse/pull/40647) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enforce documentation for every MergeTree setting. [#40648](https://github.com/ClickHouse/ClickHouse/pull/40648) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* A prototype of embedded reference documentation for high-level uniform server components. [#40649](https://github.com/ClickHouse/ClickHouse/pull/40649) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* We will check all queries from the changed perf tests to ensure that all changed queries were tested. [#40322](https://github.com/ClickHouse/ClickHouse/pull/40322) ([Nikita Taranov](https://github.com/nickitat)). +* Fix TGZ packages. [#40681](https://github.com/ClickHouse/ClickHouse/pull/40681) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix debug symbols. [#40873](https://github.com/ClickHouse/ClickHouse/pull/40873) ([Azat Khuzhin](https://github.com/azat)). +* Extended the CI configuration to create a x86 SSE2-only build. Useful for old or embedded hardware. [#40999](https://github.com/ClickHouse/ClickHouse/pull/40999) ([Robert Schulze](https://github.com/rschu1ze)). +* Switch to llvm/clang 15. [#41046](https://github.com/ClickHouse/ClickHouse/pull/41046) ([Azat Khuzhin](https://github.com/azat)). +* Continuation of [#40938](https://github.com/ClickHouse/ClickHouse/issues/40938). Fix ODR violation for `Loggers` class. Fixes [#40398](https://github.com/ClickHouse/ClickHouse/issues/40398), [#40937](https://github.com/ClickHouse/ClickHouse/issues/40937). [#41060](https://github.com/ClickHouse/ClickHouse/pull/41060) ([Dmitry Novik](https://github.com/novikd)). +* Add macOS binaries to GitHub release assets, it fixes [#37718](https://github.com/ClickHouse/ClickHouse/issues/37718). [#41088](https://github.com/ClickHouse/ClickHouse/pull/41088) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* The c-ares library is now bundled with ClickHouse's build system. [#41239](https://github.com/ClickHouse/ClickHouse/pull/41239) ([Robert Schulze](https://github.com/rschu1ze)). +* Get rid of `dlopen` from the main ClickHouse code. It remains in the library-bridge and odbc-bridge. [#41428](https://github.com/ClickHouse/ClickHouse/pull/41428) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Don't allow `dlopen` in the main ClickHouse binary, because it is harmful and insecure. We don't use it. But it can be used by some libraries for the implementation of "plugins". We absolutely discourage the ancient technique of loading 3rd-party uncontrolled dangerous libraries into the process address space, because it is insane. [#41429](https://github.com/ClickHouse/ClickHouse/pull/41429) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `source` field to deb packages, update `nfpm`. [#41531](https://github.com/ClickHouse/ClickHouse/pull/41531) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Support for DWARF-5 in the in-house DWARF parser. [#40710](https://github.com/ClickHouse/ClickHouse/pull/40710) ([Azat Khuzhin](https://github.com/azat)). +* Add fault injection in ZooKeeper client for testing [#30498](https://github.com/ClickHouse/ClickHouse/pull/30498) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add stateless tests with s3 storage with debug and tsan [#35262](https://github.com/ClickHouse/ClickHouse/pull/35262) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Trying stress on top of S3 [#36837](https://github.com/ClickHouse/ClickHouse/pull/36837) ([alesapin](https://github.com/alesapin)). +* Enable `concurrency-mt-unsafe` in `clang-tidy` [#40224](https://github.com/ClickHouse/ClickHouse/pull/40224) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix + +* Fix potential dataloss due to [a bug in AWS SDK](https://github.com/aws/aws-sdk-cpp/issues/658). Bug can be triggered only when clickhouse is used over S3. [#40506](https://github.com/ClickHouse/ClickHouse/pull/40506) ([alesapin](https://github.com/alesapin)). This bug has been open for 5 years in AWS SDK and is closed after our report. +* Malicious data in Native format might cause a crash. [#41441](https://github.com/ClickHouse/ClickHouse/pull/41441) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The aggregate function `categorialInformationValue` was having incorrectly defined properties, which might cause a null pointer dereferencing at runtime. This closes [#41443](https://github.com/ClickHouse/ClickHouse/issues/41443). [#41449](https://github.com/ClickHouse/ClickHouse/pull/41449) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Writing data in Apache `ORC` format might lead to a buffer overrun. [#41458](https://github.com/ClickHouse/ClickHouse/pull/41458) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix memory safety issues with functions `encrypt` and `contingency` if Array of Nullable is used as an argument. This fixes [#41004](https://github.com/ClickHouse/ClickHouse/issues/41004). [#40195](https://github.com/ClickHouse/ClickHouse/pull/40195) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix bugs in MergeJoin when 'not_processed' is not null. [#40335](https://github.com/ClickHouse/ClickHouse/pull/40335) ([liql2007](https://github.com/liql2007)). +* Fix incorrect result in case of decimal precision loss in IN operator, ref [#41125](https://github.com/ClickHouse/ClickHouse/issues/41125). [#41130](https://github.com/ClickHouse/ClickHouse/pull/41130) ([Vladimir C](https://github.com/vdimir)). +* Fix filling of missed `Nested` columns with multiple levels. [#37152](https://github.com/ClickHouse/ClickHouse/pull/37152) ([Anton Popov](https://github.com/CurtizJ)). +* Fix SYSTEM UNFREEZE query for Ordinary (deprecated) database. Fix for https://github.com/ClickHouse/ClickHouse/pull/36424. [#38262](https://github.com/ClickHouse/ClickHouse/pull/38262) ([Vadim Volodin](https://github.com/PolyProgrammist)). +* Fix unused unknown columns introduced by WITH statement. This fixes [#37812](https://github.com/ClickHouse/ClickHouse/issues/37812) . [#39131](https://github.com/ClickHouse/ClickHouse/pull/39131) ([Amos Bird](https://github.com/amosbird)). +* Fix query analysis for ORDER BY in presence of window functions. Fixes [#38741](https://github.com/ClickHouse/ClickHouse/issues/38741) Fixes [#24892](https://github.com/ClickHouse/ClickHouse/issues/24892). [#39354](https://github.com/ClickHouse/ClickHouse/pull/39354) ([Dmitry Novik](https://github.com/novikd)). +* Fixed `Unknown identifier (aggregate-function)` exception which appears when a user tries to calculate WINDOW ORDER BY/PARTITION BY expressions over aggregate functions. [#39762](https://github.com/ClickHouse/ClickHouse/pull/39762) ([Vladimir Chebotaryov](https://github.com/quickhouse)). +* Limit number of analyze for one query with setting `max_analyze_depth`. It prevents exponential blow up of analysis time for queries with extraordinarily large number of subqueries. [#40334](https://github.com/ClickHouse/ClickHouse/pull/40334) ([Vladimir C](https://github.com/vdimir)). +* Fix rare bug with column TTL for MergeTree engines family: In case of repeated vertical merge the error `Cannot unlink file ColumnName.bin ... No such file or directory.` could happen. [#40346](https://github.com/ClickHouse/ClickHouse/pull/40346) ([alesapin](https://github.com/alesapin)). +* Use DNS entries for both IPv4 and IPv6 if present. [#40353](https://github.com/ClickHouse/ClickHouse/pull/40353) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow to read snappy compressed files from Hadoop. [#40482](https://github.com/ClickHouse/ClickHouse/pull/40482) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash while parsing values of type `Object` (experimental feature) that contains arrays of variadic dimension. [#40483](https://github.com/ClickHouse/ClickHouse/pull/40483) ([Duc Canh Le](https://github.com/canhld94)). +* Fix settings `input_format_tsv_skip_first_lines`. [#40491](https://github.com/ClickHouse/ClickHouse/pull/40491) ([mini4](https://github.com/mini4)). +* Fix bug (race condition) when starting up MaterializedPostgreSQL database/table engine. [#40262](https://github.com/ClickHouse/ClickHouse/issues/40262). Fix error with reaching limit of relcache_callback_list slots. [#40511](https://github.com/ClickHouse/ClickHouse/pull/40511) ([Maksim Buren](https://github.com/maks-buren630501)). +* Fix possible error 'Decimal math overflow' while parsing DateTime64. [#40546](https://github.com/ClickHouse/ClickHouse/pull/40546) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix vertical merge of parts with lightweight deleted rows. [#40559](https://github.com/ClickHouse/ClickHouse/pull/40559) ([Alexander Gololobov](https://github.com/davenger)). +* Fix segment fault when writing data to URL table engine if it enables compression. [#40565](https://github.com/ClickHouse/ClickHouse/pull/40565) ([Frank Chen](https://github.com/FrankChen021)). +* Fix possible logical error `'Invalid Field get from type UInt64 to type String'` in arrayElement function with Map. [#40572](https://github.com/ClickHouse/ClickHouse/pull/40572) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible race in filesystem cache. [#40586](https://github.com/ClickHouse/ClickHouse/pull/40586) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Removed skipping of mutations in unaffected partitions of `MergeTree` tables, because this feature never worked correctly and might cause resurrection of finished mutations. [#40589](https://github.com/ClickHouse/ClickHouse/pull/40589) ([Alexander Tokmakov](https://github.com/tavplubix)). +* The clickhouse server will crash if we add a grpc port which has been occupied to the configuration in runtime. [#40597](https://github.com/ClickHouse/ClickHouse/pull/40597) ([何李夫](https://github.com/helifu)). +* Fix `base58Encode / base58Decode` handling leading 0 / '1'. [#40620](https://github.com/ClickHouse/ClickHouse/pull/40620) ([Andrey Zvonov](https://github.com/zvonand)). +* keeper-fix: fix race in accessing logs while snapshot is being installed. [#40627](https://github.com/ClickHouse/ClickHouse/pull/40627) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix short circuit execution of toFixedString function. Solves (partially) [#40622](https://github.com/ClickHouse/ClickHouse/issues/40622). [#40628](https://github.com/ClickHouse/ClickHouse/pull/40628) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixes SQLite int8 column conversion to int64 column in ClickHouse. Fixes [#40639](https://github.com/ClickHouse/ClickHouse/issues/40639). [#40642](https://github.com/ClickHouse/ClickHouse/pull/40642) ([Barum Rho](https://github.com/barumrho)). +* Fix stack overflow in recursive `Buffer` tables. This closes [#40637](https://github.com/ClickHouse/ClickHouse/issues/40637). [#40643](https://github.com/ClickHouse/ClickHouse/pull/40643) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* During insertion of a new query to the `ProcessList` allocations happen. If we reach the memory limit during these allocations we can not use `OvercommitTracker`, because `ProcessList::mutex` is already acquired. Fixes [#40611](https://github.com/ClickHouse/ClickHouse/issues/40611). [#40677](https://github.com/ClickHouse/ClickHouse/pull/40677) ([Dmitry Novik](https://github.com/novikd)). +* Fix LOGICAL_ERROR with max_read_buffer_size=0 during reading marks. [#40705](https://github.com/ClickHouse/ClickHouse/pull/40705) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory leak while pushing to MVs w/o query context (from Kafka/...). [#40732](https://github.com/ClickHouse/ClickHouse/pull/40732) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible error Attempt to read after eof in CSV schema inference. [#40746](https://github.com/ClickHouse/ClickHouse/pull/40746) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix logical error in write-through cache "File segment completion can be done only by downloader". Closes [#40748](https://github.com/ClickHouse/ClickHouse/issues/40748). [#40759](https://github.com/ClickHouse/ClickHouse/pull/40759) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Make the result of GROUPING function the same as in SQL and other DBMS. [#40762](https://github.com/ClickHouse/ClickHouse/pull/40762) ([Dmitry Novik](https://github.com/novikd)). +* In [#40595](https://github.com/ClickHouse/ClickHouse/issues/40595) it was reported that the `host_regexp` functionality was not working properly with a name to address resolution in `/etc/hosts`. It's fixed. [#40769](https://github.com/ClickHouse/ClickHouse/pull/40769) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix incremental backups for Log family. [#40827](https://github.com/ClickHouse/ClickHouse/pull/40827) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix extremely rare bug which can lead to potential data loss in zero-copy replication. [#40844](https://github.com/ClickHouse/ClickHouse/pull/40844) ([alesapin](https://github.com/alesapin)). +* Fix key condition analyzing crashes when same set expression built from different column(s). [#40850](https://github.com/ClickHouse/ClickHouse/pull/40850) ([Duc Canh Le](https://github.com/canhld94)). +* Fix nested JSON Objects schema inference. [#40851](https://github.com/ClickHouse/ClickHouse/pull/40851) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix 3-digit prefix directory for filesystem cache files not being deleted if empty. Closes [#40797](https://github.com/ClickHouse/ClickHouse/issues/40797). [#40867](https://github.com/ClickHouse/ClickHouse/pull/40867) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix uncaught DNS_ERROR on failed connection to replicas. [#40881](https://github.com/ClickHouse/ClickHouse/pull/40881) ([Robert Coelho](https://github.com/coelho)). +* Fix bug when removing unneeded columns in subquery. [#40884](https://github.com/ClickHouse/ClickHouse/pull/40884) ([luocongkai](https://github.com/TKaxe)). +* Fix extra memory allocation for remote read buffers. [#40896](https://github.com/ClickHouse/ClickHouse/pull/40896) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed a behaviour when user with explicitly revoked grant for dropping databases can still drop it. [#40906](https://github.com/ClickHouse/ClickHouse/pull/40906) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* A fix for ClickHouse Keeper: correctly compare paths in write requests to Keeper internal system node paths. [#40918](https://github.com/ClickHouse/ClickHouse/pull/40918) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix deadlock in WriteBufferFromS3. [#40943](https://github.com/ClickHouse/ClickHouse/pull/40943) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix access rights for `DESCRIBE TABLE url()` and some other `DESCRIBE TABLE ()`. [#40975](https://github.com/ClickHouse/ClickHouse/pull/40975) ([Vitaly Baranov](https://github.com/vitlibar)). +* Remove wrong parser logic for `WITH GROUPING SETS` which may lead to nullptr dereference. [#41049](https://github.com/ClickHouse/ClickHouse/pull/41049) ([Duc Canh Le](https://github.com/canhld94)). +* A fix for ClickHouse Keeper: fix possible segfault during Keeper shutdown. [#41075](https://github.com/ClickHouse/ClickHouse/pull/41075) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible segfaults, use-heap-after-free and memory leak in aggregate function combinators. Closes [#40848](https://github.com/ClickHouse/ClickHouse/issues/40848). [#41083](https://github.com/ClickHouse/ClickHouse/pull/41083) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix query_views_log with Window views. [#41132](https://github.com/ClickHouse/ClickHouse/pull/41132) ([Raúl Marín](https://github.com/Algunenano)). +* Disables optimize_monotonous_functions_in_order_by by default, mitigates: [#40094](https://github.com/ClickHouse/ClickHouse/issues/40094). [#41136](https://github.com/ClickHouse/ClickHouse/pull/41136) ([Denny Crane](https://github.com/den-crane)). +* Fixed "possible deadlock avoided" error on automatic conversion of database engine from Ordinary to Atomic. [#41146](https://github.com/ClickHouse/ClickHouse/pull/41146) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix SIGSEGV in SortedBlocksWriter in case of empty block (possible to get with `optimize_aggregation_in_order` and `join_algorithm=auto`). [#41154](https://github.com/ClickHouse/ClickHouse/pull/41154) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect query result when trivial count optimization is in effect with array join. This fixes [#39431](https://github.com/ClickHouse/ClickHouse/issues/39431). [#41158](https://github.com/ClickHouse/ClickHouse/pull/41158) ([Denny Crane](https://github.com/den-crane)). +* Fix stack-use-after-return in GetPriorityForLoadBalancing::getPriorityFunc(). [#41159](https://github.com/ClickHouse/ClickHouse/pull/41159) ([Azat Khuzhin](https://github.com/azat)). +* Fix positional arguments exception Positional argument out of bounds. Closes [#40634](https://github.com/ClickHouse/ClickHouse/issues/40634). [#41189](https://github.com/ClickHouse/ClickHouse/pull/41189) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix background clean up of broken detached parts. [#41190](https://github.com/ClickHouse/ClickHouse/pull/41190) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix exponential query rewrite in case of lots of cross joins with where, close [#21557](https://github.com/ClickHouse/ClickHouse/issues/21557). [#41223](https://github.com/ClickHouse/ClickHouse/pull/41223) ([Vladimir C](https://github.com/vdimir)). +* Fix possible logical error in write-through cache, which happened because not all types of exception were handled as needed. Closes [#41208](https://github.com/ClickHouse/ClickHouse/issues/41208). [#41232](https://github.com/ClickHouse/ClickHouse/pull/41232) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix String log entry in system.filesystem_cache_log. [#41233](https://github.com/ClickHouse/ClickHouse/pull/41233) ([jmimbrero](https://github.com/josemimbrero-tinybird)). +* Queries with `OFFSET` clause in subquery and `WHERE` clause in outer query might return incorrect result, it's fixed. Fixes [#40416](https://github.com/ClickHouse/ClickHouse/issues/40416). [#41280](https://github.com/ClickHouse/ClickHouse/pull/41280) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix possible wrong query result with `query_plan_optimize_primary_key` enabled. Fixes [#40599](https://github.com/ClickHouse/ClickHouse/issues/40599). [#41281](https://github.com/ClickHouse/ClickHouse/pull/41281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Do not allow invalid sequences influence other rows in lowerUTF8/upperUTF8. [#41286](https://github.com/ClickHouse/ClickHouse/pull/41286) ([Azat Khuzhin](https://github.com/azat)). +* Fix `ALTER ADD COLUMN` queries with columns of type `Object`. [#41290](https://github.com/ClickHouse/ClickHouse/pull/41290) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed "No node" error when selecting from `system.distributed_ddl_queue` when there's no `distributed_ddl.path` in config. Fixes [#41096](https://github.com/ClickHouse/ClickHouse/issues/41096). [#41296](https://github.com/ClickHouse/ClickHouse/pull/41296) ([young scott](https://github.com/young-scott)). +* Fix incorrect logical error `Expected relative path` in disk object storage. Related to [#41246](https://github.com/ClickHouse/ClickHouse/issues/41246). [#41297](https://github.com/ClickHouse/ClickHouse/pull/41297) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add column type check before UUID insertion in MsgPack format. [#41309](https://github.com/ClickHouse/ClickHouse/pull/41309) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible crash after inserting asynchronously (with enabled setting `async_insert`) malformed data to columns of type `Object`. It could happen, if JSONs in all batches of async inserts were invalid and could not be parsed. [#41336](https://github.com/ClickHouse/ClickHouse/pull/41336) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible deadlock with async_socket_for_remote/use_hedged_requests and parallel KILL. [#41343](https://github.com/ClickHouse/ClickHouse/pull/41343) ([Azat Khuzhin](https://github.com/azat)). +* Disables optimize_rewrite_sum_if_to_count_if by default, mitigates: [#38605](https://github.com/ClickHouse/ClickHouse/issues/38605) [#38683](https://github.com/ClickHouse/ClickHouse/issues/38683). [#41388](https://github.com/ClickHouse/ClickHouse/pull/41388) ([Denny Crane](https://github.com/den-crane)). +* Since 22.8 `ON CLUSTER` clause is ignored if database is `Replicated` and cluster name and database name are the same. Because of this `DROP PARTITION ON CLUSTER` worked unexpected way with `Replicated`. It's fixed, now `ON CLUSTER` clause is ignored only for queries that are replicated on database level. Fixes [#41299](https://github.com/ClickHouse/ClickHouse/issues/41299). [#41390](https://github.com/ClickHouse/ClickHouse/pull/41390) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix possible hung/deadlock on query cancellation (`KILL QUERY` or server shutdown). [#41467](https://github.com/ClickHouse/ClickHouse/pull/41467) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible server crash when using the JBOD feature. This fixes [#41365](https://github.com/ClickHouse/ClickHouse/issues/41365). [#41483](https://github.com/ClickHouse/ClickHouse/pull/41483) ([Amos Bird](https://github.com/amosbird)). +* Fix conversion from nullable fixed string to string. [#41541](https://github.com/ClickHouse/ClickHouse/pull/41541) ([Duc Canh Le](https://github.com/canhld94)). +* Prevent crash when passing wrong aggregation states to groupBitmap*. [#41563](https://github.com/ClickHouse/ClickHouse/pull/41563) ([Raúl Marín](https://github.com/Algunenano)). +* Queries with `ORDER BY` and `1500 <= LIMIT <= max_block_size` could return incorrect result with missing rows from top. Fixes [#41182](https://github.com/ClickHouse/ClickHouse/issues/41182). [#41576](https://github.com/ClickHouse/ClickHouse/pull/41576) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix read bytes/rows in X-ClickHouse-Summary with materialized views. [#41586](https://github.com/ClickHouse/ClickHouse/pull/41586) ([Raúl Marín](https://github.com/Algunenano)). +* Fix possible `pipeline stuck` exception for queries with `OFFSET`. The error was found with `enable_optimize_predicate_expression = 0` and always false condition in `WHERE`. Fixes [#41383](https://github.com/ClickHouse/ClickHouse/issues/41383). [#41588](https://github.com/ClickHouse/ClickHouse/pull/41588) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + + ### ClickHouse release 22.8, 2022-08-18 #### Backward Incompatible Change diff --git a/CMakeLists.txt b/CMakeLists.txt index dbbec2a600d..c737046a5f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ include (cmake/target.cmake) include (cmake/tools.cmake) include (cmake/ccache.cmake) include (cmake/clang_tidy.cmake) -include (cmake/git_status.cmake) +include (cmake/git.cmake) # Ignore export() since we don't use it, # but it gets broken with a global targets via link_libraries() @@ -143,6 +143,8 @@ include (cmake/add_warning.cmake) if (COMPILER_CLANG) # generate ranges for fast "addr2line" search if (NOT CMAKE_BUILD_TYPE_UC STREQUAL "RELEASE") + # NOTE: that clang has a bug because of it does not emit .debug_aranges + # with ThinLTO, so custom ld.lld wrapper is shipped in docker images. set(COMPILER_FLAGS "${COMPILER_FLAGS} -gdwarf-aranges") endif () diff --git a/README.md b/README.md index b173add94e3..49aed14f719 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,5 @@ ClickHouse® is an open-source column-oriented database management system that a * [Contacts](https://clickhouse.com/company/contact) can help to get your questions answered if there are any. ## Upcoming events -* [**v22.8 Release Webinar**](https://clickhouse.com/company/events/v22-8-release-webinar) Original creator, co-founder, and CTO of ClickHouse Alexey Milovidov will walk us through the highlights of the release, provide live demos, and share vision into what is coming in the roadmap. +* [**v22.9 Release Webinar**](https://clickhouse.com/company/events/v22-9-release-webinar) Original creator, co-founder, and CTO of ClickHouse Alexey Milovidov will walk us through the highlights of the release, provide live demos, and share vision into what is coming in the roadmap. +* [**ClickHouse for Analytics @ Barracuda Networks**](https://www.meetup.com/clickhouse-silicon-valley-meetup-group/events/288140358/) Join us for this in person meetup hosted by our friends at Barracuda in Bay Area. diff --git a/base/base/CachedFn.h b/base/base/CachedFn.h deleted file mode 100644 index 19b2a8ce2c0..00000000000 --- a/base/base/CachedFn.h +++ /dev/null @@ -1,75 +0,0 @@ -#pragma once - -#include -#include -#include -#include "FnTraits.h" - -/** - * Caching proxy for a functor that decays to a pointer-to-function. - * Saves pairs (func args, func result on args). - * Cache size is unlimited. Cache items are evicted only on manual drop. - * Invocation/update is O(log(saved cache values)). - * - * See Common/tests/cached_fn.cpp for examples. - */ -template -struct CachedFn -{ -private: - using Traits = FnTraits; - using DecayedArgs = TypeListMap; - using Key = TypeListChangeRoot; - using Result = typename Traits::Ret; - - std::map cache; // Can't use hashmap as tuples are unhashable by default - mutable std::mutex mutex; - -public: - template - Result operator()(Args && ...args) - { - Key key{std::forward(args)...}; - - { - std::lock_guard lock(mutex); - - if (auto it = cache.find(key); it != cache.end()) - return it->second; - } - - Result res = std::apply(Func, key); - - { - std::lock_guard lock(mutex); - cache.emplace(std::move(key), res); - } - - return res; - } - - template - void update(Args && ...args) - { - Key key{std::forward(args)...}; - Result res = std::apply(Func, key); - - { - std::lock_guard lock(mutex); - // TODO Can't use emplace(std::move(key), ..), causes test_host_ip_change errors. - cache[key] = std::move(res); - } - } - - size_t size() const - { - std::lock_guard lock(mutex); - return cache.size(); - } - - void drop() - { - std::lock_guard lock(mutex); - cache.clear(); - } -}; diff --git a/base/base/JSON.cpp b/base/base/JSON.cpp index 92350ea0e18..315bcce38da 100644 --- a/base/base/JSON.cpp +++ b/base/base/JSON.cpp @@ -22,7 +22,7 @@ POCO_IMPLEMENT_EXCEPTION(JSONException, Poco::Exception, "JSONException") // NOL #endif -/// Прочитать беззнаковое целое в простом формате из не-0-terminated строки. +/// Read unsigned integer in a simple form from a non-0-terminated string. static UInt64 readUIntText(const char * buf, const char * end) { UInt64 x = 0; @@ -59,7 +59,7 @@ static UInt64 readUIntText(const char * buf, const char * end) } -/// Прочитать знаковое целое в простом формате из не-0-terminated строки. +/// Read signed integer in a simple form from a non-0-terminated string. static Int64 readIntText(const char * buf, const char * end) { bool negative = false; @@ -102,7 +102,7 @@ static Int64 readIntText(const char * buf, const char * end) } -/// Прочитать число с плавающей запятой в простом формате, с грубым округлением, из не-0-terminated строки. +/// Read floating point number in simple format, imprecisely, from a non-0-terminated string. static double readFloatText(const char * buf, const char * end) { bool negative = false; @@ -151,8 +151,8 @@ static double readFloatText(const char * buf, const char * end) case 'E': { ++buf; - Int32 exponent = readIntText(buf, end); - x *= preciseExp10(exponent); + auto exponent = readIntText(buf, end); + x *= preciseExp10(static_cast(exponent)); run = false; break; @@ -207,7 +207,7 @@ JSON::ElementType JSON::getType() const return TYPE_NUMBER; case '"': { - /// Проверим - это просто строка или name-value pair + /// Is it a string or a name-value pair? Pos after_string = skipString(); if (after_string < ptr_end && *after_string == ':') return TYPE_NAME_VALUE_PAIR; @@ -229,15 +229,13 @@ void JSON::checkPos(Pos pos) const JSON::Pos JSON::skipString() const { - //std::cerr << "skipString()\t" << data() << std::endl; - Pos pos = ptr_begin; checkPos(pos); if (*pos != '"') throw JSONException(std::string("JSON: expected \", got ") + *pos); ++pos; - /// fast path: находим следующую двойную кавычку. Если перед ней нет бэкслеша - значит это конец строки (при допущении корректности JSON). + /// fast path: find next double quote. If it is not escaped by backslash - then it's an end of string (assuming JSON is valid). Pos closing_quote = reinterpret_cast(memchr(reinterpret_cast(pos), '\"', ptr_end - pos)); if (nullptr != closing_quote && closing_quote[-1] != '\\') return closing_quote + 1; @@ -269,8 +267,6 @@ JSON::Pos JSON::skipString() const JSON::Pos JSON::skipNumber() const { - //std::cerr << "skipNumber()\t" << data() << std::endl; - Pos pos = ptr_begin; checkPos(pos); @@ -296,8 +292,6 @@ JSON::Pos JSON::skipNumber() const JSON::Pos JSON::skipBool() const { - //std::cerr << "skipBool()\t" << data() << std::endl; - Pos pos = ptr_begin; checkPos(pos); @@ -314,16 +308,12 @@ JSON::Pos JSON::skipBool() const JSON::Pos JSON::skipNull() const { - //std::cerr << "skipNull()\t" << data() << std::endl; - return ptr_begin + 4; } JSON::Pos JSON::skipNameValuePair() const { - //std::cerr << "skipNameValuePair()\t" << data() << std::endl; - Pos pos = skipString(); checkPos(pos); @@ -338,8 +328,6 @@ JSON::Pos JSON::skipNameValuePair() const JSON::Pos JSON::skipArray() const { - //std::cerr << "skipArray()\t" << data() << std::endl; - if (!isArray()) throw JSONException("JSON: expected ["); Pos pos = ptr_begin; @@ -370,8 +358,6 @@ JSON::Pos JSON::skipArray() const JSON::Pos JSON::skipObject() const { - //std::cerr << "skipObject()\t" << data() << std::endl; - if (!isObject()) throw JSONException("JSON: expected {"); Pos pos = ptr_begin; @@ -402,8 +388,6 @@ JSON::Pos JSON::skipObject() const JSON::Pos JSON::skipElement() const { - //std::cerr << "skipElement()\t" << data() << std::endl; - ElementType type = getType(); switch (type) @@ -640,7 +624,7 @@ std::string JSON::getString() const { throw JSONException("JSON: incorrect syntax: incorrect HEX code."); } - buf.resize(buf.size() + 6); /// максимальный размер UTF8 многобайтовой последовательности + buf.resize(buf.size() + 6); /// Max size of UTF-8 sequence, including pre-standard mapping of UCS-4 to UTF-8. int res = utf8.convert(unicode, reinterpret_cast(const_cast(buf.data())) + buf.size() - 6, 6); if (!res) @@ -754,8 +738,6 @@ JSON::iterator JSON::iterator::begin() const if (type != TYPE_ARRAY && type != TYPE_OBJECT) throw JSONException("JSON: not array or object when calling begin() method."); - //std::cerr << "begin()\t" << data() << std::endl; - Pos pos = ptr_begin + 1; checkPos(pos); if (*pos == '}' || *pos == ']') @@ -846,4 +828,3 @@ bool JSON::isType() const { return isBool(); } - diff --git a/base/base/ReplxxLineReader.cpp b/base/base/ReplxxLineReader.cpp index b7c18110503..916d4f9a74d 100644 --- a/base/base/ReplxxLineReader.cpp +++ b/base/base/ReplxxLineReader.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -13,8 +14,10 @@ #include #include #include +#include #include - +#include +#include /// is_any_of namespace { @@ -35,6 +38,166 @@ std::string getEditor() return editor; } +std::string getFuzzyFinder() +{ + const char * env_path = std::getenv("PATH"); // NOLINT(concurrency-mt-unsafe) + + if (!env_path || !*env_path) + return {}; + + std::vector paths; + boost::split(paths, env_path, boost::is_any_of(":")); + for (const auto & path_str : paths) + { + std::filesystem::path path(path_str); + std::filesystem::path sk_bin_path = path / "sk"; + if (!access(sk_bin_path.c_str(), X_OK)) + return sk_bin_path; + + std::filesystem::path fzf_bin_path = path / "fzf"; + if (!access(fzf_bin_path.c_str(), X_OK)) + return fzf_bin_path; + } + + return {}; +} + +/// See comments in ShellCommand::executeImpl() +/// (for the vfork via dlsym()) +int executeCommand(char * const argv[]) +{ +#if !defined(USE_MUSL) + /** Here it is written that with a normal call `vfork`, there is a chance of deadlock in multithreaded programs, + * because of the resolving of symbols in the shared library + * http://www.oracle.com/technetwork/server-storage/solaris10/subprocess-136439.html + * Therefore, separate the resolving of the symbol from the call. + */ + static void * real_vfork = dlsym(RTLD_DEFAULT, "vfork"); +#else + /// If we use Musl with static linking, there is no dlsym and no issue with vfork. + static void * real_vfork = reinterpret_cast(&vfork); +#endif + if (!real_vfork) + throw std::runtime_error("Cannot find vfork symbol"); + + pid_t pid = reinterpret_cast(real_vfork)(); + + if (-1 == pid) + throw std::runtime_error(fmt::format("Cannot vfork {}: {}", argv[0], errnoToString())); + + /// Child + if (0 == pid) + { + sigset_t mask; + sigemptyset(&mask); + sigprocmask(0, nullptr, &mask); // NOLINT(concurrency-mt-unsafe) // ok in newly created process + sigprocmask(SIG_UNBLOCK, &mask, nullptr); // NOLINT(concurrency-mt-unsafe) // ok in newly created process + + execvp(argv[0], argv); + _exit(-1); + } + + int status = 0; + do + { + int exited_pid = waitpid(pid, &status, 0); + if (exited_pid != -1) + break; + + if (errno == EINTR) + continue; + + throw std::runtime_error(fmt::format("Cannot waitpid {}: {}", pid, errnoToString())); + } while (true); + + return status; +} + +void writeRetry(int fd, const std::string & data) +{ + size_t bytes_written = 0; + const char * begin = data.c_str(); + size_t offset = data.size(); + + while (bytes_written != offset) + { + ssize_t res = ::write(fd, begin + bytes_written, offset - bytes_written); + if ((-1 == res || 0 == res) && errno != EINTR) + throw std::runtime_error(fmt::format("Cannot write to {}: {}", fd, errnoToString())); + bytes_written += res; + } +} +std::string readFile(const std::string & path) +{ + std::ifstream t(path); + std::string str; + t.seekg(0, std::ios::end); + str.reserve(t.tellg()); + t.seekg(0, std::ios::beg); + str.assign((std::istreambuf_iterator(t)), std::istreambuf_iterator()); + return str; +} + +/// Simple wrapper for temporary files. +class TemporaryFile +{ +private: + std::string path; + int fd = -1; + +public: + explicit TemporaryFile(const char * pattern) + : path(pattern) + { + size_t dot_pos = path.rfind('.'); + if (dot_pos != std::string::npos) + fd = ::mkstemps(path.data(), path.size() - dot_pos); + else + fd = ::mkstemp(path.data()); + + if (-1 == fd) + throw std::runtime_error(fmt::format("Cannot create temporary file {}: {}", path, errnoToString())); + } + ~TemporaryFile() + { + try + { + close(); + unlink(); + } + catch (const std::runtime_error & e) + { + fmt::print(stderr, "{}", e.what()); + } + } + + void close() + { + if (fd == -1) + return; + + if (0 != ::close(fd)) + throw std::runtime_error(fmt::format("Cannot close temporary file {}: {}", path, errnoToString())); + fd = -1; + } + + void write(const std::string & data) + { + if (fd == -1) + throw std::runtime_error(fmt::format("Cannot write to uninitialized file {}", path)); + + writeRetry(fd, data); + } + + void unlink() + { + if (0 != ::unlink(path.c_str())) + throw std::runtime_error(fmt::format("Cannot remove temporary file {}: {}", path, errnoToString())); + } + + std::string & getPath() { return path; } +}; + /// Copied from replxx::src/util.cxx::now_ms_str() under the terms of 3-clause BSD license of Replxx. /// Copyright (c) 2017-2018, Marcin Konarski (amok at codestation.org) /// Copyright (c) 2010, Salvatore Sanfilippo (antirez at gmail dot com) @@ -142,6 +305,7 @@ ReplxxLineReader::ReplxxLineReader( replxx::Replxx::highlighter_callback_t highlighter_) : LineReader(history_file_path_, multiline_, std::move(extenders_), std::move(delimiters_)), highlighter(std::move(highlighter_)) , editor(getEditor()) + , fuzzy_finder(getFuzzyFinder()) { using namespace std::placeholders; using Replxx = replxx::Replxx; @@ -220,6 +384,46 @@ ReplxxLineReader::ReplxxLineReader( rx.bind_key(Replxx::KEY::control('W'), [this](char32_t code) { return rx.invoke(Replxx::ACTION::KILL_TO_WHITESPACE_ON_LEFT, code); }); rx.bind_key(Replxx::KEY::meta('E'), [this](char32_t) { openEditor(); return Replxx::ACTION_RESULT::CONTINUE; }); + + /// readline insert-comment + auto insert_comment_action = [this](char32_t code) + { + replxx::Replxx::State state(rx.get_state()); + const char * line = state.text(); + const char * line_end = line + strlen(line); + + std::string commented_line; + if (std::find(line, line_end, '\n') != line_end) + { + /// If query has multiple lines, multiline comment is used over + /// commenting each line separately for easier uncomment (though + /// with invoking editor it is simpler to uncomment multiple lines) + /// + /// Note, that using multiline comment is OK even with nested + /// comments, since nested comments are supported. + commented_line = fmt::format("/* {} */", state.text()); + } + else + { + // In a simplest case use simple comment. + commented_line = fmt::format("-- {}", state.text()); + } + rx.set_state(replxx::Replxx::State(commented_line.c_str(), commented_line.size())); + + return rx.invoke(Replxx::ACTION::COMMIT_LINE, code); + }; + rx.bind_key(Replxx::KEY::meta('#'), insert_comment_action); + + /// interactive search in history (requires fzf/sk) + if (!fuzzy_finder.empty()) + { + auto interactive_history_search = [this](char32_t code) + { + openInteractiveHistorySearch(); + return rx.invoke(Replxx::ACTION::REPAINT, code); + }; + rx.bind_key(Replxx::KEY::control('R'), interactive_history_search); + } } ReplxxLineReader::~ReplxxLineReader() @@ -264,116 +468,70 @@ void ReplxxLineReader::addToHistory(const String & line) rx.print("Unlock of history file failed: %s\n", errnoToString().c_str()); } -/// See comments in ShellCommand::executeImpl() -/// (for the vfork via dlsym()) -int ReplxxLineReader::executeEditor(const std::string & path) -{ - std::vector argv0(editor.data(), editor.data() + editor.size() + 1); - std::vector argv1(path.data(), path.data() + path.size() + 1); - char * const argv[] = {argv0.data(), argv1.data(), nullptr}; - - static void * real_vfork = dlsym(RTLD_DEFAULT, "vfork"); - if (!real_vfork) - { - rx.print("Cannot find symbol vfork in myself: %s\n", errnoToString().c_str()); - return -1; - } - - pid_t pid = reinterpret_cast(real_vfork)(); - - if (-1 == pid) - { - rx.print("Cannot vfork: %s\n", errnoToString().c_str()); - return -1; - } - - /// Child - if (0 == pid) - { - sigset_t mask; - sigemptyset(&mask); - sigprocmask(0, nullptr, &mask); // NOLINT(concurrency-mt-unsafe) // ok in newly created process - sigprocmask(SIG_UNBLOCK, &mask, nullptr); // NOLINT(concurrency-mt-unsafe) // ok in newly created process - - execvp(editor.c_str(), argv); - rx.print("Cannot execute %s: %s\n", editor.c_str(), errnoToString().c_str()); - _exit(-1); - } - - int status = 0; - do - { - int exited_pid = waitpid(pid, &status, 0); - if (exited_pid == -1) - { - if (errno == EINTR) - continue; - - rx.print("Cannot waitpid: %s\n", errnoToString().c_str()); - return -1; - } - else - break; - } while (true); - return status; -} - void ReplxxLineReader::openEditor() { - char filename[] = "clickhouse_replxx_XXXXXX.sql"; - int fd = ::mkstemps(filename, 4); - if (-1 == fd) - { - rx.print("Cannot create temporary file to edit query: %s\n", errnoToString().c_str()); - return; - } + TemporaryFile editor_file("clickhouse_client_editor_XXXXXX.sql"); + editor_file.write(rx.get_state().text()); + editor_file.close(); - replxx::Replxx::State state(rx.get_state()); - - size_t bytes_written = 0; - const char * begin = state.text(); - size_t offset = strlen(state.text()); - while (bytes_written != offset) + char * const argv[] = {editor.data(), editor_file.getPath().data(), nullptr}; + try { - ssize_t res = ::write(fd, begin + bytes_written, offset - bytes_written); - if ((-1 == res || 0 == res) && errno != EINTR) + if (executeCommand(argv) == 0) { - rx.print("Cannot write to temporary query file %s: %s\n", filename, errnoToString().c_str()); - break; + const std::string & new_query = readFile(editor_file.getPath()); + rx.set_state(replxx::Replxx::State(new_query.c_str(), new_query.size())); } - bytes_written += res; } - - if (0 != ::close(fd)) + catch (const std::runtime_error & e) { - rx.print("Cannot close temporary query file %s: %s\n", filename, errnoToString().c_str()); - return; - } - - if (0 == executeEditor(filename)) - { - try - { - std::ifstream t(filename); - std::string str; - t.seekg(0, std::ios::end); - str.reserve(t.tellg()); - t.seekg(0, std::ios::beg); - str.assign((std::istreambuf_iterator(t)), std::istreambuf_iterator()); - rx.set_state(replxx::Replxx::State(str.c_str(), str.size())); - } - catch (...) - { - rx.print("Cannot read from temporary query file %s: %s\n", filename, errnoToString().c_str()); - return; - } + rx.print(e.what()); } if (bracketed_paste_enabled) enableBracketedPaste(); +} - if (0 != ::unlink(filename)) - rx.print("Cannot remove temporary query file %s: %s\n", filename, errnoToString().c_str()); +void ReplxxLineReader::openInteractiveHistorySearch() +{ + assert(!fuzzy_finder.empty()); + TemporaryFile history_file("clickhouse_client_history_in_XXXXXX.bin"); + auto hs(rx.history_scan()); + while (hs.next()) + { + history_file.write(hs.get().text()); + history_file.write(std::string(1, '\0')); + } + history_file.close(); + + TemporaryFile output_file("clickhouse_client_history_out_XXXXXX.sql"); + output_file.close(); + + char sh[] = "sh"; + char sh_c[] = "-c"; + /// NOTE: You can use one of the following to configure the behaviour additionally: + /// - SKIM_DEFAULT_OPTIONS + /// - FZF_DEFAULT_OPTS + std::string fuzzy_finder_command = fmt::format( + "{} --read0 --tac --no-sort --tiebreak=index --bind=ctrl-r:toggle-sort --height=30% < {} > {}", + fuzzy_finder, history_file.getPath(), output_file.getPath()); + char * const argv[] = {sh, sh_c, fuzzy_finder_command.data(), nullptr}; + + try + { + if (executeCommand(argv) == 0) + { + const std::string & new_query = readFile(output_file.getPath()); + rx.set_state(replxx::Replxx::State(new_query.c_str(), new_query.size())); + } + } + catch (const std::runtime_error & e) + { + rx.print(e.what()); + } + + if (bracketed_paste_enabled) + enableBracketedPaste(); } void ReplxxLineReader::enableBracketedPaste() diff --git a/base/base/ReplxxLineReader.h b/base/base/ReplxxLineReader.h index b9ec214d02c..fea1405a208 100644 --- a/base/base/ReplxxLineReader.h +++ b/base/base/ReplxxLineReader.h @@ -27,6 +27,7 @@ private: void addToHistory(const String & line) override; int executeEditor(const std::string & path); void openEditor(); + void openInteractiveHistorySearch(); replxx::Replxx rx; replxx::Replxx::highlighter_callback_t highlighter; @@ -36,4 +37,5 @@ private: bool bracketed_paste_enabled = false; std::string editor; + std::string fuzzy_finder; }; diff --git a/base/base/StringRef.h b/base/base/StringRef.h index 14ca2530a33..5ee197021ca 100644 --- a/base/base/StringRef.h +++ b/base/base/StringRef.h @@ -61,11 +61,6 @@ struct StringRef constexpr explicit operator std::string_view() const { return std::string_view(data, size); } }; -/// Here constexpr doesn't implicate inline, see https://www.viva64.com/en/w/v1043/ -/// nullptr can't be used because the StringRef values are used in SipHash's pointer arithmetic -/// and the UBSan thinks that something like nullptr + 8 is UB. -constexpr const inline char empty_string_ref_addr{}; -constexpr const inline StringRef EMPTY_STRING_REF{&empty_string_ref_addr, 0}; using StringRefs = std::vector; @@ -227,7 +222,7 @@ inline UInt64 shiftMix(UInt64 val) return val ^ (val >> 47); } -inline UInt64 rotateByAtLeast1(UInt64 val, int shift) +inline UInt64 rotateByAtLeast1(UInt64 val, UInt8 shift) { return (val >> shift) | (val << (64 - shift)); } @@ -249,7 +244,7 @@ inline size_t hashLessThan8(const char * data, size_t size) uint8_t b = data[size >> 1]; uint8_t c = data[size - 1]; uint32_t y = static_cast(a) + (static_cast(b) << 8); - uint32_t z = size + (static_cast(c) << 2); + uint32_t z = static_cast(size) + (static_cast(c) << 2); return shiftMix(y * k2 ^ z * k3) * k2; } @@ -262,7 +257,7 @@ inline size_t hashLessThan16(const char * data, size_t size) { UInt64 a = unalignedLoad(data); UInt64 b = unalignedLoad(data + size - 8); - return hashLen16(a, rotateByAtLeast1(b + size, size)) ^ b; + return hashLen16(a, rotateByAtLeast1(b + size, static_cast(size))) ^ b; } return hashLessThan8(data, size); diff --git a/base/base/bit_cast.h b/base/base/bit_cast.h index d1246b45590..b2b6915764d 100644 --- a/base/base/bit_cast.h +++ b/base/base/bit_cast.h @@ -5,8 +5,9 @@ #include -/** \brief Returns value `from` converted to type `To` while retaining bit representation. - * `To` and `From` must satisfy `CopyConstructible`. +/** Returns value `from` converted to type `To` while retaining bit representation. + * `To` and `From` must satisfy `CopyConstructible`. + * In contrast to std::bit_cast can cast types of different width. */ template std::decay_t bit_cast(const From & from) @@ -15,13 +16,3 @@ std::decay_t bit_cast(const From & from) memcpy(static_cast(&res), &from, std::min(sizeof(res), sizeof(from))); return res; } - -/** \brief Returns value `from` converted to type `To` while retaining bit representation. - * `To` and `From` must satisfy `CopyConstructible`. - */ -template -std::decay_t safe_bit_cast(const From & from) -{ - static_assert(sizeof(To) == sizeof(From), "bit cast on types of different width"); - return bit_cast(from); -} diff --git a/base/base/getThreadId.cpp b/base/base/getThreadId.cpp index 21167b19d32..b6c22bb8856 100644 --- a/base/base/getThreadId.cpp +++ b/base/base/getThreadId.cpp @@ -22,7 +22,7 @@ uint64_t getThreadId() #if defined(OS_ANDROID) current_tid = gettid(); #elif defined(OS_LINUX) - current_tid = syscall(SYS_gettid); /// This call is always successful. - man gettid + current_tid = static_cast(syscall(SYS_gettid)); /// This call is always successful. - man gettid #elif defined(OS_FREEBSD) current_tid = pthread_getthreadid_np(); #elif defined(OS_SUNOS) diff --git a/base/base/phdr_cache.h b/base/base/phdr_cache.h index b522710c4c4..a6e129db34d 100644 --- a/base/base/phdr_cache.h +++ b/base/base/phdr_cache.h @@ -8,6 +8,7 @@ * As a drawback, this only works if no dynamic object unloading happens after this point. * This function is thread-safe. You should call it to update cache after loading new shared libraries. * Otherwise exception handling from dlopened libraries won't work (will call std::terminate immediately). + * NOTE: dlopen is forbidden in our code. * * NOTE: It is disabled with Thread Sanitizer because TSan can only use original "dl_iterate_phdr" function. */ diff --git a/base/base/shift10.cpp b/base/base/shift10.cpp index db2f4a6963e..5429bcc23b2 100644 --- a/base/base/shift10.cpp +++ b/base/base/shift10.cpp @@ -14,37 +14,37 @@ static T shift10Impl(T x, int exponent) static const long double powers10[] = { 1e-323L, 1e-322L, 1e-321L, 1e-320L, 1e-319L, 1e-318L, 1e-317L, 1e-316L, 1e-315L, 1e-314L, 1e-313L, 1e-312L, 1e-311L, - 1e-310L,1e-309L,1e-308L,1e-307L,1e-306L,1e-305L,1e-304L,1e-303L,1e-302L,1e-301L,1e-300L,1e-299L,1e-298L,1e-297L,1e-296L,1e-295L,1e-294L,1e-293L,1e-292L,1e-291L, - 1e-290L,1e-289L,1e-288L,1e-287L,1e-286L,1e-285L,1e-284L,1e-283L,1e-282L,1e-281L,1e-280L,1e-279L,1e-278L,1e-277L,1e-276L,1e-275L,1e-274L,1e-273L,1e-272L,1e-271L, - 1e-270L,1e-269L,1e-268L,1e-267L,1e-266L,1e-265L,1e-264L,1e-263L,1e-262L,1e-261L,1e-260L,1e-259L,1e-258L,1e-257L,1e-256L,1e-255L,1e-254L,1e-253L,1e-252L,1e-251L, - 1e-250L,1e-249L,1e-248L,1e-247L,1e-246L,1e-245L,1e-244L,1e-243L,1e-242L,1e-241L,1e-240L,1e-239L,1e-238L,1e-237L,1e-236L,1e-235L,1e-234L,1e-233L,1e-232L,1e-231L, - 1e-230L,1e-229L,1e-228L,1e-227L,1e-226L,1e-225L,1e-224L,1e-223L,1e-222L,1e-221L,1e-220L,1e-219L,1e-218L,1e-217L,1e-216L,1e-215L,1e-214L,1e-213L,1e-212L,1e-211L, - 1e-210L,1e-209L,1e-208L,1e-207L,1e-206L,1e-205L,1e-204L,1e-203L,1e-202L,1e-201L,1e-200L,1e-199L,1e-198L,1e-197L,1e-196L,1e-195L,1e-194L,1e-193L,1e-192L,1e-191L, - 1e-190L,1e-189L,1e-188L,1e-187L,1e-186L,1e-185L,1e-184L,1e-183L,1e-182L,1e-181L,1e-180L,1e-179L,1e-178L,1e-177L,1e-176L,1e-175L,1e-174L,1e-173L,1e-172L,1e-171L, - 1e-170L,1e-169L,1e-168L,1e-167L,1e-166L,1e-165L,1e-164L,1e-163L,1e-162L,1e-161L,1e-160L,1e-159L,1e-158L,1e-157L,1e-156L,1e-155L,1e-154L,1e-153L,1e-152L,1e-151L, - 1e-150L,1e-149L,1e-148L,1e-147L,1e-146L,1e-145L,1e-144L,1e-143L,1e-142L,1e-141L,1e-140L,1e-139L,1e-138L,1e-137L,1e-136L,1e-135L,1e-134L,1e-133L,1e-132L,1e-131L, - 1e-130L,1e-129L,1e-128L,1e-127L,1e-126L,1e-125L,1e-124L,1e-123L,1e-122L,1e-121L,1e-120L,1e-119L,1e-118L,1e-117L,1e-116L,1e-115L,1e-114L,1e-113L,1e-112L,1e-111L, - 1e-110L,1e-109L,1e-108L,1e-107L,1e-106L,1e-105L,1e-104L,1e-103L,1e-102L,1e-101L,1e-100L,1e-99L,1e-98L,1e-97L,1e-96L,1e-95L,1e-94L,1e-93L,1e-92L,1e-91L,1e-90L, - 1e-89L,1e-88L,1e-87L,1e-86L,1e-85L,1e-84L,1e-83L,1e-82L,1e-81L,1e-80L,1e-79L,1e-78L,1e-77L,1e-76L,1e-75L,1e-74L,1e-73L,1e-72L,1e-71L,1e-70, - 1e-69L,1e-68L,1e-67L,1e-66L,1e-65L,1e-64L,1e-63L,1e-62L,1e-61L,1e-60L,1e-59L,1e-58L,1e-57L,1e-56L,1e-55L,1e-54L,1e-53L,1e-52L,1e-51L,1e-50, - 1e-49L,1e-48L,1e-47L,1e-46L,1e-45L,1e-44L,1e-43L,1e-42L,1e-41L,1e-40L,1e-39L,1e-38L,1e-37L,1e-36L,1e-35L,1e-34L,1e-33L,1e-32L,1e-31L,1e-30, - 1e-29L,1e-28L,1e-27L,1e-26L,1e-25L,1e-24L,1e-23L,1e-22L,1e-21L,1e-20L,1e-19L,1e-18L,1e-17L,1e-16L,1e-15L,1e-14L,1e-13L,1e-12L,1e-11L,1e-10, - 1e-9L,1e-8L,1e-7L,1e-6L,1e-5L,1e-4L,1e-3L,1e-2L,1e-1L,1e0L,1e1L,1e2L,1e3L,1e4L,1e5L,1e6L,1e7L,1e8L,1e9L,1e10, - 1e11L,1e12L,1e13L,1e14L,1e15L,1e16L,1e17L,1e18L,1e19L,1e20L,1e21L,1e22L,1e23L,1e24L,1e25L,1e26L,1e27L,1e28L,1e29L,1e30, - 1e31L,1e32L,1e33L,1e34L,1e35L,1e36L,1e37L,1e38L,1e39L,1e40L,1e41L,1e42L,1e43L,1e44L,1e45L,1e46L,1e47L,1e48L,1e49L,1e50, - 1e51L,1e52L,1e53L,1e54L,1e55L,1e56L,1e57L,1e58L,1e59L,1e60L,1e61L,1e62L,1e63L,1e64L,1e65L,1e66L,1e67L,1e68L,1e69L,1e70, - 1e71L,1e72L,1e73L,1e74L,1e75L,1e76L,1e77L,1e78L,1e79L,1e80L,1e81L,1e82L,1e83L,1e84L,1e85L,1e86L,1e87L,1e88L,1e89L,1e90, - 1e91L,1e92L,1e93L,1e94L,1e95L,1e96L,1e97L,1e98L,1e99L,1e100L,1e101L,1e102L,1e103L,1e104L,1e105L,1e106L,1e107L,1e108L,1e109L,1e110, - 1e111L,1e112L,1e113L,1e114L,1e115L,1e116L,1e117L,1e118L,1e119L,1e120L,1e121L,1e122L,1e123L,1e124L,1e125L,1e126L,1e127L,1e128L,1e129L,1e130, - 1e131L,1e132L,1e133L,1e134L,1e135L,1e136L,1e137L,1e138L,1e139L,1e140L,1e141L,1e142L,1e143L,1e144L,1e145L,1e146L,1e147L,1e148L,1e149L,1e150, - 1e151L,1e152L,1e153L,1e154L,1e155L,1e156L,1e157L,1e158L,1e159L,1e160L,1e161L,1e162L,1e163L,1e164L,1e165L,1e166L,1e167L,1e168L,1e169L,1e170, - 1e171L,1e172L,1e173L,1e174L,1e175L,1e176L,1e177L,1e178L,1e179L,1e180L,1e181L,1e182L,1e183L,1e184L,1e185L,1e186L,1e187L,1e188L,1e189L,1e190, - 1e191L,1e192L,1e193L,1e194L,1e195L,1e196L,1e197L,1e198L,1e199L,1e200L,1e201L,1e202L,1e203L,1e204L,1e205L,1e206L,1e207L,1e208L,1e209L,1e210, - 1e211L,1e212L,1e213L,1e214L,1e215L,1e216L,1e217L,1e218L,1e219L,1e220L,1e221L,1e222L,1e223L,1e224L,1e225L,1e226L,1e227L,1e228L,1e229L,1e230, - 1e231L,1e232L,1e233L,1e234L,1e235L,1e236L,1e237L,1e238L,1e239L,1e240L,1e241L,1e242L,1e243L,1e244L,1e245L,1e246L,1e247L,1e248L,1e249L,1e250, - 1e251L,1e252L,1e253L,1e254L,1e255L,1e256L,1e257L,1e258L,1e259L,1e260L,1e261L,1e262L,1e263L,1e264L,1e265L,1e266L,1e267L,1e268L,1e269L,1e270, - 1e271L,1e272L,1e273L,1e274L,1e275L,1e276L,1e277L,1e278L,1e279L,1e280L,1e281L,1e282L,1e283L,1e284L,1e285L,1e286L,1e287L,1e288L,1e289L,1e290, - 1e291L,1e292L,1e293L,1e294L,1e295L,1e296L,1e297L,1e298L,1e299L,1e300L,1e301L,1e302L,1e303L,1e304L,1e305L,1e306L,1e307L,1e308L + 1e-310L, 1e-309L, 1e-308L, 1e-307L, 1e-306L, 1e-305L, 1e-304L, 1e-303L, 1e-302L, 1e-301L, 1e-300L, 1e-299L, 1e-298L, 1e-297L, 1e-296L, 1e-295L, 1e-294L, 1e-293L, 1e-292L, 1e-291L, + 1e-290L, 1e-289L, 1e-288L, 1e-287L, 1e-286L, 1e-285L, 1e-284L, 1e-283L, 1e-282L, 1e-281L, 1e-280L, 1e-279L, 1e-278L, 1e-277L, 1e-276L, 1e-275L, 1e-274L, 1e-273L, 1e-272L, 1e-271L, + 1e-270L, 1e-269L, 1e-268L, 1e-267L, 1e-266L, 1e-265L, 1e-264L, 1e-263L, 1e-262L, 1e-261L, 1e-260L, 1e-259L, 1e-258L, 1e-257L, 1e-256L, 1e-255L, 1e-254L, 1e-253L, 1e-252L, 1e-251L, + 1e-250L, 1e-249L, 1e-248L, 1e-247L, 1e-246L, 1e-245L, 1e-244L, 1e-243L, 1e-242L, 1e-241L, 1e-240L, 1e-239L, 1e-238L, 1e-237L, 1e-236L, 1e-235L, 1e-234L, 1e-233L, 1e-232L, 1e-231L, + 1e-230L, 1e-229L, 1e-228L, 1e-227L, 1e-226L, 1e-225L, 1e-224L, 1e-223L, 1e-222L, 1e-221L, 1e-220L, 1e-219L, 1e-218L, 1e-217L, 1e-216L, 1e-215L, 1e-214L, 1e-213L, 1e-212L, 1e-211L, + 1e-210L, 1e-209L, 1e-208L, 1e-207L, 1e-206L, 1e-205L, 1e-204L, 1e-203L, 1e-202L, 1e-201L, 1e-200L, 1e-199L, 1e-198L, 1e-197L, 1e-196L, 1e-195L, 1e-194L, 1e-193L, 1e-192L, 1e-191L, + 1e-190L, 1e-189L, 1e-188L, 1e-187L, 1e-186L, 1e-185L, 1e-184L, 1e-183L, 1e-182L, 1e-181L, 1e-180L, 1e-179L, 1e-178L, 1e-177L, 1e-176L, 1e-175L, 1e-174L, 1e-173L, 1e-172L, 1e-171L, + 1e-170L, 1e-169L, 1e-168L, 1e-167L, 1e-166L, 1e-165L, 1e-164L, 1e-163L, 1e-162L, 1e-161L, 1e-160L, 1e-159L, 1e-158L, 1e-157L, 1e-156L, 1e-155L, 1e-154L, 1e-153L, 1e-152L, 1e-151L, + 1e-150L, 1e-149L, 1e-148L, 1e-147L, 1e-146L, 1e-145L, 1e-144L, 1e-143L, 1e-142L, 1e-141L, 1e-140L, 1e-139L, 1e-138L, 1e-137L, 1e-136L, 1e-135L, 1e-134L, 1e-133L, 1e-132L, 1e-131L, + 1e-130L, 1e-129L, 1e-128L, 1e-127L, 1e-126L, 1e-125L, 1e-124L, 1e-123L, 1e-122L, 1e-121L, 1e-120L, 1e-119L, 1e-118L, 1e-117L, 1e-116L, 1e-115L, 1e-114L, 1e-113L, 1e-112L, 1e-111L, + 1e-110L, 1e-109L, 1e-108L, 1e-107L, 1e-106L, 1e-105L, 1e-104L, 1e-103L, 1e-102L, 1e-101L, 1e-100L, 1e-99L, 1e-98L, 1e-97L, 1e-96L, 1e-95L, 1e-94L, 1e-93L, 1e-92L, 1e-91L, 1e-90L, + 1e-89L, 1e-88L, 1e-87L, 1e-86L, 1e-85L, 1e-84L, 1e-83L, 1e-82L, 1e-81L, 1e-80L, 1e-79L, 1e-78L, 1e-77L, 1e-76L, 1e-75L, 1e-74L, 1e-73L, 1e-72L, 1e-71L, 1e-70, + 1e-69L, 1e-68L, 1e-67L, 1e-66L, 1e-65L, 1e-64L, 1e-63L, 1e-62L, 1e-61L, 1e-60L, 1e-59L, 1e-58L, 1e-57L, 1e-56L, 1e-55L, 1e-54L, 1e-53L, 1e-52L, 1e-51L, 1e-50, + 1e-49L, 1e-48L, 1e-47L, 1e-46L, 1e-45L, 1e-44L, 1e-43L, 1e-42L, 1e-41L, 1e-40L, 1e-39L, 1e-38L, 1e-37L, 1e-36L, 1e-35L, 1e-34L, 1e-33L, 1e-32L, 1e-31L, 1e-30, + 1e-29L, 1e-28L, 1e-27L, 1e-26L, 1e-25L, 1e-24L, 1e-23L, 1e-22L, 1e-21L, 1e-20L, 1e-19L, 1e-18L, 1e-17L, 1e-16L, 1e-15L, 1e-14L, 1e-13L, 1e-12L, 1e-11L, 1e-10, + 1e-9L, 1e-8L, 1e-7L, 1e-6L, 1e-5L, 1e-4L, 1e-3L, 1e-2L, 1e-1L, 1e0L, 1e1L, 1e2L, 1e3L, 1e4L, 1e5L, 1e6L, 1e7L, 1e8L, 1e9L, 1e10, + 1e11L, 1e12L, 1e13L, 1e14L, 1e15L, 1e16L, 1e17L, 1e18L, 1e19L, 1e20L, 1e21L, 1e22L, 1e23L, 1e24L, 1e25L, 1e26L, 1e27L, 1e28L, 1e29L, 1e30, + 1e31L, 1e32L, 1e33L, 1e34L, 1e35L, 1e36L, 1e37L, 1e38L, 1e39L, 1e40L, 1e41L, 1e42L, 1e43L, 1e44L, 1e45L, 1e46L, 1e47L, 1e48L, 1e49L, 1e50, + 1e51L, 1e52L, 1e53L, 1e54L, 1e55L, 1e56L, 1e57L, 1e58L, 1e59L, 1e60L, 1e61L, 1e62L, 1e63L, 1e64L, 1e65L, 1e66L, 1e67L, 1e68L, 1e69L, 1e70, + 1e71L, 1e72L, 1e73L, 1e74L, 1e75L, 1e76L, 1e77L, 1e78L, 1e79L, 1e80L, 1e81L, 1e82L, 1e83L, 1e84L, 1e85L, 1e86L, 1e87L, 1e88L, 1e89L, 1e90, + 1e91L, 1e92L, 1e93L, 1e94L, 1e95L, 1e96L, 1e97L, 1e98L, 1e99L, 1e100L, 1e101L, 1e102L, 1e103L, 1e104L, 1e105L, 1e106L, 1e107L, 1e108L, 1e109L, 1e110, + 1e111L, 1e112L, 1e113L, 1e114L, 1e115L, 1e116L, 1e117L, 1e118L, 1e119L, 1e120L, 1e121L, 1e122L, 1e123L, 1e124L, 1e125L, 1e126L, 1e127L, 1e128L, 1e129L, 1e130, + 1e131L, 1e132L, 1e133L, 1e134L, 1e135L, 1e136L, 1e137L, 1e138L, 1e139L, 1e140L, 1e141L, 1e142L, 1e143L, 1e144L, 1e145L, 1e146L, 1e147L, 1e148L, 1e149L, 1e150, + 1e151L, 1e152L, 1e153L, 1e154L, 1e155L, 1e156L, 1e157L, 1e158L, 1e159L, 1e160L, 1e161L, 1e162L, 1e163L, 1e164L, 1e165L, 1e166L, 1e167L, 1e168L, 1e169L, 1e170, + 1e171L, 1e172L, 1e173L, 1e174L, 1e175L, 1e176L, 1e177L, 1e178L, 1e179L, 1e180L, 1e181L, 1e182L, 1e183L, 1e184L, 1e185L, 1e186L, 1e187L, 1e188L, 1e189L, 1e190, + 1e191L, 1e192L, 1e193L, 1e194L, 1e195L, 1e196L, 1e197L, 1e198L, 1e199L, 1e200L, 1e201L, 1e202L, 1e203L, 1e204L, 1e205L, 1e206L, 1e207L, 1e208L, 1e209L, 1e210, + 1e211L, 1e212L, 1e213L, 1e214L, 1e215L, 1e216L, 1e217L, 1e218L, 1e219L, 1e220L, 1e221L, 1e222L, 1e223L, 1e224L, 1e225L, 1e226L, 1e227L, 1e228L, 1e229L, 1e230, + 1e231L, 1e232L, 1e233L, 1e234L, 1e235L, 1e236L, 1e237L, 1e238L, 1e239L, 1e240L, 1e241L, 1e242L, 1e243L, 1e244L, 1e245L, 1e246L, 1e247L, 1e248L, 1e249L, 1e250, + 1e251L, 1e252L, 1e253L, 1e254L, 1e255L, 1e256L, 1e257L, 1e258L, 1e259L, 1e260L, 1e261L, 1e262L, 1e263L, 1e264L, 1e265L, 1e266L, 1e267L, 1e268L, 1e269L, 1e270, + 1e271L, 1e272L, 1e273L, 1e274L, 1e275L, 1e276L, 1e277L, 1e278L, 1e279L, 1e280L, 1e281L, 1e282L, 1e283L, 1e284L, 1e285L, 1e286L, 1e287L, 1e288L, 1e289L, 1e290, + 1e291L, 1e292L, 1e293L, 1e294L, 1e295L, 1e296L, 1e297L, 1e298L, 1e299L, 1e300L, 1e301L, 1e302L, 1e303L, 1e304L, 1e305L, 1e306L, 1e307L, 1e308L }; if (unlikely(exponent < min_exponent)) /// Note: there are some values below MIN_EXPONENT that is greater than zero. @@ -52,7 +52,7 @@ static T shift10Impl(T x, int exponent) else if (unlikely(exponent > max_exponent)) x *= std::numeric_limits::infinity(); /// Multiplying to keep the sign of infinity. else - x *= powers10[exponent - min_exponent]; + x *= static_cast(powers10[exponent - min_exponent]); return x; } @@ -68,12 +68,12 @@ float shift10(float x, int exponent) return shift10Impl(x, exponent); } -double shift10(UInt64 x, int exponent) +long double shift10(UInt64 x, int exponent) { return shift10Impl(static_cast(x), exponent); } -double shift10(Int64 x, int exponent) +long double shift10(Int64 x, int exponent) { return shift10Impl(static_cast(x), exponent); } diff --git a/base/base/shift10.h b/base/base/shift10.h index 0f54d1f2988..2332194591b 100644 --- a/base/base/shift10.h +++ b/base/base/shift10.h @@ -12,5 +12,5 @@ double shift10(double x, int exponent); float shift10(float x, int exponent); -double shift10(UInt64 x, int exponent); -double shift10(Int64 x, int exponent); +long double shift10(UInt64 x, int exponent); +long double shift10(Int64 x, int exponent); diff --git a/base/base/terminalColors.cpp b/base/base/terminalColors.cpp index 4c2013c6499..fbb0e28a193 100644 --- a/base/base/terminalColors.cpp +++ b/base/base/terminalColors.cpp @@ -11,12 +11,12 @@ std::string setColor(UInt64 hash) /// It still looks awesome. UInt8 y = 128; - UInt8 cb = hash % 256; - UInt8 cr = hash / 256 % 256; + UInt8 cb = static_cast(hash % 256); + UInt8 cr = static_cast(hash / 256 % 256); - UInt8 r = std::max(0.0, std::min(255.0, y + 1.402 * (cr - 128))); - UInt8 g = std::max(0.0, std::min(255.0, y - 0.344136 * (cb - 128) - 0.714136 * (cr - 128))); - UInt8 b = std::max(0.0, std::min(255.0, y + 1.772 * (cb - 128))); + UInt8 r = static_cast(std::max(0.0, std::min(255.0, y + 1.402 * (cr - 128)))); + UInt8 g = static_cast(std::max(0.0, std::min(255.0, y - 0.344136 * (cb - 128) - 0.714136 * (cr - 128)))); + UInt8 b = static_cast(std::max(0.0, std::min(255.0, y + 1.772 * (cb - 128)))); /// ANSI escape sequence to set 24-bit foreground font color in terminal. return "\033[38;2;" + std::to_string(r) + ";" + std::to_string(g) + ";" + std::to_string(b) + "m"; diff --git a/base/base/wide_integer_impl.h b/base/base/wide_integer_impl.h index 5e32b286871..eb2edcb98ff 100644 --- a/base/base/wide_integer_impl.h +++ b/base/base/wide_integer_impl.h @@ -453,7 +453,7 @@ private: if constexpr (sizeof(T) <= sizeof(base_type)) { if (0 == idx) - return x; + return static_cast(x); } else if (idx * sizeof(base_type) < sizeof(T)) return x >> (idx * base_bits); // & std::numeric_limits::max() @@ -1239,13 +1239,13 @@ constexpr integer::operator long double() const noexcept template constexpr integer::operator double() const noexcept { - return static_cast(*this); + return static_cast(static_cast(*this)); } template constexpr integer::operator float() const noexcept { - return static_cast(*this); + return static_cast(static_cast(*this)); } // Unary operators diff --git a/cmake/autogenerated_versions.txt b/cmake/autogenerated_versions.txt index 5999a089331..9728451f38a 100644 --- a/cmake/autogenerated_versions.txt +++ b/cmake/autogenerated_versions.txt @@ -1,12 +1,12 @@ -# This variables autochanged by release_lib.sh: +# This variables autochanged by tests/ci/version_helper.py: # NOTE: has nothing common with DBMS_TCP_PROTOCOL_VERSION, # only DBMS_TCP_PROTOCOL_VERSION should be incremented on protocol changes. -SET(VERSION_REVISION 54466) +SET(VERSION_REVISION 54467) SET(VERSION_MAJOR 22) -SET(VERSION_MINOR 9) +SET(VERSION_MINOR 10) SET(VERSION_PATCH 1) -SET(VERSION_GITHASH 09a2ff88435f79e5279745bbe1dc0e5e401df38d) -SET(VERSION_DESCRIBE v22.9.1.1-testing) -SET(VERSION_STRING 22.9.1.1) +SET(VERSION_GITHASH 3030d4c7ff09ec44ab07d0a8069ea923227288a1) +SET(VERSION_DESCRIBE v22.10.1.1-testing) +SET(VERSION_STRING 22.10.1.1) # end of autochange diff --git a/cmake/clang_tidy.cmake b/cmake/clang_tidy.cmake index fc25c68b11a..200282234ca 100644 --- a/cmake/clang_tidy.cmake +++ b/cmake/clang_tidy.cmake @@ -3,7 +3,7 @@ option (ENABLE_CLANG_TIDY "Use clang-tidy static analyzer" OFF) if (ENABLE_CLANG_TIDY) - find_program (CLANG_TIDY_PATH NAMES "clang-tidy" "clang-tidy-14" "clang-tidy-13" "clang-tidy-12") + find_program (CLANG_TIDY_PATH NAMES "clang-tidy" "clang-tidy-15" "clang-tidy-14" "clang-tidy-13" "clang-tidy-12") if (CLANG_TIDY_PATH) message(STATUS diff --git a/cmake/cpu_features.cmake b/cmake/cpu_features.cmake index 1fc3c2db804..6707d703372 100644 --- a/cmake/cpu_features.cmake +++ b/cmake/cpu_features.cmake @@ -11,32 +11,89 @@ cmake_push_check_state () # All of them are unrelated to the instruction set at the host machine # (you can compile for newer instruction set on old machines and vice versa). -option (ENABLE_SSSE3 "Use SSSE3 instructions on x86_64" 1) -option (ENABLE_SSE41 "Use SSE4.1 instructions on x86_64" 1) -option (ENABLE_SSE42 "Use SSE4.2 instructions on x86_64" 1) -option (ENABLE_PCLMULQDQ "Use pclmulqdq instructions on x86_64" 1) -option (ENABLE_POPCNT "Use popcnt instructions on x86_64" 1) -option (ENABLE_AVX "Use AVX instructions on x86_64" 0) -option (ENABLE_AVX2 "Use AVX2 instructions on x86_64" 0) -option (ENABLE_AVX512 "Use AVX512 instructions on x86_64" 0) -option (ENABLE_AVX512_VBMI "Use AVX512_VBMI instruction on x86_64 (depends on ENABLE_AVX512)" 0) -option (ENABLE_BMI "Use BMI instructions on x86_64" 0) -option (ENABLE_AVX2_FOR_SPEC_OP "Use avx2 instructions for specific operations on x86_64" 0) -option (ENABLE_AVX512_FOR_SPEC_OP "Use avx512 instructions for specific operations on x86_64" 0) - option (ARCH_NATIVE "Add -march=native compiler flag. This makes your binaries non-portable but more performant code may be generated. This option overrides ENABLE_* options for specific instruction set. Highly not recommended to use." 0) if (ARCH_NATIVE) set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=native") elseif (ARCH_AARCH64) - set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=armv8-a+crc+simd+crypto+dotprod+ssbs") + # ARM publishes almost every year a new revision of it's ISA [1]. Each version comes with new mandatory and optional features from + # which CPU vendors can pick and choose. This creates a lot of variability ... We provide two build "profiles", one for maximum + # compatibility intended to run on all 64-bit ARM hardware released after 2013 (e.g. Raspberry Pi 4), and one for modern ARM server + # CPUs, (e.g. Graviton). + # + # [1] https://en.wikipedia.org/wiki/AArch64 + option (NO_ARMV81_OR_HIGHER "Disable ARMv8.1 or higher on Aarch64 for maximum compatibility with older/embedded hardware." 0) + + if (NO_ARMV81_OR_HIGHER) + # crc32 is optional in v8.0 and mandatory in v8.1. Enable it as __crc32()* is used in lot's of places and even very old ARM CPUs + # support it. + set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=armv8+crc") + else () + # ARMv8.2 is quite ancient but the lowest common denominator supported by both Graviton 2 and 3 processors [1]. In particular, it + # includes LSE (made mandatory with ARMv8.1) which provides nice speedups without having to fall back to compat flag + # "-moutline-atomics" for v8.0 [2, 3, 4] that requires a recent glibc with runtime dispatch helper, limiting our ability to run on + # old OSs. + # + # simd: NEON, introduced as optional in v8.0, A few extensions were added with v8.1 but it's still not mandatory. Enables the + # compiler to auto-vectorize. + # sve: Scalable Vector Extensions, introduced as optional in v8.2. Available in Graviton 3 but not in Graviton 2, and most likely + # also not in CI machines. Compiler support for autovectorization is rudimentary at the time of writing, see [5]. Can be + # enabled one-fine-day (TM) but not now. + # ssbs: "Speculative Store Bypass Safe". Optional in v8.0, mandatory in v8.5. Meltdown/spectre countermeasure. + # crypto: SHA1, SHA256, AES. Optional in v8.0. In v8.4, further algorithms were added but it's still optional, see [6]. + # dotprod: Scalar vector product (SDOT and UDOT instructions). Probably the most obscure extra flag with doubtful performance benefits + # but it has been activated since always, so why not enable it. It's not 100% clear in which revision this flag was + # introduced as optional, either in v8.2 [7] or in v8.4 [8]. + # ldapr: Load-Acquire RCpc Register. Better support of release/acquire of atomics. Good for allocators and high contention code. + # Optional in v8.2, mandatory in v8.3 [9]. Supported in Graviton 2+, Azure and GCP instances. Generated from clang 15. + # + # [1] https://github.com/aws/aws-graviton-getting-started/blob/main/c-c%2B%2B.md + # [2] https://community.arm.com/arm-community-blogs/b/tools-software-ides-blog/posts/making-the-most-of-the-arm-architecture-in-gcc-10 + # [3] https://mysqlonarm.github.io/ARM-LSE-and-MySQL/ + # [4] https://dev.to/aws-builders/large-system-extensions-for-aws-graviton-processors-3eci + # [5] https://developer.arm.com/tools-and-software/open-source-software/developer-tools/llvm-toolchain/sve-support + # [6] https://developer.arm.com/documentation/100067/0612/armclang-Command-line-Options/-mcpu?lang=en + # [7] https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html + # [8] https://developer.arm.com/documentation/102651/a/What-are-dot-product-intructions- + # [9] https://developer.arm.com/documentation/dui0801/g/A64-Data-Transfer-Instructions/LDAPR?lang=en + set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=armv8.2-a+simd+crypto+dotprod+ssbs -Xclang=-target-feature -Xclang=+ldapr -Wno-unused-command-line-argument") + endif () elseif (ARCH_PPC64LE) # Note that gcc and clang have support for x86 SSE2 intrinsics when building for PowerPC set (COMPILER_FLAGS "${COMPILER_FLAGS} -maltivec -mcpu=power8 -D__SSE2__=1 -DNO_WARN_X86_INTRINSICS") elseif (ARCH_AMD64) + option (ENABLE_SSSE3 "Use SSSE3 instructions on x86_64" 1) + option (ENABLE_SSE41 "Use SSE4.1 instructions on x86_64" 1) + option (ENABLE_SSE42 "Use SSE4.2 instructions on x86_64" 1) + option (ENABLE_PCLMULQDQ "Use pclmulqdq instructions on x86_64" 1) + option (ENABLE_POPCNT "Use popcnt instructions on x86_64" 1) + option (ENABLE_AVX "Use AVX instructions on x86_64" 0) + option (ENABLE_AVX2 "Use AVX2 instructions on x86_64" 0) + option (ENABLE_AVX512 "Use AVX512 instructions on x86_64" 0) + option (ENABLE_AVX512_VBMI "Use AVX512_VBMI instruction on x86_64 (depends on ENABLE_AVX512)" 0) + option (ENABLE_BMI "Use BMI instructions on x86_64" 0) + option (ENABLE_AVX2_FOR_SPEC_OP "Use avx2 instructions for specific operations on x86_64" 0) + option (ENABLE_AVX512_FOR_SPEC_OP "Use avx512 instructions for specific operations on x86_64" 0) + + option (NO_SSE3_OR_HIGHER "Disable SSE3 or higher on x86_64 for maximum compatibility with older/embedded hardware." 0) + if (NO_SSE3_OR_HIGHER) + SET(ENABLE_SSSE3 0) + SET(ENABLE_SSE41 0) + SET(ENABLE_SSE42 0) + SET(ENABLE_PCLMULQDQ 0) + SET(ENABLE_POPCNT 0) + SET(ENABLE_AVX 0) + SET(ENABLE_AVX2 0) + SET(ENABLE_AVX512 0) + SET(ENABLE_AVX512_VBMI 0) + SET(ENABLE_BMI 0) + SET(ENABLE_AVX2_FOR_SPEC_OP 0) + SET(ENABLE_AVX512_FOR_SPEC_OP 0) + endif() + set (TEST_FLAG "-mssse3") set (CMAKE_REQUIRED_FLAGS "${TEST_FLAG} -O0") check_cxx_source_compiles(" diff --git a/cmake/git.cmake b/cmake/git.cmake new file mode 100644 index 00000000000..397ec3cd081 --- /dev/null +++ b/cmake/git.cmake @@ -0,0 +1,42 @@ +find_package(Git) + +# Make basic Git information available as variables. Such data will later be embedded into the build, e.g. for view SYSTEM.BUILD_OPTIONS. +if (Git_FOUND) + # Commit hash + whether the building workspace was dirty or not + execute_process(COMMAND + "${GIT_EXECUTABLE}" rev-parse HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_HASH + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + + # Branch name + execute_process(COMMAND + "${GIT_EXECUTABLE}" rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_BRANCH + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + + # Date of the commit + SET(ENV{TZ} "UTC") + execute_process(COMMAND + "${GIT_EXECUTABLE}" log -1 --format=%ad --date=iso-local + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_DATE + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + + # Subject of the commit + execute_process(COMMAND + "${GIT_EXECUTABLE}" log -1 --format=%s + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_SUBJECT + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + + message(STATUS "Git HEAD commit hash: ${GIT_HASH}") + + execute_process( + COMMAND ${GIT_EXECUTABLE} status + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_STRIP_TRAILING_WHITESPACE) +else() + message(STATUS "Git could not be found.") +endif() + diff --git a/cmake/git_status.cmake b/cmake/git_status.cmake deleted file mode 100644 index c1047c0ccbf..00000000000 --- a/cmake/git_status.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# 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} OUTPUT_STRIP_TRAILING_WHITESPACE) - -else() - message(STATUS "Git could not be found.") -endif() diff --git a/cmake/ld.lld.in b/cmake/ld.lld.in new file mode 100755 index 00000000000..9736dab1bc3 --- /dev/null +++ b/cmake/ld.lld.in @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +# This is a workaround for bug in llvm/clang, +# that does not produce .debug_aranges with LTO +# +# NOTE: this is a temporary solution, that should be removed once [1] will be +# resolved. +# +# [1]: https://discourse.llvm.org/t/clang-does-not-produce-full-debug-aranges-section-with-thinlto/64898/8 + +# NOTE: only -flto=thin is supported. +# NOTE: it is not possible to check was there -gdwarf-aranges initially or not. +if [[ "$*" =~ -plugin-opt=thinlto ]]; then + exec "@LLD_PATH@" -mllvm -generate-arange-section "$@" +else + exec "@LLD_PATH@" "$@" +fi diff --git a/cmake/split_debug_symbols.cmake b/cmake/split_debug_symbols.cmake index 12182ed9c20..a9c2158359a 100644 --- a/cmake/split_debug_symbols.cmake +++ b/cmake/split_debug_symbols.cmake @@ -20,7 +20,7 @@ macro(clickhouse_split_debug_symbols) COMMAND mkdir -p "${STRIP_DESTINATION_DIR}/bin" COMMAND cp "${STRIP_BINARY_PATH}" "${STRIP_DESTINATION_DIR}/bin/${STRIP_TARGET}" # Splits debug symbols into separate file, leaves the binary untouched: - COMMAND "${OBJCOPY_PATH}" --only-keep-debug --compress-debug-sections "${STRIP_DESTINATION_DIR}/bin/${STRIP_TARGET}" "${STRIP_DESTINATION_DIR}/lib/debug/bin/${STRIP_TARGET}.debug" + COMMAND "${OBJCOPY_PATH}" --only-keep-debug "${STRIP_DESTINATION_DIR}/bin/${STRIP_TARGET}" "${STRIP_DESTINATION_DIR}/lib/debug/bin/${STRIP_TARGET}.debug" COMMAND chmod 0644 "${STRIP_DESTINATION_DIR}/lib/debug/bin/${STRIP_TARGET}.debug" # Strips binary, sections '.note' & '.comment' are removed in line with Debian's stripping policy: www.debian.org/doc/debian-policy/ch-files.html, section '.clickhouse.hash' is needed for integrity check: COMMAND "${STRIP_PATH}" --remove-section=.comment --remove-section=.note --keep-section=.clickhouse.hash "${STRIP_DESTINATION_DIR}/bin/${STRIP_TARGET}" diff --git a/cmake/target.cmake b/cmake/target.cmake index 0fb5e8a20de..ae360758701 100644 --- a/cmake/target.cmake +++ b/cmake/target.cmake @@ -45,6 +45,7 @@ if (CMAKE_CROSSCOMPILING) endif () if (USE_MUSL) + # use of undeclared identifier 'PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' set (ENABLE_SENTRY OFF CACHE INTERNAL "") set (ENABLE_ODBC OFF CACHE INTERNAL "") set (ENABLE_GRPC OFF CACHE INTERNAL "") diff --git a/cmake/tools.cmake b/cmake/tools.cmake index 5b005a6f1f9..57d39899a40 100644 --- a/cmake/tools.cmake +++ b/cmake/tools.cmake @@ -94,8 +94,13 @@ if (LINKER_NAME) if (NOT LLD_PATH) message (FATAL_ERROR "Using linker ${LINKER_NAME} but can't find its path.") endif () - set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --ld-path=${LLD_PATH}") - set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --ld-path=${LLD_PATH}") + + # This a temporary quirk to emit .debug_aranges with ThinLTO + set (LLD_WRAPPER "${CMAKE_CURRENT_BINARY_DIR}/ld.lld") + configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/cmake/ld.lld.in" "${LLD_WRAPPER}" @ONLY) + + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --ld-path=${LLD_WRAPPER}") + set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --ld-path=${LLD_WRAPPER}") else () set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=${LINKER_NAME}") set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=${LINKER_NAME}") diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index 042935a835f..89f3a62ba2e 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -24,7 +24,10 @@ if (COMPILER_CLANG) no_warning(c++98-compat-pedantic) no_warning(c++98-compat) no_warning(c++20-compat) # Use constinit in C++20 without warnings - no_warning(conversion) + no_warning(sign-conversion) + no_warning(implicit-int-conversion) + no_warning(implicit-int-float-conversion) + no_warning(shorten-64-to-32) no_warning(ctad-maybe-unsupported) # clang 9+, linux-only no_warning(disabled-macro-expansion) no_warning(documentation-unknown-command) diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 08b91c1b81c..486fca60912 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -159,6 +159,8 @@ add_contrib (s2geometry-cmake s2geometry) add_contrib (c-ares-cmake c-ares) add_contrib (qpl-cmake qpl) +add_contrib(annoy-cmake annoy) + # Put all targets defined here and in subdirectories under "contrib/" folders in GUI-based IDEs. # Some of third-party projects may override CMAKE_FOLDER or FOLDER property of their targets, so they would not appear # in "contrib/..." as originally planned, so we workaround this by fixing FOLDER properties of all targets manually, diff --git a/contrib/annoy b/contrib/annoy new file mode 160000 index 00000000000..f2ac8e7b48f --- /dev/null +++ b/contrib/annoy @@ -0,0 +1 @@ +Subproject commit f2ac8e7b48f9a9cf676d3b58286e5455aba8e956 diff --git a/contrib/annoy-cmake/CMakeLists.txt b/contrib/annoy-cmake/CMakeLists.txt new file mode 100644 index 00000000000..bdef7d92132 --- /dev/null +++ b/contrib/annoy-cmake/CMakeLists.txt @@ -0,0 +1,24 @@ +option(ENABLE_ANNOY "Enable Annoy index support" ${ENABLE_LIBRARIES}) + +# Annoy index should be disabled with undefined sanitizer. Because of memory storage optimizations +# (https://github.com/ClickHouse/annoy/blob/9d8a603a4cd252448589e84c9846f94368d5a289/src/annoylib.h#L442-L463) +# UBSan fails and leads to crash. Simmilar issue is already opened in Annoy repo +# https://github.com/spotify/annoy/issues/456 +# Problem with aligment can lead to errors like +# (https://stackoverflow.com/questions/46790550/c-undefined-behavior-strict-aliasing-rule-or-incorrect-alignment) +# or will lead to crash on arm https://developer.arm.com/documentation/ka003038/latest +# This issues should be resolved before annoy became non-experimental (--> setting "allow_experimental_annoy_index") +if ((NOT ENABLE_ANNOY) OR (SANITIZE STREQUAL "undefined") OR (ARCH_AARCH64)) + message (STATUS "Not using annoy") + return() +endif() + +set(ANNOY_PROJECT_DIR "${ClickHouse_SOURCE_DIR}/contrib/annoy") +set(ANNOY_SOURCE_DIR "${ANNOY_PROJECT_DIR}/src") + +add_library(_annoy INTERFACE) +target_include_directories(_annoy SYSTEM INTERFACE ${ANNOY_SOURCE_DIR}) + +add_library(ch_contrib::annoy ALIAS _annoy) +target_compile_definitions(_annoy INTERFACE ENABLE_ANNOY) +target_compile_definitions(_annoy INTERFACE ANNOYLIB_MULTITHREADED_BUILD) diff --git a/contrib/c-ares-cmake/CMakeLists.txt b/contrib/c-ares-cmake/CMakeLists.txt index 603c1f8b65c..4b1170f9dd1 100644 --- a/contrib/c-ares-cmake/CMakeLists.txt +++ b/contrib/c-ares-cmake/CMakeLists.txt @@ -1,35 +1,95 @@ -# Choose to build static or shared library for c-ares. -if (USE_STATIC_LIBRARIES) - set(CARES_STATIC ON CACHE BOOL "" FORCE) - set(CARES_SHARED OFF CACHE BOOL "" FORCE) -else () - set(CARES_STATIC OFF CACHE BOOL "" FORCE) - set(CARES_SHARED ON CACHE BOOL "" FORCE) -endif () +set(LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/c-ares") -# Disable looking for libnsl on a platforms that has gethostbyname in glibc -# -# c-ares searching for gethostbyname in the libnsl library, however in the -# version that shipped with gRPC it doing it wrong [1], since it uses -# CHECK_LIBRARY_EXISTS(), which will return TRUE even if the function exists in -# another dependent library. The upstream already contains correct macro [2], -# but it is not included in gRPC (even upstream gRPC, not the one that is -# shipped with clickhousee). -# -# [1]: https://github.com/c-ares/c-ares/blob/e982924acee7f7313b4baa4ee5ec000c5e373c30/CMakeLists.txt#L125 -# [2]: https://github.com/c-ares/c-ares/blob/44fbc813685a1fa8aa3f27fcd7544faf612d376a/CMakeLists.txt#L146 -# -# And because if you by some reason have libnsl [3] installed, clickhouse will -# reject to start w/o it. While this is completelly different library. -# -# [3]: https://packages.debian.org/bullseye/libnsl2 -if (NOT CMAKE_SYSTEM_NAME STREQUAL "SunOS") - set(HAVE_LIBNSL OFF CACHE BOOL "" FORCE) +# Generated from contrib/c-ares/src/lib/Makefile.inc +SET(SRCS + "${LIBRARY_DIR}/src/lib/ares__addrinfo2hostent.c" + "${LIBRARY_DIR}/src/lib/ares__addrinfo_localhost.c" + "${LIBRARY_DIR}/src/lib/ares__close_sockets.c" + "${LIBRARY_DIR}/src/lib/ares__get_hostent.c" + "${LIBRARY_DIR}/src/lib/ares__parse_into_addrinfo.c" + "${LIBRARY_DIR}/src/lib/ares__readaddrinfo.c" + "${LIBRARY_DIR}/src/lib/ares__sortaddrinfo.c" + "${LIBRARY_DIR}/src/lib/ares__read_line.c" + "${LIBRARY_DIR}/src/lib/ares__timeval.c" + "${LIBRARY_DIR}/src/lib/ares_android.c" + "${LIBRARY_DIR}/src/lib/ares_cancel.c" + "${LIBRARY_DIR}/src/lib/ares_data.c" + "${LIBRARY_DIR}/src/lib/ares_destroy.c" + "${LIBRARY_DIR}/src/lib/ares_expand_name.c" + "${LIBRARY_DIR}/src/lib/ares_expand_string.c" + "${LIBRARY_DIR}/src/lib/ares_fds.c" + "${LIBRARY_DIR}/src/lib/ares_free_hostent.c" + "${LIBRARY_DIR}/src/lib/ares_free_string.c" + "${LIBRARY_DIR}/src/lib/ares_freeaddrinfo.c" + "${LIBRARY_DIR}/src/lib/ares_getaddrinfo.c" + "${LIBRARY_DIR}/src/lib/ares_getenv.c" + "${LIBRARY_DIR}/src/lib/ares_gethostbyaddr.c" + "${LIBRARY_DIR}/src/lib/ares_gethostbyname.c" + "${LIBRARY_DIR}/src/lib/ares_getnameinfo.c" + "${LIBRARY_DIR}/src/lib/ares_getsock.c" + "${LIBRARY_DIR}/src/lib/ares_init.c" + "${LIBRARY_DIR}/src/lib/ares_library_init.c" + "${LIBRARY_DIR}/src/lib/ares_llist.c" + "${LIBRARY_DIR}/src/lib/ares_mkquery.c" + "${LIBRARY_DIR}/src/lib/ares_create_query.c" + "${LIBRARY_DIR}/src/lib/ares_nowarn.c" + "${LIBRARY_DIR}/src/lib/ares_options.c" + "${LIBRARY_DIR}/src/lib/ares_parse_a_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_aaaa_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_caa_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_mx_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_naptr_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_ns_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_ptr_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_soa_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_srv_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_txt_reply.c" + "${LIBRARY_DIR}/src/lib/ares_parse_uri_reply.c" + "${LIBRARY_DIR}/src/lib/ares_platform.c" + "${LIBRARY_DIR}/src/lib/ares_process.c" + "${LIBRARY_DIR}/src/lib/ares_query.c" + "${LIBRARY_DIR}/src/lib/ares_search.c" + "${LIBRARY_DIR}/src/lib/ares_send.c" + "${LIBRARY_DIR}/src/lib/ares_strcasecmp.c" + "${LIBRARY_DIR}/src/lib/ares_strdup.c" + "${LIBRARY_DIR}/src/lib/ares_strerror.c" + "${LIBRARY_DIR}/src/lib/ares_strsplit.c" + "${LIBRARY_DIR}/src/lib/ares_timeout.c" + "${LIBRARY_DIR}/src/lib/ares_version.c" + "${LIBRARY_DIR}/src/lib/ares_writev.c" + "${LIBRARY_DIR}/src/lib/bitncmp.c" + "${LIBRARY_DIR}/src/lib/inet_net_pton.c" + "${LIBRARY_DIR}/src/lib/inet_ntop.c" + "${LIBRARY_DIR}/src/lib/windows_port.c" +) + +if (USE_STATIC_LIBRARIES) + add_library(_c-ares STATIC ${SRCS}) + target_compile_definitions(_c-ares PUBLIC CARES_STATICLIB) +else() + add_library(_c-ares SHARED ${SRCS}) + target_compile_definitions(_c-ares PUBLIC CARES_BUILDING_LIBRARY) endif() -# Force use of c-ares inet_net_pton instead of libresolv one -set(HAVE_INET_NET_PTON OFF CACHE BOOL "" FORCE) +target_compile_definitions(_c-ares PRIVATE HAVE_CONFIG_H=1) -add_subdirectory("../c-ares/" "../c-ares/") +target_include_directories(_c-ares SYSTEM PUBLIC + "${LIBRARY_DIR}/src/lib" + "${LIBRARY_DIR}/include" +) -add_library(ch_contrib::c-ares ALIAS c-ares) \ No newline at end of file +# Platform-specific include directories. The original build system does a lot of checks to eventually generate two header files with defines: +# ares_build.h and ares_config.h. To update, run the original CMake build in c-ares for each platform and copy the headers into the +# platform-specific folder. +# For the platform-specific compile definitions, see c-ares top-level CMakeLists.txt. +if (OS_LINUX) + target_include_directories(_c-ares SYSTEM PUBLIC "${ClickHouse_SOURCE_DIR}/contrib/c-ares-cmake/linux") + target_compile_definitions(_c-ares PRIVATE -D_GNU_SOURCE -D_POSIX_C_SOURCE=199309L -D_XOPEN_SOURCE=600) +elseif (OS_DARWIN) + target_include_directories(_c-ares SYSTEM PUBLIC "${ClickHouse_SOURCE_DIR}/contrib/c-ares-cmake/darwin") + target_compile_definitions(_c-ares PRIVATE -D_DARWIN_C_SOURCE) +elseif (OS_FREEBSD) + target_include_directories(_c-ares SYSTEM PUBLIC "${ClickHouse_SOURCE_DIR}/contrib/c-ares-cmake/freebsd") +endif() + +add_library(ch_contrib::c-ares ALIAS _c-ares) diff --git a/contrib/c-ares-cmake/darwin/ares_build.h b/contrib/c-ares-cmake/darwin/ares_build.h new file mode 100644 index 00000000000..bf7402e7997 --- /dev/null +++ b/contrib/c-ares-cmake/darwin/ares_build.h @@ -0,0 +1,43 @@ +#ifndef __CARES_BUILD_H +#define __CARES_BUILD_H + +#define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t +#define CARES_TYPEOF_ARES_SSIZE_T ssize_t + +/* Prefix names with CARES_ to make sure they don't conflict with other config.h + * files. We need to include some dependent headers that may be system specific + * for C-Ares */ +#define CARES_HAVE_SYS_TYPES_H +#define CARES_HAVE_SYS_SOCKET_H +/* #undef CARES_HAVE_WINDOWS_H */ +/* #undef CARES_HAVE_WS2TCPIP_H */ +/* #undef CARES_HAVE_WINSOCK2_H */ +/* #undef CARES_HAVE_WINDOWS_H */ +#define CARES_HAVE_ARPA_NAMESER_H +#define CARES_HAVE_ARPA_NAMESER_COMPAT_H + +#ifdef CARES_HAVE_SYS_TYPES_H +# include +#endif + +#ifdef CARES_HAVE_SYS_SOCKET_H +# include +#endif + +#ifdef CARES_HAVE_WINSOCK2_H +# include +#endif + +#ifdef CARES_HAVE_WS2TCPIP_H +# include +#endif + +#ifdef CARES_HAVE_WINDOWS_H +# include +#endif + + +typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; +typedef CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t; + +#endif /* __CARES_BUILD_H */ diff --git a/contrib/c-ares-cmake/darwin/ares_config.h b/contrib/c-ares-cmake/darwin/ares_config.h new file mode 100644 index 00000000000..64af3836f3f --- /dev/null +++ b/contrib/c-ares-cmake/darwin/ares_config.h @@ -0,0 +1,432 @@ +/* Generated from ares_config.h.cmake */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* define this if ares is built for a big endian system */ +#undef ARES_BIG_ENDIAN + +/* when building as static part of libcurl */ +#undef BUILDING_LIBCURL + +/* Defined for build that exposes internal static functions for testing. */ +#undef CARES_EXPOSE_STATICS + +/* Defined for build with symbol hiding. */ +#undef CARES_SYMBOL_HIDING + +/* Definition to make a library symbol externally visible. */ +#undef CARES_SYMBOL_SCOPE_EXTERN + +/* Use resolver library to configure cares */ +/* #undef CARES_USE_LIBRESOLV */ + +/* if a /etc/inet dir is being used */ +#undef ETC_INET + +/* Define to the type of arg 2 for gethostname. */ +#define GETHOSTNAME_TYPE_ARG2 size_t + +/* Define to the type qualifier of arg 1 for getnameinfo. */ +#define GETNAMEINFO_QUAL_ARG1 + +/* Define to the type of arg 1 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG1 struct sockaddr * + +/* Define to the type of arg 2 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG2 socklen_t + +/* Define to the type of args 4 and 6 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG46 socklen_t + +/* Define to the type of arg 7 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG7 int + +/* Specifies the number of arguments to getservbyport_r */ +#define GETSERVBYPORT_R_ARGS + +/* Specifies the number of arguments to getservbyname_r */ +#define GETSERVBYNAME_R_ARGS + +/* Define to 1 if you have AF_INET6. */ +#define HAVE_AF_INET6 + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_NAMESER_COMPAT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_NAMESER_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H + +/* Define to 1 if you have the `bitncmp' function. */ +/* #undef HAVE_BITNCMP */ + +/* Define to 1 if bool is an available type. */ +#define HAVE_BOOL_T + +/* Define to 1 if you have the clock_gettime function and monotonic timer. */ +#define HAVE_CLOCK_GETTIME_MONOTONIC + +/* Define to 1 if you have the closesocket function. */ +/* #undef HAVE_CLOSESOCKET */ + +/* Define to 1 if you have the CloseSocket camel case function. */ +/* #undef HAVE_CLOSESOCKET_CAMEL */ + +/* Define to 1 if you have the connect function. */ +#define HAVE_CONNECT + +/* define if the compiler supports basic C++11 syntax */ +/* #undef HAVE_CXX11 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H + +/* Define to 1 if you have the fcntl function. */ +#define HAVE_FCNTL + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H + +/* Define to 1 if you have a working fcntl O_NONBLOCK function. */ +#define HAVE_FCNTL_O_NONBLOCK + +/* Define to 1 if you have the freeaddrinfo function. */ +#define HAVE_FREEADDRINFO + +/* Define to 1 if you have a working getaddrinfo function. */ +#define HAVE_GETADDRINFO + +/* Define to 1 if the getaddrinfo function is threadsafe. */ +#define HAVE_GETADDRINFO_THREADSAFE + +/* Define to 1 if you have the getenv function. */ +#define HAVE_GETENV + +/* Define to 1 if you have the gethostbyaddr function. */ +#define HAVE_GETHOSTBYADDR + +/* Define to 1 if you have the gethostbyname function. */ +#define HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the gethostname function. */ +#define HAVE_GETHOSTNAME + +/* Define to 1 if you have the getnameinfo function. */ +#define HAVE_GETNAMEINFO + +/* Define to 1 if you have the getservbyport_r function. */ +/* #undef HAVE_GETSERVBYPORT_R */ + +/* Define to 1 if you have the getservbyname_r function. */ +/* #undef HAVE_GETSERVBYNAME_R */ + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `if_indextoname' function. */ +#define HAVE_IF_INDEXTONAME + +/* Define to 1 if you have a IPv6 capable working inet_net_pton function. */ +/* #undef HAVE_INET_NET_PTON */ + +/* Define to 1 if you have a IPv6 capable working inet_ntop function. */ +#define HAVE_INET_NTOP + +/* Define to 1 if you have a IPv6 capable working inet_pton function. */ +#define HAVE_INET_PTON + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H + +/* Define to 1 if you have the ioctl function. */ +#define HAVE_IOCTL + +/* Define to 1 if you have the ioctlsocket function. */ +/* #undef HAVE_IOCTLSOCKET */ + +/* Define to 1 if you have the IoctlSocket camel case function. */ +/* #undef HAVE_IOCTLSOCKET_CAMEL */ + +/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function. + */ +/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */ + +/* Define to 1 if you have a working ioctlsocket FIONBIO function. */ +/* #undef HAVE_IOCTLSOCKET_FIONBIO */ + +/* Define to 1 if you have a working ioctl FIONBIO function. */ +#define HAVE_IOCTL_FIONBIO + +/* Define to 1 if you have a working ioctl SIOCGIFADDR function. */ +#define HAVE_IOCTL_SIOCGIFADDR + +/* Define to 1 if you have the `resolve' library (-lresolve). */ +/* #undef HAVE_LIBRESOLV */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H + +/* if your compiler supports LL */ +#define HAVE_LL + +/* Define to 1 if the compiler supports the 'long long' data type. */ +#define HAVE_LONGLONG + +/* Define to 1 if you have the malloc.h header file. */ +/* #undef HAVE_MALLOC_H */ + +/* Define to 1 if you have the memory.h header file. */ +#define HAVE_MEMORY_H + +/* Define to 1 if you have the MSG_NOSIGNAL flag. */ +/* #undef HAVE_MSG_NOSIGNAL */ + +/* Define to 1 if you have the header file. */ +#define HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_IN_H + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_TCP_H + +/* Define to 1 if you have the header file. */ +#define HAVE_NET_IF_H + +/* Define to 1 if you have PF_INET6. */ +#define HAVE_PF_INET6 + +/* Define to 1 if you have the recv function. */ +#define HAVE_RECV + +/* Define to 1 if you have the recvfrom function. */ +#define HAVE_RECVFROM + +/* Define to 1 if you have the send function. */ +#define HAVE_SEND + +/* Define to 1 if you have the setsockopt function. */ +#define HAVE_SETSOCKOPT + +/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */ +/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H + +/* Define to 1 if sig_atomic_t is an available typedef. */ +#define HAVE_SIG_ATOMIC_T + +/* Define to 1 if sig_atomic_t is already defined as volatile. */ +/* #undef HAVE_SIG_ATOMIC_T_VOLATILE */ + +/* Define to 1 if your struct sockaddr_in6 has sin6_scope_id. */ +#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID + +/* Define to 1 if you have the socket function. */ +#define HAVE_SOCKET + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SOCKET_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H + +/* Define to 1 if you have the strcasecmp function. */ +#define HAVE_STRCASECMP + +/* Define to 1 if you have the strcmpi function. */ +/* #undef HAVE_STRCMPI */ + +/* Define to 1 if you have the strdup function. */ +#define HAVE_STRDUP + +/* Define to 1 if you have the stricmp function. */ +/* #undef HAVE_STRICMP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H + +/* Define to 1 if you have the strncasecmp function. */ +#define HAVE_STRNCASECMP + +/* Define to 1 if you have the strncmpi function. */ +/* #undef HAVE_STRNCMPI */ + +/* Define to 1 if you have the strnicmp function. */ +/* #undef HAVE_STRNICMP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STROPTS_H */ + +/* Define to 1 if you have struct addrinfo. */ +#define HAVE_STRUCT_ADDRINFO + +/* Define to 1 if you have struct in6_addr. */ +#define HAVE_STRUCT_IN6_ADDR + +/* Define to 1 if you have struct sockaddr_in6. */ +#define HAVE_STRUCT_SOCKADDR_IN6 + +/* if struct sockaddr_storage is defined */ +#define HAVE_STRUCT_SOCKADDR_STORAGE + +/* Define to 1 if you have the timeval struct. */ +#define HAVE_STRUCT_TIMEVAL + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UIO_H + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H + +/* Define to 1 if you have the windows.h header file. */ +/* #undef HAVE_WINDOWS_H */ + +/* Define to 1 if you have the winsock2.h header file. */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define to 1 if you have the winsock.h header file. */ +/* #undef HAVE_WINSOCK_H */ + +/* Define to 1 if you have the writev function. */ +#define HAVE_WRITEV + +/* Define to 1 if you have the ws2tcpip.h header file. */ +/* #undef HAVE_WS2TCPIP_H */ + +/* Define to 1 if you have the __system_property_get function */ +#define HAVE___SYSTEM_PROPERTY_GET + +/* Define to 1 if you need the malloc.h header file even with stdlib.h */ +/* #undef NEED_MALLOC_H */ + +/* Define to 1 if you need the memory.h header file even with stdlib.h */ +/* #undef NEED_MEMORY_H */ + +/* a suitable file/device to read random data from */ +#define CARES_RANDOM_FILE "/dev/urandom" + +/* Define to the type qualifier pointed by arg 5 for recvfrom. */ +#define RECVFROM_QUAL_ARG5 + +/* Define to the type of arg 1 for recvfrom. */ +#define RECVFROM_TYPE_ARG1 int + +/* Define to the type pointed by arg 2 for recvfrom. */ +#define RECVFROM_TYPE_ARG2 void * + +/* Define to 1 if the type pointed by arg 2 for recvfrom is void. */ +#define RECVFROM_TYPE_ARG2_IS_VOID 0 + +/* Define to the type of arg 3 for recvfrom. */ +#define RECVFROM_TYPE_ARG3 size_t + +/* Define to the type of arg 4 for recvfrom. */ +#define RECVFROM_TYPE_ARG4 int + +/* Define to the type pointed by arg 5 for recvfrom. */ +#define RECVFROM_TYPE_ARG5 struct sockaddr * + +/* Define to 1 if the type pointed by arg 5 for recvfrom is void. */ +#define RECVFROM_TYPE_ARG5_IS_VOID 0 + +/* Define to the type pointed by arg 6 for recvfrom. */ +#define RECVFROM_TYPE_ARG6 socklen_t * + +/* Define to 1 if the type pointed by arg 6 for recvfrom is void. */ +#define RECVFROM_TYPE_ARG6_IS_VOID 0 + +/* Define to the function return type for recvfrom. */ +#define RECVFROM_TYPE_RETV ssize_t + +/* Define to the type of arg 1 for recv. */ +#define RECV_TYPE_ARG1 int + +/* Define to the type of arg 2 for recv. */ +#define RECV_TYPE_ARG2 void * + +/* Define to the type of arg 3 for recv. */ +#define RECV_TYPE_ARG3 size_t + +/* Define to the type of arg 4 for recv. */ +#define RECV_TYPE_ARG4 int + +/* Define to the function return type for recv. */ +#define RECV_TYPE_RETV ssize_t + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE + +/* Define to the type qualifier of arg 2 for send. */ +#define SEND_QUAL_ARG2 + +/* Define to the type of arg 1 for send. */ +#define SEND_TYPE_ARG1 int + +/* Define to the type of arg 2 for send. */ +#define SEND_TYPE_ARG2 void * + +/* Define to the type of arg 3 for send. */ +#define SEND_TYPE_ARG3 size_t + +/* Define to the type of arg 4 for send. */ +#define SEND_TYPE_ARG4 int + +/* Define to the function return type for send. */ +#define SEND_TYPE_RETV ssize_t + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME + +/* Define to disable non-blocking sockets. */ +#undef USE_BLOCKING_SOCKETS + +/* Define to avoid automatic inclusion of winsock.h */ +#undef WIN32_LEAN_AND_MEAN + +/* Type to use in place of in_addr_t when system does not provide it. */ +#undef in_addr_t + diff --git a/contrib/c-ares-cmake/freebsd/ares_build.h b/contrib/c-ares-cmake/freebsd/ares_build.h new file mode 100644 index 00000000000..bf7402e7997 --- /dev/null +++ b/contrib/c-ares-cmake/freebsd/ares_build.h @@ -0,0 +1,43 @@ +#ifndef __CARES_BUILD_H +#define __CARES_BUILD_H + +#define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t +#define CARES_TYPEOF_ARES_SSIZE_T ssize_t + +/* Prefix names with CARES_ to make sure they don't conflict with other config.h + * files. We need to include some dependent headers that may be system specific + * for C-Ares */ +#define CARES_HAVE_SYS_TYPES_H +#define CARES_HAVE_SYS_SOCKET_H +/* #undef CARES_HAVE_WINDOWS_H */ +/* #undef CARES_HAVE_WS2TCPIP_H */ +/* #undef CARES_HAVE_WINSOCK2_H */ +/* #undef CARES_HAVE_WINDOWS_H */ +#define CARES_HAVE_ARPA_NAMESER_H +#define CARES_HAVE_ARPA_NAMESER_COMPAT_H + +#ifdef CARES_HAVE_SYS_TYPES_H +# include +#endif + +#ifdef CARES_HAVE_SYS_SOCKET_H +# include +#endif + +#ifdef CARES_HAVE_WINSOCK2_H +# include +#endif + +#ifdef CARES_HAVE_WS2TCPIP_H +# include +#endif + +#ifdef CARES_HAVE_WINDOWS_H +# include +#endif + + +typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; +typedef CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t; + +#endif /* __CARES_BUILD_H */ diff --git a/contrib/c-ares-cmake/freebsd/ares_config.h b/contrib/c-ares-cmake/freebsd/ares_config.h new file mode 100644 index 00000000000..a7836e0e802 --- /dev/null +++ b/contrib/c-ares-cmake/freebsd/ares_config.h @@ -0,0 +1,432 @@ +/* Generated from ares_config.h.cmake */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* define this if ares is built for a big endian system */ +#undef ARES_BIG_ENDIAN + +/* when building as static part of libcurl */ +#undef BUILDING_LIBCURL + +/* Defined for build that exposes internal static functions for testing. */ +#undef CARES_EXPOSE_STATICS + +/* Defined for build with symbol hiding. */ +#undef CARES_SYMBOL_HIDING + +/* Definition to make a library symbol externally visible. */ +#undef CARES_SYMBOL_SCOPE_EXTERN + +/* Use resolver library to configure cares */ +/* #undef CARES_USE_LIBRESOLV */ + +/* if a /etc/inet dir is being used */ +#undef ETC_INET + +/* Define to the type of arg 2 for gethostname. */ +#define GETHOSTNAME_TYPE_ARG2 size_t + +/* Define to the type qualifier of arg 1 for getnameinfo. */ +#define GETNAMEINFO_QUAL_ARG1 + +/* Define to the type of arg 1 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG1 struct sockaddr * + +/* Define to the type of arg 2 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG2 socklen_t + +/* Define to the type of args 4 and 6 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG46 socklen_t + +/* Define to the type of arg 7 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG7 int + +/* Specifies the number of arguments to getservbyport_r */ +#define GETSERVBYPORT_R_ARGS 6 + +/* Specifies the number of arguments to getservbyname_r */ +#define GETSERVBYNAME_R_ARGS 6 + +/* Define to 1 if you have AF_INET6. */ +#define HAVE_AF_INET6 + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_NAMESER_COMPAT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_NAMESER_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H + +/* Define to 1 if you have the `bitncmp' function. */ +/* #undef HAVE_BITNCMP */ + +/* Define to 1 if bool is an available type. */ +#define HAVE_BOOL_T + +/* Define to 1 if you have the clock_gettime function and monotonic timer. */ +#define HAVE_CLOCK_GETTIME_MONOTONIC + +/* Define to 1 if you have the closesocket function. */ +/* #undef HAVE_CLOSESOCKET */ + +/* Define to 1 if you have the CloseSocket camel case function. */ +/* #undef HAVE_CLOSESOCKET_CAMEL */ + +/* Define to 1 if you have the connect function. */ +#define HAVE_CONNECT + +/* define if the compiler supports basic C++11 syntax */ +/* #undef HAVE_CXX11 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H + +/* Define to 1 if you have the fcntl function. */ +#define HAVE_FCNTL + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H + +/* Define to 1 if you have a working fcntl O_NONBLOCK function. */ +#define HAVE_FCNTL_O_NONBLOCK + +/* Define to 1 if you have the freeaddrinfo function. */ +#define HAVE_FREEADDRINFO + +/* Define to 1 if you have a working getaddrinfo function. */ +#define HAVE_GETADDRINFO + +/* Define to 1 if the getaddrinfo function is threadsafe. */ +#define HAVE_GETADDRINFO_THREADSAFE + +/* Define to 1 if you have the getenv function. */ +#define HAVE_GETENV + +/* Define to 1 if you have the gethostbyaddr function. */ +#define HAVE_GETHOSTBYADDR + +/* Define to 1 if you have the gethostbyname function. */ +#define HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the gethostname function. */ +#define HAVE_GETHOSTNAME + +/* Define to 1 if you have the getnameinfo function. */ +#define HAVE_GETNAMEINFO + +/* Define to 1 if you have the getservbyport_r function. */ +#define HAVE_GETSERVBYPORT_R + +/* Define to 1 if you have the getservbyname_r function. */ +#define HAVE_GETSERVBYNAME_R + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `if_indextoname' function. */ +#define HAVE_IF_INDEXTONAME + +/* Define to 1 if you have a IPv6 capable working inet_net_pton function. */ +/* #undef HAVE_INET_NET_PTON */ + +/* Define to 1 if you have a IPv6 capable working inet_ntop function. */ +#define HAVE_INET_NTOP + +/* Define to 1 if you have a IPv6 capable working inet_pton function. */ +#define HAVE_INET_PTON + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H + +/* Define to 1 if you have the ioctl function. */ +#define HAVE_IOCTL + +/* Define to 1 if you have the ioctlsocket function. */ +/* #undef HAVE_IOCTLSOCKET */ + +/* Define to 1 if you have the IoctlSocket camel case function. */ +/* #undef HAVE_IOCTLSOCKET_CAMEL */ + +/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function. + */ +/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */ + +/* Define to 1 if you have a working ioctlsocket FIONBIO function. */ +/* #undef HAVE_IOCTLSOCKET_FIONBIO */ + +/* Define to 1 if you have a working ioctl FIONBIO function. */ +#define HAVE_IOCTL_FIONBIO + +/* Define to 1 if you have a working ioctl SIOCGIFADDR function. */ +#define HAVE_IOCTL_SIOCGIFADDR + +/* Define to 1 if you have the `resolve' library (-lresolve). */ +/* #undef HAVE_LIBRESOLV */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H + +/* if your compiler supports LL */ +#define HAVE_LL + +/* Define to 1 if the compiler supports the 'long long' data type. */ +#define HAVE_LONGLONG + +/* Define to 1 if you have the malloc.h header file. */ +/* #undef HAVE_MALLOC_H */ + +/* Define to 1 if you have the memory.h header file. */ +#define HAVE_MEMORY_H + +/* Define to 1 if you have the MSG_NOSIGNAL flag. */ +#define HAVE_MSG_NOSIGNAL + +/* Define to 1 if you have the header file. */ +#define HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_IN_H + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_TCP_H + +/* Define to 1 if you have the header file. */ +#define HAVE_NET_IF_H + +/* Define to 1 if you have PF_INET6. */ +#define HAVE_PF_INET6 + +/* Define to 1 if you have the recv function. */ +#define HAVE_RECV + +/* Define to 1 if you have the recvfrom function. */ +#define HAVE_RECVFROM + +/* Define to 1 if you have the send function. */ +#define HAVE_SEND + +/* Define to 1 if you have the setsockopt function. */ +#define HAVE_SETSOCKOPT + +/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */ +/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H + +/* Define to 1 if sig_atomic_t is an available typedef. */ +#define HAVE_SIG_ATOMIC_T + +/* Define to 1 if sig_atomic_t is already defined as volatile. */ +/* #undef HAVE_SIG_ATOMIC_T_VOLATILE */ + +/* Define to 1 if your struct sockaddr_in6 has sin6_scope_id. */ +#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID + +/* Define to 1 if you have the socket function. */ +#define HAVE_SOCKET + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SOCKET_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H + +/* Define to 1 if you have the strcasecmp function. */ +#define HAVE_STRCASECMP + +/* Define to 1 if you have the strcmpi function. */ +/* #undef HAVE_STRCMPI */ + +/* Define to 1 if you have the strdup function. */ +#define HAVE_STRDUP + +/* Define to 1 if you have the stricmp function. */ +/* #undef HAVE_STRICMP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H + +/* Define to 1 if you have the strncasecmp function. */ +#define HAVE_STRNCASECMP + +/* Define to 1 if you have the strncmpi function. */ +/* #undef HAVE_STRNCMPI */ + +/* Define to 1 if you have the strnicmp function. */ +/* #undef HAVE_STRNICMP */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STROPTS_H */ + +/* Define to 1 if you have struct addrinfo. */ +#define HAVE_STRUCT_ADDRINFO + +/* Define to 1 if you have struct in6_addr. */ +#define HAVE_STRUCT_IN6_ADDR + +/* Define to 1 if you have struct sockaddr_in6. */ +#define HAVE_STRUCT_SOCKADDR_IN6 + +/* if struct sockaddr_storage is defined */ +#define HAVE_STRUCT_SOCKADDR_STORAGE + +/* Define to 1 if you have the timeval struct. */ +#define HAVE_STRUCT_TIMEVAL + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UIO_H + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H + +/* Define to 1 if you have the windows.h header file. */ +/* #undef HAVE_WINDOWS_H */ + +/* Define to 1 if you have the winsock2.h header file. */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define to 1 if you have the winsock.h header file. */ +/* #undef HAVE_WINSOCK_H */ + +/* Define to 1 if you have the writev function. */ +#define HAVE_WRITEV + +/* Define to 1 if you have the ws2tcpip.h header file. */ +/* #undef HAVE_WS2TCPIP_H */ + +/* Define to 1 if you have the __system_property_get function */ +#define HAVE___SYSTEM_PROPERTY_GET + +/* Define to 1 if you need the malloc.h header file even with stdlib.h */ +/* #undef NEED_MALLOC_H */ + +/* Define to 1 if you need the memory.h header file even with stdlib.h */ +/* #undef NEED_MEMORY_H */ + +/* a suitable file/device to read random data from */ +#define CARES_RANDOM_FILE "/dev/urandom" + +/* Define to the type qualifier pointed by arg 5 for recvfrom. */ +#define RECVFROM_QUAL_ARG5 + +/* Define to the type of arg 1 for recvfrom. */ +#define RECVFROM_TYPE_ARG1 int + +/* Define to the type pointed by arg 2 for recvfrom. */ +#define RECVFROM_TYPE_ARG2 void * + +/* Define to 1 if the type pointed by arg 2 for recvfrom is void. */ +#define RECVFROM_TYPE_ARG2_IS_VOID 0 + +/* Define to the type of arg 3 for recvfrom. */ +#define RECVFROM_TYPE_ARG3 size_t + +/* Define to the type of arg 4 for recvfrom. */ +#define RECVFROM_TYPE_ARG4 int + +/* Define to the type pointed by arg 5 for recvfrom. */ +#define RECVFROM_TYPE_ARG5 struct sockaddr * + +/* Define to 1 if the type pointed by arg 5 for recvfrom is void. */ +#define RECVFROM_TYPE_ARG5_IS_VOID 0 + +/* Define to the type pointed by arg 6 for recvfrom. */ +#define RECVFROM_TYPE_ARG6 socklen_t * + +/* Define to 1 if the type pointed by arg 6 for recvfrom is void. */ +#define RECVFROM_TYPE_ARG6_IS_VOID 0 + +/* Define to the function return type for recvfrom. */ +#define RECVFROM_TYPE_RETV ssize_t + +/* Define to the type of arg 1 for recv. */ +#define RECV_TYPE_ARG1 int + +/* Define to the type of arg 2 for recv. */ +#define RECV_TYPE_ARG2 void * + +/* Define to the type of arg 3 for recv. */ +#define RECV_TYPE_ARG3 size_t + +/* Define to the type of arg 4 for recv. */ +#define RECV_TYPE_ARG4 int + +/* Define to the function return type for recv. */ +#define RECV_TYPE_RETV ssize_t + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE + +/* Define to the type qualifier of arg 2 for send. */ +#define SEND_QUAL_ARG2 + +/* Define to the type of arg 1 for send. */ +#define SEND_TYPE_ARG1 int + +/* Define to the type of arg 2 for send. */ +#define SEND_TYPE_ARG2 void * + +/* Define to the type of arg 3 for send. */ +#define SEND_TYPE_ARG3 size_t + +/* Define to the type of arg 4 for send. */ +#define SEND_TYPE_ARG4 int + +/* Define to the function return type for send. */ +#define SEND_TYPE_RETV ssize_t + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME + +/* Define to disable non-blocking sockets. */ +#undef USE_BLOCKING_SOCKETS + +/* Define to avoid automatic inclusion of winsock.h */ +#undef WIN32_LEAN_AND_MEAN + +/* Type to use in place of in_addr_t when system does not provide it. */ +#undef in_addr_t + diff --git a/contrib/c-ares-cmake/linux/ares_build.h b/contrib/c-ares-cmake/linux/ares_build.h new file mode 100644 index 00000000000..bf7402e7997 --- /dev/null +++ b/contrib/c-ares-cmake/linux/ares_build.h @@ -0,0 +1,43 @@ +#ifndef __CARES_BUILD_H +#define __CARES_BUILD_H + +#define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t +#define CARES_TYPEOF_ARES_SSIZE_T ssize_t + +/* Prefix names with CARES_ to make sure they don't conflict with other config.h + * files. We need to include some dependent headers that may be system specific + * for C-Ares */ +#define CARES_HAVE_SYS_TYPES_H +#define CARES_HAVE_SYS_SOCKET_H +/* #undef CARES_HAVE_WINDOWS_H */ +/* #undef CARES_HAVE_WS2TCPIP_H */ +/* #undef CARES_HAVE_WINSOCK2_H */ +/* #undef CARES_HAVE_WINDOWS_H */ +#define CARES_HAVE_ARPA_NAMESER_H +#define CARES_HAVE_ARPA_NAMESER_COMPAT_H + +#ifdef CARES_HAVE_SYS_TYPES_H +# include +#endif + +#ifdef CARES_HAVE_SYS_SOCKET_H +# include +#endif + +#ifdef CARES_HAVE_WINSOCK2_H +# include +#endif + +#ifdef CARES_HAVE_WS2TCPIP_H +# include +#endif + +#ifdef CARES_HAVE_WINDOWS_H +# include +#endif + + +typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; +typedef CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t; + +#endif /* __CARES_BUILD_H */ diff --git a/contrib/c-ares-cmake/linux/ares_config.h b/contrib/c-ares-cmake/linux/ares_config.h new file mode 100644 index 00000000000..e0ebf86e842 --- /dev/null +++ b/contrib/c-ares-cmake/linux/ares_config.h @@ -0,0 +1,432 @@ +/* Generated from ares_config.h.cmake */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* define this if ares is built for a big endian system */ +#undef ARES_BIG_ENDIAN + +/* when building as static part of libcurl */ +#undef BUILDING_LIBCURL + +/* Defined for build that exposes internal static functions for testing. */ +#undef CARES_EXPOSE_STATICS + +/* Defined for build with symbol hiding. */ +#undef CARES_SYMBOL_HIDING + +/* Definition to make a library symbol externally visible. */ +#undef CARES_SYMBOL_SCOPE_EXTERN + +/* Use resolver library to configure cares */ +/* #undef CARES_USE_LIBRESOLV */ + +/* if a /etc/inet dir is being used */ +#undef ETC_INET + +/* Define to the type of arg 2 for gethostname. */ +#define GETHOSTNAME_TYPE_ARG2 size_t + +/* Define to the type qualifier of arg 1 for getnameinfo. */ +#define GETNAMEINFO_QUAL_ARG1 + +/* Define to the type of arg 1 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG1 struct sockaddr * + +/* Define to the type of arg 2 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG2 socklen_t + +/* Define to the type of args 4 and 6 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG46 socklen_t + +/* Define to the type of arg 7 for getnameinfo. */ +#define GETNAMEINFO_TYPE_ARG7 int + +/* Specifies the number of arguments to getservbyport_r */ +#define GETSERVBYPORT_R_ARGS 6 + +/* Specifies the number of arguments to getservbyname_r */ +#define GETSERVBYNAME_R_ARGS 6 + +/* Define to 1 if you have AF_INET6. */ +#define HAVE_AF_INET6 + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_NAMESER_COMPAT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_NAMESER_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H + +/* Define to 1 if you have the `bitncmp' function. */ +/* #undef HAVE_BITNCMP */ + +/* Define to 1 if bool is an available type. */ +#define HAVE_BOOL_T + +/* Define to 1 if you have the clock_gettime function and monotonic timer. */ +#define HAVE_CLOCK_GETTIME_MONOTONIC + +/* Define to 1 if you have the closesocket function. */ +/* #undef HAVE_CLOSESOCKET */ + +/* Define to 1 if you have the CloseSocket camel case function. */ +/* #undef HAVE_CLOSESOCKET_CAMEL */ + +/* Define to 1 if you have the connect function. */ +#define HAVE_CONNECT + +/* define if the compiler supports basic C++11 syntax */ +/* #undef HAVE_CXX11 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H + +/* Define to 1 if you have the fcntl function. */ +#define HAVE_FCNTL + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H + +/* Define to 1 if you have a working fcntl O_NONBLOCK function. */ +#define HAVE_FCNTL_O_NONBLOCK + +/* Define to 1 if you have the freeaddrinfo function. */ +#define HAVE_FREEADDRINFO + +/* Define to 1 if you have a working getaddrinfo function. */ +#define HAVE_GETADDRINFO + +/* Define to 1 if the getaddrinfo function is threadsafe. */ +/* #undef HAVE_GETADDRINFO_THREADSAFE */ + +/* Define to 1 if you have the getenv function. */ +#define HAVE_GETENV + +/* Define to 1 if you have the gethostbyaddr function. */ +#define HAVE_GETHOSTBYADDR + +/* Define to 1 if you have the gethostbyname function. */ +#define HAVE_GETHOSTBYNAME + +/* Define to 1 if you have the gethostname function. */ +#define HAVE_GETHOSTNAME + +/* Define to 1 if you have the getnameinfo function. */ +#define HAVE_GETNAMEINFO + +/* Define to 1 if you have the getservbyport_r function. */ +#define HAVE_GETSERVBYPORT_R + +/* Define to 1 if you have the getservbyname_r function. */ +#define HAVE_GETSERVBYNAME_R + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY + +/* Define to 1 if you have the `if_indextoname' function. */ +#define HAVE_IF_INDEXTONAME + +/* Define to 1 if you have a IPv6 capable working inet_net_pton function. */ +/* #undef HAVE_INET_NET_PTON */ + +/* Define to 1 if you have a IPv6 capable working inet_ntop function. */ +#define HAVE_INET_NTOP + +/* Define to 1 if you have a IPv6 capable working inet_pton function. */ +#define HAVE_INET_PTON + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H + +/* Define to 1 if you have the ioctl function. */ +#define HAVE_IOCTL + +/* Define to 1 if you have the ioctlsocket function. */ +/* #undef HAVE_IOCTLSOCKET */ + +/* Define to 1 if you have the IoctlSocket camel case function. */ +/* #undef HAVE_IOCTLSOCKET_CAMEL */ + +/* Define to 1 if you have a working IoctlSocket camel case FIONBIO function. + */ +/* #undef HAVE_IOCTLSOCKET_CAMEL_FIONBIO */ + +/* Define to 1 if you have a working ioctlsocket FIONBIO function. */ +/* #undef HAVE_IOCTLSOCKET_FIONBIO */ + +/* Define to 1 if you have a working ioctl FIONBIO function. */ +#define HAVE_IOCTL_FIONBIO + +/* Define to 1 if you have a working ioctl SIOCGIFADDR function. */ +#define HAVE_IOCTL_SIOCGIFADDR + +/* Define to 1 if you have the `resolve' library (-lresolve). */ +/* #undef HAVE_LIBRESOLV */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H + +/* if your compiler supports LL */ +#define HAVE_LL + +/* Define to 1 if the compiler supports the 'long long' data type. */ +#define HAVE_LONGLONG + +/* Define to 1 if you have the malloc.h header file. */ +#define HAVE_MALLOC_H + +/* Define to 1 if you have the memory.h header file. */ +#define HAVE_MEMORY_H + +/* Define to 1 if you have the MSG_NOSIGNAL flag. */ +#define HAVE_MSG_NOSIGNAL + +/* Define to 1 if you have the header file. */ +#define HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_IN_H + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_TCP_H + +/* Define to 1 if you have the header file. */ +#define HAVE_NET_IF_H + +/* Define to 1 if you have PF_INET6. */ +#define HAVE_PF_INET6 + +/* Define to 1 if you have the recv function. */ +#define HAVE_RECV + +/* Define to 1 if you have the recvfrom function. */ +#define HAVE_RECVFROM + +/* Define to 1 if you have the send function. */ +#define HAVE_SEND + +/* Define to 1 if you have the setsockopt function. */ +#define HAVE_SETSOCKOPT + +/* Define to 1 if you have a working setsockopt SO_NONBLOCK function. */ +/* #undef HAVE_SETSOCKOPT_SO_NONBLOCK */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H + +/* Define to 1 if sig_atomic_t is an available typedef. */ +#define HAVE_SIG_ATOMIC_T + +/* Define to 1 if sig_atomic_t is already defined as volatile. */ +/* #undef HAVE_SIG_ATOMIC_T_VOLATILE */ + +/* Define to 1 if your struct sockaddr_in6 has sin6_scope_id. */ +#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID + +/* Define to 1 if you have the socket function. */ +#define HAVE_SOCKET + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SOCKET_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H + +/* Define to 1 if you have the strcasecmp function. */ +#define HAVE_STRCASECMP + +/* Define to 1 if you have the strcmpi function. */ +/* #undef HAVE_STRCMPI */ + +/* Define to 1 if you have the strdup function. */ +#define HAVE_STRDUP + +/* Define to 1 if you have the stricmp function. */ +/* #undef HAVE_STRICMP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H + +/* Define to 1 if you have the strncasecmp function. */ +#define HAVE_STRNCASECMP + +/* Define to 1 if you have the strncmpi function. */ +/* #undef HAVE_STRNCMPI */ + +/* Define to 1 if you have the strnicmp function. */ +/* #undef HAVE_STRNICMP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STROPTS_H + +/* Define to 1 if you have struct addrinfo. */ +#define HAVE_STRUCT_ADDRINFO + +/* Define to 1 if you have struct in6_addr. */ +#define HAVE_STRUCT_IN6_ADDR + +/* Define to 1 if you have struct sockaddr_in6. */ +#define HAVE_STRUCT_SOCKADDR_IN6 + +/* if struct sockaddr_storage is defined */ +#define HAVE_STRUCT_SOCKADDR_STORAGE + +/* Define to 1 if you have the timeval struct. */ +#define HAVE_STRUCT_TIMEVAL + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PARAM_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UIO_H + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H + +/* Define to 1 if you have the windows.h header file. */ +/* #undef HAVE_WINDOWS_H */ + +/* Define to 1 if you have the winsock2.h header file. */ +/* #undef HAVE_WINSOCK2_H */ + +/* Define to 1 if you have the winsock.h header file. */ +/* #undef HAVE_WINSOCK_H */ + +/* Define to 1 if you have the writev function. */ +#define HAVE_WRITEV + +/* Define to 1 if you have the ws2tcpip.h header file. */ +/* #undef HAVE_WS2TCPIP_H */ + +/* Define to 1 if you have the __system_property_get function */ +#define HAVE___SYSTEM_PROPERTY_GET + +/* Define to 1 if you need the malloc.h header file even with stdlib.h */ +/* #undef NEED_MALLOC_H */ + +/* Define to 1 if you need the memory.h header file even with stdlib.h */ +/* #undef NEED_MEMORY_H */ + +/* a suitable file/device to read random data from */ +#define CARES_RANDOM_FILE "/dev/urandom" + +/* Define to the type qualifier pointed by arg 5 for recvfrom. */ +#define RECVFROM_QUAL_ARG5 + +/* Define to the type of arg 1 for recvfrom. */ +#define RECVFROM_TYPE_ARG1 int + +/* Define to the type pointed by arg 2 for recvfrom. */ +#define RECVFROM_TYPE_ARG2 void * + +/* Define to 1 if the type pointed by arg 2 for recvfrom is void. */ +#define RECVFROM_TYPE_ARG2_IS_VOID 0 + +/* Define to the type of arg 3 for recvfrom. */ +#define RECVFROM_TYPE_ARG3 size_t + +/* Define to the type of arg 4 for recvfrom. */ +#define RECVFROM_TYPE_ARG4 int + +/* Define to the type pointed by arg 5 for recvfrom. */ +#define RECVFROM_TYPE_ARG5 struct sockaddr * + +/* Define to 1 if the type pointed by arg 5 for recvfrom is void. */ +#define RECVFROM_TYPE_ARG5_IS_VOID 0 + +/* Define to the type pointed by arg 6 for recvfrom. */ +#define RECVFROM_TYPE_ARG6 socklen_t * + +/* Define to 1 if the type pointed by arg 6 for recvfrom is void. */ +#define RECVFROM_TYPE_ARG6_IS_VOID 0 + +/* Define to the function return type for recvfrom. */ +#define RECVFROM_TYPE_RETV ssize_t + +/* Define to the type of arg 1 for recv. */ +#define RECV_TYPE_ARG1 int + +/* Define to the type of arg 2 for recv. */ +#define RECV_TYPE_ARG2 void * + +/* Define to the type of arg 3 for recv. */ +#define RECV_TYPE_ARG3 size_t + +/* Define to the type of arg 4 for recv. */ +#define RECV_TYPE_ARG4 int + +/* Define to the function return type for recv. */ +#define RECV_TYPE_RETV ssize_t + +/* Define as the return type of signal handlers (`int' or `void'). */ +#define RETSIGTYPE + +/* Define to the type qualifier of arg 2 for send. */ +#define SEND_QUAL_ARG2 + +/* Define to the type of arg 1 for send. */ +#define SEND_TYPE_ARG1 int + +/* Define to the type of arg 2 for send. */ +#define SEND_TYPE_ARG2 void * + +/* Define to the type of arg 3 for send. */ +#define SEND_TYPE_ARG3 size_t + +/* Define to the type of arg 4 for send. */ +#define SEND_TYPE_ARG4 int + +/* Define to the function return type for send. */ +#define SEND_TYPE_RETV ssize_t + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME + +/* Define to disable non-blocking sockets. */ +#undef USE_BLOCKING_SOCKETS + +/* Define to avoid automatic inclusion of winsock.h */ +#undef WIN32_LEAN_AND_MEAN + +/* Type to use in place of in_addr_t when system does not provide it. */ +#undef in_addr_t + diff --git a/contrib/capnproto b/contrib/capnproto index c8189ec3c27..2e88221d3dd 160000 --- a/contrib/capnproto +++ b/contrib/capnproto @@ -1 +1 @@ -Subproject commit c8189ec3c27dacbd4a3288e682473010e377f593 +Subproject commit 2e88221d3dde22266bfccf40eaee6ff9b40d113d diff --git a/contrib/jemalloc-cmake/include_linux_x86_64_musl/jemalloc/internal/jemalloc_internal_defs.h.in b/contrib/jemalloc-cmake/include_linux_x86_64_musl/jemalloc/internal/jemalloc_internal_defs.h.in index ff97d297d8f..e08a2bed2ec 100644 --- a/contrib/jemalloc-cmake/include_linux_x86_64_musl/jemalloc/internal/jemalloc_internal_defs.h.in +++ b/contrib/jemalloc-cmake/include_linux_x86_64_musl/jemalloc/internal/jemalloc_internal_defs.h.in @@ -415,7 +415,7 @@ /* * Defined if strerror_r returns char * if _GNU_SOURCE is defined. */ -#define JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE +/* #undef JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE */ /* Performs additional safety checks when defined. */ /* #undef JEMALLOC_OPT_SAFETY_CHECKS */ diff --git a/contrib/krb5 b/contrib/krb5 index d879821c7a4..b89e20367b0 160000 --- a/contrib/krb5 +++ b/contrib/krb5 @@ -1 +1 @@ -Subproject commit d879821c7a4c70b0c3ad739d9951d1a2b1903df7 +Subproject commit b89e20367b074bd02dd118a6534099b21e88b3c3 diff --git a/contrib/krb5-cmake/autoconf_linux.h b/contrib/krb5-cmake/autoconf_linux.h index 7b71d962d9a..54951f866a5 100644 --- a/contrib/krb5-cmake/autoconf_linux.h +++ b/contrib/krb5-cmake/autoconf_linux.h @@ -440,7 +440,9 @@ #define HAVE_STRERROR 1 /* Define to 1 if you have the `strerror_r' function. */ +#ifndef USE_MUSL #define HAVE_STRERROR_R 1 +#endif /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 diff --git a/contrib/libcpuid b/contrib/libcpuid index 8db3b8d2d32..503083acb77 160000 --- a/contrib/libcpuid +++ b/contrib/libcpuid @@ -1 +1 @@ -Subproject commit 8db3b8d2d32d22437f063ce692a1b9bb15e42d18 +Subproject commit 503083acb77edf9fbce22a05826307dff2ce96e6 diff --git a/contrib/libpq-cmake/CMakeLists.txt b/contrib/libpq-cmake/CMakeLists.txt index 280c0381393..91326422b43 100644 --- a/contrib/libpq-cmake/CMakeLists.txt +++ b/contrib/libpq-cmake/CMakeLists.txt @@ -63,6 +63,13 @@ target_include_directories (_libpq SYSTEM PUBLIC ${LIBPQ_SOURCE_DIR}) target_include_directories (_libpq SYSTEM PUBLIC "${LIBPQ_SOURCE_DIR}/include") target_include_directories (_libpq SYSTEM PRIVATE "${LIBPQ_SOURCE_DIR}/configs") +# NOTE: this is a dirty hack to avoid and instead pg_config.h should be shipped +# for different OS'es like for jemalloc, not one generic for all OS'es like +# now. +if (OS_DARWIN OR OS_FREEBSD OR USE_MUSL) + target_compile_definitions(_libpq PRIVATE -DSTRERROR_R_INT=1) +endif() + target_link_libraries (_libpq PRIVATE OpenSSL::SSL) add_library(ch_contrib::libpq ALIAS _libpq) diff --git a/contrib/librdkafka b/contrib/librdkafka index ff32b4e9eea..6f3b483426a 160000 --- a/contrib/librdkafka +++ b/contrib/librdkafka @@ -1 +1 @@ -Subproject commit ff32b4e9eeafd0b276f010ee969179e4e9e6d0b2 +Subproject commit 6f3b483426a8c8ec950e27e446bec175cf8b553f diff --git a/contrib/llvm b/contrib/llvm index 20607e61728..0db5bf5bd24 160000 --- a/contrib/llvm +++ b/contrib/llvm @@ -1 +1 @@ -Subproject commit 20607e61728e97c969e536644c3c0c1bb1a50672 +Subproject commit 0db5bf5bd2452cd8f1283a1fcdc04845af705bfc diff --git a/contrib/openldap b/contrib/openldap index 0208811b604..8688afe6bc9 160000 --- a/contrib/openldap +++ b/contrib/openldap @@ -1 +1 @@ -Subproject commit 0208811b6043ca06fda8631a5e473df1ec515ccb +Subproject commit 8688afe6bc95ebcd20edf4578c536362218cb70a diff --git a/contrib/poco b/contrib/poco index 9fec8e11dbb..76746b35d0e 160000 --- a/contrib/poco +++ b/contrib/poco @@ -1 +1 @@ -Subproject commit 9fec8e11dbb6a352e1cfba8cc9e23ebd7fb77310 +Subproject commit 76746b35d0e254eaaba71dc3b79e46cba8cbb144 diff --git a/contrib/replxx b/contrib/replxx index 3fd0e3c9364..5d04501f93a 160000 --- a/contrib/replxx +++ b/contrib/replxx @@ -1 +1 @@ -Subproject commit 3fd0e3c9364a589447453d9906d854ebd8d385c5 +Subproject commit 5d04501f93a4fb7f0bb8b73b8f614bc986f9e25b diff --git a/contrib/sentry-native b/contrib/sentry-native index f431047ac8d..ae10fb8c224 160000 --- a/contrib/sentry-native +++ b/contrib/sentry-native @@ -1 +1 @@ -Subproject commit f431047ac8da13179c488018dddf1c0d0771a997 +Subproject commit ae10fb8c224c3f41571446e1ed7fd57b9e5e366b diff --git a/contrib/vectorscan b/contrib/vectorscan index 73695e419c2..f6250ae3e5a 160000 --- a/contrib/vectorscan +++ b/contrib/vectorscan @@ -1 +1 @@ -Subproject commit 73695e419c27af7fe2a099c7aa57931cc02aea5d +Subproject commit f6250ae3e5a3085000239313ad0689cc1e00cdc2 diff --git a/contrib/vectorscan-cmake/CMakeLists.txt b/contrib/vectorscan-cmake/CMakeLists.txt index bc17105be99..d6c626c1612 100644 --- a/contrib/vectorscan-cmake/CMakeLists.txt +++ b/contrib/vectorscan-cmake/CMakeLists.txt @@ -1,11 +1,9 @@ # We use vectorscan, a portable and API/ABI-compatible drop-in replacement for hyperscan. -if (ARCH_AMD64) +if ((ARCH_AMD64 AND NOT NO_SSE3_OR_HIGHER) OR ARCH_AARCH64) option (ENABLE_VECTORSCAN "Enable vectorscan library" ${ENABLE_LIBRARIES}) endif() -# TODO: vectorscan supports ARM yet some tests involving cyrillic letters fail (PR #38171) ... needs further investigation - # TODO PPC should generally work but needs manual generation of ppc/config.h file on a PPC machine if (NOT ENABLE_VECTORSCAN) @@ -236,11 +234,27 @@ set (SRCS # The original build system invokes ragel on src/parser/{Parser|control_verbs}.rl (+ a few more .rl files which are unneeded). To avoid a # build-time dependency on ragel (via contrib/ or find_program()), add the manually generated output of ragel to the sources. -# Please regenerate these files if you update vectorscan. -list (APPEND SRCS - "${LIBRARY_DIR}/../vectorscan-cmake/rageled_files/Parser.cpp" - "${LIBRARY_DIR}/../vectorscan-cmake/rageled_files/control_verbs.cpp" -) +# +# Please regenerate these files if you update vectorscan. They must be regenerated for each platform separately because ragel produces for +# weird reasons different constants in the output. +# +# Also, please use upstream versions of colm and ragel, the packages in Ubuntu 22.04 seem to produce wrong output on ARM. +if (ARCH_AMD64) + list (APPEND SRCS + "${LIBRARY_DIR}/../vectorscan-cmake/rageled_files/amd64/Parser.cpp" + "${LIBRARY_DIR}/../vectorscan-cmake/rageled_files/amd64/control_verbs.cpp" + ) +elseif (ARCH_AARCH64) + list (APPEND SRCS + "${LIBRARY_DIR}/../vectorscan-cmake/rageled_files/aarch64/Parser.cpp" + "${LIBRARY_DIR}/../vectorscan-cmake/rageled_files/aarch64/control_verbs.cpp" + ) + set_source_files_properties( + "${LIBRARY_DIR}/../vectorscan-cmake/rageled_files/aarch64/Parser.cpp" + "${LIBRARY_DIR}/../vectorscan-cmake/rageled_files/aarch64/control_verbs.cpp" + COMPILE_FLAGS -Wno-c++11-narrowing + ) +endif() # Platform-dependent files if (ARCH_AMD64) @@ -290,7 +304,7 @@ target_include_directories (_vectorscan SYSTEM PUBLIC "${LIBRARY_DIR}/src") # Please regenerate these files if you update vectorscan. if (ARCH_AMD64) - target_include_directories (_vectorscan PRIVATE x86_64) + target_include_directories (_vectorscan PRIVATE amd64) endif () if (ARCH_AARCH64) diff --git a/contrib/vectorscan-cmake/x86_64/config.h b/contrib/vectorscan-cmake/amd64/config.h similarity index 100% rename from contrib/vectorscan-cmake/x86_64/config.h rename to contrib/vectorscan-cmake/amd64/config.h diff --git a/contrib/vectorscan-cmake/rageled_files/Parser.cpp b/contrib/vectorscan-cmake/rageled_files/Parser.cpp deleted file mode 100644 index aebbd7ace1e..00000000000 --- a/contrib/vectorscan-cmake/rageled_files/Parser.cpp +++ /dev/null @@ -1,5605 +0,0 @@ - -#line 1 "Parser.rl" -/* - * Copyright (c) 2015-2017, Intel Corporation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** \file - * \brief Parser code (generated with Ragel from Parser.rl). - */ - -#include "config.h" - -/* Parser.cpp is a built source, may not be in same dir as parser files */ -#include "parser/check_refs.h" -#include "parser/control_verbs.h" -#include "parser/ComponentAlternation.h" -#include "parser/ComponentAssertion.h" -#include "parser/ComponentAtomicGroup.h" -#include "parser/ComponentBackReference.h" -#include "parser/ComponentBoundary.h" -#include "parser/ComponentByte.h" -#include "parser/ComponentClass.h" -#include "parser/ComponentCondReference.h" -#include "parser/ComponentEmpty.h" -#include "parser/ComponentEUS.h" -#include "parser/Component.h" -#include "parser/ComponentRepeat.h" -#include "parser/ComponentSequence.h" -#include "parser/ComponentWordBoundary.h" -#include "parser/parse_error.h" -#include "parser/Parser.h" -#include "ue2common.h" -#include "util/compare.h" -#include "util/flat_containers.h" -#include "util/unicode_def.h" -#include "util/verify_types.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace std; - -namespace ue2 { - -#define PUSH_SEQUENCE do {\ - sequences.push_back(ExprState(currentSeq, (size_t)(ts - ptr), \ - mode)); \ - } while(0) -#define POP_SEQUENCE do {\ - currentSeq = sequences.back().seq; \ - mode = sequences.back().mode; \ - sequences.pop_back(); \ - } while(0) - -namespace { - -/** \brief Structure representing current state as we're parsing (current - * sequence, current options). Stored in the 'sequences' vector. */ -struct ExprState { - ExprState(ComponentSequence *seq_in, size_t offset, - const ParseMode &mode_in) : - seq(seq_in), seqOffset(offset), mode(mode_in) {} - - ComponentSequence *seq; //!< current sequence - size_t seqOffset; //!< offset seq was entered, for error reporting - ParseMode mode; //!< current mode flags -}; - -} // namespace - -static -unsigned parseAsDecimal(unsigned oct) { - // The input was parsed as octal, but should have been parsed as decimal. - // Deconstruct the octal number and reconstruct into decimal - unsigned ret = 0; - unsigned multiplier = 1; - while (oct) { - ret += (oct & 0x7) * multiplier; - oct >>= 3; - multiplier *= 10; - } - return ret; -} - -/** \brief Maximum value for a positive integer. We use INT_MAX, as that's what - * PCRE uses. */ -static constexpr u32 MAX_NUMBER = INT_MAX; - -static -void pushDec(u32 *acc, char raw_digit) { - assert(raw_digit >= '0' && raw_digit <= '9'); - u32 digit_val = raw_digit - '0'; - - // Ensure that we don't overflow. - u64a val = ((u64a)*acc * 10) + digit_val; - if (val > MAX_NUMBER) { - throw LocatedParseError("Number is too big"); - } - - *acc = verify_u32(val); -} - -static -void pushOct(u32 *acc, char raw_digit) { - assert(raw_digit >= '0' && raw_digit <= '7'); - u32 digit_val = raw_digit - '0'; - - // Ensure that we don't overflow. - u64a val = ((u64a)*acc * 8) + digit_val; - if (val > MAX_NUMBER) { - throw LocatedParseError("Number is too big"); - } - - *acc = verify_u32(val); -} - -static -void throwInvalidRepeat(void) { - throw LocatedParseError("Invalid repeat"); -} - -static -void throwInvalidUtf8(void) { - throw ParseError("Expression is not valid UTF-8."); -} - -/** - * Adds the given child component to the parent sequence, returning a pointer - * to the new (child) "current sequence". - */ -static -ComponentSequence *enterSequence(ComponentSequence *parent, - unique_ptr child) { - assert(parent); - assert(child); - - ComponentSequence *seq = child.get(); - parent->addComponent(move(child)); - return seq; -} - -static -void addLiteral(ComponentSequence *currentSeq, char c, const ParseMode &mode) { - if (mode.utf8 && mode.caseless) { - /* leverage ComponentClass to generate the vertices */ - auto cc = getComponentClass(mode); - assert(cc); - cc->add(c); - cc->finalize(); - currentSeq->addComponent(move(cc)); - } else { - currentSeq->addComponent(getLiteralComponentClass(c, mode.caseless)); - } -} - -static -void addEscaped(ComponentSequence *currentSeq, unichar accum, - const ParseMode &mode, const char *err_msg) { - if (mode.utf8) { - /* leverage ComponentClass to generate the vertices */ - auto cc = getComponentClass(mode); - assert(cc); - cc->add(accum); - cc->finalize(); - currentSeq->addComponent(move(cc)); - } else { - if (accum > 255) { - throw LocatedParseError(err_msg); - } - addLiteral(currentSeq, (char)accum, mode); - } -} - -static -void addEscapedOctal(ComponentSequence *currentSeq, unichar accum, - const ParseMode &mode) { - addEscaped(currentSeq, accum, mode, "Octal value is greater than \\377"); -} - -static -void addEscapedHex(ComponentSequence *currentSeq, unichar accum, - const ParseMode &mode) { - addEscaped(currentSeq, accum, mode, - "Hexadecimal value is greater than \\xFF"); -} - -#define SLASH_C_ERROR "\\c must be followed by an ASCII character" - -static -u8 decodeCtrl(char raw) { - if (raw & 0x80) { - throw LocatedParseError(SLASH_C_ERROR); - } - return mytoupper(raw) ^ 0x40; -} - -static -unichar readUtf8CodePoint2c(const char *s) { - auto *ts = (const u8 *)s; - assert(ts[0] >= 0xc0 && ts[0] < 0xe0); - assert(ts[1] >= 0x80 && ts[1] < 0xc0); - unichar val = ts[0] & 0x1f; - val <<= 6; - val |= ts[1] & 0x3f; - DEBUG_PRINTF("utf8 %02hhx %02hhx ->\\x{%x}\n", ts[0], - ts[1], val); - return val; -} - -static -unichar readUtf8CodePoint3c(const char *s) { - auto *ts = (const u8 *)s; - assert(ts[0] >= 0xe0 && ts[0] < 0xf0); - assert(ts[1] >= 0x80 && ts[1] < 0xc0); - assert(ts[2] >= 0x80 && ts[2] < 0xc0); - unichar val = ts[0] & 0x0f; - val <<= 6; - val |= ts[1] & 0x3f; - val <<= 6; - val |= ts[2] & 0x3f; - DEBUG_PRINTF("utf8 %02hhx %02hhx %02hhx ->\\x{%x}\n", ts[0], - ts[1], ts[2], val); - return val; -} - -static -unichar readUtf8CodePoint4c(const char *s) { - auto *ts = (const u8 *)s; - assert(ts[0] >= 0xf0 && ts[0] < 0xf8); - assert(ts[1] >= 0x80 && ts[1] < 0xc0); - assert(ts[2] >= 0x80 && ts[2] < 0xc0); - assert(ts[3] >= 0x80 && ts[3] < 0xc0); - unichar val = ts[0] & 0x07; - val <<= 6; - val |= ts[1] & 0x3f; - val <<= 6; - val |= ts[2] & 0x3f; - val <<= 6; - val |= ts[3] & 0x3f; - DEBUG_PRINTF("utf8 %02hhx %02hhx %02hhx %02hhx ->\\x{%x}\n", ts[0], - ts[1], ts[2], ts[3], val); - return val; -} - - -#line 1909 "Parser.rl" - - - -#line 281 "Parser.cpp" -static const short _regex_actions[] = { - 0, 1, 0, 1, 1, 1, 2, 1, - 3, 1, 4, 1, 7, 1, 8, 1, - 9, 1, 10, 1, 11, 1, 12, 1, - 13, 1, 15, 1, 16, 1, 17, 1, - 18, 1, 19, 1, 20, 1, 21, 1, - 22, 1, 23, 1, 24, 1, 25, 1, - 26, 1, 27, 1, 28, 1, 29, 1, - 30, 1, 31, 1, 32, 1, 33, 1, - 34, 1, 35, 1, 36, 1, 37, 1, - 38, 1, 39, 1, 40, 1, 41, 1, - 42, 1, 43, 1, 44, 1, 45, 1, - 46, 1, 47, 1, 48, 1, 49, 1, - 50, 1, 51, 1, 52, 1, 53, 1, - 54, 1, 55, 1, 56, 1, 57, 1, - 58, 1, 59, 1, 60, 1, 61, 1, - 62, 1, 63, 1, 64, 1, 65, 1, - 66, 1, 67, 1, 68, 1, 69, 1, - 70, 1, 71, 1, 72, 1, 73, 1, - 74, 1, 75, 1, 76, 1, 77, 1, - 78, 1, 79, 1, 80, 1, 81, 1, - 82, 1, 83, 1, 84, 1, 85, 1, - 86, 1, 87, 1, 88, 1, 89, 1, - 90, 1, 91, 1, 92, 1, 93, 1, - 94, 1, 95, 1, 96, 1, 97, 1, - 98, 1, 99, 1, 100, 1, 101, 1, - 102, 1, 103, 1, 104, 1, 105, 1, - 106, 1, 107, 1, 108, 1, 109, 1, - 110, 1, 111, 1, 112, 1, 113, 1, - 114, 1, 115, 1, 116, 1, 117, 1, - 118, 1, 119, 1, 120, 1, 121, 1, - 122, 1, 123, 1, 124, 1, 125, 1, - 126, 1, 127, 1, 128, 1, 129, 1, - 130, 1, 131, 1, 132, 1, 133, 1, - 134, 1, 135, 1, 136, 1, 137, 1, - 138, 1, 139, 1, 140, 1, 141, 1, - 142, 1, 143, 1, 144, 1, 145, 1, - 146, 1, 147, 1, 148, 1, 149, 1, - 150, 1, 151, 1, 152, 1, 153, 1, - 154, 1, 155, 1, 156, 1, 157, 1, - 158, 1, 159, 1, 160, 1, 161, 1, - 162, 1, 163, 1, 164, 1, 165, 1, - 166, 1, 167, 1, 168, 1, 169, 1, - 170, 1, 171, 1, 172, 1, 173, 1, - 174, 1, 175, 1, 176, 1, 177, 1, - 178, 1, 179, 1, 180, 1, 181, 1, - 182, 1, 183, 1, 184, 1, 185, 1, - 186, 1, 187, 1, 188, 1, 189, 1, - 190, 1, 191, 1, 192, 1, 193, 1, - 194, 1, 195, 1, 196, 1, 197, 1, - 198, 1, 199, 1, 200, 1, 201, 1, - 202, 1, 203, 1, 204, 1, 205, 1, - 206, 1, 207, 1, 208, 1, 209, 1, - 210, 1, 211, 1, 212, 1, 213, 1, - 214, 1, 215, 1, 216, 1, 217, 1, - 218, 1, 219, 1, 220, 1, 221, 1, - 222, 1, 223, 1, 224, 1, 225, 1, - 226, 1, 227, 1, 228, 1, 229, 1, - 230, 1, 231, 1, 232, 1, 233, 1, - 234, 1, 235, 1, 236, 1, 237, 1, - 240, 1, 242, 1, 243, 1, 244, 1, - 245, 1, 246, 1, 247, 1, 248, 1, - 249, 1, 250, 1, 251, 1, 252, 1, - 253, 1, 254, 1, 255, 1, 256, 1, - 257, 1, 258, 1, 259, 1, 260, 1, - 261, 1, 262, 1, 263, 1, 264, 1, - 265, 1, 266, 1, 267, 1, 268, 1, - 269, 1, 270, 1, 271, 1, 272, 1, - 273, 1, 274, 1, 275, 1, 276, 1, - 277, 1, 278, 1, 279, 1, 280, 1, - 281, 1, 282, 1, 283, 1, 284, 1, - 285, 1, 286, 1, 287, 1, 288, 1, - 289, 1, 290, 1, 291, 1, 292, 1, - 293, 1, 294, 1, 295, 1, 296, 1, - 297, 1, 298, 1, 299, 1, 300, 1, - 301, 1, 302, 1, 303, 1, 307, 1, - 308, 1, 309, 1, 310, 1, 311, 1, - 312, 1, 313, 1, 314, 1, 315, 1, - 316, 1, 317, 1, 318, 1, 319, 1, - 320, 1, 321, 1, 322, 1, 323, 1, - 324, 1, 325, 1, 326, 1, 327, 1, - 328, 1, 329, 1, 330, 1, 331, 1, - 332, 1, 333, 1, 334, 1, 335, 1, - 336, 1, 337, 1, 338, 1, 342, 1, - 343, 1, 344, 1, 345, 1, 346, 1, - 347, 1, 348, 1, 349, 1, 350, 1, - 352, 1, 353, 1, 354, 1, 355, 1, - 356, 1, 357, 1, 358, 1, 359, 1, - 360, 1, 361, 1, 362, 1, 363, 1, - 364, 1, 365, 1, 366, 1, 367, 1, - 368, 1, 369, 1, 370, 1, 371, 1, - 372, 1, 373, 1, 374, 1, 375, 1, - 376, 1, 377, 1, 378, 1, 379, 1, - 380, 1, 381, 1, 382, 1, 383, 1, - 384, 1, 385, 1, 386, 1, 387, 1, - 388, 1, 389, 1, 390, 1, 391, 1, - 392, 1, 393, 1, 394, 1, 395, 1, - 396, 1, 397, 1, 398, 1, 399, 1, - 400, 1, 401, 1, 402, 1, 403, 1, - 404, 1, 405, 1, 406, 1, 407, 1, - 408, 1, 409, 1, 410, 1, 411, 1, - 412, 1, 413, 1, 414, 1, 415, 1, - 416, 1, 417, 1, 418, 1, 419, 1, - 420, 1, 421, 1, 422, 1, 423, 1, - 424, 1, 425, 1, 426, 1, 427, 1, - 428, 1, 429, 1, 430, 1, 431, 1, - 432, 1, 433, 1, 434, 1, 435, 1, - 436, 2, 3, 0, 2, 4, 5, 2, - 5, 1, 2, 9, 10, 2, 9, 238, - 2, 9, 239, 2, 9, 339, 2, 10, - 1, 2, 10, 340, 2, 10, 341, 2, - 11, 241, 2, 11, 351, 2, 12, 241, - 2, 12, 351, 2, 13, 241, 2, 13, - 351, 2, 14, 375, 2, 14, 376, 2, - 25, 0, 2, 25, 3, 2, 25, 6, - 2, 25, 14, 3, 25, 5, 306, 3, - 25, 10, 305, 3, 25, 14, 15, 4, - 25, 9, 304, 10 -}; - -static const char _regex_cond_offsets[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, - 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 18, 19, 20, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 27, 28, 29, 31, 31, 36, - 36, 37, 38, 39, 44, 44, 45, 46, - 47, 47 -}; - -static const char _regex_cond_lengths[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 2, 0, 5, 0, - 1, 1, 1, 5, 0, 1, 1, 1, - 0, 0 -}; - -static const short _regex_cond_keys[] = { - -128, -65, -128, -65, -128, -65, -128, -65, - -128, -65, -128, -65, -128, -65, -128, -65, - -128, -65, -128, -65, -128, -65, -128, -65, - -128, -65, -64, -33, -32, -17, -16, -9, - -8, -1, 35, 35, -128, -65, -128, -65, - -128, -65, -128, -65, -64, -33, -32, -17, - -16, -9, -8, -1, -128, -65, -128, -65, - -128, -65, 93, 93, 94, 94, -128, -65, - -64, -33, -32, -17, -16, -9, -8, -1, - -128, -65, -128, -65, -128, -65, -128, -65, - -64, -33, -32, -17, -16, -9, -8, -1, - -128, -65, -128, -65, -128, -65, 0 -}; - -static const char _regex_cond_spaces[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const short _regex_key_offsets[] = { - 0, 0, 1, 23, 31, 39, 46, 54, - 55, 63, 71, 79, 86, 94, 97, 99, - 108, 115, 123, 131, 134, 140, 148, 151, - 158, 165, 173, 180, 184, 191, 194, 197, - 199, 202, 205, 207, 210, 213, 215, 216, - 218, 219, 227, 229, 232, 235, 236, 244, - 252, 260, 268, 275, 283, 290, 298, 305, - 313, 315, 318, 325, 329, 332, 335, 337, - 339, 341, 342, 344, 345, 347, 349, 350, - 351, 353, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, 369, - 370, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, 388, 389, 390, 392, 393, 394, - 395, 396, 397, 399, 400, 401, 402, 403, - 404, 405, 406, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 426, 427, 429, - 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, 444, 445, - 446, 447, 448, 450, 451, 452, 453, 454, - 455, 456, 457, 458, 459, 461, 462, 463, - 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 519, 520, - 521, 522, 523, 524, 525, 526, 527, 528, - 529, 530, 531, 532, 533, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 552, - 553, 554, 555, 556, 557, 558, 559, 561, - 562, 563, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 573, 574, 575, 576, 577, - 578, 579, 580, 582, 583, 584, 585, 586, - 587, 588, 589, 590, 591, 592, 593, 594, - 595, 596, 597, 601, 602, 603, 604, 605, - 606, 607, 608, 609, 610, 611, 612, 613, - 614, 615, 616, 617, 618, 620, 621, 622, - 623, 624, 625, 626, 627, 628, 629, 631, - 632, 633, 634, 635, 636, 637, 640, 641, - 642, 643, 644, 645, 646, 647, 648, 650, - 651, 652, 653, 654, 655, 656, 658, 659, - 660, 661, 662, 663, 664, 665, 666, 667, - 668, 669, 670, 671, 672, 673, 674, 675, - 676, 677, 678, 679, 680, 681, 682, 683, - 684, 685, 686, 687, 688, 689, 690, 691, - 692, 693, 694, 695, 696, 697, 698, 699, - 700, 701, 702, 704, 705, 706, 707, 708, - 709, 710, 714, 715, 716, 717, 718, 719, - 720, 721, 722, 723, 724, 725, 726, 727, - 728, 729, 730, 731, 732, 733, 734, 735, - 736, 737, 738, 739, 740, 741, 742, 743, - 744, 745, 746, 747, 748, 749, 750, 752, - 753, 754, 755, 756, 757, 758, 759, 760, - 761, 762, 763, 764, 765, 766, 767, 768, - 769, 770, 771, 773, 774, 775, 776, 777, - 778, 779, 780, 781, 782, 783, 784, 785, - 786, 787, 788, 789, 790, 791, 792, 793, - 794, 795, 796, 797, 798, 799, 800, 801, - 802, 803, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 817, 820, - 822, 823, 824, 825, 826, 827, 828, 829, - 830, 833, 834, 835, 836, 837, 838, 839, - 840, 841, 842, 843, 844, 845, 846, 847, - 849, 850, 851, 853, 854, 855, 856, 857, - 858, 859, 860, 861, 862, 863, 864, 865, - 866, 867, 868, 869, 870, 871, 872, 873, - 874, 875, 876, 877, 880, 883, 885, 900, - 903, 906, 908, 922, 927, 932, 936, 940, - 943, 946, 950, 954, 957, 960, 964, 968, - 972, 975, 978, 982, 986, 990, 994, 997, - 1000, 1004, 1008, 1012, 1016, 1019, 1022, 1026, - 1030, 1034, 1038, 1041, 1044, 1048, 1052, 1056, - 1060, 1063, 1066, 1070, 1074, 1078, 1082, 1085, - 1088, 1093, 1097, 1101, 1105, 1108, 1111, 1115, - 1119, 1123, 1126, 1129, 1133, 1137, 1141, 1145, - 1148, 1151, 1155, 1159, 1163, 1167, 1170, 1173, - 1177, 1181, 1185, 1188, 1191, 1195, 1199, 1203, - 1207, 1211, 1214, 1217, 1222, 1227, 1231, 1235, - 1238, 1241, 1245, 1249, 1252, 1255, 1259, 1263, - 1267, 1270, 1273, 1277, 1281, 1285, 1289, 1292, - 1295, 1299, 1303, 1307, 1311, 1314, 1317, 1321, - 1325, 1329, 1333, 1336, 1339, 1343, 1347, 1351, - 1355, 1358, 1361, 1365, 1369, 1373, 1377, 1380, - 1383, 1388, 1392, 1396, 1400, 1403, 1406, 1410, - 1414, 1418, 1421, 1424, 1428, 1432, 1436, 1440, - 1443, 1446, 1450, 1454, 1458, 1462, 1465, 1468, - 1472, 1476, 1480, 1483, 1486, 1490, 1494, 1498, - 1502, 1506, 1509, 1512, 1515, 1518, 1520, 1522, - 1525, 1532, 1534, 1536, 1538, 1540, 1542, 1544, - 1546, 1548, 1550, 1584, 1586, 1593, 1600, 1614, - 1616, 1622, 1625, 1634, 1635, 1638, 1641, 1648, - 1650, 1652, 1654, 1657, 1702, 1704, 1706, 1710, - 1714, 1716, 1717, 1717, 1723, 1725, 1727, 1729, - 1731, 1734, 1735, 1736, 1743, 1749, 1755, 1757, - 1759, 1761, 1763, 1765, 1767, 1768, 1771, 1794, - 1797, 1802, 1811, 1813, 1814, 1816, 1821, 1824, - 1826, 1828, 1829, 1831, 1841, 1847, 1848, 1853, - 1857, 1865, 1867, 1876, 1880, 1881, 1882, 1886, - 1887, 1890, 1890, 1897, 1913, 1916, 1955, 1957, - 1959, 1961, 1963, 1964, 1964, 1965, 1966, 1973, - 1979, 1985, 1987, 1989, 1991, 2000, 2002, 2015, - 2016, 2018, 2020, 2022, 2035, 2036, 2038, 2040, - 2042, 2043 -}; - -static const short _regex_trans_keys[] = { - 41, 33, 35, 38, 39, 40, 41, 43, - 45, 58, 60, 61, 62, 63, 67, 80, - 105, 109, 115, 120, 123, 48, 57, 41, - 95, 48, 57, 65, 90, 97, 122, 39, - 95, 48, 57, 65, 90, 97, 122, 95, - 48, 57, 65, 90, 97, 122, 39, 95, - 48, 57, 65, 90, 97, 122, 41, 41, - 95, 48, 57, 65, 90, 97, 122, 41, - 95, 48, 57, 65, 90, 97, 122, 41, - 95, 48, 57, 65, 90, 97, 122, 95, - 48, 57, 65, 90, 97, 122, 62, 95, - 48, 57, 65, 90, 97, 122, 33, 60, - 61, 33, 61, 38, 41, 95, 48, 57, - 65, 90, 97, 122, 95, 48, 57, 65, - 90, 97, 122, 41, 95, 48, 57, 65, - 90, 97, 122, 41, 95, 48, 57, 65, - 90, 97, 122, 41, 48, 57, 41, 58, - 105, 109, 115, 120, 62, 95, 48, 57, - 65, 90, 97, 122, 41, 48, 57, 95, - 48, 57, 65, 90, 97, 122, 95, 48, - 57, 65, 90, 97, 122, 41, 95, 48, - 57, 65, 90, 97, 122, 95, 48, 57, - 65, 90, 97, 122, 105, 109, 115, 120, - 41, 45, 58, 105, 109, 115, 120, 46, - 92, 93, 46, 92, 93, 46, 92, 58, - 92, 93, 58, 92, 93, 58, 92, 61, - 92, 93, 61, 92, 93, 61, 92, 39, - 48, 57, 62, 45, 95, 48, 57, 65, - 90, 97, 122, 48, 57, 125, 48, 57, - 125, 48, 57, 125, 95, 125, 48, 57, - 65, 90, 97, 122, 95, 125, 48, 57, - 65, 90, 97, 122, 95, 125, 48, 57, - 65, 90, 97, 122, 95, 125, 48, 57, - 65, 90, 97, 122, 95, 48, 57, 65, - 90, 97, 122, 39, 95, 48, 57, 65, - 90, 97, 122, 95, 48, 57, 65, 90, - 97, 122, 62, 95, 48, 57, 65, 90, - 97, 122, 95, 48, 57, 65, 90, 97, - 122, 95, 125, 48, 57, 65, 90, 97, - 122, 48, 55, 125, 48, 55, 125, 48, - 57, 65, 70, 97, 102, 44, 125, 48, - 57, 125, 48, 57, 125, 48, 57, 384, - 447, 384, 447, 384, 447, 41, 41, 80, - 41, 41, 70, 41, 56, 41, 121, 97, - 109, 98, 105, 99, 101, 110, 105, 97, - 110, 101, 115, 116, 97, 110, 108, 109, - 116, 105, 110, 101, 115, 101, 117, 109, - 97, 107, 110, 103, 97, 108, 105, 112, - 111, 109, 111, 102, 111, 97, 104, 105, - 109, 105, 108, 108, 101, 103, 104, 105, - 110, 101, 115, 101, 105, 100, 110, 114, - 97, 100, 105, 97, 110, 95, 65, 98, - 111, 114, 105, 103, 105, 110, 97, 108, - 105, 97, 110, 97, 101, 109, 114, 111, - 107, 101, 101, 109, 111, 110, 116, 105, - 99, 110, 101, 105, 102, 111, 114, 109, - 112, 114, 114, 105, 111, 116, 105, 108, - 108, 105, 99, 115, 118, 101, 114, 101, - 116, 97, 110, 97, 103, 97, 114, 105, - 121, 112, 116, 105, 97, 110, 95, 72, - 105, 101, 114, 111, 103, 108, 121, 112, - 104, 115, 104, 105, 111, 112, 105, 99, - 111, 114, 103, 105, 97, 110, 97, 103, - 111, 108, 105, 116, 105, 99, 116, 104, - 105, 99, 101, 101, 107, 106, 114, 97, - 114, 97, 116, 105, 109, 117, 107, 104, - 105, 110, 117, 108, 110, 111, 111, 98, - 114, 101, 119, 114, 97, 103, 97, 110, - 97, 112, 101, 114, 105, 97, 108, 95, - 65, 114, 97, 109, 97, 105, 99, 104, - 115, 101, 114, 105, 116, 101, 100, 99, - 114, 105, 112, 116, 105, 111, 110, 97, - 108, 95, 80, 97, 104, 114, 108, 97, - 118, 105, 116, 104, 105, 97, 110, 118, - 97, 110, 101, 115, 101, 105, 110, 116, - 121, 116, 104, 105, 110, 97, 100, 97, - 97, 107, 97, 110, 97, 97, 104, 95, - 76, 105, 97, 109, 114, 111, 115, 104, - 116, 104, 105, 101, 114, 111, 116, 105, - 110, 112, 99, 104, 97, 109, 110, 115, - 98, 117, 101, 97, 114, 95, 66, 117, - 99, 100, 105, 97, 110, 105, 97, 110, - 108, 110, 97, 121, 97, 108, 97, 109, - 100, 97, 105, 99, 116, 101, 105, 95, - 77, 97, 121, 101, 107, 110, 103, 111, - 108, 105, 97, 110, 97, 110, 109, 97, - 114, 119, 95, 84, 97, 105, 95, 76, - 117, 101, 111, 104, 97, 109, 95, 100, - 67, 104, 105, 107, 105, 95, 73, 80, - 83, 84, 116, 97, 108, 105, 99, 101, - 114, 115, 105, 97, 110, 111, 117, 116, - 104, 95, 65, 114, 97, 98, 105, 97, - 110, 117, 114, 107, 105, 99, 105, 121, - 97, 109, 97, 110, 121, 97, 97, 111, - 103, 115, 95, 80, 97, 101, 110, 105, - 99, 105, 97, 110, 106, 97, 110, 103, - 110, 105, 99, 109, 117, 97, 114, 105, - 116, 97, 110, 114, 97, 115, 104, 116, - 114, 97, 97, 118, 105, 97, 110, 110, - 104, 97, 108, 97, 110, 100, 97, 110, - 101, 115, 101, 108, 114, 111, 116, 105, - 95, 78, 97, 103, 114, 105, 105, 97, - 99, 103, 105, 109, 97, 98, 108, 111, - 103, 97, 110, 119, 97, 95, 76, 84, - 86, 101, 104, 97, 109, 105, 101, 116, - 105, 108, 108, 117, 103, 117, 97, 97, - 105, 110, 97, 98, 102, 101, 116, 97, - 110, 105, 110, 97, 103, 104, 97, 114, - 105, 116, 105, 99, 105, 110, 115, 112, - 100, 123, 94, 125, 94, 46, 92, 93, - 46, 92, 93, 46, 92, 58, 92, 93, - 94, 97, 98, 99, 100, 103, 108, 112, - 115, 117, 119, 120, 58, 92, 93, 58, - 92, 93, 58, 92, 58, 92, 93, 97, - 98, 99, 100, 103, 108, 112, 115, 117, - 119, 120, 58, 92, 93, 108, 115, 58, - 92, 93, 110, 112, 58, 92, 93, 117, - 58, 92, 93, 109, 58, 92, 93, 58, - 92, 93, 58, 92, 93, 104, 58, 92, - 93, 97, 58, 92, 93, 58, 92, 93, - 58, 92, 93, 99, 58, 92, 93, 105, - 58, 92, 93, 105, 58, 92, 93, 58, - 92, 93, 58, 92, 93, 108, 58, 92, - 93, 97, 58, 92, 93, 110, 58, 92, - 93, 107, 58, 92, 93, 58, 92, 93, - 58, 92, 93, 110, 58, 92, 93, 116, - 58, 92, 93, 114, 58, 92, 93, 108, - 58, 92, 93, 58, 92, 93, 58, 92, - 93, 105, 58, 92, 93, 103, 58, 92, - 93, 105, 58, 92, 93, 116, 58, 92, - 93, 58, 92, 93, 58, 92, 93, 114, - 58, 92, 93, 97, 58, 92, 93, 112, - 58, 92, 93, 104, 58, 92, 93, 58, - 92, 93, 58, 92, 93, 111, 58, 92, - 93, 119, 58, 92, 93, 101, 58, 92, - 93, 114, 58, 92, 93, 58, 92, 93, - 58, 92, 93, 114, 117, 58, 92, 93, - 105, 58, 92, 93, 110, 58, 92, 93, - 116, 58, 92, 93, 58, 92, 93, 58, - 92, 93, 110, 58, 92, 93, 99, 58, - 92, 93, 116, 58, 92, 93, 58, 92, - 93, 58, 92, 93, 112, 58, 92, 93, - 97, 58, 92, 93, 99, 58, 92, 93, - 101, 58, 92, 93, 58, 92, 93, 58, - 92, 93, 112, 58, 92, 93, 112, 58, - 92, 93, 101, 58, 92, 93, 114, 58, - 92, 93, 58, 92, 93, 58, 92, 93, - 111, 58, 92, 93, 114, 58, 92, 93, - 100, 58, 92, 93, 58, 92, 93, 58, - 92, 93, 100, 58, 92, 93, 105, 58, - 92, 93, 103, 58, 92, 93, 105, 58, - 92, 93, 116, 58, 92, 93, 58, 92, - 93, 58, 92, 93, 108, 115, 58, 92, - 93, 110, 112, 58, 92, 93, 117, 58, - 92, 93, 109, 58, 92, 93, 58, 92, - 93, 58, 92, 93, 104, 58, 92, 93, - 97, 58, 92, 93, 58, 92, 93, 58, - 92, 93, 99, 58, 92, 93, 105, 58, - 92, 93, 105, 58, 92, 93, 58, 92, - 93, 58, 92, 93, 108, 58, 92, 93, - 97, 58, 92, 93, 110, 58, 92, 93, - 107, 58, 92, 93, 58, 92, 93, 58, - 92, 93, 110, 58, 92, 93, 116, 58, - 92, 93, 114, 58, 92, 93, 108, 58, - 92, 93, 58, 92, 93, 58, 92, 93, - 105, 58, 92, 93, 103, 58, 92, 93, - 105, 58, 92, 93, 116, 58, 92, 93, - 58, 92, 93, 58, 92, 93, 114, 58, - 92, 93, 97, 58, 92, 93, 112, 58, - 92, 93, 104, 58, 92, 93, 58, 92, - 93, 58, 92, 93, 111, 58, 92, 93, - 119, 58, 92, 93, 101, 58, 92, 93, - 114, 58, 92, 93, 58, 92, 93, 58, - 92, 93, 114, 117, 58, 92, 93, 105, - 58, 92, 93, 110, 58, 92, 93, 116, - 58, 92, 93, 58, 92, 93, 58, 92, - 93, 110, 58, 92, 93, 99, 58, 92, - 93, 116, 58, 92, 93, 58, 92, 93, - 58, 92, 93, 112, 58, 92, 93, 97, - 58, 92, 93, 99, 58, 92, 93, 101, - 58, 92, 93, 58, 92, 93, 58, 92, - 93, 112, 58, 92, 93, 112, 58, 92, - 93, 101, 58, 92, 93, 114, 58, 92, - 93, 58, 92, 93, 58, 92, 93, 111, - 58, 92, 93, 114, 58, 92, 93, 100, - 58, 92, 93, 58, 92, 93, 58, 92, - 93, 100, 58, 92, 93, 105, 58, 92, - 93, 103, 58, 92, 93, 105, 58, 92, - 93, 116, 58, 92, 93, 58, 92, 93, - 61, 92, 93, 61, 92, 93, 61, 92, - 48, 55, 125, 48, 55, 125, 48, 57, - 65, 70, 97, 102, 384, 447, 384, 447, - 384, 447, 384, 447, 384, 447, 384, 447, - 384, 447, 384, 447, 384, 447, 0, 32, - 36, 40, 41, 42, 43, 46, 63, 91, - 92, 94, 123, 124, 1315, 1571, 1, 8, - 9, 13, 14, 34, 37, 255, 384, 447, - 448, 479, 480, 495, 496, 503, 504, 511, - 42, 63, 95, 48, 57, 65, 90, 97, - 122, 95, 48, 57, 65, 90, 97, 122, - 39, 48, 60, 63, 82, 95, 49, 55, - 56, 57, 65, 90, 97, 122, 48, 57, - 105, 109, 115, 120, 48, 57, 41, 48, - 57, 33, 61, 95, 48, 57, 65, 90, - 97, 122, 123, 41, 48, 57, 60, 61, - 62, 41, 45, 58, 105, 109, 115, 120, - 43, 63, 43, 63, 43, 63, 46, 58, - 61, 48, 65, 66, 67, 68, 69, 71, - 72, 75, 76, 78, 80, 81, 82, 83, - 85, 86, 87, 88, 90, 97, 98, 99, - 100, 101, 102, 103, 104, 107, 108, 110, - 111, 112, 114, 115, 116, 117, 118, 119, - 120, 122, 49, 55, 56, 57, 48, 55, - 48, 55, 48, 55, 56, 57, 48, 55, - 56, 57, 48, 57, 123, 39, 45, 60, - 123, 48, 57, 48, 57, 48, 57, 48, - 57, 48, 57, 39, 60, 123, 123, 123, - 123, 48, 57, 65, 70, 97, 102, 48, - 57, 65, 70, 97, 102, 48, 57, 65, - 70, 97, 102, 48, 57, 43, 63, 384, - 447, 384, 447, 384, 447, 41, 85, 41, - 41, 67, 84, 65, 66, 67, 68, 69, - 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 82, 83, 84, 85, 86, 88, - 89, 90, 110, 114, 118, 97, 101, 111, - 114, 117, 97, 99, 102, 104, 110, 111, - 115, 117, 121, 109, 112, 101, 103, 116, - 101, 108, 111, 114, 117, 97, 101, 105, - 103, 117, 109, 110, 97, 97, 104, 38, - 97, 101, 105, 108, 109, 111, 116, 117, - 121, 97, 99, 101, 110, 111, 121, 101, - 100, 101, 107, 108, 111, 103, 108, 114, - 115, 99, 100, 101, 102, 104, 105, 111, - 115, 101, 117, 97, 99, 104, 105, 107, - 109, 111, 117, 121, 97, 101, 104, 105, - 103, 97, 97, 112, 115, 119, 105, 108, - 112, 115, 67, 76, 77, 78, 80, 83, - 90, 45, 91, 92, 93, 0, 255, 384, - 447, 448, 479, 480, 495, 496, 503, 504, - 511, 46, 58, 61, 48, 68, 69, 72, - 76, 78, 80, 81, 83, 85, 86, 87, - 97, 98, 99, 100, 101, 102, 103, 104, - 108, 110, 111, 112, 114, 115, 116, 117, - 118, 119, 120, 49, 55, 56, 57, 65, - 90, 105, 122, 48, 55, 48, 55, 48, - 55, 48, 55, 123, 123, 123, 123, 48, - 57, 65, 70, 97, 102, 48, 57, 65, - 70, 97, 102, 48, 57, 65, 70, 97, - 102, 384, 447, 384, 447, 384, 447, 92, - 1117, 1118, -128, 91, 95, 127, 861, 862, - 69, 81, 92, 0, 255, 384, 447, 448, - 479, 480, 495, 496, 503, 504, 511, 69, - 384, 447, 384, 447, 384, 447, 92, 0, - 255, 384, 447, 448, 479, 480, 495, 496, - 503, 504, 511, 69, 384, 447, 384, 447, - 384, 447, 41, 10, 0 -}; - -static const char _regex_single_lengths[] = { - 0, 1, 20, 2, 2, 1, 2, 1, - 2, 2, 2, 1, 2, 3, 2, 3, - 1, 2, 2, 1, 6, 2, 1, 1, - 1, 2, 1, 4, 7, 3, 3, 2, - 3, 3, 2, 3, 3, 2, 1, 0, - 1, 2, 0, 1, 1, 1, 2, 2, - 2, 2, 1, 2, 1, 2, 1, 2, - 0, 1, 1, 2, 1, 1, 0, 0, - 0, 1, 2, 1, 2, 2, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 4, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, - 1, 4, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 2, - 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 3, 2, 15, 3, - 3, 2, 14, 5, 5, 4, 4, 3, - 3, 4, 4, 3, 3, 4, 4, 4, - 3, 3, 4, 4, 4, 4, 3, 3, - 4, 4, 4, 4, 3, 3, 4, 4, - 4, 4, 3, 3, 4, 4, 4, 4, - 3, 3, 4, 4, 4, 4, 3, 3, - 5, 4, 4, 4, 3, 3, 4, 4, - 4, 3, 3, 4, 4, 4, 4, 3, - 3, 4, 4, 4, 4, 3, 3, 4, - 4, 4, 3, 3, 4, 4, 4, 4, - 4, 3, 3, 5, 5, 4, 4, 3, - 3, 4, 4, 3, 3, 4, 4, 4, - 3, 3, 4, 4, 4, 4, 3, 3, - 4, 4, 4, 4, 3, 3, 4, 4, - 4, 4, 3, 3, 4, 4, 4, 4, - 3, 3, 4, 4, 4, 4, 3, 3, - 5, 4, 4, 4, 3, 3, 4, 4, - 4, 3, 3, 4, 4, 4, 4, 3, - 3, 4, 4, 4, 4, 3, 3, 4, - 4, 4, 3, 3, 4, 4, 4, 4, - 4, 3, 3, 3, 3, 2, 0, 1, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 16, 2, 1, 1, 6, 0, - 4, 1, 3, 1, 1, 3, 7, 2, - 2, 2, 3, 41, 0, 0, 0, 0, - 0, 1, 0, 4, 0, 0, 0, 0, - 3, 1, 1, 1, 0, 0, 0, 2, - 0, 0, 0, 2, 1, 3, 23, 3, - 5, 9, 2, 1, 2, 5, 3, 2, - 2, 1, 2, 10, 6, 1, 5, 4, - 8, 2, 9, 4, 1, 1, 4, 1, - 3, 0, 7, 4, 3, 31, 0, 0, - 0, 0, 1, 0, 1, 1, 1, 0, - 0, 0, 0, 0, 3, 2, 1, 1, - 0, 0, 0, 1, 1, 0, 0, 0, - 1, 1 -}; - -static const char _regex_range_lengths[] = { - 0, 0, 1, 3, 3, 3, 3, 0, - 3, 3, 3, 3, 3, 0, 0, 3, - 3, 3, 3, 1, 0, 3, 1, 3, - 3, 3, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, - 0, 3, 1, 1, 1, 0, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 1, 1, 3, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 9, 0, 3, 3, 4, 1, - 1, 1, 3, 0, 1, 0, 0, 0, - 0, 0, 0, 2, 1, 1, 2, 2, - 1, 0, 0, 1, 1, 1, 1, 1, - 0, 0, 0, 3, 3, 3, 1, 0, - 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 4, 1, 1, - 1, 1, 0, 0, 0, 0, 3, 3, - 3, 1, 1, 1, 3, 0, 6, 0, - 1, 1, 1, 6, 0, 1, 1, 1, - 0, 0 -}; - -static const short _regex_index_offsets[] = { - 0, 0, 2, 24, 30, 36, 41, 47, - 49, 55, 61, 67, 72, 78, 82, 85, - 92, 97, 103, 109, 112, 119, 125, 128, - 133, 138, 144, 149, 154, 162, 166, 170, - 173, 177, 181, 184, 188, 192, 195, 197, - 199, 201, 207, 209, 212, 215, 217, 223, - 229, 235, 241, 246, 252, 257, 263, 268, - 274, 276, 279, 284, 288, 291, 294, 296, - 298, 300, 302, 305, 307, 310, 313, 315, - 317, 320, 322, 324, 326, 328, 330, 332, - 334, 336, 338, 340, 342, 344, 346, 350, - 352, 354, 356, 358, 360, 362, 364, 366, - 368, 370, 372, 374, 376, 378, 380, 382, - 384, 386, 388, 390, 392, 395, 397, 399, - 401, 403, 405, 408, 410, 412, 414, 416, - 418, 420, 422, 425, 427, 429, 431, 433, - 435, 437, 439, 441, 443, 445, 447, 449, - 451, 453, 455, 457, 459, 461, 463, 466, - 468, 470, 472, 474, 476, 478, 480, 482, - 484, 486, 488, 490, 492, 494, 496, 498, - 500, 502, 504, 507, 509, 511, 513, 515, - 517, 519, 521, 523, 525, 528, 530, 532, - 534, 536, 538, 540, 542, 544, 546, 548, - 550, 552, 554, 556, 558, 560, 562, 564, - 566, 568, 570, 572, 574, 576, 578, 580, - 582, 584, 586, 588, 590, 592, 594, 596, - 598, 600, 602, 604, 606, 608, 610, 612, - 614, 616, 618, 620, 622, 624, 626, 628, - 630, 632, 634, 636, 638, 640, 643, 645, - 647, 649, 651, 653, 655, 657, 659, 661, - 663, 665, 667, 669, 671, 673, 675, 677, - 679, 681, 683, 685, 687, 689, 691, 693, - 695, 697, 699, 701, 703, 705, 707, 709, - 711, 713, 715, 717, 719, 721, 723, 726, - 728, 730, 732, 734, 736, 738, 740, 742, - 744, 746, 748, 750, 752, 754, 756, 758, - 760, 762, 764, 767, 769, 771, 773, 775, - 777, 779, 781, 783, 785, 787, 789, 791, - 793, 795, 797, 802, 804, 806, 808, 810, - 812, 814, 816, 818, 820, 822, 824, 826, - 828, 830, 832, 834, 836, 839, 841, 843, - 845, 847, 849, 851, 853, 855, 857, 860, - 862, 864, 866, 868, 870, 872, 876, 878, - 880, 882, 884, 886, 888, 890, 892, 895, - 897, 899, 901, 903, 905, 907, 910, 912, - 914, 916, 918, 920, 922, 924, 926, 928, - 930, 932, 934, 936, 938, 940, 942, 944, - 946, 948, 950, 952, 954, 956, 958, 960, - 962, 964, 966, 968, 970, 972, 974, 976, - 978, 980, 982, 984, 986, 988, 990, 992, - 994, 996, 998, 1001, 1003, 1005, 1007, 1009, - 1011, 1013, 1018, 1020, 1022, 1024, 1026, 1028, - 1030, 1032, 1034, 1036, 1038, 1040, 1042, 1044, - 1046, 1048, 1050, 1052, 1054, 1056, 1058, 1060, - 1062, 1064, 1066, 1068, 1070, 1072, 1074, 1076, - 1078, 1080, 1082, 1084, 1086, 1088, 1090, 1093, - 1095, 1097, 1099, 1101, 1103, 1105, 1107, 1109, - 1111, 1113, 1115, 1117, 1119, 1121, 1123, 1125, - 1127, 1129, 1131, 1134, 1136, 1138, 1140, 1142, - 1144, 1146, 1148, 1150, 1152, 1154, 1156, 1158, - 1160, 1162, 1164, 1166, 1168, 1170, 1172, 1174, - 1176, 1178, 1180, 1182, 1184, 1186, 1188, 1190, - 1192, 1194, 1197, 1199, 1201, 1203, 1205, 1207, - 1209, 1211, 1213, 1215, 1217, 1219, 1221, 1225, - 1228, 1230, 1232, 1234, 1236, 1238, 1240, 1242, - 1244, 1248, 1250, 1252, 1254, 1256, 1258, 1260, - 1262, 1264, 1266, 1268, 1270, 1272, 1274, 1276, - 1279, 1281, 1283, 1286, 1288, 1290, 1292, 1294, - 1296, 1298, 1300, 1302, 1304, 1306, 1308, 1310, - 1312, 1314, 1316, 1318, 1320, 1322, 1324, 1326, - 1328, 1330, 1332, 1334, 1338, 1342, 1345, 1361, - 1365, 1369, 1372, 1387, 1393, 1399, 1404, 1409, - 1413, 1417, 1422, 1427, 1431, 1435, 1440, 1445, - 1450, 1454, 1458, 1463, 1468, 1473, 1478, 1482, - 1486, 1491, 1496, 1501, 1506, 1510, 1514, 1519, - 1524, 1529, 1534, 1538, 1542, 1547, 1552, 1557, - 1562, 1566, 1570, 1575, 1580, 1585, 1590, 1594, - 1598, 1604, 1609, 1614, 1619, 1623, 1627, 1632, - 1637, 1642, 1646, 1650, 1655, 1660, 1665, 1670, - 1674, 1678, 1683, 1688, 1693, 1698, 1702, 1706, - 1711, 1716, 1721, 1725, 1729, 1734, 1739, 1744, - 1749, 1754, 1758, 1762, 1768, 1774, 1779, 1784, - 1788, 1792, 1797, 1802, 1806, 1810, 1815, 1820, - 1825, 1829, 1833, 1838, 1843, 1848, 1853, 1857, - 1861, 1866, 1871, 1876, 1881, 1885, 1889, 1894, - 1899, 1904, 1909, 1913, 1917, 1922, 1927, 1932, - 1937, 1941, 1945, 1950, 1955, 1960, 1965, 1969, - 1973, 1979, 1984, 1989, 1994, 1998, 2002, 2007, - 2012, 2017, 2021, 2025, 2030, 2035, 2040, 2045, - 2049, 2053, 2058, 2063, 2068, 2073, 2077, 2081, - 2086, 2091, 2096, 2100, 2104, 2109, 2114, 2119, - 2124, 2129, 2133, 2137, 2141, 2145, 2148, 2150, - 2153, 2158, 2160, 2162, 2164, 2166, 2168, 2170, - 2172, 2174, 2176, 2202, 2205, 2210, 2215, 2226, - 2228, 2234, 2237, 2244, 2246, 2249, 2253, 2261, - 2264, 2267, 2270, 2274, 2318, 2320, 2322, 2325, - 2328, 2330, 2332, 2333, 2339, 2341, 2343, 2345, - 2347, 2351, 2353, 2355, 2360, 2364, 2368, 2370, - 2373, 2375, 2377, 2379, 2382, 2384, 2388, 2412, - 2416, 2422, 2432, 2435, 2437, 2440, 2446, 2450, - 2453, 2456, 2458, 2461, 2472, 2479, 2481, 2487, - 2492, 2501, 2504, 2514, 2519, 2521, 2523, 2528, - 2530, 2534, 2535, 2543, 2554, 2558, 2594, 2596, - 2598, 2600, 2602, 2604, 2605, 2607, 2609, 2614, - 2618, 2622, 2624, 2626, 2628, 2635, 2638, 2646, - 2648, 2650, 2652, 2654, 2662, 2664, 2666, 2668, - 2670, 2672 -}; - -static const short _regex_indicies[] = { - 0, 1, 3, 4, 5, 6, 7, 8, - 9, 10, 12, 13, 14, 15, 16, 17, - 18, 19, 19, 19, 19, 20, 11, 2, - 22, 23, 23, 23, 23, 21, 24, 25, - 25, 25, 25, 21, 27, 27, 27, 27, - 26, 28, 27, 27, 27, 27, 26, 29, - 26, 29, 30, 30, 30, 30, 26, 31, - 30, 32, 30, 30, 26, 29, 30, 32, - 30, 30, 26, 33, 33, 33, 33, 26, - 28, 33, 33, 33, 33, 26, 34, 35, - 36, 26, 37, 38, 26, 39, 40, 30, - 41, 30, 30, 26, 42, 42, 42, 42, - 26, 40, 42, 42, 42, 42, 26, 40, - 30, 41, 30, 30, 26, 43, 44, 21, - 45, 46, 47, 47, 47, 47, 21, 24, - 48, 48, 48, 48, 21, 49, 50, 21, - 48, 48, 48, 48, 21, 51, 51, 51, - 51, 21, 52, 51, 51, 51, 51, 21, - 23, 23, 23, 23, 21, 47, 47, 47, - 47, 21, 45, 53, 46, 54, 54, 54, - 54, 21, 57, 58, 55, 56, 57, 58, - 59, 56, 57, 58, 56, 61, 62, 55, - 60, 61, 62, 63, 60, 61, 62, 60, - 65, 66, 55, 64, 65, 66, 59, 64, - 65, 66, 64, 69, 68, 70, 67, 69, - 71, 72, 74, 73, 74, 74, 67, 75, - 67, 77, 76, 67, 77, 78, 67, 77, - 67, 74, 80, 79, 74, 74, 67, 74, - 80, 81, 74, 74, 67, 74, 80, 74, - 74, 74, 67, 74, 82, 74, 74, 74, - 67, 84, 84, 84, 84, 83, 85, 84, - 84, 84, 84, 83, 86, 86, 86, 86, - 83, 87, 86, 86, 86, 86, 83, 88, - 88, 88, 88, 83, 88, 89, 88, 88, - 88, 83, 91, 90, 92, 91, 90, 95, - 94, 94, 94, 93, 97, 99, 98, 96, - 101, 100, 96, 102, 100, 96, 104, 103, - 105, 103, 106, 103, 109, 108, 109, 110, - 108, 111, 108, 109, 112, 108, 113, 114, - 108, 115, 108, 117, 116, 118, 119, 116, - 120, 116, 121, 116, 122, 116, 123, 116, - 124, 116, 125, 116, 126, 116, 127, 116, - 128, 116, 129, 116, 130, 116, 131, 116, - 132, 116, 133, 134, 135, 116, 136, 116, - 137, 116, 138, 116, 139, 116, 140, 116, - 141, 116, 142, 116, 143, 116, 144, 116, - 145, 116, 146, 116, 147, 116, 148, 116, - 149, 116, 150, 116, 151, 116, 152, 116, - 153, 116, 154, 116, 155, 116, 156, 116, - 157, 158, 116, 159, 116, 160, 116, 161, - 116, 162, 116, 163, 116, 164, 165, 116, - 166, 116, 167, 116, 168, 116, 169, 116, - 170, 116, 171, 116, 172, 116, 174, 175, - 173, 176, 173, 177, 173, 178, 173, 179, - 173, 180, 173, 181, 173, 182, 173, 183, - 173, 184, 173, 185, 173, 186, 173, 187, - 173, 188, 173, 189, 173, 190, 173, 191, - 173, 192, 173, 193, 173, 194, 173, 195, - 196, 173, 197, 173, 198, 173, 199, 173, - 200, 173, 201, 173, 202, 173, 204, 203, - 205, 203, 206, 203, 207, 203, 208, 203, - 209, 203, 210, 173, 211, 173, 212, 173, - 213, 173, 214, 173, 215, 173, 216, 173, - 217, 218, 173, 219, 173, 220, 173, 221, - 173, 222, 173, 223, 173, 224, 173, 225, - 173, 226, 173, 227, 173, 228, 229, 116, - 230, 116, 231, 116, 232, 116, 233, 116, - 234, 116, 235, 116, 236, 116, 237, 116, - 238, 116, 239, 116, 240, 116, 241, 116, - 242, 116, 243, 116, 244, 116, 245, 116, - 246, 116, 247, 116, 248, 116, 249, 116, - 250, 116, 251, 116, 252, 116, 253, 116, - 254, 116, 255, 116, 256, 116, 257, 116, - 258, 116, 259, 116, 260, 116, 261, 116, - 262, 116, 263, 116, 264, 116, 265, 116, - 266, 116, 267, 116, 268, 116, 269, 116, - 270, 116, 271, 116, 272, 116, 273, 116, - 274, 116, 275, 116, 276, 116, 277, 116, - 278, 116, 279, 116, 280, 116, 281, 116, - 282, 116, 283, 116, 284, 116, 285, 116, - 286, 287, 116, 288, 116, 289, 116, 290, - 116, 291, 116, 292, 116, 293, 116, 294, - 116, 295, 116, 296, 116, 297, 116, 298, - 116, 300, 299, 301, 299, 302, 299, 303, - 299, 304, 299, 305, 116, 306, 116, 307, - 116, 308, 116, 309, 116, 310, 116, 311, - 116, 312, 116, 313, 116, 314, 116, 315, - 116, 316, 116, 317, 116, 318, 116, 319, - 116, 320, 116, 321, 116, 322, 116, 323, - 116, 324, 116, 325, 116, 326, 116, 327, - 116, 328, 116, 329, 330, 116, 331, 116, - 332, 116, 333, 116, 334, 116, 335, 116, - 336, 116, 337, 116, 338, 116, 339, 116, - 340, 116, 341, 116, 342, 116, 343, 116, - 344, 116, 345, 116, 346, 116, 347, 116, - 348, 116, 349, 116, 350, 351, 116, 352, - 116, 353, 116, 354, 116, 355, 116, 356, - 116, 357, 116, 358, 116, 359, 116, 360, - 116, 361, 116, 362, 116, 363, 116, 364, - 116, 365, 116, 366, 116, 367, 368, 369, - 370, 116, 371, 116, 372, 116, 373, 116, - 374, 116, 375, 116, 376, 116, 377, 116, - 378, 116, 379, 116, 380, 116, 381, 116, - 382, 116, 383, 116, 384, 116, 385, 116, - 386, 116, 387, 116, 388, 389, 116, 390, - 116, 391, 116, 392, 116, 393, 116, 394, - 116, 395, 116, 396, 116, 397, 116, 398, - 116, 400, 401, 399, 402, 399, 403, 399, - 404, 399, 405, 399, 406, 399, 407, 399, - 408, 409, 410, 399, 411, 399, 412, 399, - 413, 399, 414, 399, 415, 399, 416, 399, - 417, 399, 418, 399, 419, 420, 399, 421, - 399, 422, 399, 423, 399, 424, 399, 425, - 399, 426, 399, 428, 429, 427, 430, 427, - 431, 427, 432, 427, 433, 427, 434, 427, - 435, 427, 436, 427, 437, 427, 438, 427, - 439, 427, 441, 440, 442, 440, 443, 440, - 444, 440, 445, 440, 446, 440, 447, 440, - 448, 440, 449, 440, 450, 427, 451, 427, - 452, 427, 453, 427, 454, 427, 455, 427, - 456, 427, 457, 427, 458, 427, 459, 427, - 460, 427, 461, 427, 463, 462, 464, 462, - 465, 462, 466, 462, 467, 462, 468, 462, - 469, 462, 470, 462, 471, 462, 472, 462, - 473, 116, 474, 116, 475, 116, 476, 477, - 116, 478, 116, 479, 116, 480, 116, 481, - 116, 482, 116, 483, 116, 484, 485, 486, - 487, 116, 488, 116, 489, 116, 490, 116, - 491, 116, 492, 116, 493, 116, 494, 116, - 495, 116, 496, 116, 497, 116, 498, 116, - 499, 116, 500, 116, 501, 116, 502, 116, - 503, 116, 504, 116, 505, 116, 506, 116, - 507, 116, 508, 116, 509, 116, 510, 116, - 511, 116, 512, 116, 513, 116, 514, 116, - 515, 116, 516, 116, 517, 116, 518, 116, - 519, 116, 520, 116, 521, 116, 522, 116, - 523, 116, 525, 526, 524, 527, 524, 528, - 524, 529, 524, 530, 524, 531, 524, 532, - 524, 533, 524, 534, 524, 535, 524, 536, - 524, 537, 524, 538, 524, 539, 116, 540, - 116, 541, 116, 542, 116, 543, 116, 544, - 116, 545, 116, 547, 548, 546, 549, 546, - 550, 546, 551, 546, 552, 546, 553, 546, - 554, 546, 555, 546, 556, 546, 557, 546, - 558, 546, 559, 546, 560, 546, 561, 546, - 562, 546, 563, 546, 564, 546, 565, 546, - 566, 546, 567, 546, 568, 546, 569, 546, - 570, 546, 571, 546, 572, 546, 573, 546, - 574, 546, 575, 546, 576, 546, 577, 546, - 578, 546, 579, 580, 546, 581, 546, 582, - 546, 583, 546, 584, 546, 585, 546, 586, - 546, 587, 546, 588, 546, 589, 546, 590, - 546, 591, 546, 592, 546, 593, 594, 595, - 116, 596, 597, 116, 598, 116, 599, 116, - 600, 116, 601, 116, 602, 116, 603, 116, - 604, 116, 605, 116, 606, 607, 608, 116, - 609, 116, 610, 116, 611, 116, 612, 116, - 613, 116, 614, 116, 615, 116, 616, 116, - 617, 116, 618, 116, 619, 116, 620, 116, - 621, 116, 622, 116, 623, 624, 116, 625, - 116, 626, 116, 627, 628, 116, 629, 116, - 630, 116, 631, 116, 632, 116, 633, 116, - 634, 116, 635, 116, 636, 116, 637, 116, - 638, 116, 639, 116, 640, 116, 641, 116, - 642, 116, 643, 116, 644, 116, 645, 116, - 646, 116, 647, 116, 648, 116, 650, 649, - 652, 651, 653, 649, 649, 651, 656, 657, - 654, 655, 656, 657, 658, 655, 656, 657, - 655, 660, 661, 654, 662, 663, 664, 665, - 666, 667, 668, 669, 670, 671, 672, 673, - 659, 660, 661, 654, 659, 660, 661, 674, - 659, 660, 661, 659, 660, 661, 654, 675, - 676, 677, 678, 679, 680, 681, 682, 683, - 684, 685, 659, 660, 661, 654, 686, 687, - 659, 660, 661, 654, 688, 689, 659, 660, - 661, 654, 690, 659, 660, 661, 654, 691, - 659, 692, 661, 654, 659, 660, 661, 693, - 659, 660, 661, 654, 694, 659, 660, 661, - 654, 695, 659, 696, 661, 654, 659, 660, - 661, 697, 659, 660, 661, 654, 698, 659, - 660, 661, 654, 699, 659, 660, 661, 654, - 700, 659, 701, 661, 654, 659, 660, 661, - 702, 659, 660, 661, 654, 703, 659, 660, - 661, 654, 704, 659, 660, 661, 654, 705, - 659, 660, 661, 654, 706, 659, 707, 661, - 654, 659, 660, 661, 708, 659, 660, 661, - 654, 709, 659, 660, 661, 654, 710, 659, - 660, 661, 654, 711, 659, 660, 661, 654, - 712, 659, 713, 661, 654, 659, 660, 661, - 714, 659, 660, 661, 654, 715, 659, 660, - 661, 654, 716, 659, 660, 661, 654, 717, - 659, 660, 661, 654, 718, 659, 719, 661, - 654, 659, 660, 661, 720, 659, 660, 661, - 654, 721, 659, 660, 661, 654, 722, 659, - 660, 661, 654, 723, 659, 660, 661, 654, - 724, 659, 725, 661, 654, 659, 660, 661, - 726, 659, 660, 661, 654, 727, 659, 660, - 661, 654, 728, 659, 660, 661, 654, 729, - 659, 660, 661, 654, 730, 659, 731, 661, - 654, 659, 660, 661, 732, 659, 660, 661, - 654, 733, 734, 659, 660, 661, 654, 735, - 659, 660, 661, 654, 736, 659, 660, 661, - 654, 737, 659, 738, 661, 654, 659, 660, - 661, 739, 659, 660, 661, 654, 740, 659, - 660, 661, 654, 741, 659, 660, 661, 654, - 742, 659, 743, 661, 654, 659, 660, 661, - 744, 659, 660, 661, 654, 745, 659, 660, - 661, 654, 746, 659, 660, 661, 654, 747, - 659, 660, 661, 654, 748, 659, 749, 661, - 654, 659, 660, 661, 750, 659, 660, 661, - 654, 751, 659, 660, 661, 654, 752, 659, - 660, 661, 654, 753, 659, 660, 661, 654, - 754, 659, 755, 661, 654, 659, 660, 661, - 756, 659, 660, 661, 654, 757, 659, 660, - 661, 654, 758, 659, 660, 661, 654, 759, - 659, 760, 661, 654, 659, 660, 661, 761, - 659, 660, 661, 654, 762, 659, 660, 661, - 654, 763, 659, 660, 661, 654, 764, 659, - 660, 661, 654, 765, 659, 660, 661, 654, - 766, 659, 767, 661, 654, 659, 660, 661, - 768, 659, 660, 661, 654, 769, 770, 659, - 660, 661, 654, 771, 772, 659, 660, 661, - 654, 773, 659, 660, 661, 654, 774, 659, - 775, 661, 654, 659, 660, 661, 776, 659, - 660, 661, 654, 777, 659, 660, 661, 654, - 778, 659, 779, 661, 654, 659, 660, 661, - 780, 659, 660, 661, 654, 781, 659, 660, - 661, 654, 782, 659, 660, 661, 654, 783, - 659, 784, 661, 654, 659, 660, 661, 785, - 659, 660, 661, 654, 786, 659, 660, 661, - 654, 787, 659, 660, 661, 654, 788, 659, - 660, 661, 654, 789, 659, 790, 661, 654, - 659, 660, 661, 791, 659, 660, 661, 654, - 792, 659, 660, 661, 654, 793, 659, 660, - 661, 654, 794, 659, 660, 661, 654, 795, - 659, 796, 661, 654, 659, 660, 661, 797, - 659, 660, 661, 654, 798, 659, 660, 661, - 654, 799, 659, 660, 661, 654, 800, 659, - 660, 661, 654, 801, 659, 802, 661, 654, - 659, 660, 661, 803, 659, 660, 661, 654, - 804, 659, 660, 661, 654, 805, 659, 660, - 661, 654, 806, 659, 660, 661, 654, 807, - 659, 808, 661, 654, 659, 660, 661, 809, - 659, 660, 661, 654, 810, 659, 660, 661, - 654, 811, 659, 660, 661, 654, 812, 659, - 660, 661, 654, 813, 659, 814, 661, 654, - 659, 660, 661, 815, 659, 660, 661, 654, - 816, 817, 659, 660, 661, 654, 818, 659, - 660, 661, 654, 819, 659, 660, 661, 654, - 820, 659, 821, 661, 654, 659, 660, 661, - 822, 659, 660, 661, 654, 823, 659, 660, - 661, 654, 824, 659, 660, 661, 654, 825, - 659, 826, 661, 654, 659, 660, 661, 827, - 659, 660, 661, 654, 828, 659, 660, 661, - 654, 829, 659, 660, 661, 654, 830, 659, - 660, 661, 654, 831, 659, 832, 661, 654, - 659, 660, 661, 833, 659, 660, 661, 654, - 834, 659, 660, 661, 654, 835, 659, 660, - 661, 654, 836, 659, 660, 661, 654, 837, - 659, 838, 661, 654, 659, 660, 661, 839, - 659, 660, 661, 654, 840, 659, 660, 661, - 654, 841, 659, 660, 661, 654, 842, 659, - 843, 661, 654, 659, 660, 661, 844, 659, - 660, 661, 654, 845, 659, 660, 661, 654, - 846, 659, 660, 661, 654, 847, 659, 660, - 661, 654, 848, 659, 660, 661, 654, 849, - 659, 850, 661, 654, 659, 660, 661, 851, - 659, 853, 854, 654, 852, 853, 854, 658, - 852, 853, 854, 852, 856, 855, 857, 856, - 855, 860, 859, 859, 859, 858, 862, 861, - 863, 861, 864, 861, 866, 865, 867, 865, - 868, 865, 870, 869, 871, 869, 872, 869, - 873, 876, 877, 878, 879, 880, 881, 882, - 883, 884, 885, 886, 887, 888, 875, 893, - 875, 876, 875, 875, 889, 890, 891, 892, - 889, 874, 895, 896, 894, 23, 23, 23, - 23, 897, 25, 25, 25, 25, 897, 899, - 30, 902, 903, 904, 30, 900, 901, 30, - 30, 898, 44, 897, 47, 47, 47, 47, - 44, 897, 43, 44, 897, 905, 906, 48, - 48, 48, 48, 897, 907, 897, 49, 50, - 897, 908, 909, 910, 897, 45, 53, 46, - 54, 54, 54, 54, 897, 912, 913, 911, - 915, 916, 914, 918, 919, 917, 56, 60, - 64, 920, 923, 926, 927, 928, 929, 930, - 931, 932, 933, 934, 934, 935, 936, 937, - 938, 934, 939, 940, 941, 942, 943, 944, - 945, 946, 947, 948, 949, 950, 951, 934, - 952, 953, 954, 955, 956, 957, 934, 958, - 959, 960, 961, 924, 925, 922, 963, 962, - 964, 962, 966, 967, 965, 969, 967, 968, - 967, 970, 973, 972, 975, 68, 977, 71, - 979, 978, 976, 981, 980, 982, 980, 984, - 983, 985, 983, 987, 988, 989, 986, 991, - 990, 994, 993, 999, 996, 997, 998, 995, - 1000, 1001, 1002, 995, 94, 94, 94, 1003, - 98, 1004, 1006, 1007, 1005, 1009, 1008, 1010, - 1008, 1011, 1008, 1013, 1014, 1012, 109, 108, - 109, 1016, 1017, 108, 1019, 1020, 1021, 1022, - 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, - 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, - 1039, 1040, 1041, 1018, 1043, 1044, 1045, 1042, - 1046, 1047, 1048, 1049, 1050, 1042, 1052, 1053, - 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1051, - 1062, 1063, 1061, 1064, 1042, 1065, 1066, 1042, - 1067, 1068, 1069, 1070, 1071, 1042, 1072, 1073, - 1074, 1042, 1076, 1077, 1075, 1078, 1079, 1042, - 1080, 1042, 1081, 1082, 1042, 1084, 1085, 1086, - 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1083, - 1095, 1096, 1097, 1098, 1099, 1100, 1094, 1102, - 1101, 1104, 1105, 1106, 1107, 1108, 1103, 1109, - 1110, 1111, 1112, 1042, 1114, 1115, 1116, 1117, - 1118, 1119, 1120, 1121, 1113, 1122, 1123, 1042, - 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, - 1133, 1124, 1134, 1135, 1136, 1137, 1042, 1138, - 1042, 1139, 1042, 1140, 1141, 1142, 1143, 1042, - 1144, 1042, 1146, 1147, 1148, 1145, 649, 1150, - 1151, 1152, 1153, 1154, 1155, 1156, 1149, 1158, - 1159, 1160, 1161, 1157, 1162, 1163, 1164, 1165, - 1162, 874, 655, 1167, 852, 1166, 1169, 1173, - 1174, 1175, 1176, 1176, 1177, 1178, 1179, 1176, - 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, - 1188, 1189, 1176, 1190, 1191, 1192, 1193, 1194, - 1195, 1176, 1196, 1197, 1198, 1170, 1171, 1172, - 1172, 1168, 1200, 1199, 1201, 1199, 1203, 1202, - 1204, 1202, 1207, 1206, 1209, 1211, 1210, 1214, - 1213, 1219, 1216, 1217, 1218, 1215, 1220, 1221, - 1222, 1215, 859, 859, 859, 1223, 1225, 1224, - 1226, 1224, 1227, 1224, 1229, 1230, 1231, 1228, - 1228, 1228, 874, 1233, 1234, 1232, 1236, 1235, - 1237, 1238, 1239, 1240, 1237, 874, 1242, 1241, - 1244, 1243, 1245, 1243, 1246, 1243, 1248, 1247, - 1249, 1250, 1251, 1252, 1249, 874, 1254, 1253, - 1256, 1255, 1257, 1255, 1258, 1255, 1260, 1259, - 1262, 1261, 0 -}; - -static const short _regex_trans_targs[] = { - 746, 746, 746, 746, 746, 748, 749, 750, - 746, 751, 752, 753, 746, 754, 746, 746, - 755, 756, 757, 758, 746, 746, 746, 3, - 746, 4, 746, 6, 7, 746, 8, 746, - 9, 12, 746, 14, 746, 746, 746, 16, - 746, 18, 17, 746, 19, 746, 746, 20, - 21, 746, 22, 25, 746, 27, 28, 746, - 29, 30, 31, 746, 32, 33, 34, 746, - 35, 36, 37, 746, 38, 746, 772, 40, - 42, 46, 49, 43, 44, 746, 45, 47, - 746, 48, 746, 746, 51, 746, 53, 746, - 55, 746, 746, 57, 746, 746, 58, 746, - 746, 60, 59, 783, 61, 783, 783, 746, - 746, 64, 746, 787, 65, 787, 67, 787, - 69, 787, 70, 787, 790, 790, 73, 76, - 74, 75, 790, 77, 78, 79, 80, 790, - 82, 83, 84, 85, 790, 87, 92, 94, - 88, 89, 90, 91, 790, 93, 790, 95, - 790, 97, 98, 99, 100, 790, 102, 103, - 104, 105, 106, 790, 108, 109, 111, 110, - 790, 112, 113, 790, 115, 120, 116, 117, - 118, 119, 790, 121, 790, 790, 123, 139, - 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 790, - 140, 141, 790, 143, 144, 790, 145, 146, - 147, 148, 790, 790, 150, 151, 790, 153, - 154, 790, 156, 157, 158, 159, 160, 161, - 790, 163, 167, 164, 165, 166, 790, 168, - 169, 170, 171, 790, 173, 177, 174, 175, - 176, 790, 178, 179, 180, 181, 182, 183, - 790, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, - 200, 201, 790, 203, 204, 205, 206, 207, - 790, 209, 210, 211, 212, 213, 790, 215, - 216, 217, 218, 219, 220, 221, 790, 223, - 224, 225, 790, 227, 228, 790, 230, 235, - 231, 232, 233, 234, 790, 236, 237, 238, - 239, 790, 799, 790, 242, 790, 244, 245, - 790, 247, 248, 249, 790, 251, 252, 253, - 254, 255, 790, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, - 790, 271, 277, 272, 273, 274, 275, 276, - 790, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 295, - 292, 293, 294, 790, 296, 297, 298, 299, - 790, 301, 302, 303, 304, 305, 790, 307, - 310, 314, 319, 308, 309, 790, 311, 312, - 313, 790, 315, 316, 317, 318, 790, 320, - 321, 322, 323, 790, 325, 332, 326, 327, - 328, 329, 330, 331, 790, 333, 790, 790, - 790, 335, 336, 790, 338, 339, 340, 790, - 342, 344, 349, 343, 790, 345, 346, 347, - 348, 790, 790, 351, 354, 352, 353, 790, - 355, 356, 790, 790, 358, 364, 359, 360, - 361, 362, 363, 790, 365, 366, 367, 790, - 790, 369, 370, 371, 372, 373, 374, 375, - 376, 790, 378, 379, 380, 381, 382, 383, - 790, 385, 386, 387, 388, 790, 790, 390, - 391, 392, 393, 394, 395, 396, 397, 790, - 790, 400, 401, 790, 403, 408, 404, 405, - 406, 407, 790, 409, 410, 415, 421, 433, - 411, 412, 413, 414, 790, 416, 417, 418, - 419, 420, 790, 422, 423, 424, 425, 426, - 427, 428, 429, 430, 431, 432, 790, 434, - 435, 436, 437, 790, 439, 440, 790, 442, - 443, 444, 445, 790, 790, 447, 452, 448, - 449, 450, 451, 790, 453, 454, 455, 456, - 457, 458, 790, 460, 461, 462, 790, 464, - 465, 790, 790, 467, 473, 468, 469, 470, - 471, 472, 790, 474, 475, 476, 477, 478, - 479, 790, 481, 482, 483, 484, 790, 486, - 487, 488, 489, 790, 491, 492, 493, 494, - 495, 496, 790, 498, 507, 499, 500, 501, - 502, 503, 504, 505, 506, 790, 508, 509, - 790, 511, 519, 528, 512, 515, 513, 514, - 790, 516, 517, 518, 790, 520, 521, 522, - 525, 790, 523, 524, 790, 526, 527, 790, - 529, 790, 531, 532, 533, 790, 535, 536, - 790, 537, 790, 539, 543, 540, 541, 542, - 790, 544, 545, 546, 547, 790, 549, 550, - 551, 552, 553, 790, 790, 790, 790, 790, - 790, 0, 560, 561, 562, 817, 819, 563, - 564, 565, 819, 567, 568, 569, 570, 651, - 666, 672, 678, 684, 690, 696, 707, 713, - 719, 724, 819, 571, 586, 592, 598, 604, - 610, 616, 627, 633, 639, 644, 572, 581, - 573, 577, 574, 575, 576, 819, 578, 579, - 580, 819, 582, 583, 584, 585, 819, 587, - 588, 589, 590, 591, 819, 593, 594, 595, - 596, 597, 819, 599, 600, 601, 602, 603, - 819, 605, 606, 607, 608, 609, 819, 611, - 612, 613, 614, 615, 819, 617, 622, 618, - 619, 620, 621, 819, 623, 624, 625, 626, - 819, 628, 629, 630, 631, 632, 819, 634, - 635, 636, 637, 638, 819, 640, 641, 642, - 643, 819, 645, 646, 647, 648, 649, 650, - 819, 652, 661, 653, 657, 654, 655, 656, - 819, 658, 659, 660, 819, 662, 663, 664, - 665, 819, 667, 668, 669, 670, 671, 819, - 673, 674, 675, 676, 677, 819, 679, 680, - 681, 682, 683, 819, 685, 686, 687, 688, - 689, 819, 691, 692, 693, 694, 695, 819, - 697, 702, 698, 699, 700, 701, 819, 703, - 704, 705, 706, 819, 708, 709, 710, 711, - 712, 819, 714, 715, 716, 717, 718, 819, - 720, 721, 722, 723, 819, 725, 726, 727, - 728, 729, 730, 819, 731, 732, 733, 819, - 735, 819, 819, 736, 819, 819, 819, 739, - 819, 838, 838, 742, 838, 843, 843, 745, - 843, 746, 0, 746, 746, 746, 747, 746, - 759, 760, 746, 761, 762, 763, 746, 782, - 746, 746, 784, 785, 786, 746, 746, 1, - 2, 746, 746, 5, 9, 10, 11, 13, - 15, 746, 746, 746, 23, 24, 26, 746, - 746, 746, 746, 746, 746, 746, 746, 746, - 746, 746, 746, 764, 766, 768, 746, 746, - 746, 746, 746, 746, 746, 746, 746, 769, - 746, 746, 746, 746, 746, 746, 746, 746, - 746, 770, 746, 746, 746, 771, 746, 776, - 746, 777, 778, 746, 746, 746, 746, 746, - 779, 746, 746, 765, 746, 746, 767, 768, - 746, 768, 746, 746, 746, 746, 746, 746, - 746, 39, 774, 41, 746, 773, 746, 746, - 775, 746, 746, 50, 52, 54, 746, 56, - 746, 746, 746, 746, 780, 780, 780, 781, - 746, 746, 746, 746, 746, 746, 746, 746, - 746, 746, 62, 63, 788, 787, 789, 787, - 66, 68, 790, 791, 792, 793, 795, 796, - 797, 798, 800, 801, 802, 803, 804, 806, - 807, 808, 809, 810, 811, 812, 813, 814, - 815, 816, 790, 71, 72, 81, 86, 96, - 101, 107, 114, 790, 122, 790, 790, 142, - 790, 794, 790, 155, 162, 790, 149, 152, - 172, 184, 202, 208, 214, 222, 226, 229, - 240, 246, 250, 790, 241, 243, 256, 270, - 300, 306, 324, 790, 790, 334, 337, 341, - 790, 790, 790, 790, 790, 350, 790, 357, - 790, 805, 790, 377, 384, 790, 368, 790, - 790, 389, 398, 790, 790, 399, 402, 438, - 441, 790, 790, 790, 790, 790, 446, 790, - 790, 790, 459, 463, 790, 466, 790, 480, - 485, 790, 790, 790, 490, 497, 510, 530, - 534, 538, 548, 554, 555, 556, 557, 558, - 790, 790, 790, 790, 790, 818, 818, 818, - 818, 818, 818, 818, 818, 819, 819, 820, - 821, 819, 819, 833, 834, 835, 819, 566, - 819, 822, 824, 819, 819, 819, 819, 819, - 819, 826, 819, 819, 819, 819, 819, 819, - 827, 819, 819, 819, 819, 819, 819, 828, - 829, 819, 819, 819, 819, 819, 830, 819, - 823, 819, 819, 825, 819, 819, 819, 819, - 819, 819, 819, 734, 819, 819, 819, 819, - 831, 831, 831, 832, 819, 819, 819, 819, - 819, 819, 737, 738, 836, 837, 836, 836, - 836, 836, 836, 838, 839, 838, 840, 841, - 842, 838, 838, 838, 838, 740, 741, 843, - 844, 843, 845, 846, 847, 843, 843, 843, - 843, 743, 744, 848, 848, 849, 849 -}; - -static const short _regex_trans_actions[] = { - 827, 631, 765, 731, 723, 45, 903, 903, - 897, 45, 912, 45, 900, 903, 729, 741, - 0, 45, 45, 923, 737, 841, 747, 0, - 743, 3, 839, 3, 0, 761, 3, 759, - 870, 3, 751, 0, 749, 755, 753, 0, - 757, 3, 0, 745, 0, 725, 727, 27, - 3, 763, 0, 3, 673, 0, 25, 829, - 0, 0, 0, 603, 0, 0, 0, 601, - 0, 0, 0, 831, 0, 675, 17, 0, - 7, 870, 3, 17, 17, 663, 17, 870, - 661, 870, 665, 837, 3, 671, 3, 669, - 3, 667, 833, 0, 677, 835, 0, 679, - 845, 0, 11, 29, 13, 31, 0, 843, - 769, 0, 771, 59, 0, 53, 0, 51, - 0, 49, 0, 47, 359, 315, 0, 0, - 0, 0, 127, 0, 0, 0, 0, 129, - 0, 0, 0, 0, 131, 0, 0, 0, - 0, 0, 0, 0, 133, 0, 135, 0, - 137, 0, 0, 0, 0, 139, 0, 0, - 0, 0, 0, 141, 0, 0, 0, 0, - 143, 0, 0, 145, 0, 0, 0, 0, - 0, 0, 147, 0, 149, 341, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 151, - 0, 0, 153, 0, 0, 155, 0, 0, - 0, 0, 157, 343, 0, 0, 159, 0, - 0, 161, 0, 0, 0, 0, 0, 0, - 163, 0, 0, 0, 0, 0, 165, 0, - 0, 0, 0, 167, 0, 0, 0, 0, - 0, 169, 0, 0, 0, 0, 0, 0, - 171, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 173, 0, 0, 0, 0, 0, - 175, 0, 0, 0, 0, 0, 177, 0, - 0, 0, 0, 0, 0, 0, 179, 0, - 0, 0, 181, 0, 0, 183, 0, 0, - 0, 0, 0, 0, 185, 0, 0, 0, - 0, 187, 45, 357, 0, 189, 0, 0, - 191, 0, 0, 0, 193, 0, 0, 0, - 0, 0, 195, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 197, 0, 0, 0, 0, 0, 0, 0, - 199, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 201, 0, 0, 0, 0, - 203, 0, 0, 0, 0, 0, 205, 0, - 0, 0, 0, 0, 0, 207, 0, 0, - 0, 209, 0, 0, 0, 0, 211, 0, - 0, 0, 0, 213, 0, 0, 0, 0, - 0, 0, 0, 0, 215, 0, 217, 345, - 219, 0, 0, 221, 0, 0, 0, 223, - 0, 0, 0, 0, 225, 0, 0, 0, - 0, 227, 229, 0, 0, 0, 0, 231, - 0, 0, 233, 347, 0, 0, 0, 0, - 0, 0, 0, 235, 0, 0, 0, 237, - 349, 0, 0, 0, 0, 0, 0, 0, - 0, 239, 0, 0, 0, 0, 0, 0, - 241, 0, 0, 0, 0, 243, 351, 0, - 0, 0, 0, 0, 0, 0, 0, 245, - 247, 0, 0, 249, 0, 0, 0, 0, - 0, 0, 251, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 253, 0, 0, 0, - 0, 0, 255, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 257, 0, - 0, 0, 0, 259, 0, 0, 261, 0, - 0, 0, 0, 263, 353, 0, 0, 0, - 0, 0, 0, 265, 0, 0, 0, 0, - 0, 0, 267, 0, 0, 0, 269, 0, - 0, 271, 355, 0, 0, 0, 0, 0, - 0, 0, 273, 0, 0, 0, 0, 0, - 0, 275, 0, 0, 0, 0, 277, 0, - 0, 0, 0, 279, 0, 0, 0, 0, - 0, 0, 281, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 283, 0, 0, - 285, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 0, 0, 289, 0, 0, 0, - 0, 291, 0, 0, 293, 0, 0, 295, - 0, 297, 0, 0, 0, 299, 0, 0, - 303, 0, 301, 0, 0, 0, 0, 0, - 305, 0, 0, 0, 0, 307, 0, 0, - 0, 0, 0, 309, 311, 119, 121, 123, - 125, 39, 0, 35, 33, 37, 539, 0, - 0, 0, 377, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 435, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 381, 0, 0, - 0, 385, 0, 0, 0, 0, 389, 0, - 0, 0, 0, 0, 393, 0, 0, 0, - 0, 0, 397, 0, 0, 0, 0, 0, - 401, 0, 0, 0, 0, 0, 405, 0, - 0, 0, 0, 0, 409, 0, 0, 0, - 0, 0, 0, 413, 0, 0, 0, 0, - 417, 0, 0, 0, 0, 0, 421, 0, - 0, 0, 0, 0, 425, 0, 0, 0, - 0, 429, 0, 0, 0, 0, 0, 0, - 433, 0, 0, 0, 0, 0, 0, 0, - 379, 0, 0, 0, 383, 0, 0, 0, - 0, 387, 0, 0, 0, 0, 0, 391, - 0, 0, 0, 0, 0, 395, 0, 0, - 0, 0, 0, 399, 0, 0, 0, 0, - 0, 403, 0, 0, 0, 0, 0, 407, - 0, 0, 0, 0, 0, 0, 411, 0, - 0, 0, 0, 415, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 0, 0, 423, - 0, 0, 0, 0, 427, 0, 0, 0, - 0, 0, 0, 431, 0, 0, 0, 533, - 0, 471, 535, 0, 475, 537, 503, 0, - 505, 569, 557, 0, 559, 587, 575, 0, - 577, 633, 0, 777, 775, 637, 45, 597, - 0, 0, 609, 0, 45, 0, 635, 909, - 599, 773, 0, 45, 45, 629, 779, 0, - 0, 821, 819, 1, 855, 855, 1, 0, - 3, 735, 733, 739, 1, 1, 0, 783, - 615, 613, 785, 619, 617, 787, 623, 621, - 781, 817, 721, 5, 852, 915, 639, 647, - 611, 695, 607, 717, 699, 715, 683, 0, - 605, 713, 691, 703, 687, 719, 641, 657, - 645, 0, 693, 659, 655, 906, 697, 45, - 651, 45, 0, 653, 689, 649, 701, 685, - 7, 643, 791, 15, 867, 795, 858, 919, - 793, 927, 847, 811, 711, 709, 809, 681, - 801, 7, 17, 849, 799, 17, 876, 797, - 17, 873, 815, 1, 1, 1, 803, 0, - 813, 707, 705, 805, 19, 23, 21, 45, - 882, 894, 888, 807, 825, 789, 627, 625, - 823, 767, 0, 0, 45, 55, 45, 57, - 0, 0, 317, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, - 0, 0, 339, 0, 0, 0, 0, 0, - 0, 0, 0, 319, 0, 61, 63, 0, - 65, 45, 67, 0, 0, 321, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 337, 0, 0, 0, 0, - 0, 0, 0, 323, 79, 0, 0, 0, - 69, 71, 73, 75, 77, 0, 325, 0, - 81, 45, 83, 0, 0, 327, 0, 329, - 85, 0, 0, 87, 89, 0, 0, 0, - 0, 331, 91, 93, 95, 97, 0, 99, - 101, 103, 0, 0, 333, 0, 105, 0, - 0, 107, 109, 111, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 313, 335, 113, 115, 117, 375, 361, 363, - 365, 367, 369, 371, 373, 509, 491, 45, - 0, 511, 507, 0, 45, 45, 531, 0, - 499, 5, 9, 473, 497, 489, 439, 457, - 493, 0, 437, 485, 461, 481, 451, 441, - 0, 487, 453, 449, 495, 455, 445, 45, - 0, 447, 483, 443, 459, 479, 7, 517, - 15, 861, 519, 15, 864, 513, 469, 467, - 527, 477, 521, 0, 515, 465, 463, 523, - 19, 23, 21, 45, 879, 891, 885, 525, - 529, 501, 0, 0, 549, 0, 543, 541, - 551, 547, 545, 563, 0, 561, 0, 45, - 45, 567, 553, 565, 555, 0, 0, 581, - 0, 579, 0, 45, 45, 585, 571, 583, - 573, 0, 0, 591, 589, 595, 593 -}; - -static const short _regex_to_state_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 41, - 0, 41, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 41, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 41, 0, 0, 41, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 41, 41, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 41, 0, 41, 0, - 0, 0, 0, 41, 0, 0, 0, 0, - 41, 41 -}; - -static const short _regex_from_state_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 43, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 43, 0, 0, 43, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 43, 43, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 43, 0, 43, 0, - 0, 0, 0, 43, 0, 0, 0, 0, - 43, 43 -}; - -static const short _regex_eof_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 39, - 39, 39, 39, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 -}; - -static const short _regex_eof_trans[] = { - 0, 1, 1, 22, 22, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 84, 84, 84, 84, 84, 84, - 91, 91, 94, 97, 97, 97, 104, 104, - 104, 108, 108, 108, 108, 108, 108, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 204, 204, 204, - 204, 204, 204, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 300, 300, 300, 300, 300, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 428, 428, 428, - 428, 428, 428, 428, 428, 428, 428, 428, - 441, 441, 441, 441, 441, 441, 441, 441, - 441, 428, 428, 428, 428, 428, 428, 428, - 428, 428, 428, 428, 428, 463, 463, 463, - 463, 463, 463, 463, 463, 463, 463, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 525, 525, - 525, 525, 525, 525, 525, 525, 525, 525, - 525, 525, 525, 117, 117, 117, 117, 117, - 117, 117, 547, 547, 547, 547, 547, 547, - 547, 547, 547, 547, 547, 547, 547, 547, - 547, 547, 547, 547, 547, 547, 547, 547, - 547, 547, 547, 547, 547, 547, 547, 547, - 547, 547, 547, 547, 547, 547, 547, 547, - 547, 547, 547, 547, 547, 547, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 0, - 0, 0, 0, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 655, 655, 856, 856, - 859, 862, 862, 862, 866, 866, 866, 870, - 870, 870, 0, 895, 898, 898, 899, 898, - 898, 898, 898, 898, 898, 898, 898, 912, - 915, 918, 921, 922, 963, 963, 966, 969, - 971, 972, 975, 977, 981, 981, 984, 984, - 987, 991, 993, 996, 996, 1004, 1005, 1006, - 1009, 1009, 1009, 0, 1016, 1016, 0, 1043, - 1043, 1052, 1062, 1043, 1043, 1043, 1043, 1076, - 1043, 1043, 1043, 1084, 1095, 1102, 1104, 1043, - 1114, 1043, 1125, 1043, 1043, 1043, 1043, 1043, - 1146, 0, 0, 0, 1167, 1167, 1200, 1200, - 1203, 1203, 1206, 1209, 1211, 1213, 1216, 1216, - 1224, 1225, 1225, 1225, 0, 1233, 0, 1242, - 1244, 1244, 1244, 0, 1254, 1256, 1256, 1256, - 0, 0 -}; - -static const int regex_start = 746; -static const int regex_error = 0; - -static const int regex_en_readVerb = 787; -static const int regex_en_readUCP = 790; -static const int regex_en_readBracedUCP = 559; -static const int regex_en_readUCPSingle = 818; -static const int regex_en_charClassGuts = 819; -static const int regex_en_readClass = 836; -static const int regex_en_readQuotedLiteral = 838; -static const int regex_en_readQuotedClass = 843; -static const int regex_en_readComment = 848; -static const int regex_en_readNewlineTerminatedComment = 849; -static const int regex_en_main = 746; - - -#line 1912 "Parser.rl" - -/** \brief Main parser call, returns root Component or nullptr. */ -unique_ptr parse(const char *ptr, ParseMode &globalMode) { - assert(ptr); - - const char *p = ptr; - const char *pe = ptr + strlen(ptr); - - // First, read the control verbs, set any global mode flags and move the - // ptr forward. - p = read_control_verbs(p, pe, 0, globalMode); - - const char *eof = pe; - int cs; - UNUSED int act; - int top; - vector stack; - const char *ts, *te; - unichar accumulator = 0; - unichar octAccumulator = 0; /* required as we are also accumulating for - * back ref when looking for octals */ - unsigned repeatN = 0; - unsigned repeatM = 0; - string label; - - ParseMode mode = globalMode; - ParseMode newMode; - - bool negated = false; - bool inComment = false; - - // Stack of sequences and flags used to store state when we enter - // sub-sequences. - vector sequences; - - // Index of the next capturing group. Note that zero is reserved for the - // root sequence. - unsigned groupIndex = 1; - - // Set storing group names that are currently in use. - flat_set groupNames; - - // Root sequence. - unique_ptr rootSeq = std::make_unique(); - rootSeq->setCaptureIndex(0); - - // Current sequence being appended to - ComponentSequence *currentSeq = rootSeq.get(); - - // The current character class being appended to. This is used as the - // accumulator for both character class and UCP properties. - unique_ptr currentCls; - - // True if the machine is currently inside a character class, i.e. square - // brackets [..]. - bool inCharClass = false; - - // True if the machine is inside a character class but it has not processed - // any "real" elements yet, i.e. it's still processing meta-characters like - // '^'. - bool inCharClassEarly = false; - - // Location at which the current character class began. - const char *currentClsBegin = p; - - // We throw exceptions on various parsing failures beyond this point: we - // use a try/catch block here to clean up our allocated memory before we - // re-throw the exception to the caller. - try { - // Embed the Ragel machine here - -#line 2533 "Parser.cpp" - { - cs = regex_start; - top = 0; - ts = 0; - te = 0; - act = 0; - } - -#line 1983 "Parser.rl" - -#line 2544 "Parser.cpp" - { - int _klen; - unsigned int _trans; - short _widec; - const short *_acts; - unsigned int _nacts; - const short *_keys; - - if ( p == pe ) - goto _test_eof; - if ( cs == 0 ) - goto _out; -_resume: - _acts = _regex_actions + _regex_from_state_actions[cs]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) { - switch ( *_acts++ ) { - case 24: -#line 1 "NONE" - {ts = p;} - break; -#line 2566 "Parser.cpp" - } - } - - _widec = (*p); - _klen = _regex_cond_lengths[cs]; - _keys = _regex_cond_keys + (_regex_cond_offsets[cs]*2); - if ( _klen > 0 ) { - const short *_lower = _keys; - const short *_mid; - const short *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( _widec < _mid[0] ) - _upper = _mid - 2; - else if ( _widec > _mid[1] ) - _lower = _mid + 2; - else { - switch ( _regex_cond_spaces[_regex_cond_offsets[cs] + ((_mid - _keys)>>1)] ) { - case 0: { - _widec = (short)(128 + ((*p) - -128)); - if ( -#line 475 "Parser.rl" - mode.utf8 ) _widec += 256; - break; - } - case 1: { - _widec = (short)(1152 + ((*p) - -128)); - if ( -#line 476 "Parser.rl" - mode.ignore_space ) _widec += 256; - break; - } - case 2: { - _widec = (short)(640 + ((*p) - -128)); - if ( -#line 477 "Parser.rl" - inCharClassEarly ) _widec += 256; - break; - } - } - break; - } - } - } - - _keys = _regex_trans_keys + _regex_key_offsets[cs]; - _trans = _regex_index_offsets[cs]; - - _klen = _regex_single_lengths[cs]; - if ( _klen > 0 ) { - const short *_lower = _keys; - const short *_mid; - const short *_upper = _keys + _klen - 1; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( _widec < *_mid ) - _upper = _mid - 1; - else if ( _widec > *_mid ) - _lower = _mid + 1; - else { - _trans += (unsigned int)(_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _regex_range_lengths[cs]; - if ( _klen > 0 ) { - const short *_lower = _keys; - const short *_mid; - const short *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( _widec < _mid[0] ) - _upper = _mid - 2; - else if ( _widec > _mid[1] ) - _lower = _mid + 2; - else { - _trans += (unsigned int)((_mid - _keys)>>1); - goto _match; - } - } - _trans += _klen; - } - -_match: - _trans = _regex_indicies[_trans]; -_eof_trans: - cs = _regex_trans_targs[_trans]; - - if ( _regex_trans_actions[_trans] == 0 ) - goto _again; - - _acts = _regex_actions + _regex_trans_actions[_trans]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) - { - switch ( *_acts++ ) - { - case 0: -#line 285 "Parser.rl" - { label.clear();} - break; - case 1: -#line 286 "Parser.rl" - { label.push_back((*p));} - break; - case 2: -#line 287 "Parser.rl" - { octAccumulator = 0;} - break; - case 3: -#line 288 "Parser.rl" - { accumulator = 0;} - break; - case 4: -#line 289 "Parser.rl" - { - octAccumulator = 0; - pushOct(&octAccumulator, (*p)); - } - break; - case 5: -#line 293 "Parser.rl" - { - accumulator = 0; - pushDec(&accumulator, (*p)); - } - break; - case 6: -#line 297 "Parser.rl" - { repeatN = 0; repeatM = 0; } - break; - case 7: -#line 298 "Parser.rl" - { pushDec(&repeatN, (*p)); } - break; - case 8: -#line 299 "Parser.rl" - { pushDec(&repeatM, (*p)); } - break; - case 9: -#line 300 "Parser.rl" - { pushOct(&octAccumulator, (*p)); } - break; - case 10: -#line 301 "Parser.rl" - { pushDec(&accumulator, (*p)); } - break; - case 11: -#line 302 "Parser.rl" - { - accumulator *= 16; - accumulator += (*p) - '0'; - } - break; - case 12: -#line 306 "Parser.rl" - { - accumulator *= 16; - accumulator += 10 + (*p) - 'a'; - } - break; - case 13: -#line 310 "Parser.rl" - { - accumulator *= 16; - accumulator += 10 + (*p) - 'A'; - } - break; - case 14: -#line 430 "Parser.rl" - { - newMode = mode; - } - break; - case 15: -#line 437 "Parser.rl" - { - switch ((*p)) { - case 'i': - newMode.caseless = true; - break; - case 'm': - newMode.multiline = true; - break; - case 's': - newMode.dotall = true; - break; - case 'x': - newMode.ignore_space = true; - break; - default: - assert(0); // this action only called for [imsx] - break; - } - } - break; - case 16: -#line 456 "Parser.rl" - { - switch ((*p)) { - case 'i': - newMode.caseless = false; - break; - case 'm': - newMode.multiline = false; - break; - case 's': - newMode.dotall = false; - break; - case 'x': - newMode.ignore_space = false; - break; - default: - assert(0); // this action only called for [imsx] - break; - } - } - break; - case 17: -#line 510 "Parser.rl" - {repeatM = repeatN;} - break; - case 18: -#line 510 "Parser.rl" - {repeatM = ComponentRepeat::NoLimit;} - break; - case 19: -#line 722 "Parser.rl" - { negated = !negated; } - break; - case 20: -#line 723 "Parser.rl" - { p--; { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 790;goto _again;}} } - break; - case 21: -#line 724 "Parser.rl" - { if (!inCharClass) { // not inside [..] - currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); - } - {cs = stack[--top]; goto _again;} - } - break; - case 22: -#line 730 "Parser.rl" - { throw LocatedParseError("Malformed property"); } - break; - case 25: -#line 1 "NONE" - {te = p+1;} - break; - case 26: -#line 550 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("(*UTF8) must be at start of " - "expression, encountered"); - }} - break; - case 27: -#line 554 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("(*UTF) must be at start of " - "expression, encountered"); - }} - break; - case 28: -#line 558 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("(*UCP) must be at start of " - "expression, encountered"); - }} - break; - case 29: -#line 564 "Parser.rl" - {te = p+1;{ - ParseMode temp_mode; - assert(ts - 2 >= ptr); // parser needs the '(*' at the start too. - read_control_verbs(ts - 2, te, (ts - 2 - ptr), temp_mode); - assert(0); // Should have thrown a parse error. - throw LocatedParseError("Unknown control verb"); - }} - break; - case 30: -#line 571 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Unknown control verb"); - }} - break; - case 31: -#line 571 "Parser.rl" - {te = p;p--;{ - throw LocatedParseError("Unknown control verb"); - }} - break; - case 32: -#line 571 "Parser.rl" - {{p = ((te))-1;}{ - throw LocatedParseError("Unknown control verb"); - }} - break; - case 33: -#line 581 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_CC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 34: -#line 582 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_CF, negated); {cs = stack[--top]; goto _again;} }} - break; - case 35: -#line 583 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_CN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 36: -#line 585 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_CS, negated); {cs = stack[--top]; goto _again;} }} - break; - case 37: -#line 587 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_LL, negated); {cs = stack[--top]; goto _again;} }} - break; - case 38: -#line 588 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_LM, negated); {cs = stack[--top]; goto _again;} }} - break; - case 39: -#line 589 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_LO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 40: -#line 590 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_LT, negated); {cs = stack[--top]; goto _again;} }} - break; - case 41: -#line 591 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_LU, negated); {cs = stack[--top]; goto _again;} }} - break; - case 42: -#line 592 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_L_AND, negated); {cs = stack[--top]; goto _again;} }} - break; - case 43: -#line 594 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_MC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 44: -#line 596 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_MN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 45: -#line 598 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_ND, negated); {cs = stack[--top]; goto _again;} }} - break; - case 46: -#line 599 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_NL, negated); {cs = stack[--top]; goto _again;} }} - break; - case 47: -#line 600 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_NO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 48: -#line 602 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_PC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 49: -#line 603 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_PD, negated); {cs = stack[--top]; goto _again;} }} - break; - case 50: -#line 604 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_PE, negated); {cs = stack[--top]; goto _again;} }} - break; - case 51: -#line 605 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_PF, negated); {cs = stack[--top]; goto _again;} }} - break; - case 52: -#line 606 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_PI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 53: -#line 607 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_PO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 54: -#line 608 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_PS, negated); {cs = stack[--top]; goto _again;} }} - break; - case 55: -#line 610 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_SC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 56: -#line 611 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_SK, negated); {cs = stack[--top]; goto _again;} }} - break; - case 57: -#line 612 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_SM, negated); {cs = stack[--top]; goto _again;} }} - break; - case 58: -#line 613 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_SO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 59: -#line 615 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_ZL, negated); {cs = stack[--top]; goto _again;} }} - break; - case 60: -#line 616 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_ZP, negated); {cs = stack[--top]; goto _again;} }} - break; - case 61: -#line 617 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_ZS, negated); {cs = stack[--top]; goto _again;} }} - break; - case 62: -#line 618 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_XAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 63: -#line 619 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_XPS, negated); {cs = stack[--top]; goto _again;} }} - break; - case 64: -#line 620 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_XSP, negated); {cs = stack[--top]; goto _again;} }} - break; - case 65: -#line 621 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_XWD, negated); {cs = stack[--top]; goto _again;} }} - break; - case 66: -#line 622 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_ARABIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 67: -#line 623 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_ARMENIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 68: -#line 624 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_AVESTAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 69: -#line 625 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_BALINESE, negated); {cs = stack[--top]; goto _again;} }} - break; - case 70: -#line 626 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_BAMUM, negated); {cs = stack[--top]; goto _again;} }} - break; - case 71: -#line 627 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_BATAK, negated); {cs = stack[--top]; goto _again;} }} - break; - case 72: -#line 628 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_BENGALI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 73: -#line 629 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_BOPOMOFO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 74: -#line 630 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_BRAHMI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 75: -#line 631 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_BRAILLE, negated); {cs = stack[--top]; goto _again;} }} - break; - case 76: -#line 632 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_BUGINESE, negated); {cs = stack[--top]; goto _again;} }} - break; - case 77: -#line 633 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_BUHID, negated); {cs = stack[--top]; goto _again;} }} - break; - case 78: -#line 634 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_CANADIAN_ABORIGINAL, negated); {cs = stack[--top]; goto _again;} }} - break; - case 79: -#line 635 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_CARIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 80: -#line 636 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_CHAM, negated); {cs = stack[--top]; goto _again;} }} - break; - case 81: -#line 637 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_CHEROKEE, negated); {cs = stack[--top]; goto _again;} }} - break; - case 82: -#line 638 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_COMMON, negated); {cs = stack[--top]; goto _again;} }} - break; - case 83: -#line 639 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_COPTIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 84: -#line 640 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_CUNEIFORM, negated); {cs = stack[--top]; goto _again;} }} - break; - case 85: -#line 641 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_CYPRIOT, negated); {cs = stack[--top]; goto _again;} }} - break; - case 86: -#line 642 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_CYRILLIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 87: -#line 643 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_DESERET, negated); {cs = stack[--top]; goto _again;} }} - break; - case 88: -#line 644 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_DEVANAGARI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 89: -#line 645 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_EGYPTIAN_HIEROGLYPHS, negated); {cs = stack[--top]; goto _again;} }} - break; - case 90: -#line 646 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_ETHIOPIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 91: -#line 647 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_GEORGIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 92: -#line 648 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_GLAGOLITIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 93: -#line 649 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_GOTHIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 94: -#line 650 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_GREEK, negated); {cs = stack[--top]; goto _again;} }} - break; - case 95: -#line 651 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_GUJARATI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 96: -#line 652 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_GURMUKHI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 97: -#line 654 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_HANGUL, negated); {cs = stack[--top]; goto _again;} }} - break; - case 98: -#line 655 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_HANUNOO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 99: -#line 656 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_HEBREW, negated); {cs = stack[--top]; goto _again;} }} - break; - case 100: -#line 657 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_HIRAGANA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 101: -#line 658 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_IMPERIAL_ARAMAIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 102: -#line 659 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_INHERITED, negated); {cs = stack[--top]; goto _again;} }} - break; - case 103: -#line 660 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_INSCRIPTIONAL_PAHLAVI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 104: -#line 661 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_INSCRIPTIONAL_PARTHIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 105: -#line 662 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_JAVANESE, negated); {cs = stack[--top]; goto _again;} }} - break; - case 106: -#line 663 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_KAITHI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 107: -#line 664 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_KANNADA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 108: -#line 665 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_KATAKANA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 109: -#line 666 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_KAYAH_LI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 110: -#line 667 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_KHAROSHTHI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 111: -#line 668 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_KHMER, negated); {cs = stack[--top]; goto _again;} }} - break; - case 112: -#line 669 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_LAO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 113: -#line 670 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_LATIN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 114: -#line 671 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_LEPCHA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 115: -#line 672 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_LIMBU, negated); {cs = stack[--top]; goto _again;} }} - break; - case 116: -#line 673 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_LINEAR_B, negated); {cs = stack[--top]; goto _again;} }} - break; - case 117: -#line 674 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_LISU, negated); {cs = stack[--top]; goto _again;} }} - break; - case 118: -#line 675 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_LYCIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 119: -#line 676 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_LYDIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 120: -#line 677 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_MALAYALAM, negated); {cs = stack[--top]; goto _again;} }} - break; - case 121: -#line 678 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_MANDAIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 122: -#line 679 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_MEETEI_MAYEK, negated); {cs = stack[--top]; goto _again;} }} - break; - case 123: -#line 680 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_MONGOLIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 124: -#line 681 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_MYANMAR, negated); {cs = stack[--top]; goto _again;} }} - break; - case 125: -#line 682 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_NEW_TAI_LUE, negated); {cs = stack[--top]; goto _again;} }} - break; - case 126: -#line 683 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_NKO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 127: -#line 684 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_OGHAM, negated); {cs = stack[--top]; goto _again;} }} - break; - case 128: -#line 685 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_OL_CHIKI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 129: -#line 686 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_OLD_ITALIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 130: -#line 687 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_OLD_PERSIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 131: -#line 688 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_OLD_SOUTH_ARABIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 132: -#line 689 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_OLD_TURKIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 133: -#line 690 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_ORIYA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 134: -#line 691 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_OSMANYA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 135: -#line 692 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_PHAGS_PA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 136: -#line 693 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_PHOENICIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 137: -#line 694 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_REJANG, negated); {cs = stack[--top]; goto _again;} }} - break; - case 138: -#line 695 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_RUNIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 139: -#line 696 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_SAMARITAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 140: -#line 697 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_SAURASHTRA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 141: -#line 698 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_SHAVIAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 142: -#line 699 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_SINHALA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 143: -#line 700 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_SUNDANESE, negated); {cs = stack[--top]; goto _again;} }} - break; - case 144: -#line 701 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_SYLOTI_NAGRI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 145: -#line 702 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_SYRIAC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 146: -#line 703 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_TAGALOG, negated); {cs = stack[--top]; goto _again;} }} - break; - case 147: -#line 704 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_TAGBANWA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 148: -#line 705 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_TAI_LE, negated); {cs = stack[--top]; goto _again;} }} - break; - case 149: -#line 706 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_TAI_THAM, negated); {cs = stack[--top]; goto _again;} }} - break; - case 150: -#line 707 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_TAI_VIET, negated); {cs = stack[--top]; goto _again;} }} - break; - case 151: -#line 708 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_TAMIL, negated); {cs = stack[--top]; goto _again;} }} - break; - case 152: -#line 709 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_TELUGU, negated); {cs = stack[--top]; goto _again;} }} - break; - case 153: -#line 710 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_THAANA, negated); {cs = stack[--top]; goto _again;} }} - break; - case 154: -#line 711 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_THAI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 155: -#line 712 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_TIBETAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 156: -#line 713 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_TIFINAGH, negated); {cs = stack[--top]; goto _again;} }} - break; - case 157: -#line 714 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_UGARITIC, negated); {cs = stack[--top]; goto _again;} }} - break; - case 158: -#line 715 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_VAI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 159: -#line 716 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_SCRIPT_YI, negated); {cs = stack[--top]; goto _again;} }} - break; - case 160: -#line 717 "Parser.rl" - {te = p+1;{ currentCls->add(CLASS_UCP_ANY, negated); {cs = stack[--top]; goto _again;} }} - break; - case 161: -#line 718 "Parser.rl" - {te = p+1;{ throw LocatedParseError("Unknown property"); }} - break; - case 162: -#line 580 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_UCP_C, negated); {cs = stack[--top]; goto _again;} }} - break; - case 163: -#line 584 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_UCP_CO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 164: -#line 586 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_UCP_L, negated); {cs = stack[--top]; goto _again;} }} - break; - case 165: -#line 593 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_UCP_M, negated); {cs = stack[--top]; goto _again;} }} - break; - case 166: -#line 595 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_UCP_ME, negated); {cs = stack[--top]; goto _again;} }} - break; - case 167: -#line 597 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_UCP_N, negated); {cs = stack[--top]; goto _again;} }} - break; - case 168: -#line 601 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_UCP_P, negated); {cs = stack[--top]; goto _again;} }} - break; - case 169: -#line 609 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_UCP_S, negated); {cs = stack[--top]; goto _again;} }} - break; - case 170: -#line 614 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_UCP_Z, negated); {cs = stack[--top]; goto _again;} }} - break; - case 171: -#line 653 "Parser.rl" - {te = p;p--;{ currentCls->add(CLASS_SCRIPT_HAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 172: -#line 718 "Parser.rl" - {te = p;p--;{ throw LocatedParseError("Unknown property"); }} - break; - case 173: -#line 580 "Parser.rl" - {{p = ((te))-1;}{ currentCls->add(CLASS_UCP_C, negated); {cs = stack[--top]; goto _again;} }} - break; - case 174: -#line 584 "Parser.rl" - {{p = ((te))-1;}{ currentCls->add(CLASS_UCP_CO, negated); {cs = stack[--top]; goto _again;} }} - break; - case 175: -#line 586 "Parser.rl" - {{p = ((te))-1;}{ currentCls->add(CLASS_UCP_L, negated); {cs = stack[--top]; goto _again;} }} - break; - case 176: -#line 593 "Parser.rl" - {{p = ((te))-1;}{ currentCls->add(CLASS_UCP_M, negated); {cs = stack[--top]; goto _again;} }} - break; - case 177: -#line 595 "Parser.rl" - {{p = ((te))-1;}{ currentCls->add(CLASS_UCP_ME, negated); {cs = stack[--top]; goto _again;} }} - break; - case 178: -#line 597 "Parser.rl" - {{p = ((te))-1;}{ currentCls->add(CLASS_UCP_N, negated); {cs = stack[--top]; goto _again;} }} - break; - case 179: -#line 601 "Parser.rl" - {{p = ((te))-1;}{ currentCls->add(CLASS_UCP_P, negated); {cs = stack[--top]; goto _again;} }} - break; - case 180: -#line 609 "Parser.rl" - {{p = ((te))-1;}{ currentCls->add(CLASS_UCP_S, negated); {cs = stack[--top]; goto _again;} }} - break; - case 181: -#line 653 "Parser.rl" - {{p = ((te))-1;}{ currentCls->add(CLASS_SCRIPT_HAN, negated); {cs = stack[--top]; goto _again;} }} - break; - case 182: -#line 718 "Parser.rl" - {{p = ((te))-1;}{ throw LocatedParseError("Unknown property"); }} - break; - case 183: -#line 733 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_UCP_C, negated); - if (!inCharClass) { - currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); - } - {cs = stack[--top]; goto _again;} - }} - break; - case 184: -#line 741 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_UCP_L, negated); - if (!inCharClass) { - currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); - } - {cs = stack[--top]; goto _again;} - }} - break; - case 185: -#line 749 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_UCP_M, negated); - if (!inCharClass) { - currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); - } - {cs = stack[--top]; goto _again;} - }} - break; - case 186: -#line 757 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_UCP_N, negated); - if (!inCharClass) { - currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); - } - {cs = stack[--top]; goto _again;} - }} - break; - case 187: -#line 765 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_UCP_P, negated); - if (!inCharClass) { - currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); - } - {cs = stack[--top]; goto _again;} - }} - break; - case 188: -#line 773 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_UCP_S, negated); - if (!inCharClass) { - currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); - } - {cs = stack[--top]; goto _again;} - }} - break; - case 189: -#line 781 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_UCP_Z, negated); - if (!inCharClass) { - currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); - } - {cs = stack[--top]; goto _again;} - }} - break; - case 190: -#line 790 "Parser.rl" - {te = p+1;{ throw LocatedParseError("Unknown property"); }} - break; - case 191: -#line 796 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Unsupported POSIX collating " - "element"); - }} - break; - case 192: -#line 803 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_ALNUM, false); - }} - break; - case 193: -#line 806 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_ALNUM, true); - }} - break; - case 194: -#line 809 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_ALPHA, false); - }} - break; - case 195: -#line 812 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_ALPHA, true); - }} - break; - case 196: -#line 815 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_ASCII, false); - }} - break; - case 197: -#line 818 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_ASCII, true); - }} - break; - case 198: -#line 821 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_BLANK, false); - }} - break; - case 199: -#line 824 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_BLANK, true); - }} - break; - case 200: -#line 827 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_CNTRL, false); - }} - break; - case 201: -#line 830 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_CNTRL, true); - }} - break; - case 202: -#line 833 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_DIGIT, false); - }} - break; - case 203: -#line 836 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_DIGIT, true); - }} - break; - case 204: -#line 839 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_GRAPH, false); - }} - break; - case 205: -#line 842 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_GRAPH, true); - }} - break; - case 206: -#line 845 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_LOWER, false); - }} - break; - case 207: -#line 848 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_LOWER, true); - }} - break; - case 208: -#line 851 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_PRINT, false); - }} - break; - case 209: -#line 854 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_PRINT, true); - }} - break; - case 210: -#line 857 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_PUNCT, false); - }} - break; - case 211: -#line 860 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_PUNCT, true); - }} - break; - case 212: -#line 864 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_SPACE, false); - }} - break; - case 213: -#line 867 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_SPACE, true); - }} - break; - case 214: -#line 870 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_UPPER, false); - }} - break; - case 215: -#line 873 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_UPPER, true); - }} - break; - case 216: -#line 876 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_WORD, false); - }} - break; - case 217: -#line 879 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_WORD, true); - }} - break; - case 218: -#line 882 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_XDIGIT, false); - }} - break; - case 219: -#line 885 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_XDIGIT, true); - }} - break; - case 220: -#line 890 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Invalid POSIX named class"); - }} - break; - case 221: -#line 893 "Parser.rl" - {te = p+1;{ - { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 843;goto _again;}} - }} - break; - case 222: -#line 896 "Parser.rl" - {te = p+1;{ /*noop*/}} - break; - case 223: -#line 898 "Parser.rl" - {te = p+1;{ - currentCls->add('\x08'); - }} - break; - case 224: -#line 902 "Parser.rl" - {te = p+1;{ - currentCls->add('\x09'); - }} - break; - case 225: -#line 906 "Parser.rl" - {te = p+1;{ - currentCls->add('\x0a'); - }} - break; - case 226: -#line 910 "Parser.rl" - {te = p+1;{ - currentCls->add('\x0d'); - }} - break; - case 227: -#line 914 "Parser.rl" - {te = p+1;{ - currentCls->add('\x0c'); - }} - break; - case 228: -#line 918 "Parser.rl" - {te = p+1;{ - currentCls->add('\x07'); - }} - break; - case 229: -#line 922 "Parser.rl" - {te = p+1;{ - currentCls->add('\x1b'); - }} - break; - case 230: -#line 926 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_HORZ, false); - }} - break; - case 231: -#line 930 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_HORZ, true); - }} - break; - case 232: -#line 934 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_VERT, false); - }} - break; - case 233: -#line 938 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_VERT, true); - }} - break; - case 234: -#line 942 "Parser.rl" - {te = p+1;{ - negated = false; - p--; - { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 559;goto _again;}} - }} - break; - case 235: -#line 948 "Parser.rl" - {te = p+1;{ - negated = false; - p--; - { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 818;goto _again;}} - }} - break; - case 236: -#line 954 "Parser.rl" - {te = p+1;{ - negated = true; - p--; - { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 559;goto _again;}} - }} - break; - case 237: -#line 960 "Parser.rl" - {te = p+1;{ - negated = true; - p--; - { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 818;goto _again;}} - }} - break; - case 238: -#line 970 "Parser.rl" - {te = p+1;{ - currentCls->add(octAccumulator); - }} - break; - case 239: -#line 973 "Parser.rl" - {te = p+1;{ - currentCls->add(octAccumulator); - }} - break; - case 240: -#line 977 "Parser.rl" - {te = p+1;{ - string oct(ts + 3, te - ts - 4); - unsigned long val; - try { - val = stoul(oct, nullptr, 8); - } catch (const std::out_of_range &) { - val = MAX_UNICODE + 1; - } - if ((!mode.utf8 && val > 255) || val > MAX_UNICODE) { - throw LocatedParseError("Value in \\o{...} sequence is too large"); - } - currentCls->add((unichar)val); - }} - break; - case 241: -#line 997 "Parser.rl" - {te = p+1;{ - currentCls->add(accumulator); - }} - break; - case 242: -#line 1001 "Parser.rl" - {te = p+1;{ - // whatever we found here - currentCls->add(*(ts + 1)); - - }} - break; - case 243: -#line 1007 "Parser.rl" - {te = p+1;{ - string hex(ts + 3, te - ts - 4); - unsigned long val; - try { - val = stoul(hex, nullptr, 16); - } catch (const std::out_of_range &) { - val = MAX_UNICODE + 1; - } - if (val > MAX_UNICODE) { - throw LocatedParseError("Value in \\x{...} sequence is too large"); - } - currentCls->add((unichar)val); - }} - break; - case 244: -#line 1025 "Parser.rl" - {te = p+1;{ - if (te - ts < 3) { - assert(te - ts == 2); - throw LocatedParseError(SLASH_C_ERROR); - } else { - assert(te - ts == 3); - currentCls->add(decodeCtrl(ts[2])); - } - }} - break; - case 245: -#line 1035 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_WORD, false); - }} - break; - case 246: -#line 1039 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_WORD, true); - }} - break; - case 247: -#line 1043 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_SPACE, false); - }} - break; - case 248: -#line 1047 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_SPACE, true); - }} - break; - case 249: -#line 1051 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_DIGIT, false); - }} - break; - case 250: -#line 1055 "Parser.rl" - {te = p+1;{ - currentCls->add(CLASS_DIGIT, true); - }} - break; - case 251: -#line 1058 "Parser.rl" - {te = p+1;{ - currentCls->addDash(); - }} - break; - case 252: -#line 276 "Parser.rl" - {te = p+1;{ - ostringstream str; - str << "'\\" << *(ts + 1) << "' at index " << ts - ptr - << " not supported in a character class."; - throw ParseError(str.str()); - }} - break; - case 253: -#line 276 "Parser.rl" - {te = p+1;{ - ostringstream str; - str << "'\\" << *(ts + 1) << "' at index " << ts - ptr - << " not supported in a character class."; - throw ParseError(str.str()); - }} - break; - case 254: -#line 276 "Parser.rl" - {te = p+1;{ - ostringstream str; - str << "'\\" << *(ts + 1) << "' at index " << ts - ptr - << " not supported in a character class."; - throw ParseError(str.str()); - }} - break; - case 255: -#line 1075 "Parser.rl" - {te = p+1;{ - // add the literal char - currentCls->add(*(ts + 1)); - }} - break; - case 256: -#line 1081 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - currentCls->add(readUtf8CodePoint2c(ts)); - }} - break; - case 257: -#line 1086 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - currentCls->add(readUtf8CodePoint3c(ts)); - }} - break; - case 258: -#line 1091 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - currentCls->add(readUtf8CodePoint4c(ts)); - }} - break; - case 259: -#line 1096 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 260: -#line 1102 "Parser.rl" - {te = p+1;{ - currentCls->add((u8)*ts); - }} - break; - case 261: -#line 1106 "Parser.rl" - {te = p+1;{ - currentCls->finalize(); - currentSeq->addComponent(move(currentCls)); - inCharClass = false; - {cs = 746;goto _again;} - }} - break; - case 262: -#line 966 "Parser.rl" - {te = p;p--;{ throw LocatedParseError("Malformed property"); }} - break; - case 263: -#line 967 "Parser.rl" - {te = p;p--;{ throw LocatedParseError("Malformed property"); }} - break; - case 264: -#line 970 "Parser.rl" - {te = p;p--;{ - currentCls->add(octAccumulator); - }} - break; - case 265: -#line 973 "Parser.rl" - {te = p;p--;{ - currentCls->add(octAccumulator); - }} - break; - case 266: -#line 992 "Parser.rl" - {te = p;p--;{ - throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); - }} - break; - case 267: -#line 997 "Parser.rl" - {te = p;p--;{ - currentCls->add(accumulator); - }} - break; - case 268: -#line 1021 "Parser.rl" - {te = p;p--;{ - throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); - }} - break; - case 269: -#line 1025 "Parser.rl" - {te = p;p--;{ - if (te - ts < 3) { - assert(te - ts == 2); - throw LocatedParseError(SLASH_C_ERROR); - } else { - assert(te - ts == 3); - currentCls->add(decodeCtrl(ts[2])); - } - }} - break; - case 270: -#line 1096 "Parser.rl" - {te = p;p--;{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 271: -#line 1102 "Parser.rl" - {te = p;p--;{ - currentCls->add((u8)*ts); - }} - break; - case 272: -#line 992 "Parser.rl" - {{p = ((te))-1;}{ - throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); - }} - break; - case 273: -#line 1021 "Parser.rl" - {{p = ((te))-1;}{ - throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); - }} - break; - case 274: -#line 1096 "Parser.rl" - {{p = ((te))-1;}{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 275: -#line 1102 "Parser.rl" - {{p = ((te))-1;}{ - currentCls->add((u8)*ts); - }} - break; - case 276: -#line 1120 "Parser.rl" - {te = p+1;{ - if (currentCls->isNegated()) { - // Already seen a caret; the second one is not a meta-character. - inCharClassEarly = false; - p--; {cs = 819;goto _again;} - } else { - currentCls->negate(); - // Note: we cannot switch off inCharClassEarly here, as /[^]]/ - // needs to use the right square bracket path below. - } - }} - break; - case 277: -#line 1133 "Parser.rl" - {te = p+1;{ - currentCls->add(']'); - inCharClassEarly = false; - }} - break; - case 278: -#line 1138 "Parser.rl" - {te = p+1;{ { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 843;goto _again;}} }} - break; - case 279: -#line 1139 "Parser.rl" - {te = p+1;{ /*noop*/}} - break; - case 280: -#line 1142 "Parser.rl" - {te = p+1;{ - inCharClassEarly = false; - p--; - {cs = 819;goto _again;} - }} - break; - case 281: -#line 1142 "Parser.rl" - {te = p;p--;{ - inCharClassEarly = false; - p--; - {cs = 819;goto _again;} - }} - break; - case 282: -#line 1154 "Parser.rl" - {te = p+1;{ - {cs = 746;goto _again;} - }} - break; - case 283: -#line 1159 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - /* leverage ComponentClass to generate the vertices */ - auto cc = getComponentClass(mode); - cc->add(readUtf8CodePoint2c(ts)); - cc->finalize(); - currentSeq->addComponent(move(cc)); - }} - break; - case 284: -#line 1168 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - /* leverage ComponentClass to generate the vertices */ - auto cc = getComponentClass(mode); - cc->add(readUtf8CodePoint3c(ts)); - cc->finalize(); - currentSeq->addComponent(move(cc)); - }} - break; - case 285: -#line 1177 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - /* leverage ComponentClass to generate the vertices */ - auto cc = getComponentClass(mode); - cc->add(readUtf8CodePoint4c(ts)); - cc->finalize(); - currentSeq->addComponent(move(cc)); - }} - break; - case 286: -#line 1186 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 287: -#line 1192 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, *ts, mode); - }} - break; - case 288: -#line 1186 "Parser.rl" - {te = p;p--;{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 289: -#line 1192 "Parser.rl" - {te = p;p--;{ - addLiteral(currentSeq, *ts, mode); - }} - break; - case 290: -#line 1186 "Parser.rl" - {{p = ((te))-1;}{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 291: -#line 1202 "Parser.rl" - {te = p+1;{ - {cs = stack[--top]; goto _again;} - }} - break; - case 292: -#line 1207 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - currentCls->add(readUtf8CodePoint2c(ts)); - inCharClassEarly = false; - }} - break; - case 293: -#line 1213 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - currentCls->add(readUtf8CodePoint3c(ts)); - inCharClassEarly = false; - }} - break; - case 294: -#line 1219 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - currentCls->add(readUtf8CodePoint4c(ts)); - inCharClassEarly = false; - }} - break; - case 295: -#line 1225 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 296: -#line 1231 "Parser.rl" - {te = p+1;{ - currentCls->add(*ts); - inCharClassEarly = false; - }} - break; - case 297: -#line 1225 "Parser.rl" - {te = p;p--;{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 298: -#line 1231 "Parser.rl" - {te = p;p--;{ - currentCls->add(*ts); - inCharClassEarly = false; - }} - break; - case 299: -#line 1225 "Parser.rl" - {{p = ((te))-1;}{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 300: -#line 1243 "Parser.rl" - {te = p+1;{ inComment = false; {cs = 746;goto _again;} }} - break; - case 301: -#line 1247 "Parser.rl" - {te = p+1;} - break; - case 302: -#line 1255 "Parser.rl" - {te = p+1;{ inComment = false; {cs = 746;goto _again;} }} - break; - case 303: -#line 1259 "Parser.rl" - {te = p+1;} - break; - case 304: -#line 1491 "Parser.rl" - {act = 288;} - break; - case 305: -#line 1508 "Parser.rl" - {act = 290;} - break; - case 306: -#line 1737 "Parser.rl" - {act = 330;} - break; - case 307: -#line 362 "Parser.rl" - {te = p+1;{ - if (sequences.empty()) { - throw LocatedParseError("Unmatched parentheses"); - } - currentSeq->finalize(); - POP_SEQUENCE; - }} - break; - case 308: -#line 1274 "Parser.rl" - {te = p+1;{ - currentSeq->addAlternation(); - }} - break; - case 309: -#line 1279 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("POSIX named classes are only " - "supported inside a class"); - }} - break; - case 310: -#line 1286 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Unsupported POSIX collating " - "element"); - }} - break; - case 311: -#line 1293 "Parser.rl" - {te = p+1;{ - {cs = 838;goto _again;} - }} - break; - case 312: -#line 1297 "Parser.rl" - {te = p+1;{ /* noop */ }} - break; - case 313: -#line 1299 "Parser.rl" - {te = p+1;{ - currentSeq->addComponent(generateComponent(CLASS_ANY, false, mode)); - }} - break; - case 314: -#line 1303 "Parser.rl" - {te = p+1;{ - if (mode.utf8) { - throw LocatedParseError("\\C is unsupported in UTF8"); - } - currentSeq->addComponent(std::make_unique()); - }} - break; - case 315: -#line 1317 "Parser.rl" - {te = p+1;{ - if (!currentSeq->addRepeat(0, ComponentRepeat::NoLimit, - ComponentRepeat::REPEAT_NONGREEDY)) { - throwInvalidRepeat(); - } - }} - break; - case 316: -#line 1324 "Parser.rl" - {te = p+1;{ - if (!currentSeq->addRepeat(0, ComponentRepeat::NoLimit, - ComponentRepeat::REPEAT_POSSESSIVE)) { - throwInvalidRepeat(); - } - }} - break; - case 317: -#line 1338 "Parser.rl" - {te = p+1;{ - if (!currentSeq->addRepeat(1, ComponentRepeat::NoLimit, - ComponentRepeat::REPEAT_NONGREEDY)) { - throwInvalidRepeat(); - } - }} - break; - case 318: -#line 1345 "Parser.rl" - {te = p+1;{ - if (!currentSeq->addRepeat(1, ComponentRepeat::NoLimit, - ComponentRepeat::REPEAT_POSSESSIVE)) { - throwInvalidRepeat(); - } - }} - break; - case 319: -#line 1359 "Parser.rl" - {te = p+1;{ - if (!currentSeq->addRepeat( - 0, 1, ComponentRepeat::REPEAT_NONGREEDY)) { - throwInvalidRepeat(); - } - }} - break; - case 320: -#line 1366 "Parser.rl" - {te = p+1;{ - if (!currentSeq->addRepeat( - 0, 1, ComponentRepeat::REPEAT_POSSESSIVE)) { - throwInvalidRepeat(); - } - }} - break; - case 321: -#line 1383 "Parser.rl" - {te = p+1;{ - if (repeatN > repeatM || repeatM == 0) { - throwInvalidRepeat(); - } else if (!currentSeq->addRepeat( - repeatN, repeatM, - ComponentRepeat::REPEAT_NONGREEDY)) { - throwInvalidRepeat(); - } - }} - break; - case 322: -#line 1393 "Parser.rl" - {te = p+1;{ - if (repeatN > repeatM || repeatM == 0) { - throwInvalidRepeat(); - } else if (!currentSeq->addRepeat( - repeatN, repeatM, - ComponentRepeat::REPEAT_POSSESSIVE)) { - throwInvalidRepeat(); - } - }} - break; - case 323: -#line 322 "Parser.rl" - {te = p+1;{ - inComment = true; - {cs = 849;goto _again;} - }} - break; - case 324: -#line 1410 "Parser.rl" - {te = p+1;{ p--; { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 787;goto _again;}} }} - break; - case 325: -#line 1414 "Parser.rl" - {te = p+1;{ assert(0); {p++; goto _out; } }} - break; - case 326: -#line 1421 "Parser.rl" - {te = p+1;{ - auto bound = mode.multiline ? ComponentBoundary::BEGIN_LINE - : ComponentBoundary::BEGIN_STRING; - currentSeq->addComponent(std::make_unique(bound)); - }} - break; - case 327: -#line 1428 "Parser.rl" - {te = p+1;{ - auto bound = mode.multiline ? ComponentBoundary::END_LINE - : ComponentBoundary::END_STRING_OPTIONAL_LF; - currentSeq->addComponent(std::make_unique(bound)); - }} - break; - case 328: -#line 1434 "Parser.rl" - {te = p+1;{ - auto bound = ComponentBoundary::BEGIN_STRING; - currentSeq->addComponent(std::make_unique(bound)); - }} - break; - case 329: -#line 1439 "Parser.rl" - {te = p+1;{ - auto bound = ComponentBoundary::END_STRING_OPTIONAL_LF; - currentSeq->addComponent(std::make_unique(bound)); - }} - break; - case 330: -#line 1444 "Parser.rl" - {te = p+1;{ - auto bound = ComponentBoundary::END_STRING; - currentSeq->addComponent(std::make_unique(bound)); - }} - break; - case 331: -#line 1449 "Parser.rl" - {te = p+1;{ - currentSeq->addComponent( - std::make_unique(ts - ptr, false, mode)); - }} - break; - case 332: -#line 1454 "Parser.rl" - {te = p+1;{ - currentSeq->addComponent( - std::make_unique(ts - ptr, true, mode)); - }} - break; - case 333: -#line 1464 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, '\x09', mode); - }} - break; - case 334: -#line 1468 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, '\x0a', mode); - }} - break; - case 335: -#line 1472 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, '\x0d', mode); - }} - break; - case 336: -#line 1476 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, '\x0c', mode); - }} - break; - case 337: -#line 1480 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, '\x07', mode); - }} - break; - case 338: -#line 1484 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, '\x1b', mode); - }} - break; - case 339: -#line 1488 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, octAccumulator, mode); - }} - break; - case 340: -#line 479 "Parser.rl" - {te = p+1;{ - if (accumulator == 0) { - throw LocatedParseError("Numbered reference cannot be zero"); - } - currentSeq->addComponent(std::make_unique(accumulator)); - }} - break; - case 341: -#line 486 "Parser.rl" - {te = p+1;{ - // Accumulator is a negative offset. - if (accumulator == 0) { - throw LocatedParseError("Numbered reference cannot be zero"); - } - if (accumulator >= groupIndex) { - throw LocatedParseError("Invalid reference"); - } - unsigned idx = groupIndex - accumulator; - currentSeq->addComponent(std::make_unique(idx)); - }} - break; - case 342: -#line 479 "Parser.rl" - {te = p+1;{ - if (accumulator == 0) { - throw LocatedParseError("Numbered reference cannot be zero"); - } - currentSeq->addComponent(std::make_unique(accumulator)); - }} - break; - case 343: -#line 486 "Parser.rl" - {te = p+1;{ - // Accumulator is a negative offset. - if (accumulator == 0) { - throw LocatedParseError("Numbered reference cannot be zero"); - } - if (accumulator >= groupIndex) { - throw LocatedParseError("Invalid reference"); - } - unsigned idx = groupIndex - accumulator; - currentSeq->addComponent(std::make_unique(idx)); - }} - break; - case 344: -#line 498 "Parser.rl" - {te = p+1;{ - currentSeq->addComponent(std::make_unique(label)); - }} - break; - case 345: -#line 498 "Parser.rl" - {te = p+1;{ - currentSeq->addComponent(std::make_unique(label)); - }} - break; - case 346: -#line 498 "Parser.rl" - {te = p+1;{ - currentSeq->addComponent(std::make_unique(label)); - }} - break; - case 347: -#line 498 "Parser.rl" - {te = p+1;{ - currentSeq->addComponent(std::make_unique(label)); - }} - break; - case 348: -#line 498 "Parser.rl" - {te = p+1;{ - currentSeq->addComponent(std::make_unique(label)); - }} - break; - case 349: -#line 1549 "Parser.rl" - {te = p+1;{ - ostringstream str; - str << "Onigiruma subroutine call at index " << ts - ptr << - " not supported."; - throw ParseError(str.str()); - }} - break; - case 350: -#line 1560 "Parser.rl" - {te = p+1;{ - string oct(ts + 3, te - ts - 4); - unsigned long val; - try { - val = stoul(oct, nullptr, 8); - } catch (const std::out_of_range &) { - val = MAX_UNICODE + 1; - } - if ((!mode.utf8 && val > 255) || val > MAX_UNICODE) { - throw LocatedParseError("Value in \\o{...} sequence is too large"); - } - addEscapedOctal(currentSeq, (unichar)val, mode); - }} - break; - case 351: -#line 1578 "Parser.rl" - {te = p+1;{ - addEscapedHex(currentSeq, accumulator, mode); - }} - break; - case 352: -#line 1582 "Parser.rl" - {te = p+1;{ - string hex(ts + 3, te - ts - 4); - unsigned long val; - try { - val = stoul(hex, nullptr, 16); - } catch (const std::out_of_range &) { - val = MAX_UNICODE + 1; - } - if (val > MAX_UNICODE) { - throw LocatedParseError("Value in \\x{...} sequence is too large"); - } - addEscapedHex(currentSeq, (unichar)val, mode); - }} - break; - case 353: -#line 1600 "Parser.rl" - {te = p+1;{ - if (te - ts < 3) { - assert(te - ts == 2); - throw LocatedParseError(SLASH_C_ERROR); - } else { - assert(te - ts == 3); - addLiteral(currentSeq, decodeCtrl(ts[2]), mode); - } - }} - break; - case 354: -#line 1610 "Parser.rl" - {te = p+1;{ - ostringstream str; - str << "'\\" << *(ts + 1) << "' at index " << ts - ptr - << " not supported."; - throw ParseError(str.str()); - }} - break; - case 355: -#line 1618 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_WORD, false, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 356: -#line 1623 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_WORD, true, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 357: -#line 1628 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_SPACE, false, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 358: -#line 1633 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_SPACE, true, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 359: -#line 1638 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_DIGIT, false, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 360: -#line 1643 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_DIGIT, true, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 361: -#line 1648 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_HORZ, false, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 362: -#line 1653 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_HORZ, true, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 363: -#line 1658 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_VERT, false, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 364: -#line 1663 "Parser.rl" - {te = p+1;{ - auto cc = generateComponent(CLASS_VERT, true, mode); - currentSeq->addComponent(move(cc)); - }} - break; - case 365: -#line 1668 "Parser.rl" - {te = p+1;{ - assert(!currentCls && !inCharClass); - currentCls = getComponentClass(mode); - negated = false; - p--; - { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 559;goto _again;}} - }} - break; - case 366: -#line 1676 "Parser.rl" - {te = p+1;{ - assert(!currentCls && !inCharClass); - currentCls = getComponentClass(mode); - negated = false; - p--; - { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 818;goto _again;}} - }} - break; - case 367: -#line 1684 "Parser.rl" - {te = p+1;{ - assert(!currentCls && !inCharClass); - currentCls = getComponentClass(mode); - negated = true; - p--; - { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 559;goto _again;}} - }} - break; - case 368: -#line 1692 "Parser.rl" - {te = p+1;{ - assert(!currentCls && !inCharClass); - currentCls = getComponentClass(mode); - negated = true; - p--; - { - DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); - if ((int)stack.size() == top) { - stack.resize(2 * (top + 1)); - } - {stack[top++] = cs; cs = 818;goto _again;}} - }} - break; - case 369: -#line 1704 "Parser.rl" - {te = p+1;{ - ostringstream str; - str << "\\R at index " << ts - ptr << " not supported."; - throw ParseError(str.str()); - }} - break; - case 370: -#line 1711 "Parser.rl" - {te = p+1;{ - ostringstream str; - str << "\\K at index " << ts - ptr << " not supported."; - throw ParseError(str.str()); - }} - break; - case 371: -#line 1726 "Parser.rl" - {te = p+1;{ - ostringstream str; - str << "\\G at index " << ts - ptr << " not supported."; - throw ParseError(str.str()); - }} - break; - case 372: -#line 1732 "Parser.rl" - {te = p+1;{ - currentSeq->addComponent(std::make_unique(ts - ptr, mode)); - }} - break; - case 373: -#line 1737 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, *(ts + 1), mode); - }} - break; - case 374: -#line 316 "Parser.rl" - {te = p+1;{ - inComment = true; - {cs = 848;goto _again;} - }} - break; - case 375: -#line 433 "Parser.rl" - {te = p+1;{ - mode = newMode; - currentSeq->addComponent(std::make_unique()); - }} - break; - case 376: -#line 355 "Parser.rl" - {te = p+1;{ - PUSH_SEQUENCE; - mode = newMode; - currentSeq = - enterSequence(currentSeq, std::make_unique()); - }} - break; - case 377: -#line 369 "Parser.rl" - {te = p+1;{ - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique(ComponentAssertion::LOOKAHEAD, - ComponentAssertion::POS)); - }} - break; - case 378: -#line 375 "Parser.rl" - {te = p+1;{ - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique(ComponentAssertion::LOOKAHEAD, - ComponentAssertion::NEG)); - }} - break; - case 379: -#line 381 "Parser.rl" - {te = p+1;{ - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique(ComponentAssertion::LOOKBEHIND, - ComponentAssertion::POS)); - }} - break; - case 380: -#line 387 "Parser.rl" - {te = p+1;{ - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique(ComponentAssertion::LOOKBEHIND, - ComponentAssertion::NEG)); - }} - break; - case 381: -#line 393 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Embedded code is not supported"); - }} - break; - case 382: -#line 393 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Embedded code is not supported"); - }} - break; - case 383: -#line 416 "Parser.rl" - {te = p+1;{ - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique()); - }} - break; - case 384: -#line 336 "Parser.rl" - {te = p+1;{ - assert(!label.empty()); // should be guaranteed by machine - char c = *label.begin(); - if (c >= '0' && c <= '9') { - throw LocatedParseError("Group name cannot begin with a digit"); - } - if (!groupNames.insert(label).second) { - throw LocatedParseError("Two named subpatterns use the name '" + label + "'"); - } - PUSH_SEQUENCE; - auto seq = std::make_unique(); - seq->setCaptureIndex(groupIndex++); - seq->setCaptureName(label); - currentSeq = enterSequence(currentSeq, move(seq)); - }} - break; - case 385: -#line 399 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Subpattern reference unsupported"); - }} - break; - case 386: -#line 399 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Subpattern reference unsupported"); - }} - break; - case 387: -#line 1783 "Parser.rl" - {te = p+1;{ - auto a = std::make_unique( - ComponentAssertion::LOOKAHEAD, ComponentAssertion::POS); - ComponentAssertion *a_seq = a.get(); - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique(move(a))); - PUSH_SEQUENCE; - currentSeq = a_seq; - }} - break; - case 388: -#line 1794 "Parser.rl" - {te = p+1;{ - auto a = std::make_unique( - ComponentAssertion::LOOKAHEAD, ComponentAssertion::NEG); - ComponentAssertion *a_seq = a.get(); - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique(move(a))); - PUSH_SEQUENCE; - currentSeq = a_seq; - }} - break; - case 389: -#line 1805 "Parser.rl" - {te = p+1;{ - auto a = std::make_unique( - ComponentAssertion::LOOKBEHIND, ComponentAssertion::POS); - ComponentAssertion *a_seq = a.get(); - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique(move(a))); - PUSH_SEQUENCE; - currentSeq = a_seq; - }} - break; - case 390: -#line 1816 "Parser.rl" - {te = p+1;{ - auto a = std::make_unique( - ComponentAssertion::LOOKBEHIND, ComponentAssertion::NEG); - ComponentAssertion *a_seq = a.get(); - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique(move(a))); - PUSH_SEQUENCE; - currentSeq = a_seq; - }} - break; - case 391: -#line 1828 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Pattern recursion not supported"); - }} - break; - case 392: -#line 402 "Parser.rl" - {te = p+1;{ - if (accumulator == 0) { - throw LocatedParseError("Numbered reference cannot be zero"); - } - PUSH_SEQUENCE; - currentSeq = enterSequence(currentSeq, - std::make_unique(accumulator)); - }} - break; - case 393: -#line 410 "Parser.rl" - {te = p+1;{ - PUSH_SEQUENCE; - assert(!label.empty()); - currentSeq = enterSequence(currentSeq, - std::make_unique(label)); - }} - break; - case 394: -#line 1844 "Parser.rl" - {te = p+1;{ - ostringstream str; - str << "Callout at index " << ts - ptr << " not supported."; - throw ParseError(str.str()); - }} - break; - case 395: -#line 1852 "Parser.rl" - {te = p+1;{ - throw LocatedParseError("Unrecognised character after (?"); - }} - break; - case 396: -#line 1857 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - /* leverage ComponentClass to generate the vertices */ - auto cc = getComponentClass(mode); - cc->add(readUtf8CodePoint2c(ts)); - cc->finalize(); - currentSeq->addComponent(move(cc)); - }} - break; - case 397: -#line 1866 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - /* leverage ComponentClass to generate the vertices */ - auto cc = getComponentClass(mode); - cc->add(readUtf8CodePoint3c(ts)); - cc->finalize(); - currentSeq->addComponent(move(cc)); - }} - break; - case 398: -#line 1875 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - /* leverage ComponentClass to generate the vertices */ - auto cc = getComponentClass(mode); - cc->add(readUtf8CodePoint4c(ts)); - cc->finalize(); - currentSeq->addComponent(move(cc)); - }} - break; - case 399: -#line 1884 "Parser.rl" - {te = p+1;{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 400: -#line 1893 "Parser.rl" - {te = p+1;{ - if (mode.ignore_space == false) { - addLiteral(currentSeq, *ts, mode); - } - }} - break; - case 401: -#line 1898 "Parser.rl" - {te = p+1;{ - addLiteral(currentSeq, *ts, mode); - }} - break; - case 402: -#line 328 "Parser.rl" - {te = p;p--;{ - PUSH_SEQUENCE; - auto seq = std::make_unique(); - seq->setCaptureIndex(groupIndex++); - currentSeq = enterSequence(currentSeq, move(seq)); - }} - break; - case 403: -#line 421 "Parser.rl" - {te = p;p--;{ - assert(!currentCls); - assert(!inCharClass); // not reentrant - currentCls = getComponentClass(mode); - inCharClass = true; - inCharClassEarly = true; - currentClsBegin = ts; - {cs = 836;goto _again;} - }} - break; - case 404: -#line 1310 "Parser.rl" - {te = p;p--;{ - if (!currentSeq->addRepeat(0, ComponentRepeat::NoLimit, - ComponentRepeat::REPEAT_GREEDY)) { - throwInvalidRepeat(); - } - }} - break; - case 405: -#line 1331 "Parser.rl" - {te = p;p--;{ - if (!currentSeq->addRepeat(1, ComponentRepeat::NoLimit, - ComponentRepeat::REPEAT_GREEDY)) { - throwInvalidRepeat(); - } - }} - break; - case 406: -#line 1352 "Parser.rl" - {te = p;p--;{ - if (!currentSeq->addRepeat( - 0, 1, ComponentRepeat::REPEAT_GREEDY)) { - throwInvalidRepeat(); - } - }} - break; - case 407: -#line 1373 "Parser.rl" - {te = p;p--;{ - if (repeatN > repeatM || repeatM == 0) { - throwInvalidRepeat(); - } else if (!currentSeq->addRepeat( - repeatN, repeatM, - ComponentRepeat::REPEAT_GREEDY)) { - throwInvalidRepeat(); - } - }} - break; - case 408: -#line 1488 "Parser.rl" - {te = p;p--;{ - addLiteral(currentSeq, octAccumulator, mode); - }} - break; - case 409: -#line 1491 "Parser.rl" - {te = p;p--;{ - // If there are enough capturing sub expressions, this may be - // a back reference - accumulator = parseAsDecimal(octAccumulator); - if (accumulator < groupIndex) { - currentSeq->addComponent(std::make_unique(accumulator)); - } else { - addEscapedOctal(currentSeq, octAccumulator, mode); - } - }} - break; - case 410: -#line 479 "Parser.rl" - {te = p;p--;{ - if (accumulator == 0) { - throw LocatedParseError("Numbered reference cannot be zero"); - } - currentSeq->addComponent(std::make_unique(accumulator)); - }} - break; - case 411: -#line 479 "Parser.rl" - {te = p;p--;{ - if (accumulator == 0) { - throw LocatedParseError("Numbered reference cannot be zero"); - } - currentSeq->addComponent(std::make_unique(accumulator)); - }} - break; - case 412: -#line 486 "Parser.rl" - {te = p;p--;{ - // Accumulator is a negative offset. - if (accumulator == 0) { - throw LocatedParseError("Numbered reference cannot be zero"); - } - if (accumulator >= groupIndex) { - throw LocatedParseError("Invalid reference"); - } - unsigned idx = groupIndex - accumulator; - currentSeq->addComponent(std::make_unique(idx)); - }} - break; - case 413: -#line 1557 "Parser.rl" - {te = p;p--;{ - throw LocatedParseError("Invalid reference after \\g"); - }} - break; - case 414: -#line 1574 "Parser.rl" - {te = p;p--;{ - throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); - }} - break; - case 415: -#line 1578 "Parser.rl" - {te = p;p--;{ - addEscapedHex(currentSeq, accumulator, mode); - }} - break; - case 416: -#line 1596 "Parser.rl" - {te = p;p--;{ - throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); - }} - break; - case 417: -#line 1600 "Parser.rl" - {te = p;p--;{ - if (te - ts < 3) { - assert(te - ts == 2); - throw LocatedParseError(SLASH_C_ERROR); - } else { - assert(te - ts == 3); - addLiteral(currentSeq, decodeCtrl(ts[2]), mode); - } - }} - break; - case 418: -#line 1700 "Parser.rl" - {te = p;p--;{ throw LocatedParseError("Malformed property"); }} - break; - case 419: -#line 1701 "Parser.rl" - {te = p;p--;{ throw LocatedParseError("Malformed property"); }} - break; - case 420: -#line 1719 "Parser.rl" - {te = p;p--;{ - ostringstream str; - str << "\\k at index " << ts - ptr << " not supported."; - throw ParseError(str.str()); - }} - break; - case 421: -#line 1742 "Parser.rl" - {te = p;p--;{ - assert(ts + 1 == pe); - ostringstream str; - str << "Unescaped \\ at end of input, index " << ts - ptr << "."; - throw ParseError(str.str()); - }} - break; - case 422: -#line 396 "Parser.rl" - {te = p;p--;{ - throw LocatedParseError("Conditional subpattern unsupported"); - }} - break; - case 423: -#line 1852 "Parser.rl" - {te = p;p--;{ - throw LocatedParseError("Unrecognised character after (?"); - }} - break; - case 424: -#line 1884 "Parser.rl" - {te = p;p--;{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 425: -#line 1898 "Parser.rl" - {te = p;p--;{ - addLiteral(currentSeq, *ts, mode); - }} - break; - case 426: -#line 328 "Parser.rl" - {{p = ((te))-1;}{ - PUSH_SEQUENCE; - auto seq = std::make_unique(); - seq->setCaptureIndex(groupIndex++); - currentSeq = enterSequence(currentSeq, move(seq)); - }} - break; - case 427: -#line 421 "Parser.rl" - {{p = ((te))-1;}{ - assert(!currentCls); - assert(!inCharClass); // not reentrant - currentCls = getComponentClass(mode); - inCharClass = true; - inCharClassEarly = true; - currentClsBegin = ts; - {cs = 836;goto _again;} - }} - break; - case 428: -#line 1557 "Parser.rl" - {{p = ((te))-1;}{ - throw LocatedParseError("Invalid reference after \\g"); - }} - break; - case 429: -#line 1574 "Parser.rl" - {{p = ((te))-1;}{ - throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); - }} - break; - case 430: -#line 1596 "Parser.rl" - {{p = ((te))-1;}{ - throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); - }} - break; - case 431: -#line 1719 "Parser.rl" - {{p = ((te))-1;}{ - ostringstream str; - str << "\\k at index " << ts - ptr << " not supported."; - throw ParseError(str.str()); - }} - break; - case 432: -#line 396 "Parser.rl" - {{p = ((te))-1;}{ - throw LocatedParseError("Conditional subpattern unsupported"); - }} - break; - case 433: -#line 1852 "Parser.rl" - {{p = ((te))-1;}{ - throw LocatedParseError("Unrecognised character after (?"); - }} - break; - case 434: -#line 1884 "Parser.rl" - {{p = ((te))-1;}{ - assert(mode.utf8); - throwInvalidUtf8(); - }} - break; - case 435: -#line 1898 "Parser.rl" - {{p = ((te))-1;}{ - addLiteral(currentSeq, *ts, mode); - }} - break; - case 436: -#line 1 "NONE" - { switch( act ) { - case 288: - {{p = ((te))-1;} - // If there are enough capturing sub expressions, this may be - // a back reference - accumulator = parseAsDecimal(octAccumulator); - if (accumulator < groupIndex) { - currentSeq->addComponent(std::make_unique(accumulator)); - } else { - addEscapedOctal(currentSeq, octAccumulator, mode); - } - } - break; - case 290: - {{p = ((te))-1;} - // if there are enough left parens to this point, back ref - if (accumulator < groupIndex) { - currentSeq->addComponent(std::make_unique(accumulator)); - } else { - // Otherwise, we interpret the first three digits as an - // octal escape, and the remaining characters stand for - // themselves as literals. - const char *s = ts; - unsigned int accum = 0; - unsigned int oct_digits = 0; - assert(*s == '\\'); // token starts at backslash - for (++s; s < te && oct_digits < 3; ++oct_digits, ++s) { - u8 digit = *s - '0'; - if (digit < 8) { - accum = digit + accum * 8; - } else { - break; - } - } - - if (oct_digits > 0) { - addEscapedOctal(currentSeq, accum, mode); - } - - // And then the rest of the digits, if any, are literal. - for (; s < te; ++s) { - addLiteral(currentSeq, *s, mode); - } - } - } - break; - case 330: - {{p = ((te))-1;} - addLiteral(currentSeq, *(ts + 1), mode); - } - break; - } - } - break; -#line 5508 "Parser.cpp" - } - } - -_again: - _acts = _regex_actions + _regex_to_state_actions[cs]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) { - switch ( *_acts++ ) { - case 23: -#line 1 "NONE" - {ts = 0;} - break; -#line 5521 "Parser.cpp" - } - } - - if ( cs == 0 ) - goto _out; - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) - { - if ( _regex_eof_trans[cs] > 0 ) { - _trans = _regex_eof_trans[cs] - 1; - goto _eof_trans; - } - const short *__acts = _regex_actions + _regex_eof_actions[cs]; - unsigned int __nacts = (unsigned int) *__acts++; - while ( __nacts-- > 0 ) { - switch ( *__acts++ ) { - case 22: -#line 730 "Parser.rl" - { throw LocatedParseError("Malformed property"); } - break; -#line 5544 "Parser.cpp" - } - } - } - - _out: {} - } - -#line 1984 "Parser.rl" - - if (p != pe && *p != '\0') { - // didn't make it to the end of our input, but we didn't throw a ParseError? - assert(0); - ostringstream str; - str << "Parse error at index " << (p - ptr) << "."; - throw ParseError(str.str()); - } - - if (currentCls) { - assert(inCharClass); - assert(currentClsBegin); - ostringstream oss; - oss << "Unterminated character class starting at index " - << currentClsBegin - ptr << "."; - throw ParseError(oss.str()); - } - - if (inComment) { - throw ParseError("Unterminated comment."); - } - - if (!sequences.empty()) { - ostringstream str; - str << "Missing close parenthesis for group started at index " - << sequences.back().seqOffset << "."; - throw ParseError(str.str()); - } - - // Unlikely, but possible - if (groupIndex > 65535) { - throw ParseError("The maximum number of capturing subexpressions is 65535."); - } - - // Finalize the top-level sequence, which will take care of any - // top-level alternation. - currentSeq->finalize(); - assert(currentSeq == rootSeq.get()); - - // Ensure that all references are valid. - checkReferences(*rootSeq, groupIndex, groupNames); - - return move(rootSeq); - } catch (LocatedParseError &error) { - if (ts >= ptr && ts <= pe) { - error.locate(ts - ptr); - } else { - error.locate(0); - } - throw; - } -} - -} // namespace ue2 diff --git a/contrib/vectorscan-cmake/rageled_files/aarch64/Parser.cpp b/contrib/vectorscan-cmake/rageled_files/aarch64/Parser.cpp new file mode 100644 index 00000000000..fd58ead4128 --- /dev/null +++ b/contrib/vectorscan-cmake/rageled_files/aarch64/Parser.cpp @@ -0,0 +1,10725 @@ +#line 1 "Parser.rl" +/* +* Copyright (c) 2015-2017, Intel Corporation +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of Intel Corporation nor the names of its contributors +* may be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +/** \file +* \brief Parser code (generated with Ragel from Parser.rl). +*/ + +#include "config.h" + +/* Parser.cpp is a built source, may not be in same dir as parser files */ +#include "parser/check_refs.h" +#include "parser/control_verbs.h" +#include "parser/ComponentAlternation.h" +#include "parser/ComponentAssertion.h" +#include "parser/ComponentAtomicGroup.h" +#include "parser/ComponentBackReference.h" +#include "parser/ComponentBoundary.h" +#include "parser/ComponentByte.h" +#include "parser/ComponentClass.h" +#include "parser/ComponentCondReference.h" +#include "parser/ComponentEmpty.h" +#include "parser/ComponentEUS.h" +#include "parser/Component.h" +#include "parser/ComponentRepeat.h" +#include "parser/ComponentSequence.h" +#include "parser/ComponentWordBoundary.h" +#include "parser/parse_error.h" +#include "parser/Parser.h" +#include "ue2common.h" +#include "util/compare.h" +#include "util/flat_containers.h" +#include "util/unicode_def.h" +#include "util/verify_types.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +namespace ue2 { + +#define PUSH_SEQUENCE do {\ + sequences.push_back(ExprState(currentSeq, (size_t)(ts - ptr), \ + mode)); \ + } while(0) +#define POP_SEQUENCE do {\ + currentSeq = sequences.back().seq; \ + mode = sequences.back().mode; \ + sequences.pop_back(); \ + } while(0) + + namespace { + + /** \brief Structure representing current state as we're parsing (current + * sequence, current options). Stored in the 'sequences' vector. */ + struct ExprState { + ExprState(ComponentSequence *seq_in, size_t offset, + const ParseMode &mode_in) : + seq(seq_in), seqOffset(offset), mode(mode_in) {} + + ComponentSequence *seq; //!< current sequence + size_t seqOffset; //!< offset seq was entered, for error reporting + ParseMode mode; //!< current mode flags + }; + + } // namespace + + static + unsigned parseAsDecimal(unsigned oct) { + // The input was parsed as octal, but should have been parsed as decimal. + // Deconstruct the octal number and reconstruct into decimal + unsigned ret = 0; + unsigned multiplier = 1; + while (oct) { + ret += (oct & 0x7) * multiplier; + oct >>= 3; + multiplier *= 10; + } + return ret; + } + + /** \brief Maximum value for a positive integer. We use INT_MAX, as that's what + * PCRE uses. */ + static constexpr u32 MAX_NUMBER = INT_MAX; + + static + void pushDec(u32 *acc, char raw_digit) { + assert(raw_digit >= '0' && raw_digit <= '9'); + u32 digit_val = raw_digit - '0'; + + // Ensure that we don't overflow. + u64a val = ((u64a)*acc * 10) + digit_val; + if (val > MAX_NUMBER) { + throw LocatedParseError("Number is too big"); + } + + *acc = verify_u32(val); + } + + static + void pushOct(u32 *acc, char raw_digit) { + assert(raw_digit >= '0' && raw_digit <= '7'); + u32 digit_val = raw_digit - '0'; + + // Ensure that we don't overflow. + u64a val = ((u64a)*acc * 8) + digit_val; + if (val > MAX_NUMBER) { + throw LocatedParseError("Number is too big"); + } + + *acc = verify_u32(val); + } + + static + void throwInvalidRepeat(void) { + throw LocatedParseError("Invalid repeat"); + } + + static + void throwInvalidUtf8(void) { + throw ParseError("Expression is not valid UTF-8."); + } + + /** + * Adds the given child component to the parent sequence, returning a pointer + * to the new (child) "current sequence". + */ + static + ComponentSequence *enterSequence(ComponentSequence *parent, + unique_ptr child) { + assert(parent); + assert(child); + + ComponentSequence *seq = child.get(); + parent->addComponent(move(child)); + return seq; + } + + static + void addLiteral(ComponentSequence *currentSeq, char c, const ParseMode &mode) { + if (mode.utf8 && mode.caseless) { + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + assert(cc); + cc->add(c); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } else { + currentSeq->addComponent(getLiteralComponentClass(c, mode.caseless)); + } + } + + static + void addEscaped(ComponentSequence *currentSeq, unichar accum, + const ParseMode &mode, const char *err_msg) { + if (mode.utf8) { + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + assert(cc); + cc->add(accum); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } else { + if (accum > 255) { + throw LocatedParseError(err_msg); + } + addLiteral(currentSeq, (char)accum, mode); + } + } + + static + void addEscapedOctal(ComponentSequence *currentSeq, unichar accum, + const ParseMode &mode) { + addEscaped(currentSeq, accum, mode, "Octal value is greater than \\377"); + } + + static + void addEscapedHex(ComponentSequence *currentSeq, unichar accum, + const ParseMode &mode) { + addEscaped(currentSeq, accum, mode, + "Hexadecimal value is greater than \\xFF"); + } + +#define SLASH_C_ERROR "\\c must be followed by an ASCII character" + + static + u8 decodeCtrl(char raw) { + if (raw & 0x80) { + throw LocatedParseError(SLASH_C_ERROR); + } + return mytoupper(raw) ^ 0x40; + } + + static + unichar readUtf8CodePoint2c(const char *s) { + auto *ts = (const u8 *)s; + assert(ts[0] >= 0xc0 && ts[0] < 0xe0); + assert(ts[1] >= 0x80 && ts[1] < 0xc0); + unichar val = ts[0] & 0x1f; + val <<= 6; + val |= ts[1] & 0x3f; + DEBUG_PRINTF("utf8 %02hhx %02hhx ->\\x{%x}\n", ts[0], + ts[1], val); + return val; + } + + static + unichar readUtf8CodePoint3c(const char *s) { + auto *ts = (const u8 *)s; + assert(ts[0] >= 0xe0 && ts[0] < 0xf0); + assert(ts[1] >= 0x80 && ts[1] < 0xc0); + assert(ts[2] >= 0x80 && ts[2] < 0xc0); + unichar val = ts[0] & 0x0f; + val <<= 6; + val |= ts[1] & 0x3f; + val <<= 6; + val |= ts[2] & 0x3f; + DEBUG_PRINTF("utf8 %02hhx %02hhx %02hhx ->\\x{%x}\n", ts[0], + ts[1], ts[2], val); + return val; + } + + static + unichar readUtf8CodePoint4c(const char *s) { + auto *ts = (const u8 *)s; + assert(ts[0] >= 0xf0 && ts[0] < 0xf8); + assert(ts[1] >= 0x80 && ts[1] < 0xc0); + assert(ts[2] >= 0x80 && ts[2] < 0xc0); + assert(ts[3] >= 0x80 && ts[3] < 0xc0); + unichar val = ts[0] & 0x07; + val <<= 6; + val |= ts[1] & 0x3f; + val <<= 6; + val |= ts[2] & 0x3f; + val <<= 6; + val |= ts[3] & 0x3f; + DEBUG_PRINTF("utf8 %02hhx %02hhx %02hhx %02hhx ->\\x{%x}\n", ts[0], + ts[1], ts[2], ts[3], val); + return val; + } + + +#line 1909 "Parser.rl" + + + +#line 277 "Parser.cpp" +static const short _regex_actions[] = { + 0, 1, 0, 1, 1, 1, 2, 1, + 3, 1, 4, 1, 7, 1, 8, 1, + 9, 1, 10, 1, 11, 1, 12, 1, + 13, 1, 15, 1, 16, 1, 17, 1, + 18, 1, 19, 1, 20, 1, 21, 1, + 22, 1, 23, 1, 24, 1, 25, 1, + 26, 1, 27, 1, 28, 1, 29, 1, + 30, 1, 31, 1, 32, 1, 33, 1, + 34, 1, 35, 1, 36, 1, 37, 1, + 38, 1, 39, 1, 40, 1, 41, 1, + 42, 1, 43, 1, 44, 1, 45, 1, + 46, 1, 47, 1, 48, 1, 49, 1, + 50, 1, 51, 1, 52, 1, 53, 1, + 54, 1, 55, 1, 56, 1, 57, 1, + 58, 1, 59, 1, 60, 1, 61, 1, + 62, 1, 63, 1, 64, 1, 65, 1, + 66, 1, 67, 1, 68, 1, 69, 1, + 70, 1, 71, 1, 72, 1, 73, 1, + 74, 1, 75, 1, 76, 1, 77, 1, + 78, 1, 79, 1, 80, 1, 81, 1, + 82, 1, 83, 1, 84, 1, 85, 1, + 86, 1, 87, 1, 88, 1, 89, 1, + 90, 1, 91, 1, 92, 1, 93, 1, + 94, 1, 95, 1, 96, 1, 97, 1, + 98, 1, 99, 1, 100, 1, 101, 1, + 102, 1, 103, 1, 104, 1, 105, 1, + 106, 1, 107, 1, 108, 1, 109, 1, + 110, 1, 111, 1, 112, 1, 113, 1, + 114, 1, 115, 1, 116, 1, 117, 1, + 118, 1, 119, 1, 120, 1, 121, 1, + 122, 1, 123, 1, 124, 1, 125, 1, + 126, 1, 127, 1, 128, 1, 129, 1, + 130, 1, 131, 1, 132, 1, 133, 1, + 134, 1, 135, 1, 136, 1, 137, 1, + 138, 1, 139, 1, 140, 1, 141, 1, + 142, 1, 143, 1, 144, 1, 145, 1, + 146, 1, 147, 1, 148, 1, 149, 1, + 150, 1, 151, 1, 152, 1, 153, 1, + 154, 1, 155, 1, 156, 1, 157, 1, + 158, 1, 159, 1, 160, 1, 161, 1, + 162, 1, 163, 1, 164, 1, 165, 1, + 166, 1, 167, 1, 168, 1, 169, 1, + 170, 1, 171, 1, 172, 1, 173, 1, + 174, 1, 175, 1, 176, 1, 177, 1, + 178, 1, 179, 1, 180, 1, 181, 1, + 182, 1, 183, 1, 184, 1, 185, 1, + 186, 1, 187, 1, 188, 1, 189, 1, + 190, 1, 191, 1, 192, 1, 193, 1, + 194, 1, 195, 1, 196, 1, 197, 1, + 198, 1, 199, 1, 200, 1, 201, 1, + 202, 1, 203, 1, 204, 1, 205, 1, + 206, 1, 207, 1, 208, 1, 209, 1, + 210, 1, 211, 1, 212, 1, 213, 1, + 214, 1, 215, 1, 216, 1, 217, 1, + 218, 1, 219, 1, 220, 1, 221, 1, + 222, 1, 223, 1, 224, 1, 225, 1, + 226, 1, 227, 1, 228, 1, 229, 1, + 230, 1, 231, 1, 232, 1, 233, 1, + 234, 1, 235, 1, 236, 1, 237, 1, + 240, 1, 242, 1, 243, 1, 244, 1, + 245, 1, 246, 1, 247, 1, 248, 1, + 249, 1, 250, 1, 251, 1, 252, 1, + 253, 1, 254, 1, 255, 1, 256, 1, + 257, 1, 258, 1, 259, 1, 260, 1, + 261, 1, 262, 1, 263, 1, 264, 1, + 265, 1, 266, 1, 267, 1, 268, 1, + 269, 1, 270, 1, 271, 1, 272, 1, + 273, 1, 274, 1, 275, 1, 276, 1, + 277, 1, 278, 1, 279, 1, 280, 1, + 281, 1, 282, 1, 283, 1, 284, 1, + 285, 1, 286, 1, 287, 1, 288, 1, + 289, 1, 290, 1, 291, 1, 292, 1, + 293, 1, 294, 1, 295, 1, 296, 1, + 297, 1, 298, 1, 299, 1, 300, 1, + 301, 1, 302, 1, 303, 1, 307, 1, + 308, 1, 309, 1, 310, 1, 311, 1, + 312, 1, 313, 1, 314, 1, 315, 1, + 316, 1, 317, 1, 318, 1, 319, 1, + 320, 1, 321, 1, 322, 1, 323, 1, + 324, 1, 325, 1, 326, 1, 327, 1, + 328, 1, 329, 1, 330, 1, 331, 1, + 332, 1, 333, 1, 334, 1, 335, 1, + 336, 1, 337, 1, 338, 1, 342, 1, + 343, 1, 344, 1, 345, 1, 346, 1, + 347, 1, 348, 1, 349, 1, 350, 1, + 352, 1, 353, 1, 354, 1, 355, 1, + 356, 1, 357, 1, 358, 1, 359, 1, + 360, 1, 361, 1, 362, 1, 363, 1, + 364, 1, 365, 1, 366, 1, 367, 1, + 368, 1, 369, 1, 370, 1, 371, 1, + 372, 1, 373, 1, 374, 1, 375, 1, + 376, 1, 377, 1, 378, 1, 379, 1, + 380, 1, 381, 1, 382, 1, 383, 1, + 384, 1, 385, 1, 386, 1, 387, 1, + 388, 1, 389, 1, 390, 1, 391, 1, + 392, 1, 393, 1, 394, 1, 395, 1, + 396, 1, 397, 1, 398, 1, 399, 1, + 400, 1, 401, 1, 402, 1, 403, 1, + 404, 1, 405, 1, 406, 1, 407, 1, + 408, 1, 409, 1, 410, 1, 411, 1, + 412, 1, 413, 1, 414, 1, 415, 1, + 416, 1, 417, 1, 418, 1, 419, 1, + 420, 1, 421, 1, 422, 1, 423, 1, + 424, 1, 425, 1, 426, 1, 427, 1, + 428, 1, 429, 1, 430, 1, 431, 1, + 432, 1, 433, 1, 434, 1, 435, 1, + 436, 2, 3, 0, 2, 4, 5, 2, + 5, 1, 2, 9, 10, 2, 9, 238, + 2, 9, 239, 2, 9, 339, 2, 10, + 1, 2, 10, 340, 2, 10, 341, 2, + 11, 241, 2, 11, 351, 2, 12, 241, + 2, 12, 351, 2, 13, 241, 2, 13, + 351, 2, 14, 375, 2, 14, 376, 2, + 25, 0, 2, 25, 3, 2, 25, 6, + 2, 25, 14, 3, 25, 5, 306, 3, + 25, 10, 305, 3, 25, 14, 15, 4, + 25, 9, 304, 10, 0 + }; + + static const short _regex_key_offsets[] = { + 0, 0, 1, 23, 31, 39, 46, 54, + 55, 63, 71, 79, 86, 94, 97, 99, + 108, 115, 123, 131, 134, 140, 148, 151, + 158, 165, 173, 180, 184, 191, 194, 197, + 199, 202, 205, 207, 210, 213, 215, 216, + 218, 219, 227, 229, 232, 235, 236, 244, + 252, 260, 268, 275, 283, 290, 298, 305, + 313, 315, 318, 325, 329, 332, 335, 337, + 339, 341, 342, 344, 345, 347, 349, 350, + 351, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 369, + 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 392, 393, 394, + 395, 396, 397, 399, 400, 401, 402, 403, + 404, 405, 406, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 429, + 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 561, + 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 631, + 632, 633, 634, 635, 636, 637, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 650, + 651, 652, 653, 654, 655, 656, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, 681, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 704, 705, 706, 707, 708, + 709, 710, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 752, + 753, 754, 755, 756, 757, 758, 759, 760, + 761, 762, 763, 764, 765, 766, 767, 768, + 769, 770, 771, 773, 774, 775, 776, 777, + 778, 779, 780, 781, 782, 783, 784, 785, + 786, 787, 788, 789, 790, 791, 792, 793, + 794, 795, 796, 797, 798, 799, 800, 801, + 802, 803, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 820, + 822, 823, 824, 825, 826, 827, 828, 829, + 830, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, + 849, 850, 851, 853, 854, 855, 856, 857, + 858, 859, 860, 861, 862, 863, 864, 865, + 866, 867, 868, 869, 870, 871, 872, 873, + 874, 875, 876, 877, 880, 883, 885, 900, + 903, 906, 908, 922, 927, 932, 936, 940, + 943, 946, 950, 954, 957, 960, 964, 968, + 972, 975, 978, 982, 986, 990, 994, 997, + 1000, 1004, 1008, 1012, 1016, 1019, 1022, 1026, + 1030, 1034, 1038, 1041, 1044, 1048, 1052, 1056, + 1060, 1063, 1066, 1070, 1074, 1078, 1082, 1085, + 1088, 1093, 1097, 1101, 1105, 1108, 1111, 1115, + 1119, 1123, 1126, 1129, 1133, 1137, 1141, 1145, + 1148, 1151, 1155, 1159, 1163, 1167, 1170, 1173, + 1177, 1181, 1185, 1188, 1191, 1195, 1199, 1203, + 1207, 1211, 1214, 1217, 1222, 1227, 1231, 1235, + 1238, 1241, 1245, 1249, 1252, 1255, 1259, 1263, + 1267, 1270, 1273, 1277, 1281, 1285, 1289, 1292, + 1295, 1299, 1303, 1307, 1311, 1314, 1317, 1321, + 1325, 1329, 1333, 1336, 1339, 1343, 1347, 1351, + 1355, 1358, 1361, 1365, 1369, 1373, 1377, 1380, + 1383, 1388, 1392, 1396, 1400, 1403, 1406, 1410, + 1414, 1418, 1421, 1424, 1428, 1432, 1436, 1440, + 1443, 1446, 1450, 1454, 1458, 1462, 1465, 1468, + 1472, 1476, 1480, 1483, 1486, 1490, 1494, 1498, + 1502, 1506, 1509, 1512, 1515, 1518, 1520, 1522, + 1525, 1532, 1534, 1536, 1538, 1540, 1542, 1544, + 1546, 1548, 1550, 1577, 1579, 1586, 1593, 1607, + 1609, 1615, 1618, 1627, 1628, 1631, 1634, 1641, + 1643, 1645, 1647, 1650, 1695, 1697, 1699, 1703, + 1707, 1709, 1710, 1710, 1716, 1718, 1720, 1722, + 1724, 1727, 1728, 1729, 1736, 1742, 1748, 1750, + 1752, 1754, 1756, 1758, 1760, 1761, 1764, 1787, + 1790, 1795, 1804, 1806, 1807, 1809, 1814, 1817, + 1819, 1821, 1822, 1824, 1834, 1840, 1841, 1846, + 1850, 1858, 1860, 1869, 1873, 1874, 1875, 1879, + 1880, 1883, 1883, 1890, 1904, 1907, 1946, 1948, + 1950, 1952, 1954, 1955, 1955, 1956, 1957, 1964, + 1970, 1976, 1978, 1980, 1982, 1985, 1987, 1998, + 1999, 2001, 2003, 2005, 2016, 2017, 2019, 2021, + 2023, 2024, 0 + }; + + static const char _regex_trans_keys[] = { + 41u, 33u, 35u, 38u, 39u, 40u, 41u, 43u, + 45u, 58u, 60u, 61u, 62u, 63u, 67u, 80u, + 105u, 109u, 115u, 120u, 123u, 48u, 57u, 41u, + 95u, 48u, 57u, 65u, 90u, 97u, 122u, 39u, + 95u, 48u, 57u, 65u, 90u, 97u, 122u, 95u, + 48u, 57u, 65u, 90u, 97u, 122u, 39u, 95u, + 48u, 57u, 65u, 90u, 97u, 122u, 41u, 41u, + 95u, 48u, 57u, 65u, 90u, 97u, 122u, 41u, + 95u, 48u, 57u, 65u, 90u, 97u, 122u, 41u, + 95u, 48u, 57u, 65u, 90u, 97u, 122u, 95u, + 48u, 57u, 65u, 90u, 97u, 122u, 62u, 95u, + 48u, 57u, 65u, 90u, 97u, 122u, 33u, 60u, + 61u, 33u, 61u, 38u, 41u, 95u, 48u, 57u, + 65u, 90u, 97u, 122u, 95u, 48u, 57u, 65u, + 90u, 97u, 122u, 41u, 95u, 48u, 57u, 65u, + 90u, 97u, 122u, 41u, 95u, 48u, 57u, 65u, + 90u, 97u, 122u, 41u, 48u, 57u, 41u, 58u, + 105u, 109u, 115u, 120u, 62u, 95u, 48u, 57u, + 65u, 90u, 97u, 122u, 41u, 48u, 57u, 95u, + 48u, 57u, 65u, 90u, 97u, 122u, 95u, 48u, + 57u, 65u, 90u, 97u, 122u, 41u, 95u, 48u, + 57u, 65u, 90u, 97u, 122u, 95u, 48u, 57u, + 65u, 90u, 97u, 122u, 105u, 109u, 115u, 120u, + 41u, 45u, 58u, 105u, 109u, 115u, 120u, 46u, + 92u, 93u, 46u, 92u, 93u, 46u, 92u, 58u, + 92u, 93u, 58u, 92u, 93u, 58u, 92u, 61u, + 92u, 93u, 61u, 92u, 93u, 61u, 92u, 39u, + 48u, 57u, 62u, 45u, 95u, 48u, 57u, 65u, + 90u, 97u, 122u, 48u, 57u, 125u, 48u, 57u, + 125u, 48u, 57u, 125u, 95u, 125u, 48u, 57u, + 65u, 90u, 97u, 122u, 95u, 125u, 48u, 57u, + 65u, 90u, 97u, 122u, 95u, 125u, 48u, 57u, + 65u, 90u, 97u, 122u, 95u, 125u, 48u, 57u, + 65u, 90u, 97u, 122u, 95u, 48u, 57u, 65u, + 90u, 97u, 122u, 39u, 95u, 48u, 57u, 65u, + 90u, 97u, 122u, 95u, 48u, 57u, 65u, 90u, + 97u, 122u, 62u, 95u, 48u, 57u, 65u, 90u, + 97u, 122u, 95u, 48u, 57u, 65u, 90u, 97u, + 122u, 95u, 125u, 48u, 57u, 65u, 90u, 97u, + 122u, 48u, 55u, 125u, 48u, 55u, 125u, 48u, + 57u, 65u, 70u, 97u, 102u, 44u, 125u, 48u, + 57u, 125u, 48u, 57u, 125u, 48u, 57u, 128u, + 191u, 128u, 191u, 128u, 191u, 41u, 41u, 80u, + 41u, 41u, 70u, 41u, 56u, 41u, 121u, 97u, + 109u, 98u, 105u, 99u, 101u, 110u, 105u, 97u, + 110u, 101u, 115u, 116u, 97u, 110u, 108u, 109u, + 116u, 105u, 110u, 101u, 115u, 101u, 117u, 109u, + 97u, 107u, 110u, 103u, 97u, 108u, 105u, 112u, + 111u, 109u, 111u, 102u, 111u, 97u, 104u, 105u, + 109u, 105u, 108u, 108u, 101u, 103u, 104u, 105u, + 110u, 101u, 115u, 101u, 105u, 100u, 110u, 114u, + 97u, 100u, 105u, 97u, 110u, 95u, 65u, 98u, + 111u, 114u, 105u, 103u, 105u, 110u, 97u, 108u, + 105u, 97u, 110u, 97u, 101u, 109u, 114u, 111u, + 107u, 101u, 101u, 109u, 111u, 110u, 116u, 105u, + 99u, 110u, 101u, 105u, 102u, 111u, 114u, 109u, + 112u, 114u, 114u, 105u, 111u, 116u, 105u, 108u, + 108u, 105u, 99u, 115u, 118u, 101u, 114u, 101u, + 116u, 97u, 110u, 97u, 103u, 97u, 114u, 105u, + 121u, 112u, 116u, 105u, 97u, 110u, 95u, 72u, + 105u, 101u, 114u, 111u, 103u, 108u, 121u, 112u, + 104u, 115u, 104u, 105u, 111u, 112u, 105u, 99u, + 111u, 114u, 103u, 105u, 97u, 110u, 97u, 103u, + 111u, 108u, 105u, 116u, 105u, 99u, 116u, 104u, + 105u, 99u, 101u, 101u, 107u, 106u, 114u, 97u, + 114u, 97u, 116u, 105u, 109u, 117u, 107u, 104u, + 105u, 110u, 117u, 108u, 110u, 111u, 111u, 98u, + 114u, 101u, 119u, 114u, 97u, 103u, 97u, 110u, + 97u, 112u, 101u, 114u, 105u, 97u, 108u, 95u, + 65u, 114u, 97u, 109u, 97u, 105u, 99u, 104u, + 115u, 101u, 114u, 105u, 116u, 101u, 100u, 99u, + 114u, 105u, 112u, 116u, 105u, 111u, 110u, 97u, + 108u, 95u, 80u, 97u, 104u, 114u, 108u, 97u, + 118u, 105u, 116u, 104u, 105u, 97u, 110u, 118u, + 97u, 110u, 101u, 115u, 101u, 105u, 110u, 116u, + 121u, 116u, 104u, 105u, 110u, 97u, 100u, 97u, + 97u, 107u, 97u, 110u, 97u, 97u, 104u, 95u, + 76u, 105u, 97u, 109u, 114u, 111u, 115u, 104u, + 116u, 104u, 105u, 101u, 114u, 111u, 116u, 105u, + 110u, 112u, 99u, 104u, 97u, 109u, 110u, 115u, + 98u, 117u, 101u, 97u, 114u, 95u, 66u, 117u, + 99u, 100u, 105u, 97u, 110u, 105u, 97u, 110u, + 108u, 110u, 97u, 121u, 97u, 108u, 97u, 109u, + 100u, 97u, 105u, 99u, 116u, 101u, 105u, 95u, + 77u, 97u, 121u, 101u, 107u, 110u, 103u, 111u, + 108u, 105u, 97u, 110u, 97u, 110u, 109u, 97u, + 114u, 119u, 95u, 84u, 97u, 105u, 95u, 76u, + 117u, 101u, 111u, 104u, 97u, 109u, 95u, 100u, + 67u, 104u, 105u, 107u, 105u, 95u, 73u, 80u, + 83u, 84u, 116u, 97u, 108u, 105u, 99u, 101u, + 114u, 115u, 105u, 97u, 110u, 111u, 117u, 116u, + 104u, 95u, 65u, 114u, 97u, 98u, 105u, 97u, + 110u, 117u, 114u, 107u, 105u, 99u, 105u, 121u, + 97u, 109u, 97u, 110u, 121u, 97u, 97u, 111u, + 103u, 115u, 95u, 80u, 97u, 101u, 110u, 105u, + 99u, 105u, 97u, 110u, 106u, 97u, 110u, 103u, + 110u, 105u, 99u, 109u, 117u, 97u, 114u, 105u, + 116u, 97u, 110u, 114u, 97u, 115u, 104u, 116u, + 114u, 97u, 97u, 118u, 105u, 97u, 110u, 110u, + 104u, 97u, 108u, 97u, 110u, 100u, 97u, 110u, + 101u, 115u, 101u, 108u, 114u, 111u, 116u, 105u, + 95u, 78u, 97u, 103u, 114u, 105u, 105u, 97u, + 99u, 103u, 105u, 109u, 97u, 98u, 108u, 111u, + 103u, 97u, 110u, 119u, 97u, 95u, 76u, 84u, + 86u, 101u, 104u, 97u, 109u, 105u, 101u, 116u, + 105u, 108u, 108u, 117u, 103u, 117u, 97u, 97u, + 105u, 110u, 97u, 98u, 102u, 101u, 116u, 97u, + 110u, 105u, 110u, 97u, 103u, 104u, 97u, 114u, + 105u, 116u, 105u, 99u, 105u, 110u, 115u, 112u, + 100u, 123u, 94u, 125u, 94u, 46u, 92u, 93u, + 46u, 92u, 93u, 46u, 92u, 58u, 92u, 93u, + 94u, 97u, 98u, 99u, 100u, 103u, 108u, 112u, + 115u, 117u, 119u, 120u, 58u, 92u, 93u, 58u, + 92u, 93u, 58u, 92u, 58u, 92u, 93u, 97u, + 98u, 99u, 100u, 103u, 108u, 112u, 115u, 117u, + 119u, 120u, 58u, 92u, 93u, 108u, 115u, 58u, + 92u, 93u, 110u, 112u, 58u, 92u, 93u, 117u, + 58u, 92u, 93u, 109u, 58u, 92u, 93u, 58u, + 92u, 93u, 58u, 92u, 93u, 104u, 58u, 92u, + 93u, 97u, 58u, 92u, 93u, 58u, 92u, 93u, + 58u, 92u, 93u, 99u, 58u, 92u, 93u, 105u, + 58u, 92u, 93u, 105u, 58u, 92u, 93u, 58u, + 92u, 93u, 58u, 92u, 93u, 108u, 58u, 92u, + 93u, 97u, 58u, 92u, 93u, 110u, 58u, 92u, + 93u, 107u, 58u, 92u, 93u, 58u, 92u, 93u, + 58u, 92u, 93u, 110u, 58u, 92u, 93u, 116u, + 58u, 92u, 93u, 114u, 58u, 92u, 93u, 108u, + 58u, 92u, 93u, 58u, 92u, 93u, 58u, 92u, + 93u, 105u, 58u, 92u, 93u, 103u, 58u, 92u, + 93u, 105u, 58u, 92u, 93u, 116u, 58u, 92u, + 93u, 58u, 92u, 93u, 58u, 92u, 93u, 114u, + 58u, 92u, 93u, 97u, 58u, 92u, 93u, 112u, + 58u, 92u, 93u, 104u, 58u, 92u, 93u, 58u, + 92u, 93u, 58u, 92u, 93u, 111u, 58u, 92u, + 93u, 119u, 58u, 92u, 93u, 101u, 58u, 92u, + 93u, 114u, 58u, 92u, 93u, 58u, 92u, 93u, + 58u, 92u, 93u, 114u, 117u, 58u, 92u, 93u, + 105u, 58u, 92u, 93u, 110u, 58u, 92u, 93u, + 116u, 58u, 92u, 93u, 58u, 92u, 93u, 58u, + 92u, 93u, 110u, 58u, 92u, 93u, 99u, 58u, + 92u, 93u, 116u, 58u, 92u, 93u, 58u, 92u, + 93u, 58u, 92u, 93u, 112u, 58u, 92u, 93u, + 97u, 58u, 92u, 93u, 99u, 58u, 92u, 93u, + 101u, 58u, 92u, 93u, 58u, 92u, 93u, 58u, + 92u, 93u, 112u, 58u, 92u, 93u, 112u, 58u, + 92u, 93u, 101u, 58u, 92u, 93u, 114u, 58u, + 92u, 93u, 58u, 92u, 93u, 58u, 92u, 93u, + 111u, 58u, 92u, 93u, 114u, 58u, 92u, 93u, + 100u, 58u, 92u, 93u, 58u, 92u, 93u, 58u, + 92u, 93u, 100u, 58u, 92u, 93u, 105u, 58u, + 92u, 93u, 103u, 58u, 92u, 93u, 105u, 58u, + 92u, 93u, 116u, 58u, 92u, 93u, 58u, 92u, + 93u, 58u, 92u, 93u, 108u, 115u, 58u, 92u, + 93u, 110u, 112u, 58u, 92u, 93u, 117u, 58u, + 92u, 93u, 109u, 58u, 92u, 93u, 58u, 92u, + 93u, 58u, 92u, 93u, 104u, 58u, 92u, 93u, + 97u, 58u, 92u, 93u, 58u, 92u, 93u, 58u, + 92u, 93u, 99u, 58u, 92u, 93u, 105u, 58u, + 92u, 93u, 105u, 58u, 92u, 93u, 58u, 92u, + 93u, 58u, 92u, 93u, 108u, 58u, 92u, 93u, + 97u, 58u, 92u, 93u, 110u, 58u, 92u, 93u, + 107u, 58u, 92u, 93u, 58u, 92u, 93u, 58u, + 92u, 93u, 110u, 58u, 92u, 93u, 116u, 58u, + 92u, 93u, 114u, 58u, 92u, 93u, 108u, 58u, + 92u, 93u, 58u, 92u, 93u, 58u, 92u, 93u, + 105u, 58u, 92u, 93u, 103u, 58u, 92u, 93u, + 105u, 58u, 92u, 93u, 116u, 58u, 92u, 93u, + 58u, 92u, 93u, 58u, 92u, 93u, 114u, 58u, + 92u, 93u, 97u, 58u, 92u, 93u, 112u, 58u, + 92u, 93u, 104u, 58u, 92u, 93u, 58u, 92u, + 93u, 58u, 92u, 93u, 111u, 58u, 92u, 93u, + 119u, 58u, 92u, 93u, 101u, 58u, 92u, 93u, + 114u, 58u, 92u, 93u, 58u, 92u, 93u, 58u, + 92u, 93u, 114u, 117u, 58u, 92u, 93u, 105u, + 58u, 92u, 93u, 110u, 58u, 92u, 93u, 116u, + 58u, 92u, 93u, 58u, 92u, 93u, 58u, 92u, + 93u, 110u, 58u, 92u, 93u, 99u, 58u, 92u, + 93u, 116u, 58u, 92u, 93u, 58u, 92u, 93u, + 58u, 92u, 93u, 112u, 58u, 92u, 93u, 97u, + 58u, 92u, 93u, 99u, 58u, 92u, 93u, 101u, + 58u, 92u, 93u, 58u, 92u, 93u, 58u, 92u, + 93u, 112u, 58u, 92u, 93u, 112u, 58u, 92u, + 93u, 101u, 58u, 92u, 93u, 114u, 58u, 92u, + 93u, 58u, 92u, 93u, 58u, 92u, 93u, 111u, + 58u, 92u, 93u, 114u, 58u, 92u, 93u, 100u, + 58u, 92u, 93u, 58u, 92u, 93u, 58u, 92u, + 93u, 100u, 58u, 92u, 93u, 105u, 58u, 92u, + 93u, 103u, 58u, 92u, 93u, 105u, 58u, 92u, + 93u, 116u, 58u, 92u, 93u, 58u, 92u, 93u, + 61u, 92u, 93u, 61u, 92u, 93u, 61u, 92u, + 48u, 55u, 125u, 48u, 55u, 125u, 48u, 57u, + 65u, 70u, 97u, 102u, 128u, 191u, 128u, 191u, + 128u, 191u, 128u, 191u, 128u, 191u, 128u, 191u, + 128u, 191u, 128u, 191u, 128u, 191u, 0u, 32u, + 35u, 36u, 40u, 41u, 42u, 43u, 46u, 63u, + 91u, 92u, 94u, 123u, 124u, 9u, 13u, 128u, + 191u, 192u, 223u, 224u, 239u, 240u, 247u, 248u, + 255u, 42u, 63u, 95u, 48u, 57u, 65u, 90u, + 97u, 122u, 95u, 48u, 57u, 65u, 90u, 97u, + 122u, 39u, 48u, 60u, 63u, 82u, 95u, 49u, + 55u, 56u, 57u, 65u, 90u, 97u, 122u, 48u, + 57u, 105u, 109u, 115u, 120u, 48u, 57u, 41u, + 48u, 57u, 33u, 61u, 95u, 48u, 57u, 65u, + 90u, 97u, 122u, 123u, 41u, 48u, 57u, 60u, + 61u, 62u, 41u, 45u, 58u, 105u, 109u, 115u, + 120u, 43u, 63u, 43u, 63u, 43u, 63u, 46u, + 58u, 61u, 48u, 65u, 66u, 67u, 68u, 69u, + 71u, 72u, 75u, 76u, 78u, 80u, 81u, 82u, + 83u, 85u, 86u, 87u, 88u, 90u, 97u, 98u, + 99u, 100u, 101u, 102u, 103u, 104u, 107u, 108u, + 110u, 111u, 112u, 114u, 115u, 116u, 117u, 118u, + 119u, 120u, 122u, 49u, 55u, 56u, 57u, 48u, + 55u, 48u, 55u, 48u, 55u, 56u, 57u, 48u, + 55u, 56u, 57u, 48u, 57u, 123u, 39u, 45u, + 60u, 123u, 48u, 57u, 48u, 57u, 48u, 57u, + 48u, 57u, 48u, 57u, 39u, 60u, 123u, 123u, + 123u, 123u, 48u, 57u, 65u, 70u, 97u, 102u, + 48u, 57u, 65u, 70u, 97u, 102u, 48u, 57u, + 65u, 70u, 97u, 102u, 48u, 57u, 43u, 63u, + 128u, 191u, 128u, 191u, 128u, 191u, 41u, 85u, + 41u, 41u, 67u, 84u, 65u, 66u, 67u, 68u, + 69u, 71u, 72u, 73u, 74u, 75u, 76u, 77u, + 78u, 79u, 80u, 82u, 83u, 84u, 85u, 86u, + 88u, 89u, 90u, 110u, 114u, 118u, 97u, 101u, + 111u, 114u, 117u, 97u, 99u, 102u, 104u, 110u, + 111u, 115u, 117u, 121u, 109u, 112u, 101u, 103u, + 116u, 101u, 108u, 111u, 114u, 117u, 97u, 101u, + 105u, 103u, 117u, 109u, 110u, 97u, 97u, 104u, + 38u, 97u, 101u, 105u, 108u, 109u, 111u, 116u, + 117u, 121u, 97u, 99u, 101u, 110u, 111u, 121u, + 101u, 100u, 101u, 107u, 108u, 111u, 103u, 108u, + 114u, 115u, 99u, 100u, 101u, 102u, 104u, 105u, + 111u, 115u, 101u, 117u, 97u, 99u, 104u, 105u, + 107u, 109u, 111u, 117u, 121u, 97u, 101u, 104u, + 105u, 103u, 97u, 97u, 112u, 115u, 119u, 105u, + 108u, 112u, 115u, 67u, 76u, 77u, 78u, 80u, + 83u, 90u, 45u, 91u, 92u, 93u, 128u, 191u, + 192u, 223u, 224u, 239u, 240u, 247u, 248u, 255u, + 46u, 58u, 61u, 48u, 68u, 69u, 72u, 76u, + 78u, 80u, 81u, 83u, 85u, 86u, 87u, 97u, + 98u, 99u, 100u, 101u, 102u, 103u, 104u, 108u, + 110u, 111u, 112u, 114u, 115u, 116u, 117u, 118u, + 119u, 120u, 49u, 55u, 56u, 57u, 65u, 90u, + 105u, 122u, 48u, 55u, 48u, 55u, 48u, 55u, + 48u, 55u, 123u, 123u, 123u, 123u, 48u, 57u, + 65u, 70u, 97u, 102u, 48u, 57u, 65u, 70u, + 97u, 102u, 48u, 57u, 65u, 70u, 97u, 102u, + 128u, 191u, 128u, 191u, 128u, 191u, 92u, 93u, + 94u, 69u, 81u, 92u, 128u, 191u, 192u, 223u, + 224u, 239u, 240u, 247u, 248u, 255u, 69u, 128u, + 191u, 128u, 191u, 128u, 191u, 92u, 128u, 191u, + 192u, 223u, 224u, 239u, 240u, 247u, 248u, 255u, + 69u, 128u, 191u, 128u, 191u, 128u, 191u, 41u, + 10u, 0u + }; + + static const signed char _regex_single_lengths[] = { + 0, 1, 20, 2, 2, 1, 2, 1, + 2, 2, 2, 1, 2, 3, 2, 3, + 1, 2, 2, 1, 6, 2, 1, 1, + 1, 2, 1, 4, 7, 3, 3, 2, + 3, 3, 2, 3, 3, 2, 1, 0, + 1, 2, 0, 1, 1, 1, 2, 2, + 2, 2, 1, 2, 1, 2, 1, 2, + 0, 1, 1, 2, 1, 1, 0, 0, + 0, 1, 2, 1, 2, 2, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 4, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 2, + 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 3, 2, 15, 3, + 3, 2, 14, 5, 5, 4, 4, 3, + 3, 4, 4, 3, 3, 4, 4, 4, + 3, 3, 4, 4, 4, 4, 3, 3, + 4, 4, 4, 4, 3, 3, 4, 4, + 4, 4, 3, 3, 4, 4, 4, 4, + 3, 3, 4, 4, 4, 4, 3, 3, + 5, 4, 4, 4, 3, 3, 4, 4, + 4, 3, 3, 4, 4, 4, 4, 3, + 3, 4, 4, 4, 4, 3, 3, 4, + 4, 4, 3, 3, 4, 4, 4, 4, + 4, 3, 3, 5, 5, 4, 4, 3, + 3, 4, 4, 3, 3, 4, 4, 4, + 3, 3, 4, 4, 4, 4, 3, 3, + 4, 4, 4, 4, 3, 3, 4, 4, + 4, 4, 3, 3, 4, 4, 4, 4, + 3, 3, 4, 4, 4, 4, 3, 3, + 5, 4, 4, 4, 3, 3, 4, 4, + 4, 3, 3, 4, 4, 4, 4, 3, + 3, 4, 4, 4, 4, 3, 3, 4, + 4, 4, 3, 3, 4, 4, 4, 4, + 4, 3, 3, 3, 3, 2, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15, 2, 1, 1, 6, 0, + 4, 1, 3, 1, 1, 3, 7, 2, + 2, 2, 3, 41, 0, 0, 0, 0, + 0, 1, 0, 4, 0, 0, 0, 0, + 3, 1, 1, 1, 0, 0, 0, 2, + 0, 0, 0, 2, 1, 3, 23, 3, + 5, 9, 2, 1, 2, 5, 3, 2, + 2, 1, 2, 10, 6, 1, 5, 4, + 8, 2, 9, 4, 1, 1, 4, 1, + 3, 0, 7, 4, 3, 31, 0, 0, + 0, 0, 1, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 3, 2, 1, 1, + 0, 0, 0, 1, 1, 0, 0, 0, + 1, 1, 0 + }; + + static const signed char _regex_range_lengths[] = { + 0, 0, 1, 3, 3, 3, 3, 0, + 3, 3, 3, 3, 3, 0, 0, 3, + 3, 3, 3, 1, 0, 3, 1, 3, + 3, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 3, 1, 1, 1, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 1, 1, 3, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 6, 0, 3, 3, 4, 1, + 1, 1, 3, 0, 1, 0, 0, 0, + 0, 0, 0, 2, 1, 1, 2, 2, + 1, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 3, 3, 3, 1, 0, + 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 4, 1, 1, + 1, 1, 0, 0, 0, 0, 3, 3, + 3, 1, 1, 1, 0, 0, 5, 0, + 1, 1, 1, 5, 0, 1, 1, 1, + 0, 0, 0 + }; + + static const short _regex_index_offsets[] = { + 0, 0, 2, 24, 30, 36, 41, 47, + 49, 55, 61, 67, 72, 78, 82, 85, + 92, 97, 103, 109, 112, 119, 125, 128, + 133, 138, 144, 149, 154, 162, 166, 170, + 173, 177, 181, 184, 188, 192, 195, 197, + 199, 201, 207, 209, 212, 215, 217, 223, + 229, 235, 241, 246, 252, 257, 263, 268, + 274, 276, 279, 284, 288, 291, 294, 296, + 298, 300, 302, 305, 307, 310, 313, 315, + 317, 320, 322, 324, 326, 328, 330, 332, + 334, 336, 338, 340, 342, 344, 346, 350, + 352, 354, 356, 358, 360, 362, 364, 366, + 368, 370, 372, 374, 376, 378, 380, 382, + 384, 386, 388, 390, 392, 395, 397, 399, + 401, 403, 405, 408, 410, 412, 414, 416, + 418, 420, 422, 425, 427, 429, 431, 433, + 435, 437, 439, 441, 443, 445, 447, 449, + 451, 453, 455, 457, 459, 461, 463, 466, + 468, 470, 472, 474, 476, 478, 480, 482, + 484, 486, 488, 490, 492, 494, 496, 498, + 500, 502, 504, 507, 509, 511, 513, 515, + 517, 519, 521, 523, 525, 528, 530, 532, + 534, 536, 538, 540, 542, 544, 546, 548, + 550, 552, 554, 556, 558, 560, 562, 564, + 566, 568, 570, 572, 574, 576, 578, 580, + 582, 584, 586, 588, 590, 592, 594, 596, + 598, 600, 602, 604, 606, 608, 610, 612, + 614, 616, 618, 620, 622, 624, 626, 628, + 630, 632, 634, 636, 638, 640, 643, 645, + 647, 649, 651, 653, 655, 657, 659, 661, + 663, 665, 667, 669, 671, 673, 675, 677, + 679, 681, 683, 685, 687, 689, 691, 693, + 695, 697, 699, 701, 703, 705, 707, 709, + 711, 713, 715, 717, 719, 721, 723, 726, + 728, 730, 732, 734, 736, 738, 740, 742, + 744, 746, 748, 750, 752, 754, 756, 758, + 760, 762, 764, 767, 769, 771, 773, 775, + 777, 779, 781, 783, 785, 787, 789, 791, + 793, 795, 797, 802, 804, 806, 808, 810, + 812, 814, 816, 818, 820, 822, 824, 826, + 828, 830, 832, 834, 836, 839, 841, 843, + 845, 847, 849, 851, 853, 855, 857, 860, + 862, 864, 866, 868, 870, 872, 876, 878, + 880, 882, 884, 886, 888, 890, 892, 895, + 897, 899, 901, 903, 905, 907, 910, 912, + 914, 916, 918, 920, 922, 924, 926, 928, + 930, 932, 934, 936, 938, 940, 942, 944, + 946, 948, 950, 952, 954, 956, 958, 960, + 962, 964, 966, 968, 970, 972, 974, 976, + 978, 980, 982, 984, 986, 988, 990, 992, + 994, 996, 998, 1001, 1003, 1005, 1007, 1009, + 1011, 1013, 1018, 1020, 1022, 1024, 1026, 1028, + 1030, 1032, 1034, 1036, 1038, 1040, 1042, 1044, + 1046, 1048, 1050, 1052, 1054, 1056, 1058, 1060, + 1062, 1064, 1066, 1068, 1070, 1072, 1074, 1076, + 1078, 1080, 1082, 1084, 1086, 1088, 1090, 1093, + 1095, 1097, 1099, 1101, 1103, 1105, 1107, 1109, + 1111, 1113, 1115, 1117, 1119, 1121, 1123, 1125, + 1127, 1129, 1131, 1134, 1136, 1138, 1140, 1142, + 1144, 1146, 1148, 1150, 1152, 1154, 1156, 1158, + 1160, 1162, 1164, 1166, 1168, 1170, 1172, 1174, + 1176, 1178, 1180, 1182, 1184, 1186, 1188, 1190, + 1192, 1194, 1197, 1199, 1201, 1203, 1205, 1207, + 1209, 1211, 1213, 1215, 1217, 1219, 1221, 1225, + 1228, 1230, 1232, 1234, 1236, 1238, 1240, 1242, + 1244, 1248, 1250, 1252, 1254, 1256, 1258, 1260, + 1262, 1264, 1266, 1268, 1270, 1272, 1274, 1276, + 1279, 1281, 1283, 1286, 1288, 1290, 1292, 1294, + 1296, 1298, 1300, 1302, 1304, 1306, 1308, 1310, + 1312, 1314, 1316, 1318, 1320, 1322, 1324, 1326, + 1328, 1330, 1332, 1334, 1338, 1342, 1345, 1361, + 1365, 1369, 1372, 1387, 1393, 1399, 1404, 1409, + 1413, 1417, 1422, 1427, 1431, 1435, 1440, 1445, + 1450, 1454, 1458, 1463, 1468, 1473, 1478, 1482, + 1486, 1491, 1496, 1501, 1506, 1510, 1514, 1519, + 1524, 1529, 1534, 1538, 1542, 1547, 1552, 1557, + 1562, 1566, 1570, 1575, 1580, 1585, 1590, 1594, + 1598, 1604, 1609, 1614, 1619, 1623, 1627, 1632, + 1637, 1642, 1646, 1650, 1655, 1660, 1665, 1670, + 1674, 1678, 1683, 1688, 1693, 1698, 1702, 1706, + 1711, 1716, 1721, 1725, 1729, 1734, 1739, 1744, + 1749, 1754, 1758, 1762, 1768, 1774, 1779, 1784, + 1788, 1792, 1797, 1802, 1806, 1810, 1815, 1820, + 1825, 1829, 1833, 1838, 1843, 1848, 1853, 1857, + 1861, 1866, 1871, 1876, 1881, 1885, 1889, 1894, + 1899, 1904, 1909, 1913, 1917, 1922, 1927, 1932, + 1937, 1941, 1945, 1950, 1955, 1960, 1965, 1969, + 1973, 1979, 1984, 1989, 1994, 1998, 2002, 2007, + 2012, 2017, 2021, 2025, 2030, 2035, 2040, 2045, + 2049, 2053, 2058, 2063, 2068, 2073, 2077, 2081, + 2086, 2091, 2096, 2100, 2104, 2109, 2114, 2119, + 2124, 2129, 2133, 2137, 2141, 2145, 2148, 2150, + 2153, 2158, 2160, 2162, 2164, 2166, 2168, 2170, + 2172, 2174, 2176, 2198, 2201, 2206, 2211, 2222, + 2224, 2230, 2233, 2240, 2242, 2245, 2249, 2257, + 2260, 2263, 2266, 2270, 2314, 2316, 2318, 2321, + 2324, 2326, 2328, 2329, 2335, 2337, 2339, 2341, + 2343, 2347, 2349, 2351, 2356, 2360, 2364, 2366, + 2369, 2371, 2373, 2375, 2378, 2380, 2384, 2408, + 2412, 2418, 2428, 2431, 2433, 2436, 2442, 2446, + 2449, 2452, 2454, 2457, 2468, 2475, 2477, 2483, + 2488, 2497, 2500, 2510, 2515, 2517, 2519, 2524, + 2526, 2530, 2531, 2539, 2549, 2553, 2589, 2591, + 2593, 2595, 2597, 2599, 2600, 2602, 2604, 2609, + 2613, 2617, 2619, 2621, 2623, 2627, 2630, 2637, + 2639, 2641, 2643, 2645, 2652, 2654, 2656, 2658, + 2660, 2662, 0 + }; + + static const signed char _regex_trans_cond_spaces[] = { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, -1, + 0, -1, 0, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, -1, + 0, -1, 0, -1, 0, -1, 0, -1, + 0, -1, 0, -1, 0, -1, 0, -1, + -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 0, 0, 0, 0, 0, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 0, -1, 0, -1, 0, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 0, + 0, 0, 0, 0, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, 0, -1, 0, -1, 0, -1, -1, + 2, 2, -1, -1, -1, -1, -1, 0, + 0, 0, 0, 0, -1, -1, -1, 0, + -1, 0, -1, 0, -1, -1, 0, 0, + 0, 0, 0, -1, -1, -1, 0, -1, + 0, -1, 0, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 0 + }; + + static const short _regex_trans_offsets[] = { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 296, + 297, 299, 300, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, 681, 682, + 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, + 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, + 795, 796, 797, 798, 799, 800, 801, 802, + 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, + 819, 820, 821, 822, 823, 824, 825, 826, + 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, + 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, + 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 877, 878, 879, 880, 881, 882, + 883, 884, 885, 886, 887, 888, 889, 890, + 891, 892, 893, 894, 895, 896, 897, 898, + 899, 900, 901, 902, 903, 904, 905, 906, + 907, 908, 909, 910, 911, 912, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 930, + 931, 932, 933, 934, 935, 936, 937, 938, + 939, 940, 941, 942, 943, 944, 945, 946, + 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 965, 966, 967, 968, 969, 970, + 971, 972, 973, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 984, 985, 986, + 987, 988, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, + 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, + 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, + 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, + 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, + 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, + 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, + 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, + 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, + 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, + 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, + 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, + 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, + 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, + 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, + 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, + 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, + 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, + 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, + 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, + 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, + 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, + 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, + 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, + 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, + 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, + 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, + 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, + 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, + 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, + 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, + 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, + 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, + 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, + 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, + 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, + 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, + 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, + 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, + 1339, 1340, 1341, 1342, 1343, 1344, 1345, 1346, + 1347, 1348, 1349, 1350, 1351, 1352, 1353, 1354, + 1355, 1356, 1357, 1358, 1359, 1360, 1361, 1362, + 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, + 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, + 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, + 1387, 1388, 1389, 1390, 1391, 1392, 1393, 1394, + 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, + 1403, 1404, 1405, 1406, 1407, 1408, 1409, 1410, + 1411, 1412, 1413, 1414, 1415, 1416, 1417, 1418, + 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, + 1427, 1428, 1429, 1430, 1431, 1432, 1433, 1434, + 1435, 1436, 1437, 1438, 1439, 1440, 1441, 1442, + 1443, 1444, 1445, 1446, 1447, 1448, 1449, 1450, + 1451, 1452, 1453, 1454, 1455, 1456, 1457, 1458, + 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, + 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, + 1475, 1476, 1477, 1478, 1479, 1480, 1481, 1482, + 1483, 1484, 1485, 1486, 1487, 1488, 1489, 1490, + 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, + 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, + 1507, 1508, 1509, 1510, 1511, 1512, 1513, 1514, + 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, + 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, + 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, + 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, + 1547, 1548, 1549, 1550, 1551, 1552, 1553, 1554, + 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, + 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, + 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, + 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, + 1595, 1596, 1597, 1598, 1599, 1600, 1601, 1602, + 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, + 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, + 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, + 1627, 1628, 1629, 1630, 1631, 1632, 1633, 1634, + 1635, 1636, 1637, 1638, 1639, 1640, 1641, 1642, + 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, + 1651, 1652, 1653, 1654, 1655, 1656, 1657, 1658, + 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, + 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, + 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, + 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, + 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, + 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, + 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, + 1715, 1716, 1717, 1718, 1719, 1720, 1721, 1722, + 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, + 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, + 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, + 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, + 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, + 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, + 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, + 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, + 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, + 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, + 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, + 1811, 1812, 1813, 1814, 1815, 1816, 1817, 1818, + 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, + 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, + 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, + 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, + 1851, 1852, 1853, 1854, 1855, 1856, 1857, 1858, + 1859, 1860, 1861, 1862, 1863, 1864, 1865, 1866, + 1867, 1868, 1869, 1870, 1871, 1872, 1873, 1874, + 1875, 1876, 1877, 1878, 1879, 1880, 1881, 1882, + 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1890, + 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1898, + 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, + 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, + 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, + 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, + 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, + 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, + 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, + 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, + 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, + 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, + 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, + 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, + 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, + 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, + 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, + 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050, + 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, + 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, + 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, + 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, + 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, + 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, + 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, + 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, + 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, + 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, + 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, + 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, + 2147, 2148, 2149, 2150, 2151, 2152, 2153, 2154, + 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2163, + 2164, 2166, 2167, 2169, 2170, 2172, 2173, 2175, + 2176, 2178, 2179, 2181, 2182, 2184, 2185, 2187, + 2188, 2189, 2190, 2192, 2193, 2194, 2195, 2196, + 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, + 2205, 2207, 2209, 2211, 2213, 2215, 2216, 2217, + 2218, 2219, 2220, 2221, 2222, 2223, 2224, 2225, + 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, + 2234, 2235, 2236, 2237, 2238, 2239, 2240, 2241, + 2242, 2243, 2244, 2245, 2246, 2247, 2248, 2249, + 2250, 2251, 2252, 2253, 2254, 2255, 2256, 2257, + 2258, 2259, 2260, 2261, 2262, 2263, 2264, 2265, + 2266, 2267, 2268, 2269, 2270, 2271, 2272, 2273, + 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, + 2282, 2283, 2284, 2285, 2286, 2287, 2288, 2289, + 2290, 2291, 2292, 2293, 2294, 2295, 2296, 2297, + 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, + 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, + 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2321, + 2322, 2323, 2324, 2325, 2326, 2327, 2328, 2329, + 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, + 2338, 2339, 2340, 2341, 2342, 2343, 2344, 2345, + 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, + 2354, 2355, 2356, 2357, 2358, 2359, 2360, 2361, + 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369, + 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, + 2378, 2379, 2380, 2381, 2382, 2383, 2384, 2385, + 2386, 2387, 2389, 2390, 2392, 2393, 2395, 2396, + 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, + 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, + 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, + 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, + 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, + 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, + 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, + 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, + 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, + 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, + 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, + 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, + 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500, + 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, + 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, + 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, + 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, + 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, + 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, + 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, + 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, + 2566, 2568, 2570, 2572, 2574, 2575, 2576, 2577, + 2578, 2579, 2580, 2581, 2582, 2583, 2584, 2585, + 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, + 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, + 2602, 2603, 2604, 2605, 2606, 2607, 2608, 2609, + 2610, 2611, 2612, 2613, 2614, 2615, 2616, 2617, + 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, + 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, + 2634, 2635, 2636, 2637, 2638, 2639, 2640, 2641, + 2642, 2643, 2645, 2646, 2648, 2649, 2651, 2652, + 2653, 2655, 2657, 2658, 2659, 2660, 2661, 2662, + 2664, 2666, 2668, 2670, 2672, 2673, 2674, 2675, + 2677, 2678, 2680, 2681, 2683, 2684, 2685, 2687, + 2689, 2691, 2693, 2695, 2696, 2697, 2698, 2700, + 2701, 2703, 2704, 2706, 2707, 2708, 2709, 2710, + 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, + 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, + 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, + 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, + 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, + 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, + 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, + 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, + 2775, 2776, 2777, 2778, 2779, 2780, 2781, 2782, + 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, + 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, + 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, + 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, + 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, + 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, + 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, + 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, + 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, + 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, + 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, + 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, + 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, + 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, + 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, + 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, + 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, + 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, + 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, + 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, + 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, + 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, + 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, + 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, + 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, + 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, + 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, + 2999, 3000, 3001, 3002, 3003, 3004, 3005, 3006, + 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, + 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, + 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, + 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, + 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, + 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, + 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, + 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, + 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, + 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, + 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, + 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, + 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, + 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, + 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, + 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, + 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, + 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, + 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, + 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, + 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, + 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, + 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, + 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, + 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3206, + 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, + 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, + 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, + 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, + 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, + 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3254, + 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, + 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, + 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, + 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, + 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, + 3295, 3296, 3297, 3298, 3299, 3300, 3301, 3302, + 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, + 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, + 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, + 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, + 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, + 3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, + 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, + 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, + 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, + 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, + 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, + 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, + 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, + 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, + 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, + 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, + 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, + 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, + 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454, + 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, + 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, + 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, + 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, + 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, + 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, + 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, + 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, + 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, + 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3534, + 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, + 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, + 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, + 3559, 3560, 0 + }; + + static const signed char _regex_trans_lengths[] = { + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 2, 1, 2, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 1, 1, 1, 2, + 1, 2, 1, 2, 1, 1, 2, 2, + 2, 2, 2, 1, 1, 1, 2, 1, + 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0 + }; + + static const signed char _regex_cond_keys[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 + }; + + static const short _regex_cond_targs[] = { + 746, 746, 746, 746, 748, 749, 750, 746, + 751, 752, 746, 754, 746, 746, 755, 756, + 757, 758, 758, 758, 758, 746, 753, 746, + 746, 3, 3, 3, 3, 746, 746, 4, + 4, 4, 4, 746, 6, 6, 6, 6, + 746, 7, 6, 6, 6, 6, 746, 746, + 746, 746, 8, 8, 8, 8, 746, 746, + 8, 9, 8, 8, 746, 746, 8, 9, + 8, 8, 746, 12, 12, 12, 12, 746, + 7, 12, 12, 12, 12, 746, 746, 14, + 746, 746, 746, 746, 746, 16, 746, 8, + 18, 8, 8, 746, 17, 17, 17, 17, + 746, 746, 17, 17, 17, 17, 746, 746, + 8, 18, 8, 8, 746, 746, 19, 746, + 746, 746, 20, 20, 20, 20, 746, 746, + 21, 21, 21, 21, 746, 746, 22, 746, + 21, 21, 21, 21, 746, 25, 25, 25, + 25, 746, 746, 25, 25, 25, 25, 746, + 3, 3, 3, 3, 746, 20, 20, 20, + 20, 746, 746, 27, 746, 28, 28, 28, + 28, 746, 30, 31, 746, 29, 30, 31, + 746, 29, 30, 31, 29, 33, 34, 746, + 32, 33, 34, 746, 32, 33, 34, 32, + 36, 37, 746, 35, 36, 37, 746, 35, + 36, 37, 35, 746, 38, 772, 746, 746, + 40, 42, 49, 46, 49, 49, 746, 43, + 746, 746, 44, 746, 746, 45, 746, 746, + 746, 49, 746, 47, 49, 49, 746, 49, + 746, 48, 49, 49, 746, 49, 746, 49, + 49, 49, 746, 49, 746, 49, 49, 49, + 746, 51, 51, 51, 51, 746, 746, 51, + 51, 51, 51, 746, 53, 53, 53, 53, + 746, 746, 53, 53, 53, 53, 746, 55, + 55, 55, 55, 746, 55, 746, 55, 55, + 55, 746, 57, 746, 746, 57, 746, 746, + 58, 58, 58, 746, 60, 783, 59, 746, + 783, 61, 746, 783, 61, 746, 746, 746, + 746, 746, 64, 746, 746, 746, 746, 787, + 65, 787, 67, 65, 787, 65, 787, 69, + 65, 787, 70, 65, 787, 65, 790, 790, + 73, 76, 790, 74, 790, 75, 790, 790, + 790, 77, 790, 78, 790, 79, 790, 80, + 790, 790, 790, 82, 790, 83, 790, 84, + 790, 85, 790, 790, 790, 87, 92, 94, + 790, 88, 790, 89, 790, 90, 790, 91, + 790, 790, 790, 93, 790, 790, 790, 95, + 790, 790, 790, 97, 790, 98, 790, 99, + 790, 100, 790, 790, 790, 102, 790, 103, + 790, 104, 790, 105, 790, 106, 790, 790, + 790, 108, 790, 109, 111, 790, 110, 790, + 790, 790, 112, 790, 113, 790, 790, 790, + 115, 120, 790, 116, 790, 117, 790, 118, + 790, 119, 790, 790, 790, 121, 790, 790, + 790, 123, 139, 790, 124, 790, 125, 790, + 126, 790, 127, 790, 128, 790, 129, 790, + 130, 790, 131, 790, 132, 790, 133, 790, + 134, 790, 135, 790, 136, 790, 137, 790, + 138, 790, 790, 790, 140, 790, 141, 790, + 790, 790, 143, 144, 790, 790, 790, 145, + 790, 146, 790, 147, 790, 148, 790, 790, + 790, 150, 790, 151, 790, 790, 790, 153, + 790, 154, 790, 790, 790, 156, 790, 157, + 790, 158, 790, 159, 790, 160, 790, 161, + 790, 790, 790, 163, 167, 790, 164, 790, + 165, 790, 166, 790, 790, 790, 168, 790, + 169, 790, 170, 790, 171, 790, 790, 790, + 173, 177, 790, 174, 790, 175, 790, 176, + 790, 790, 790, 178, 790, 179, 790, 180, + 790, 181, 790, 182, 790, 183, 790, 790, + 790, 185, 790, 186, 790, 187, 790, 188, + 790, 189, 790, 190, 790, 191, 790, 192, + 790, 193, 790, 194, 790, 195, 790, 196, + 790, 197, 790, 198, 790, 199, 790, 200, + 790, 201, 790, 790, 790, 203, 790, 204, + 790, 205, 790, 206, 790, 207, 790, 790, + 790, 209, 790, 210, 790, 211, 790, 212, + 790, 213, 790, 790, 790, 215, 790, 216, + 790, 217, 790, 218, 790, 219, 790, 220, + 790, 221, 790, 790, 790, 223, 790, 224, + 790, 225, 790, 790, 790, 227, 790, 228, + 790, 790, 790, 230, 235, 790, 231, 790, + 232, 790, 233, 790, 234, 790, 790, 790, + 236, 790, 237, 790, 238, 790, 239, 790, + 790, 790, 799, 790, 242, 790, 790, 790, + 244, 790, 245, 790, 790, 790, 247, 790, + 248, 790, 249, 790, 790, 790, 251, 790, + 252, 790, 253, 790, 254, 790, 255, 790, + 790, 790, 257, 790, 258, 790, 259, 790, + 260, 790, 261, 790, 262, 790, 263, 790, + 264, 790, 265, 790, 266, 790, 267, 790, + 268, 790, 269, 790, 790, 790, 271, 277, + 790, 272, 790, 273, 790, 274, 790, 275, + 790, 276, 790, 790, 790, 278, 790, 279, + 790, 280, 790, 281, 790, 282, 790, 283, + 790, 284, 790, 285, 790, 286, 790, 287, + 790, 288, 790, 289, 790, 290, 790, 291, + 295, 790, 292, 790, 293, 790, 294, 790, + 790, 790, 296, 790, 297, 790, 298, 790, + 299, 790, 790, 790, 301, 790, 302, 790, + 303, 790, 304, 790, 305, 790, 790, 790, + 307, 310, 314, 319, 790, 308, 790, 309, + 790, 790, 790, 311, 790, 312, 790, 313, + 790, 790, 790, 315, 790, 316, 790, 317, + 790, 318, 790, 790, 790, 320, 790, 321, + 790, 322, 790, 323, 790, 790, 790, 325, + 332, 790, 326, 790, 327, 790, 328, 790, + 329, 790, 330, 790, 331, 790, 790, 790, + 333, 790, 790, 790, 790, 335, 790, 336, + 790, 790, 790, 338, 790, 339, 790, 340, + 790, 790, 790, 342, 344, 349, 790, 343, + 790, 790, 790, 345, 790, 346, 790, 347, + 790, 348, 790, 790, 790, 790, 790, 351, + 354, 790, 352, 790, 353, 790, 790, 790, + 355, 790, 356, 790, 790, 790, 358, 364, + 790, 359, 790, 360, 790, 361, 790, 362, + 790, 363, 790, 790, 790, 365, 790, 366, + 790, 367, 790, 790, 790, 369, 790, 370, + 790, 371, 790, 372, 790, 373, 790, 374, + 790, 375, 790, 376, 790, 790, 790, 378, + 790, 379, 790, 380, 790, 381, 790, 382, + 790, 383, 790, 790, 790, 385, 790, 386, + 790, 387, 790, 388, 790, 790, 790, 390, + 790, 391, 790, 392, 790, 393, 790, 394, + 790, 395, 790, 396, 790, 397, 790, 790, + 790, 790, 790, 400, 790, 401, 790, 790, + 790, 403, 408, 790, 404, 790, 405, 790, + 406, 790, 407, 790, 790, 790, 409, 790, + 410, 415, 421, 433, 790, 411, 790, 412, + 790, 413, 790, 414, 790, 790, 790, 416, + 790, 417, 790, 418, 790, 419, 790, 420, + 790, 790, 790, 422, 790, 423, 790, 424, + 790, 425, 790, 426, 790, 427, 790, 428, + 790, 429, 790, 430, 790, 431, 790, 432, + 790, 790, 790, 434, 790, 435, 790, 436, + 790, 437, 790, 790, 790, 439, 790, 440, + 790, 790, 790, 442, 790, 443, 790, 444, + 790, 445, 790, 790, 790, 447, 452, 790, + 448, 790, 449, 790, 450, 790, 451, 790, + 790, 790, 453, 790, 454, 790, 455, 790, + 456, 790, 457, 790, 458, 790, 790, 790, + 460, 790, 461, 790, 462, 790, 790, 790, + 464, 790, 465, 790, 790, 790, 467, 473, + 790, 468, 790, 469, 790, 470, 790, 471, + 790, 472, 790, 790, 790, 474, 790, 475, + 790, 476, 790, 477, 790, 478, 790, 479, + 790, 790, 790, 481, 790, 482, 790, 483, + 790, 484, 790, 790, 790, 486, 790, 487, + 790, 488, 790, 489, 790, 790, 790, 491, + 790, 492, 790, 493, 790, 494, 790, 495, + 790, 496, 790, 790, 790, 498, 507, 790, + 499, 790, 500, 790, 501, 790, 502, 790, + 503, 790, 504, 790, 505, 790, 506, 790, + 790, 790, 508, 790, 509, 790, 790, 790, + 511, 519, 528, 790, 512, 515, 790, 513, + 790, 514, 790, 790, 790, 516, 790, 517, + 790, 518, 790, 790, 790, 520, 790, 521, + 522, 525, 790, 790, 790, 523, 790, 524, + 790, 790, 790, 526, 790, 527, 790, 790, + 790, 529, 790, 790, 790, 531, 790, 532, + 790, 533, 790, 790, 790, 535, 790, 536, + 790, 790, 537, 790, 790, 790, 539, 543, + 790, 540, 790, 541, 790, 542, 790, 790, + 790, 544, 790, 545, 790, 546, 790, 547, + 790, 790, 790, 549, 790, 550, 790, 551, + 790, 552, 790, 553, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 560, 0, 562, 561, 817, 0, 0, + 561, 564, 565, 819, 563, 564, 565, 819, + 563, 564, 565, 563, 568, 569, 819, 570, + 651, 666, 672, 678, 684, 690, 696, 707, + 713, 719, 724, 567, 568, 569, 819, 567, + 568, 569, 819, 567, 568, 569, 567, 568, + 569, 819, 571, 586, 592, 598, 604, 610, + 616, 627, 633, 639, 644, 567, 568, 569, + 819, 572, 581, 567, 568, 569, 819, 573, + 577, 567, 568, 569, 819, 574, 567, 568, + 569, 819, 575, 567, 576, 569, 819, 567, + 568, 569, 819, 567, 568, 569, 819, 578, + 567, 568, 569, 819, 579, 567, 580, 569, + 819, 567, 568, 569, 819, 567, 568, 569, + 819, 582, 567, 568, 569, 819, 583, 567, + 568, 569, 819, 584, 567, 585, 569, 819, + 567, 568, 569, 819, 567, 568, 569, 819, + 587, 567, 568, 569, 819, 588, 567, 568, + 569, 819, 589, 567, 568, 569, 819, 590, + 567, 591, 569, 819, 567, 568, 569, 819, + 567, 568, 569, 819, 593, 567, 568, 569, + 819, 594, 567, 568, 569, 819, 595, 567, + 568, 569, 819, 596, 567, 597, 569, 819, + 567, 568, 569, 819, 567, 568, 569, 819, + 599, 567, 568, 569, 819, 600, 567, 568, + 569, 819, 601, 567, 568, 569, 819, 602, + 567, 603, 569, 819, 567, 568, 569, 819, + 567, 568, 569, 819, 605, 567, 568, 569, + 819, 606, 567, 568, 569, 819, 607, 567, + 568, 569, 819, 608, 567, 609, 569, 819, + 567, 568, 569, 819, 567, 568, 569, 819, + 611, 567, 568, 569, 819, 612, 567, 568, + 569, 819, 613, 567, 568, 569, 819, 614, + 567, 615, 569, 819, 567, 568, 569, 819, + 567, 568, 569, 819, 617, 622, 567, 568, + 569, 819, 618, 567, 568, 569, 819, 619, + 567, 568, 569, 819, 620, 567, 621, 569, + 819, 567, 568, 569, 819, 567, 568, 569, + 819, 623, 567, 568, 569, 819, 624, 567, + 568, 569, 819, 625, 567, 626, 569, 819, + 567, 568, 569, 819, 567, 568, 569, 819, + 628, 567, 568, 569, 819, 629, 567, 568, + 569, 819, 630, 567, 568, 569, 819, 631, + 567, 632, 569, 819, 567, 568, 569, 819, + 567, 568, 569, 819, 634, 567, 568, 569, + 819, 635, 567, 568, 569, 819, 636, 567, + 568, 569, 819, 637, 567, 638, 569, 819, + 567, 568, 569, 819, 567, 568, 569, 819, + 640, 567, 568, 569, 819, 641, 567, 568, + 569, 819, 642, 567, 643, 569, 819, 567, + 568, 569, 819, 567, 568, 569, 819, 645, + 567, 568, 569, 819, 646, 567, 568, 569, + 819, 647, 567, 568, 569, 819, 648, 567, + 568, 569, 819, 649, 567, 650, 569, 819, + 567, 568, 569, 819, 567, 568, 569, 819, + 652, 661, 567, 568, 569, 819, 653, 657, + 567, 568, 569, 819, 654, 567, 568, 569, + 819, 655, 567, 656, 569, 819, 567, 568, + 569, 819, 567, 568, 569, 819, 658, 567, + 568, 569, 819, 659, 567, 660, 569, 819, + 567, 568, 569, 819, 567, 568, 569, 819, + 662, 567, 568, 569, 819, 663, 567, 568, + 569, 819, 664, 567, 665, 569, 819, 567, + 568, 569, 819, 567, 568, 569, 819, 667, + 567, 568, 569, 819, 668, 567, 568, 569, + 819, 669, 567, 568, 569, 819, 670, 567, + 671, 569, 819, 567, 568, 569, 819, 567, + 568, 569, 819, 673, 567, 568, 569, 819, + 674, 567, 568, 569, 819, 675, 567, 568, + 569, 819, 676, 567, 677, 569, 819, 567, + 568, 569, 819, 567, 568, 569, 819, 679, + 567, 568, 569, 819, 680, 567, 568, 569, + 819, 681, 567, 568, 569, 819, 682, 567, + 683, 569, 819, 567, 568, 569, 819, 567, + 568, 569, 819, 685, 567, 568, 569, 819, + 686, 567, 568, 569, 819, 687, 567, 568, + 569, 819, 688, 567, 689, 569, 819, 567, + 568, 569, 819, 567, 568, 569, 819, 691, + 567, 568, 569, 819, 692, 567, 568, 569, + 819, 693, 567, 568, 569, 819, 694, 567, + 695, 569, 819, 567, 568, 569, 819, 567, + 568, 569, 819, 697, 702, 567, 568, 569, + 819, 698, 567, 568, 569, 819, 699, 567, + 568, 569, 819, 700, 567, 701, 569, 819, + 567, 568, 569, 819, 567, 568, 569, 819, + 703, 567, 568, 569, 819, 704, 567, 568, + 569, 819, 705, 567, 706, 569, 819, 567, + 568, 569, 819, 567, 568, 569, 819, 708, + 567, 568, 569, 819, 709, 567, 568, 569, + 819, 710, 567, 568, 569, 819, 711, 567, + 712, 569, 819, 567, 568, 569, 819, 567, + 568, 569, 819, 714, 567, 568, 569, 819, + 715, 567, 568, 569, 819, 716, 567, 568, + 569, 819, 717, 567, 718, 569, 819, 567, + 568, 569, 819, 567, 568, 569, 819, 720, + 567, 568, 569, 819, 721, 567, 568, 569, + 819, 722, 567, 723, 569, 819, 567, 568, + 569, 819, 567, 568, 569, 819, 725, 567, + 568, 569, 819, 726, 567, 568, 569, 819, + 727, 567, 568, 569, 819, 728, 567, 568, + 569, 819, 729, 567, 730, 569, 819, 567, + 568, 569, 819, 567, 732, 733, 819, 731, + 732, 733, 819, 731, 732, 733, 731, 735, + 819, 819, 735, 819, 819, 736, 736, 736, + 819, 819, 819, 819, 819, 739, 819, 819, + 819, 819, 838, 838, 838, 838, 742, 838, + 838, 838, 838, 843, 843, 843, 843, 745, + 843, 843, 843, 843, 746, 746, 746, 746, + 746, 747, 746, 759, 760, 746, 761, 762, + 763, 746, 782, 746, 746, 746, 746, 746, + 784, 746, 785, 746, 786, 746, 746, 746, + 1, 2, 746, 3, 3, 3, 3, 746, + 4, 4, 4, 4, 746, 5, 8, 11, + 13, 15, 8, 9, 10, 8, 8, 746, + 19, 746, 20, 20, 20, 20, 19, 746, + 746, 19, 746, 746, 746, 21, 21, 21, + 21, 746, 746, 746, 746, 22, 746, 23, + 24, 26, 746, 746, 27, 746, 28, 28, + 28, 28, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 29, 32, 35, 746, + 764, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 769, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 770, 746, + 746, 746, 771, 746, 776, 746, 746, 777, + 778, 746, 746, 746, 746, 746, 746, 779, + 746, 766, 768, 746, 765, 746, 746, 746, + 767, 768, 746, 768, 768, 746, 768, 746, + 746, 746, 746, 38, 39, 40, 41, 774, + 746, 773, 746, 746, 746, 775, 746, 746, + 746, 50, 52, 54, 746, 56, 746, 746, + 746, 781, 780, 780, 780, 746, 746, 746, + 746, 746, 58, 58, 58, 746, 59, 746, + 746, 746, 746, 746, 746, 746, 746, 62, + 746, 746, 63, 746, 787, 789, 788, 787, + 65, 787, 66, 68, 65, 791, 792, 793, + 795, 796, 797, 798, 800, 801, 802, 803, + 804, 806, 807, 808, 809, 810, 811, 812, + 813, 814, 815, 816, 790, 71, 72, 81, + 790, 86, 96, 101, 107, 114, 790, 122, + 790, 790, 142, 790, 794, 790, 155, 162, + 790, 149, 152, 790, 172, 790, 184, 202, + 790, 208, 214, 222, 226, 229, 790, 240, + 246, 250, 790, 241, 243, 790, 256, 270, + 790, 300, 790, 306, 324, 790, 790, 334, + 337, 341, 790, 790, 790, 790, 790, 350, + 790, 357, 790, 805, 790, 377, 384, 790, + 368, 790, 790, 389, 398, 790, 790, 790, + 399, 402, 438, 441, 790, 790, 790, 790, + 790, 446, 790, 790, 790, 790, 459, 463, + 790, 466, 790, 480, 485, 790, 790, 790, + 490, 497, 790, 510, 530, 534, 538, 790, + 548, 790, 554, 790, 555, 556, 557, 558, + 790, 790, 790, 790, 790, 790, 790, 0, + 818, 818, 818, 818, 818, 818, 818, 818, + 819, 820, 821, 819, 819, 819, 819, 833, + 819, 834, 819, 835, 819, 819, 819, 563, + 566, 731, 819, 822, 819, 819, 819, 819, + 819, 826, 819, 819, 819, 819, 819, 819, + 819, 827, 819, 819, 819, 819, 819, 819, + 819, 828, 829, 819, 819, 819, 819, 819, + 819, 830, 824, 819, 819, 819, 819, 823, + 819, 819, 819, 825, 819, 819, 819, 819, + 819, 819, 734, 819, 819, 819, 832, 831, + 831, 831, 819, 819, 819, 819, 819, 736, + 736, 736, 819, 819, 819, 819, 819, 737, + 819, 819, 738, 819, 837, 836, 836, 836, + 836, 836, 836, 836, 836, 839, 838, 838, + 838, 840, 838, 841, 838, 842, 838, 838, + 838, 838, 838, 838, 838, 838, 838, 740, + 838, 838, 741, 838, 844, 843, 843, 843, + 845, 843, 846, 843, 847, 843, 843, 843, + 843, 843, 843, 843, 843, 843, 743, 843, + 843, 744, 843, 848, 848, 849, 849, 0, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 787, 787, 787, 787, 787, 787, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 559, 560, + 561, 562, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 838, 838, 838, 843, 843, + 843, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 787, 787, 787, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 817, 818, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 836, 836, 838, 838, 838, + 838, 838, 843, 843, 843, 843, 843, 848, + 849, 0 + }; + + static const short _regex_cond_actions[] = { + 827, 631, 731, 723, 45, 903, 903, 897, + 45, 912, 900, 903, 729, 741, 0, 45, + 45, 923, 923, 923, 923, 737, 45, 765, + 747, 0, 0, 0, 0, 841, 743, 3, + 3, 3, 3, 841, 3, 3, 3, 3, + 839, 0, 3, 3, 3, 3, 839, 761, + 839, 761, 3, 3, 3, 3, 839, 759, + 3, 870, 3, 3, 839, 761, 3, 870, + 3, 3, 839, 3, 3, 3, 3, 839, + 0, 3, 3, 3, 3, 839, 751, 0, + 749, 839, 755, 753, 839, 0, 757, 3, + 3, 3, 3, 839, 0, 0, 0, 0, + 839, 757, 0, 0, 0, 0, 839, 757, + 3, 3, 3, 3, 839, 745, 0, 841, + 725, 727, 27, 27, 27, 27, 841, 743, + 3, 3, 3, 3, 841, 763, 0, 841, + 3, 3, 3, 3, 841, 3, 3, 3, + 3, 841, 673, 3, 3, 3, 3, 841, + 0, 0, 0, 0, 841, 27, 27, 27, + 27, 841, 725, 0, 727, 25, 25, 25, + 25, 841, 0, 0, 829, 0, 0, 0, + 603, 0, 0, 0, 0, 0, 0, 829, + 0, 0, 0, 601, 0, 0, 0, 0, + 0, 0, 829, 0, 0, 0, 603, 0, + 0, 0, 0, 675, 0, 17, 831, 675, + 0, 7, 3, 870, 3, 3, 831, 17, + 831, 663, 17, 831, 663, 17, 831, 663, + 831, 3, 661, 870, 3, 3, 831, 3, + 661, 870, 3, 3, 831, 3, 661, 3, + 3, 3, 831, 3, 665, 3, 3, 3, + 831, 3, 3, 3, 3, 837, 671, 3, + 3, 3, 3, 837, 3, 3, 3, 3, + 837, 669, 3, 3, 3, 3, 837, 3, + 3, 3, 3, 837, 3, 667, 3, 3, + 3, 837, 0, 833, 677, 0, 833, 679, + 0, 0, 0, 835, 0, 29, 11, 845, + 31, 13, 845, 0, 13, 845, 843, 769, + 843, 843, 0, 843, 843, 771, 843, 53, + 0, 53, 0, 0, 51, 0, 53, 0, + 0, 49, 0, 0, 47, 0, 315, 359, + 0, 0, 359, 0, 359, 0, 359, 127, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 129, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 131, 359, 0, 0, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 133, 359, 0, 359, 135, 359, 0, + 359, 137, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 139, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 141, + 359, 0, 359, 0, 0, 359, 0, 359, + 143, 359, 0, 359, 0, 359, 145, 359, + 0, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 147, 359, 0, 359, 149, + 359, 0, 0, 341, 0, 341, 0, 341, + 0, 341, 0, 341, 0, 341, 0, 341, + 0, 341, 0, 341, 0, 341, 0, 341, + 0, 341, 0, 341, 0, 341, 0, 341, + 0, 341, 151, 341, 0, 341, 0, 341, + 153, 341, 0, 0, 341, 155, 341, 0, + 341, 0, 341, 0, 341, 0, 341, 157, + 341, 0, 343, 0, 343, 159, 343, 0, + 343, 0, 343, 161, 343, 0, 341, 0, + 341, 0, 341, 0, 341, 0, 341, 0, + 341, 163, 341, 0, 0, 341, 0, 341, + 0, 341, 0, 341, 165, 341, 0, 341, + 0, 341, 0, 341, 0, 341, 167, 341, + 0, 0, 359, 0, 359, 0, 359, 0, + 359, 169, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 171, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 173, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 175, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 177, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 179, 359, 0, 359, 0, + 359, 0, 359, 181, 359, 0, 359, 0, + 359, 183, 359, 0, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 185, 359, + 0, 359, 0, 359, 0, 359, 0, 359, + 187, 359, 45, 359, 0, 357, 189, 357, + 0, 357, 0, 357, 191, 357, 0, 359, + 0, 359, 0, 359, 193, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 0, 359, + 195, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 197, 359, 0, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 199, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 0, 359, 0, 359, 0, 359, 0, 359, + 201, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 203, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 205, 359, + 0, 0, 0, 0, 359, 0, 359, 0, + 359, 207, 359, 0, 359, 0, 359, 0, + 359, 209, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 211, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 213, 359, 0, + 0, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 215, 359, + 0, 359, 217, 359, 219, 0, 345, 0, + 345, 221, 345, 0, 345, 0, 345, 0, + 345, 223, 345, 0, 0, 0, 345, 0, + 345, 225, 345, 0, 345, 0, 345, 0, + 345, 0, 345, 227, 345, 229, 345, 0, + 0, 345, 0, 345, 0, 345, 231, 345, + 0, 345, 0, 345, 233, 345, 0, 0, + 347, 0, 347, 0, 347, 0, 347, 0, + 347, 0, 347, 235, 347, 0, 347, 0, + 347, 0, 347, 237, 347, 0, 349, 0, + 349, 0, 349, 0, 349, 0, 349, 0, + 349, 0, 349, 0, 349, 239, 349, 0, + 347, 0, 347, 0, 347, 0, 347, 0, + 347, 0, 347, 241, 347, 0, 347, 0, + 347, 0, 347, 0, 347, 243, 347, 0, + 351, 0, 351, 0, 351, 0, 351, 0, + 351, 0, 351, 0, 351, 0, 351, 245, + 351, 247, 351, 0, 359, 0, 359, 249, + 359, 0, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 251, 359, 0, 359, + 0, 0, 0, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 253, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 255, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 257, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 259, 359, 0, 359, 0, + 359, 261, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 263, 359, 0, 0, 353, + 0, 353, 0, 353, 0, 353, 0, 353, + 265, 353, 0, 353, 0, 353, 0, 353, + 0, 353, 0, 353, 0, 353, 267, 353, + 0, 359, 0, 359, 0, 359, 269, 359, + 0, 359, 0, 359, 271, 359, 0, 0, + 355, 0, 355, 0, 355, 0, 355, 0, + 355, 0, 355, 273, 355, 0, 355, 0, + 355, 0, 355, 0, 355, 0, 355, 0, + 355, 275, 355, 0, 355, 0, 355, 0, + 355, 0, 355, 277, 355, 0, 355, 0, + 355, 0, 355, 0, 355, 279, 355, 0, + 355, 0, 355, 0, 355, 0, 355, 0, + 355, 0, 355, 281, 355, 0, 0, 355, + 0, 355, 0, 355, 0, 355, 0, 355, + 0, 355, 0, 355, 0, 355, 0, 355, + 283, 355, 0, 355, 0, 355, 285, 355, + 0, 0, 0, 359, 0, 0, 359, 0, + 359, 0, 359, 287, 359, 0, 359, 0, + 359, 0, 359, 289, 359, 0, 359, 0, + 0, 0, 359, 291, 359, 0, 359, 0, + 359, 293, 359, 0, 359, 0, 359, 295, + 359, 0, 359, 297, 359, 0, 359, 0, + 359, 0, 359, 299, 359, 0, 359, 0, + 303, 359, 0, 359, 301, 359, 0, 0, + 359, 0, 359, 0, 359, 0, 359, 305, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 307, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 309, 359, 311, + 359, 119, 359, 121, 359, 123, 359, 125, + 359, 0, 39, 33, 35, 37, 39, 39, + 35, 0, 0, 539, 0, 0, 0, 377, + 0, 0, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 539, 0, + 0, 0, 435, 0, 0, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 381, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 385, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 389, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 393, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 397, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 401, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 405, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 409, + 0, 0, 0, 539, 0, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 413, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 417, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 421, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 425, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 429, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 433, 0, 0, 0, 539, + 0, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 379, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 383, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 387, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 391, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 395, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 399, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 403, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 407, 0, + 0, 0, 539, 0, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 411, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 415, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 419, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 423, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 427, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 431, 0, 0, 0, 539, 0, + 0, 0, 377, 0, 0, 0, 0, 0, + 533, 471, 0, 533, 475, 0, 0, 0, + 535, 537, 503, 537, 537, 0, 537, 537, + 505, 537, 569, 557, 569, 569, 0, 569, + 569, 559, 569, 587, 575, 587, 587, 0, + 587, 587, 577, 587, 633, 775, 777, 629, + 637, 45, 597, 0, 0, 609, 0, 45, + 0, 635, 909, 599, 775, 777, 773, 777, + 0, 777, 45, 777, 45, 777, 773, 777, + 0, 0, 779, 0, 0, 0, 0, 821, + 3, 3, 3, 3, 821, 1, 3, 1, + 0, 3, 3, 855, 855, 3, 3, 819, + 0, 821, 27, 27, 27, 27, 0, 821, + 745, 0, 821, 735, 733, 3, 3, 3, + 3, 821, 739, 821, 763, 0, 821, 1, + 1, 0, 821, 725, 0, 727, 25, 25, + 25, 25, 821, 615, 613, 783, 619, 617, + 785, 623, 621, 787, 0, 0, 0, 781, + 5, 639, 647, 611, 695, 607, 717, 699, + 715, 683, 683, 0, 605, 713, 691, 683, + 703, 687, 719, 641, 657, 645, 0, 693, + 659, 655, 906, 697, 45, 683, 651, 45, + 0, 653, 689, 649, 683, 701, 685, 7, + 643, 852, 915, 721, 15, 791, 867, 791, + 858, 919, 795, 927, 919, 793, 919, 847, + 709, 711, 681, 0, 7, 0, 849, 17, + 801, 17, 799, 876, 799, 17, 797, 873, + 797, 1, 1, 1, 815, 0, 803, 705, + 707, 45, 19, 23, 21, 805, 882, 894, + 888, 805, 0, 0, 0, 807, 11, 825, + 627, 625, 789, 823, 767, 823, 823, 0, + 823, 823, 0, 823, 55, 45, 45, 53, + 0, 53, 0, 0, 0, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 0, 0, 317, 0, 0, 0, + 339, 0, 0, 0, 0, 0, 339, 0, + 61, 63, 0, 65, 45, 67, 0, 0, + 319, 0, 0, 321, 0, 339, 0, 0, + 339, 0, 0, 0, 0, 0, 339, 0, + 0, 0, 339, 0, 0, 337, 0, 0, + 339, 0, 339, 0, 0, 339, 79, 0, + 0, 0, 69, 71, 73, 75, 77, 0, + 323, 0, 81, 45, 83, 0, 0, 325, + 0, 327, 85, 0, 0, 87, 89, 329, + 0, 0, 0, 0, 339, 91, 93, 95, + 97, 0, 99, 101, 103, 331, 0, 0, + 339, 0, 105, 0, 0, 107, 109, 111, + 0, 0, 333, 0, 0, 0, 0, 339, + 0, 339, 0, 339, 0, 0, 0, 0, + 339, 313, 339, 113, 115, 117, 335, 39, + 361, 363, 365, 367, 369, 371, 373, 375, + 491, 45, 0, 511, 509, 507, 509, 0, + 509, 45, 509, 45, 509, 507, 509, 0, + 0, 0, 531, 5, 489, 439, 457, 493, + 493, 0, 437, 485, 493, 461, 481, 451, + 441, 0, 487, 453, 449, 495, 455, 493, + 445, 45, 0, 447, 483, 443, 493, 459, + 479, 7, 9, 473, 497, 497, 499, 15, + 517, 861, 517, 15, 519, 864, 519, 467, + 469, 477, 0, 521, 463, 465, 45, 19, + 23, 21, 523, 879, 891, 885, 523, 0, + 0, 0, 525, 529, 501, 529, 529, 0, + 529, 529, 0, 529, 0, 549, 543, 549, + 541, 549, 547, 545, 551, 0, 563, 561, + 563, 0, 563, 45, 563, 45, 563, 561, + 563, 553, 567, 565, 555, 565, 565, 0, + 565, 565, 0, 565, 0, 581, 579, 581, + 0, 581, 45, 581, 45, 581, 579, 581, + 571, 585, 583, 573, 583, 583, 0, 583, + 583, 0, 583, 589, 591, 593, 595, 0, + 827, 827, 841, 841, 839, 839, 839, 839, + 839, 839, 839, 839, 839, 839, 839, 839, + 839, 839, 841, 841, 841, 841, 841, 841, + 841, 841, 841, 841, 829, 829, 829, 829, + 829, 829, 829, 829, 829, 831, 831, 831, + 831, 831, 831, 831, 831, 831, 831, 831, + 831, 837, 837, 837, 837, 837, 837, 833, + 833, 835, 845, 845, 845, 843, 843, 843, + 59, 59, 59, 59, 59, 59, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 343, 343, 343, 343, + 343, 343, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 357, 357, 357, 357, 357, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 345, 345, 345, + 345, 345, 345, 345, 345, 345, 345, 345, + 345, 345, 345, 345, 345, 345, 345, 345, + 345, 345, 345, 345, 347, 347, 347, 347, + 347, 347, 347, 347, 347, 347, 347, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 347, 347, 347, 347, 347, 347, 347, 347, + 347, 347, 347, 347, 351, 351, 351, 351, + 351, 351, 351, 351, 351, 351, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 353, 353, + 353, 353, 359, 359, 359, 359, 359, 359, + 359, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 39, 39, + 39, 39, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 533, 533, 535, + 537, 537, 537, 569, 569, 569, 587, 587, + 587, 0, 779, 821, 821, 819, 821, 821, + 821, 821, 821, 821, 821, 821, 783, 785, + 787, 781, 817, 791, 791, 795, 793, 847, + 811, 809, 801, 799, 799, 797, 797, 815, + 803, 813, 805, 805, 807, 825, 789, 823, + 823, 823, 0, 57, 57, 0, 339, 339, + 319, 321, 339, 339, 339, 339, 337, 339, + 339, 339, 323, 325, 327, 329, 339, 331, + 339, 333, 339, 339, 339, 339, 339, 335, + 0, 0, 0, 531, 531, 517, 517, 519, + 519, 513, 527, 521, 515, 523, 523, 525, + 529, 529, 529, 0, 551, 0, 567, 565, + 565, 565, 0, 585, 583, 583, 583, 0, + 0, 0 + }; + + static const signed char _regex_to_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 41, + 0, 41, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 41, 0, 0, 41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 41, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 41, 0, 41, 0, + 0, 0, 0, 41, 0, 0, 0, 0, + 41, 41, 0 + }; + + static const signed char _regex_from_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 43, 0, 0, 43, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43, 0, 43, 0, + 0, 0, 0, 43, 0, 0, 0, 0, + 43, 43, 0 + }; + + static const short _regex_eof_trans[] = { + 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, + 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, + 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, + 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, + 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, + 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, + 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, + 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, + 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, + 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, + 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, + 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, + 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, + 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, + 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, + 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, + 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, + 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, + 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, + 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, + 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, + 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, + 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, + 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, + 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, + 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, + 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, + 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, + 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, + 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, + 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, + 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, + 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, + 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, + 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, + 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, + 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, + 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, + 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, + 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, + 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, + 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, + 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, + 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, + 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, + 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, + 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, + 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, + 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, + 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, + 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, + 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, + 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, + 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, + 3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, + 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, + 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, + 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, + 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, + 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, + 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, + 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, + 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, + 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, + 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, + 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, + 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, + 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, + 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, + 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, + 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, + 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, + 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, + 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, + 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, + 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, + 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, + 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, + 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, + 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, + 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, + 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, + 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, + 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, + 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, + 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, + 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, + 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, + 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, + 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, + 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, + 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, + 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, + 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, + 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, + 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, + 3433, 3434, 3435, 3436, 3437, 3438, 3439, 3440, + 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, + 3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, + 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, + 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, + 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, + 3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, + 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, + 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, + 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, + 3513, 3514, 0 + }; + + static const int regex_start = 746; + static const int regex_error = 0; + + static const int regex_en_readVerb = 787; + static const int regex_en_readUCP = 790; + static const int regex_en_readBracedUCP = 559; + static const int regex_en_readUCPSingle = 818; + static const int regex_en_charClassGuts = 819; + static const int regex_en_readClass = 836; + static const int regex_en_readQuotedLiteral = 838; + static const int regex_en_readQuotedClass = 843; + static const int regex_en_readComment = 848; + static const int regex_en_readNewlineTerminatedComment = 849; + static const int regex_en_main = 746; + + +#line 1911 "Parser.rl" + + + /** \brief Main parser call, returns root Component or nullptr. */ + unique_ptr parse(const char *ptr, ParseMode &globalMode) { + assert(ptr); + + const char *p = ptr; + const char *pe = ptr + strlen(ptr); + + // First, read the control verbs, set any global mode flags and move the + // ptr forward. + p = read_control_verbs(p, pe, 0, globalMode); + + const char *eof = pe; + int cs; + UNUSED int act; + int top; + vector stack; + const char *ts, *te; + unichar accumulator = 0; + unichar octAccumulator = 0; /* required as we are also accumulating for + * back ref when looking for octals */ + unsigned repeatN = 0; + unsigned repeatM = 0; + string label; + + ParseMode mode = globalMode; + ParseMode newMode; + + bool negated = false; + bool inComment = false; + + // Stack of sequences and flags used to store state when we enter + // sub-sequences. + vector sequences; + + // Index of the next capturing group. Note that zero is reserved for the + // root sequence. + unsigned groupIndex = 1; + + // Set storing group names that are currently in use. + flat_set groupNames; + + // Root sequence. + unique_ptr rootSeq = std::make_unique(); + rootSeq->setCaptureIndex(0); + + // Current sequence being appended to + ComponentSequence *currentSeq = rootSeq.get(); + + // The current character class being appended to. This is used as the + // accumulator for both character class and UCP properties. + unique_ptr currentCls; + + // True if the machine is currently inside a character class, i.e. square + // brackets [..]. + bool inCharClass = false; + + // True if the machine is inside a character class but it has not processed + // any "real" elements yet, i.e. it's still processing meta-characters like + // '^'. + bool inCharClassEarly = false; + + // Location at which the current character class began. + const char *currentClsBegin = p; + + // We throw exceptions on various parsing failures beyond this point: we + // use a try/catch block here to clean up our allocated memory before we + // re-throw the exception to the caller. + try { + // Embed the Ragel machine here + +#line 4187 "Parser.cpp" + { + cs = (int)regex_start; + top = 0; + ts = 0; + te = 0; + act = 0; + } + +#line 1982 "Parser.rl" + + +#line 4196 "Parser.cpp" + { + int _cpc; + int _klen; + const signed char * _ckeys; + unsigned int _trans = 0; + unsigned int _cond = 0; + const char * _keys; + const short * _acts; + unsigned int _nacts; + _resume: {} + if ( p == pe && p != eof ) + goto _out; + _acts = ( _regex_actions + (_regex_from_state_actions[cs])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) { + case 24: { + { +#line 1 "NONE" + {ts = p;}} + +#line 4218 "Parser.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + if ( p == eof ) { + if ( _regex_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_regex_eof_trans[cs] - 1; + } + } + else { + _keys = ( _regex_trans_keys + (_regex_key_offsets[cs])); + _trans = (unsigned int)_regex_index_offsets[cs]; + + _klen = (int)_regex_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _keys += _klen; + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + ((_upper-_lower) >> 1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 1; + else if ( ( (*( p))) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + } + + _klen = (int)_regex_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + (_klen<<1) - 2; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 2; + else if ( ( (*( p))) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + break; + } + } + } + + _match: {} + } + _ckeys = ( _regex_cond_keys + (_regex_trans_offsets[_trans])); + _klen = (int)_regex_trans_lengths[_trans]; + _cond = (unsigned int)_regex_trans_offsets[_trans]; + + _cpc = 0; + switch ( _regex_trans_cond_spaces[_trans] ) { + + case 0: { + if ( ( mode.utf8 ) +#line 4293 "Parser.cpp" + ) _cpc += 1; + break; + } + case 1: { + if ( ( mode.ignore_space ) +#line 4298 "Parser.cpp" + ) _cpc += 1; + break; + } + case 2: { + if ( ( inCharClassEarly ) +#line 4303 "Parser.cpp" + ) _cpc += 1; + break; + } + } + { + const signed char *_lower = _ckeys; + const signed char *_upper = _ckeys + _klen - 1; + const signed char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _cond = 3561; + + break; + } + + _mid = _lower + ((_upper-_lower) >> 1); + if ( _cpc < (int)(*( _mid)) ) + _upper = _mid - 1; + else if ( _cpc > (int)(*( _mid)) ) + _lower = _mid + 1; + else { + _cond += (unsigned int)(_mid - _ckeys); + + break; + } + } + } + cs = (int)_regex_cond_targs[_cond]; + + if ( _regex_cond_actions[_cond] != 0 ) { + + _acts = ( _regex_actions + (_regex_cond_actions[_cond])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) + { + case 0: { + { +#line 285 "Parser.rl" + label.clear();} + +#line 4345 "Parser.cpp" + + break; + } + case 1: { + { +#line 286 "Parser.rl" + label.push_back((( (*( p)))));} + +#line 4353 "Parser.cpp" + + break; + } + case 2: { + { +#line 287 "Parser.rl" + octAccumulator = 0;} + +#line 4361 "Parser.cpp" + + break; + } + case 3: { + { +#line 288 "Parser.rl" + accumulator = 0;} + +#line 4369 "Parser.cpp" + + break; + } + case 4: { + { +#line 289 "Parser.rl" + + octAccumulator = 0; + pushOct(&octAccumulator, (( (*( p))))); + } + +#line 4380 "Parser.cpp" + + break; + } + case 5: { + { +#line 293 "Parser.rl" + + accumulator = 0; + pushDec(&accumulator, (( (*( p))))); + } + +#line 4391 "Parser.cpp" + + break; + } + case 6: { + { +#line 297 "Parser.rl" + repeatN = 0; repeatM = 0; } + +#line 4399 "Parser.cpp" + + break; + } + case 7: { + { +#line 298 "Parser.rl" + pushDec(&repeatN, (( (*( p))))); } + +#line 4407 "Parser.cpp" + + break; + } + case 8: { + { +#line 299 "Parser.rl" + pushDec(&repeatM, (( (*( p))))); } + +#line 4415 "Parser.cpp" + + break; + } + case 9: { + { +#line 300 "Parser.rl" + pushOct(&octAccumulator, (( (*( p))))); } + +#line 4423 "Parser.cpp" + + break; + } + case 10: { + { +#line 301 "Parser.rl" + pushDec(&accumulator, (( (*( p))))); } + +#line 4431 "Parser.cpp" + + break; + } + case 11: { + { +#line 302 "Parser.rl" + + accumulator *= 16; + accumulator += (( (*( p)))) - '0'; + } + +#line 4442 "Parser.cpp" + + break; + } + case 12: { + { +#line 306 "Parser.rl" + + accumulator *= 16; + accumulator += 10 + (( (*( p)))) - 'a'; + } + +#line 4453 "Parser.cpp" + + break; + } + case 13: { + { +#line 310 "Parser.rl" + + accumulator *= 16; + accumulator += 10 + (( (*( p)))) - 'A'; + } + +#line 4464 "Parser.cpp" + + break; + } + case 14: { + { +#line 430 "Parser.rl" + + newMode = mode; + } + +#line 4474 "Parser.cpp" + + break; + } + case 15: { + { +#line 437 "Parser.rl" + + switch ((( (*( p))))) { + case 'i': + newMode.caseless = true; + break; + case 'm': + newMode.multiline = true; + break; + case 's': + newMode.dotall = true; + break; + case 'x': + newMode.ignore_space = true; + break; + default: + assert(0); // this action only called for [imsx] + break; + } + } + +#line 4500 "Parser.cpp" + + break; + } + case 16: { + { +#line 456 "Parser.rl" + + switch ((( (*( p))))) { + case 'i': + newMode.caseless = false; + break; + case 'm': + newMode.multiline = false; + break; + case 's': + newMode.dotall = false; + break; + case 'x': + newMode.ignore_space = false; + break; + default: + assert(0); // this action only called for [imsx] + break; + } + } + +#line 4526 "Parser.cpp" + + break; + } + case 17: { + { +#line 510 "Parser.rl" + repeatM = repeatN;} + +#line 4534 "Parser.cpp" + + break; + } + case 18: { + { +#line 510 "Parser.rl" + repeatM = ComponentRepeat::NoLimit;} + +#line 4542 "Parser.cpp" + + break; + } + case 19: { + { +#line 722 "Parser.rl" + negated = !negated; } + +#line 4550 "Parser.cpp" + + break; + } + case 20: { + { +#line 723 "Parser.rl" + {p = p - 1; } {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 790;goto _again;}} + +#line 4566 "Parser.cpp" + + break; + } + case 21: { + { +#line 724 "Parser.rl" + if (!inCharClass) { // not inside [..] + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + +#line 4579 "Parser.cpp" + + break; + } + case 22: { + { +#line 730 "Parser.rl" + throw LocatedParseError("Malformed property"); } + +#line 4587 "Parser.cpp" + + break; + } + case 25: { + { +#line 1 "NONE" + {te = p+1;}} + +#line 4595 "Parser.cpp" + + break; + } + case 26: { + { +#line 550 "Parser.rl" + {te = p+1;{ +#line 550 "Parser.rl" + + throw LocatedParseError("(*UTF8) must be at start of " + "expression, encountered"); + } + }} + +#line 4609 "Parser.cpp" + + break; + } + case 27: { + { +#line 554 "Parser.rl" + {te = p+1;{ +#line 554 "Parser.rl" + + throw LocatedParseError("(*UTF) must be at start of " + "expression, encountered"); + } + }} + +#line 4623 "Parser.cpp" + + break; + } + case 28: { + { +#line 558 "Parser.rl" + {te = p+1;{ +#line 558 "Parser.rl" + + throw LocatedParseError("(*UCP) must be at start of " + "expression, encountered"); + } + }} + +#line 4637 "Parser.cpp" + + break; + } + case 29: { + { +#line 564 "Parser.rl" + {te = p+1;{ +#line 564 "Parser.rl" + + ParseMode temp_mode; + assert(ts - 2 >= ptr); // parser needs the '(*' at the start too. + read_control_verbs(ts - 2, te, (ts - 2 - ptr), temp_mode); + assert(0); // Should have thrown a parse error. + throw LocatedParseError("Unknown control verb"); + } + }} + +#line 4654 "Parser.cpp" + + break; + } + case 30: { + { +#line 571 "Parser.rl" + {te = p+1;{ +#line 571 "Parser.rl" + + throw LocatedParseError("Unknown control verb"); + } + }} + +#line 4667 "Parser.cpp" + + break; + } + case 31: { + { +#line 571 "Parser.rl" + {te = p;p = p - 1;{ +#line 571 "Parser.rl" + + throw LocatedParseError("Unknown control verb"); + } + }} + +#line 4680 "Parser.cpp" + + break; + } + case 32: { + { +#line 571 "Parser.rl" + {p = ((te))-1; + { +#line 571 "Parser.rl" + + throw LocatedParseError("Unknown control verb"); + } + }} + +#line 4694 "Parser.cpp" + + break; + } + case 33: { + { +#line 581 "Parser.rl" + {te = p+1;{ +#line 581 "Parser.rl" + currentCls->add(CLASS_UCP_CC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4705 "Parser.cpp" + + break; + } + case 34: { + { +#line 582 "Parser.rl" + {te = p+1;{ +#line 582 "Parser.rl" + currentCls->add(CLASS_UCP_CF, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4716 "Parser.cpp" + + break; + } + case 35: { + { +#line 583 "Parser.rl" + {te = p+1;{ +#line 583 "Parser.rl" + currentCls->add(CLASS_UCP_CN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4727 "Parser.cpp" + + break; + } + case 36: { + { +#line 585 "Parser.rl" + {te = p+1;{ +#line 585 "Parser.rl" + currentCls->add(CLASS_UCP_CS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4738 "Parser.cpp" + + break; + } + case 37: { + { +#line 587 "Parser.rl" + {te = p+1;{ +#line 587 "Parser.rl" + currentCls->add(CLASS_UCP_LL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4749 "Parser.cpp" + + break; + } + case 38: { + { +#line 588 "Parser.rl" + {te = p+1;{ +#line 588 "Parser.rl" + currentCls->add(CLASS_UCP_LM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4760 "Parser.cpp" + + break; + } + case 39: { + { +#line 589 "Parser.rl" + {te = p+1;{ +#line 589 "Parser.rl" + currentCls->add(CLASS_UCP_LO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4771 "Parser.cpp" + + break; + } + case 40: { + { +#line 590 "Parser.rl" + {te = p+1;{ +#line 590 "Parser.rl" + currentCls->add(CLASS_UCP_LT, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4782 "Parser.cpp" + + break; + } + case 41: { + { +#line 591 "Parser.rl" + {te = p+1;{ +#line 591 "Parser.rl" + currentCls->add(CLASS_UCP_LU, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4793 "Parser.cpp" + + break; + } + case 42: { + { +#line 592 "Parser.rl" + {te = p+1;{ +#line 592 "Parser.rl" + currentCls->add(CLASS_UCP_L_AND, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4804 "Parser.cpp" + + break; + } + case 43: { + { +#line 594 "Parser.rl" + {te = p+1;{ +#line 594 "Parser.rl" + currentCls->add(CLASS_UCP_MC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4815 "Parser.cpp" + + break; + } + case 44: { + { +#line 596 "Parser.rl" + {te = p+1;{ +#line 596 "Parser.rl" + currentCls->add(CLASS_UCP_MN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4826 "Parser.cpp" + + break; + } + case 45: { + { +#line 598 "Parser.rl" + {te = p+1;{ +#line 598 "Parser.rl" + currentCls->add(CLASS_UCP_ND, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4837 "Parser.cpp" + + break; + } + case 46: { + { +#line 599 "Parser.rl" + {te = p+1;{ +#line 599 "Parser.rl" + currentCls->add(CLASS_UCP_NL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4848 "Parser.cpp" + + break; + } + case 47: { + { +#line 600 "Parser.rl" + {te = p+1;{ +#line 600 "Parser.rl" + currentCls->add(CLASS_UCP_NO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4859 "Parser.cpp" + + break; + } + case 48: { + { +#line 602 "Parser.rl" + {te = p+1;{ +#line 602 "Parser.rl" + currentCls->add(CLASS_UCP_PC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4870 "Parser.cpp" + + break; + } + case 49: { + { +#line 603 "Parser.rl" + {te = p+1;{ +#line 603 "Parser.rl" + currentCls->add(CLASS_UCP_PD, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4881 "Parser.cpp" + + break; + } + case 50: { + { +#line 604 "Parser.rl" + {te = p+1;{ +#line 604 "Parser.rl" + currentCls->add(CLASS_UCP_PE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4892 "Parser.cpp" + + break; + } + case 51: { + { +#line 605 "Parser.rl" + {te = p+1;{ +#line 605 "Parser.rl" + currentCls->add(CLASS_UCP_PF, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4903 "Parser.cpp" + + break; + } + case 52: { + { +#line 606 "Parser.rl" + {te = p+1;{ +#line 606 "Parser.rl" + currentCls->add(CLASS_UCP_PI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4914 "Parser.cpp" + + break; + } + case 53: { + { +#line 607 "Parser.rl" + {te = p+1;{ +#line 607 "Parser.rl" + currentCls->add(CLASS_UCP_PO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4925 "Parser.cpp" + + break; + } + case 54: { + { +#line 608 "Parser.rl" + {te = p+1;{ +#line 608 "Parser.rl" + currentCls->add(CLASS_UCP_PS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4936 "Parser.cpp" + + break; + } + case 55: { + { +#line 610 "Parser.rl" + {te = p+1;{ +#line 610 "Parser.rl" + currentCls->add(CLASS_UCP_SC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4947 "Parser.cpp" + + break; + } + case 56: { + { +#line 611 "Parser.rl" + {te = p+1;{ +#line 611 "Parser.rl" + currentCls->add(CLASS_UCP_SK, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4958 "Parser.cpp" + + break; + } + case 57: { + { +#line 612 "Parser.rl" + {te = p+1;{ +#line 612 "Parser.rl" + currentCls->add(CLASS_UCP_SM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4969 "Parser.cpp" + + break; + } + case 58: { + { +#line 613 "Parser.rl" + {te = p+1;{ +#line 613 "Parser.rl" + currentCls->add(CLASS_UCP_SO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4980 "Parser.cpp" + + break; + } + case 59: { + { +#line 615 "Parser.rl" + {te = p+1;{ +#line 615 "Parser.rl" + currentCls->add(CLASS_UCP_ZL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4991 "Parser.cpp" + + break; + } + case 60: { + { +#line 616 "Parser.rl" + {te = p+1;{ +#line 616 "Parser.rl" + currentCls->add(CLASS_UCP_ZP, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5002 "Parser.cpp" + + break; + } + case 61: { + { +#line 617 "Parser.rl" + {te = p+1;{ +#line 617 "Parser.rl" + currentCls->add(CLASS_UCP_ZS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5013 "Parser.cpp" + + break; + } + case 62: { + { +#line 618 "Parser.rl" + {te = p+1;{ +#line 618 "Parser.rl" + currentCls->add(CLASS_UCP_XAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5024 "Parser.cpp" + + break; + } + case 63: { + { +#line 619 "Parser.rl" + {te = p+1;{ +#line 619 "Parser.rl" + currentCls->add(CLASS_UCP_XPS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5035 "Parser.cpp" + + break; + } + case 64: { + { +#line 620 "Parser.rl" + {te = p+1;{ +#line 620 "Parser.rl" + currentCls->add(CLASS_UCP_XSP, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5046 "Parser.cpp" + + break; + } + case 65: { + { +#line 621 "Parser.rl" + {te = p+1;{ +#line 621 "Parser.rl" + currentCls->add(CLASS_UCP_XWD, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5057 "Parser.cpp" + + break; + } + case 66: { + { +#line 622 "Parser.rl" + {te = p+1;{ +#line 622 "Parser.rl" + currentCls->add(CLASS_SCRIPT_ARABIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5068 "Parser.cpp" + + break; + } + case 67: { + { +#line 623 "Parser.rl" + {te = p+1;{ +#line 623 "Parser.rl" + currentCls->add(CLASS_SCRIPT_ARMENIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5079 "Parser.cpp" + + break; + } + case 68: { + { +#line 624 "Parser.rl" + {te = p+1;{ +#line 624 "Parser.rl" + currentCls->add(CLASS_SCRIPT_AVESTAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5090 "Parser.cpp" + + break; + } + case 69: { + { +#line 625 "Parser.rl" + {te = p+1;{ +#line 625 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BALINESE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5101 "Parser.cpp" + + break; + } + case 70: { + { +#line 626 "Parser.rl" + {te = p+1;{ +#line 626 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BAMUM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5112 "Parser.cpp" + + break; + } + case 71: { + { +#line 627 "Parser.rl" + {te = p+1;{ +#line 627 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BATAK, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5123 "Parser.cpp" + + break; + } + case 72: { + { +#line 628 "Parser.rl" + {te = p+1;{ +#line 628 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BENGALI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5134 "Parser.cpp" + + break; + } + case 73: { + { +#line 629 "Parser.rl" + {te = p+1;{ +#line 629 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BOPOMOFO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5145 "Parser.cpp" + + break; + } + case 74: { + { +#line 630 "Parser.rl" + {te = p+1;{ +#line 630 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BRAHMI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5156 "Parser.cpp" + + break; + } + case 75: { + { +#line 631 "Parser.rl" + {te = p+1;{ +#line 631 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BRAILLE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5167 "Parser.cpp" + + break; + } + case 76: { + { +#line 632 "Parser.rl" + {te = p+1;{ +#line 632 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BUGINESE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5178 "Parser.cpp" + + break; + } + case 77: { + { +#line 633 "Parser.rl" + {te = p+1;{ +#line 633 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BUHID, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5189 "Parser.cpp" + + break; + } + case 78: { + { +#line 634 "Parser.rl" + {te = p+1;{ +#line 634 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CANADIAN_ABORIGINAL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5200 "Parser.cpp" + + break; + } + case 79: { + { +#line 635 "Parser.rl" + {te = p+1;{ +#line 635 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CARIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5211 "Parser.cpp" + + break; + } + case 80: { + { +#line 636 "Parser.rl" + {te = p+1;{ +#line 636 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CHAM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5222 "Parser.cpp" + + break; + } + case 81: { + { +#line 637 "Parser.rl" + {te = p+1;{ +#line 637 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CHEROKEE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5233 "Parser.cpp" + + break; + } + case 82: { + { +#line 638 "Parser.rl" + {te = p+1;{ +#line 638 "Parser.rl" + currentCls->add(CLASS_SCRIPT_COMMON, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5244 "Parser.cpp" + + break; + } + case 83: { + { +#line 639 "Parser.rl" + {te = p+1;{ +#line 639 "Parser.rl" + currentCls->add(CLASS_SCRIPT_COPTIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5255 "Parser.cpp" + + break; + } + case 84: { + { +#line 640 "Parser.rl" + {te = p+1;{ +#line 640 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CUNEIFORM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5266 "Parser.cpp" + + break; + } + case 85: { + { +#line 641 "Parser.rl" + {te = p+1;{ +#line 641 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CYPRIOT, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5277 "Parser.cpp" + + break; + } + case 86: { + { +#line 642 "Parser.rl" + {te = p+1;{ +#line 642 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CYRILLIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5288 "Parser.cpp" + + break; + } + case 87: { + { +#line 643 "Parser.rl" + {te = p+1;{ +#line 643 "Parser.rl" + currentCls->add(CLASS_SCRIPT_DESERET, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5299 "Parser.cpp" + + break; + } + case 88: { + { +#line 644 "Parser.rl" + {te = p+1;{ +#line 644 "Parser.rl" + currentCls->add(CLASS_SCRIPT_DEVANAGARI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5310 "Parser.cpp" + + break; + } + case 89: { + { +#line 645 "Parser.rl" + {te = p+1;{ +#line 645 "Parser.rl" + currentCls->add(CLASS_SCRIPT_EGYPTIAN_HIEROGLYPHS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5321 "Parser.cpp" + + break; + } + case 90: { + { +#line 646 "Parser.rl" + {te = p+1;{ +#line 646 "Parser.rl" + currentCls->add(CLASS_SCRIPT_ETHIOPIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5332 "Parser.cpp" + + break; + } + case 91: { + { +#line 647 "Parser.rl" + {te = p+1;{ +#line 647 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GEORGIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5343 "Parser.cpp" + + break; + } + case 92: { + { +#line 648 "Parser.rl" + {te = p+1;{ +#line 648 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GLAGOLITIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5354 "Parser.cpp" + + break; + } + case 93: { + { +#line 649 "Parser.rl" + {te = p+1;{ +#line 649 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GOTHIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5365 "Parser.cpp" + + break; + } + case 94: { + { +#line 650 "Parser.rl" + {te = p+1;{ +#line 650 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GREEK, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5376 "Parser.cpp" + + break; + } + case 95: { + { +#line 651 "Parser.rl" + {te = p+1;{ +#line 651 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GUJARATI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5387 "Parser.cpp" + + break; + } + case 96: { + { +#line 652 "Parser.rl" + {te = p+1;{ +#line 652 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GURMUKHI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5398 "Parser.cpp" + + break; + } + case 97: { + { +#line 654 "Parser.rl" + {te = p+1;{ +#line 654 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HANGUL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5409 "Parser.cpp" + + break; + } + case 98: { + { +#line 655 "Parser.rl" + {te = p+1;{ +#line 655 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HANUNOO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5420 "Parser.cpp" + + break; + } + case 99: { + { +#line 656 "Parser.rl" + {te = p+1;{ +#line 656 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HEBREW, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5431 "Parser.cpp" + + break; + } + case 100: { + { +#line 657 "Parser.rl" + {te = p+1;{ +#line 657 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HIRAGANA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5442 "Parser.cpp" + + break; + } + case 101: { + { +#line 658 "Parser.rl" + {te = p+1;{ +#line 658 "Parser.rl" + currentCls->add(CLASS_SCRIPT_IMPERIAL_ARAMAIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5453 "Parser.cpp" + + break; + } + case 102: { + { +#line 659 "Parser.rl" + {te = p+1;{ +#line 659 "Parser.rl" + currentCls->add(CLASS_SCRIPT_INHERITED, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5464 "Parser.cpp" + + break; + } + case 103: { + { +#line 660 "Parser.rl" + {te = p+1;{ +#line 660 "Parser.rl" + currentCls->add(CLASS_SCRIPT_INSCRIPTIONAL_PAHLAVI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5475 "Parser.cpp" + + break; + } + case 104: { + { +#line 661 "Parser.rl" + {te = p+1;{ +#line 661 "Parser.rl" + currentCls->add(CLASS_SCRIPT_INSCRIPTIONAL_PARTHIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5486 "Parser.cpp" + + break; + } + case 105: { + { +#line 662 "Parser.rl" + {te = p+1;{ +#line 662 "Parser.rl" + currentCls->add(CLASS_SCRIPT_JAVANESE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5497 "Parser.cpp" + + break; + } + case 106: { + { +#line 663 "Parser.rl" + {te = p+1;{ +#line 663 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KAITHI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5508 "Parser.cpp" + + break; + } + case 107: { + { +#line 664 "Parser.rl" + {te = p+1;{ +#line 664 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KANNADA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5519 "Parser.cpp" + + break; + } + case 108: { + { +#line 665 "Parser.rl" + {te = p+1;{ +#line 665 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KATAKANA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5530 "Parser.cpp" + + break; + } + case 109: { + { +#line 666 "Parser.rl" + {te = p+1;{ +#line 666 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KAYAH_LI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5541 "Parser.cpp" + + break; + } + case 110: { + { +#line 667 "Parser.rl" + {te = p+1;{ +#line 667 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KHAROSHTHI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5552 "Parser.cpp" + + break; + } + case 111: { + { +#line 668 "Parser.rl" + {te = p+1;{ +#line 668 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KHMER, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5563 "Parser.cpp" + + break; + } + case 112: { + { +#line 669 "Parser.rl" + {te = p+1;{ +#line 669 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LAO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5574 "Parser.cpp" + + break; + } + case 113: { + { +#line 670 "Parser.rl" + {te = p+1;{ +#line 670 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LATIN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5585 "Parser.cpp" + + break; + } + case 114: { + { +#line 671 "Parser.rl" + {te = p+1;{ +#line 671 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LEPCHA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5596 "Parser.cpp" + + break; + } + case 115: { + { +#line 672 "Parser.rl" + {te = p+1;{ +#line 672 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LIMBU, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5607 "Parser.cpp" + + break; + } + case 116: { + { +#line 673 "Parser.rl" + {te = p+1;{ +#line 673 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LINEAR_B, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5618 "Parser.cpp" + + break; + } + case 117: { + { +#line 674 "Parser.rl" + {te = p+1;{ +#line 674 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LISU, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5629 "Parser.cpp" + + break; + } + case 118: { + { +#line 675 "Parser.rl" + {te = p+1;{ +#line 675 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LYCIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5640 "Parser.cpp" + + break; + } + case 119: { + { +#line 676 "Parser.rl" + {te = p+1;{ +#line 676 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LYDIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5651 "Parser.cpp" + + break; + } + case 120: { + { +#line 677 "Parser.rl" + {te = p+1;{ +#line 677 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MALAYALAM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5662 "Parser.cpp" + + break; + } + case 121: { + { +#line 678 "Parser.rl" + {te = p+1;{ +#line 678 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MANDAIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5673 "Parser.cpp" + + break; + } + case 122: { + { +#line 679 "Parser.rl" + {te = p+1;{ +#line 679 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MEETEI_MAYEK, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5684 "Parser.cpp" + + break; + } + case 123: { + { +#line 680 "Parser.rl" + {te = p+1;{ +#line 680 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MONGOLIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5695 "Parser.cpp" + + break; + } + case 124: { + { +#line 681 "Parser.rl" + {te = p+1;{ +#line 681 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MYANMAR, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5706 "Parser.cpp" + + break; + } + case 125: { + { +#line 682 "Parser.rl" + {te = p+1;{ +#line 682 "Parser.rl" + currentCls->add(CLASS_SCRIPT_NEW_TAI_LUE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5717 "Parser.cpp" + + break; + } + case 126: { + { +#line 683 "Parser.rl" + {te = p+1;{ +#line 683 "Parser.rl" + currentCls->add(CLASS_SCRIPT_NKO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5728 "Parser.cpp" + + break; + } + case 127: { + { +#line 684 "Parser.rl" + {te = p+1;{ +#line 684 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OGHAM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5739 "Parser.cpp" + + break; + } + case 128: { + { +#line 685 "Parser.rl" + {te = p+1;{ +#line 685 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OL_CHIKI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5750 "Parser.cpp" + + break; + } + case 129: { + { +#line 686 "Parser.rl" + {te = p+1;{ +#line 686 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OLD_ITALIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5761 "Parser.cpp" + + break; + } + case 130: { + { +#line 687 "Parser.rl" + {te = p+1;{ +#line 687 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OLD_PERSIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5772 "Parser.cpp" + + break; + } + case 131: { + { +#line 688 "Parser.rl" + {te = p+1;{ +#line 688 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OLD_SOUTH_ARABIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5783 "Parser.cpp" + + break; + } + case 132: { + { +#line 689 "Parser.rl" + {te = p+1;{ +#line 689 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OLD_TURKIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5794 "Parser.cpp" + + break; + } + case 133: { + { +#line 690 "Parser.rl" + {te = p+1;{ +#line 690 "Parser.rl" + currentCls->add(CLASS_SCRIPT_ORIYA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5805 "Parser.cpp" + + break; + } + case 134: { + { +#line 691 "Parser.rl" + {te = p+1;{ +#line 691 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OSMANYA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5816 "Parser.cpp" + + break; + } + case 135: { + { +#line 692 "Parser.rl" + {te = p+1;{ +#line 692 "Parser.rl" + currentCls->add(CLASS_SCRIPT_PHAGS_PA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5827 "Parser.cpp" + + break; + } + case 136: { + { +#line 693 "Parser.rl" + {te = p+1;{ +#line 693 "Parser.rl" + currentCls->add(CLASS_SCRIPT_PHOENICIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5838 "Parser.cpp" + + break; + } + case 137: { + { +#line 694 "Parser.rl" + {te = p+1;{ +#line 694 "Parser.rl" + currentCls->add(CLASS_SCRIPT_REJANG, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5849 "Parser.cpp" + + break; + } + case 138: { + { +#line 695 "Parser.rl" + {te = p+1;{ +#line 695 "Parser.rl" + currentCls->add(CLASS_SCRIPT_RUNIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5860 "Parser.cpp" + + break; + } + case 139: { + { +#line 696 "Parser.rl" + {te = p+1;{ +#line 696 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SAMARITAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5871 "Parser.cpp" + + break; + } + case 140: { + { +#line 697 "Parser.rl" + {te = p+1;{ +#line 697 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SAURASHTRA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5882 "Parser.cpp" + + break; + } + case 141: { + { +#line 698 "Parser.rl" + {te = p+1;{ +#line 698 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SHAVIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5893 "Parser.cpp" + + break; + } + case 142: { + { +#line 699 "Parser.rl" + {te = p+1;{ +#line 699 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SINHALA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5904 "Parser.cpp" + + break; + } + case 143: { + { +#line 700 "Parser.rl" + {te = p+1;{ +#line 700 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SUNDANESE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5915 "Parser.cpp" + + break; + } + case 144: { + { +#line 701 "Parser.rl" + {te = p+1;{ +#line 701 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SYLOTI_NAGRI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5926 "Parser.cpp" + + break; + } + case 145: { + { +#line 702 "Parser.rl" + {te = p+1;{ +#line 702 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SYRIAC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5937 "Parser.cpp" + + break; + } + case 146: { + { +#line 703 "Parser.rl" + {te = p+1;{ +#line 703 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAGALOG, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5948 "Parser.cpp" + + break; + } + case 147: { + { +#line 704 "Parser.rl" + {te = p+1;{ +#line 704 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAGBANWA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5959 "Parser.cpp" + + break; + } + case 148: { + { +#line 705 "Parser.rl" + {te = p+1;{ +#line 705 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAI_LE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5970 "Parser.cpp" + + break; + } + case 149: { + { +#line 706 "Parser.rl" + {te = p+1;{ +#line 706 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAI_THAM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5981 "Parser.cpp" + + break; + } + case 150: { + { +#line 707 "Parser.rl" + {te = p+1;{ +#line 707 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAI_VIET, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5992 "Parser.cpp" + + break; + } + case 151: { + { +#line 708 "Parser.rl" + {te = p+1;{ +#line 708 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAMIL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6003 "Parser.cpp" + + break; + } + case 152: { + { +#line 709 "Parser.rl" + {te = p+1;{ +#line 709 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TELUGU, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6014 "Parser.cpp" + + break; + } + case 153: { + { +#line 710 "Parser.rl" + {te = p+1;{ +#line 710 "Parser.rl" + currentCls->add(CLASS_SCRIPT_THAANA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6025 "Parser.cpp" + + break; + } + case 154: { + { +#line 711 "Parser.rl" + {te = p+1;{ +#line 711 "Parser.rl" + currentCls->add(CLASS_SCRIPT_THAI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6036 "Parser.cpp" + + break; + } + case 155: { + { +#line 712 "Parser.rl" + {te = p+1;{ +#line 712 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TIBETAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6047 "Parser.cpp" + + break; + } + case 156: { + { +#line 713 "Parser.rl" + {te = p+1;{ +#line 713 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TIFINAGH, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6058 "Parser.cpp" + + break; + } + case 157: { + { +#line 714 "Parser.rl" + {te = p+1;{ +#line 714 "Parser.rl" + currentCls->add(CLASS_SCRIPT_UGARITIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6069 "Parser.cpp" + + break; + } + case 158: { + { +#line 715 "Parser.rl" + {te = p+1;{ +#line 715 "Parser.rl" + currentCls->add(CLASS_SCRIPT_VAI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6080 "Parser.cpp" + + break; + } + case 159: { + { +#line 716 "Parser.rl" + {te = p+1;{ +#line 716 "Parser.rl" + currentCls->add(CLASS_SCRIPT_YI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6091 "Parser.cpp" + + break; + } + case 160: { + { +#line 717 "Parser.rl" + {te = p+1;{ +#line 717 "Parser.rl" + currentCls->add(CLASS_UCP_ANY, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6102 "Parser.cpp" + + break; + } + case 161: { + { +#line 718 "Parser.rl" + {te = p+1;{ +#line 718 "Parser.rl" + throw LocatedParseError("Unknown property"); } + }} + +#line 6113 "Parser.cpp" + + break; + } + case 162: { + { +#line 580 "Parser.rl" + {te = p;p = p - 1;{ +#line 580 "Parser.rl" + currentCls->add(CLASS_UCP_C, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6124 "Parser.cpp" + + break; + } + case 163: { + { +#line 584 "Parser.rl" + {te = p;p = p - 1;{ +#line 584 "Parser.rl" + currentCls->add(CLASS_UCP_CO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6135 "Parser.cpp" + + break; + } + case 164: { + { +#line 586 "Parser.rl" + {te = p;p = p - 1;{ +#line 586 "Parser.rl" + currentCls->add(CLASS_UCP_L, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6146 "Parser.cpp" + + break; + } + case 165: { + { +#line 593 "Parser.rl" + {te = p;p = p - 1;{ +#line 593 "Parser.rl" + currentCls->add(CLASS_UCP_M, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6157 "Parser.cpp" + + break; + } + case 166: { + { +#line 595 "Parser.rl" + {te = p;p = p - 1;{ +#line 595 "Parser.rl" + currentCls->add(CLASS_UCP_ME, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6168 "Parser.cpp" + + break; + } + case 167: { + { +#line 597 "Parser.rl" + {te = p;p = p - 1;{ +#line 597 "Parser.rl" + currentCls->add(CLASS_UCP_N, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6179 "Parser.cpp" + + break; + } + case 168: { + { +#line 601 "Parser.rl" + {te = p;p = p - 1;{ +#line 601 "Parser.rl" + currentCls->add(CLASS_UCP_P, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6190 "Parser.cpp" + + break; + } + case 169: { + { +#line 609 "Parser.rl" + {te = p;p = p - 1;{ +#line 609 "Parser.rl" + currentCls->add(CLASS_UCP_S, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6201 "Parser.cpp" + + break; + } + case 170: { + { +#line 614 "Parser.rl" + {te = p;p = p - 1;{ +#line 614 "Parser.rl" + currentCls->add(CLASS_UCP_Z, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6212 "Parser.cpp" + + break; + } + case 171: { + { +#line 653 "Parser.rl" + {te = p;p = p - 1;{ +#line 653 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6223 "Parser.cpp" + + break; + } + case 172: { + { +#line 718 "Parser.rl" + {te = p;p = p - 1;{ +#line 718 "Parser.rl" + throw LocatedParseError("Unknown property"); } + }} + +#line 6234 "Parser.cpp" + + break; + } + case 173: { + { +#line 580 "Parser.rl" + {p = ((te))-1; + { +#line 580 "Parser.rl" + currentCls->add(CLASS_UCP_C, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6246 "Parser.cpp" + + break; + } + case 174: { + { +#line 584 "Parser.rl" + {p = ((te))-1; + { +#line 584 "Parser.rl" + currentCls->add(CLASS_UCP_CO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6258 "Parser.cpp" + + break; + } + case 175: { + { +#line 586 "Parser.rl" + {p = ((te))-1; + { +#line 586 "Parser.rl" + currentCls->add(CLASS_UCP_L, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6270 "Parser.cpp" + + break; + } + case 176: { + { +#line 593 "Parser.rl" + {p = ((te))-1; + { +#line 593 "Parser.rl" + currentCls->add(CLASS_UCP_M, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6282 "Parser.cpp" + + break; + } + case 177: { + { +#line 595 "Parser.rl" + {p = ((te))-1; + { +#line 595 "Parser.rl" + currentCls->add(CLASS_UCP_ME, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6294 "Parser.cpp" + + break; + } + case 178: { + { +#line 597 "Parser.rl" + {p = ((te))-1; + { +#line 597 "Parser.rl" + currentCls->add(CLASS_UCP_N, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6306 "Parser.cpp" + + break; + } + case 179: { + { +#line 601 "Parser.rl" + {p = ((te))-1; + { +#line 601 "Parser.rl" + currentCls->add(CLASS_UCP_P, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6318 "Parser.cpp" + + break; + } + case 180: { + { +#line 609 "Parser.rl" + {p = ((te))-1; + { +#line 609 "Parser.rl" + currentCls->add(CLASS_UCP_S, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6330 "Parser.cpp" + + break; + } + case 181: { + { +#line 653 "Parser.rl" + {p = ((te))-1; + { +#line 653 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6342 "Parser.cpp" + + break; + } + case 182: { + { +#line 718 "Parser.rl" + {p = ((te))-1; + { +#line 718 "Parser.rl" + throw LocatedParseError("Unknown property"); } + }} + +#line 6354 "Parser.cpp" + + break; + } + case 183: { + { +#line 733 "Parser.rl" + {te = p+1;{ +#line 733 "Parser.rl" + + currentCls->add(CLASS_UCP_C, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6372 "Parser.cpp" + + break; + } + case 184: { + { +#line 741 "Parser.rl" + {te = p+1;{ +#line 741 "Parser.rl" + + currentCls->add(CLASS_UCP_L, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6390 "Parser.cpp" + + break; + } + case 185: { + { +#line 749 "Parser.rl" + {te = p+1;{ +#line 749 "Parser.rl" + + currentCls->add(CLASS_UCP_M, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6408 "Parser.cpp" + + break; + } + case 186: { + { +#line 757 "Parser.rl" + {te = p+1;{ +#line 757 "Parser.rl" + + currentCls->add(CLASS_UCP_N, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6426 "Parser.cpp" + + break; + } + case 187: { + { +#line 765 "Parser.rl" + {te = p+1;{ +#line 765 "Parser.rl" + + currentCls->add(CLASS_UCP_P, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6444 "Parser.cpp" + + break; + } + case 188: { + { +#line 773 "Parser.rl" + {te = p+1;{ +#line 773 "Parser.rl" + + currentCls->add(CLASS_UCP_S, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6462 "Parser.cpp" + + break; + } + case 189: { + { +#line 781 "Parser.rl" + {te = p+1;{ +#line 781 "Parser.rl" + + currentCls->add(CLASS_UCP_Z, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6480 "Parser.cpp" + + break; + } + case 190: { + { +#line 790 "Parser.rl" + {te = p+1;{ +#line 790 "Parser.rl" + throw LocatedParseError("Unknown property"); } + }} + +#line 6491 "Parser.cpp" + + break; + } + case 191: { + { +#line 796 "Parser.rl" + {te = p+1;{ +#line 796 "Parser.rl" + + throw LocatedParseError("Unsupported POSIX collating " + "element"); + } + }} + +#line 6505 "Parser.cpp" + + break; + } + case 192: { + { +#line 803 "Parser.rl" + {te = p+1;{ +#line 803 "Parser.rl" + + currentCls->add(CLASS_ALNUM, false); + } + }} + +#line 6518 "Parser.cpp" + + break; + } + case 193: { + { +#line 806 "Parser.rl" + {te = p+1;{ +#line 806 "Parser.rl" + + currentCls->add(CLASS_ALNUM, true); + } + }} + +#line 6531 "Parser.cpp" + + break; + } + case 194: { + { +#line 809 "Parser.rl" + {te = p+1;{ +#line 809 "Parser.rl" + + currentCls->add(CLASS_ALPHA, false); + } + }} + +#line 6544 "Parser.cpp" + + break; + } + case 195: { + { +#line 812 "Parser.rl" + {te = p+1;{ +#line 812 "Parser.rl" + + currentCls->add(CLASS_ALPHA, true); + } + }} + +#line 6557 "Parser.cpp" + + break; + } + case 196: { + { +#line 815 "Parser.rl" + {te = p+1;{ +#line 815 "Parser.rl" + + currentCls->add(CLASS_ASCII, false); + } + }} + +#line 6570 "Parser.cpp" + + break; + } + case 197: { + { +#line 818 "Parser.rl" + {te = p+1;{ +#line 818 "Parser.rl" + + currentCls->add(CLASS_ASCII, true); + } + }} + +#line 6583 "Parser.cpp" + + break; + } + case 198: { + { +#line 821 "Parser.rl" + {te = p+1;{ +#line 821 "Parser.rl" + + currentCls->add(CLASS_BLANK, false); + } + }} + +#line 6596 "Parser.cpp" + + break; + } + case 199: { + { +#line 824 "Parser.rl" + {te = p+1;{ +#line 824 "Parser.rl" + + currentCls->add(CLASS_BLANK, true); + } + }} + +#line 6609 "Parser.cpp" + + break; + } + case 200: { + { +#line 827 "Parser.rl" + {te = p+1;{ +#line 827 "Parser.rl" + + currentCls->add(CLASS_CNTRL, false); + } + }} + +#line 6622 "Parser.cpp" + + break; + } + case 201: { + { +#line 830 "Parser.rl" + {te = p+1;{ +#line 830 "Parser.rl" + + currentCls->add(CLASS_CNTRL, true); + } + }} + +#line 6635 "Parser.cpp" + + break; + } + case 202: { + { +#line 833 "Parser.rl" + {te = p+1;{ +#line 833 "Parser.rl" + + currentCls->add(CLASS_DIGIT, false); + } + }} + +#line 6648 "Parser.cpp" + + break; + } + case 203: { + { +#line 836 "Parser.rl" + {te = p+1;{ +#line 836 "Parser.rl" + + currentCls->add(CLASS_DIGIT, true); + } + }} + +#line 6661 "Parser.cpp" + + break; + } + case 204: { + { +#line 839 "Parser.rl" + {te = p+1;{ +#line 839 "Parser.rl" + + currentCls->add(CLASS_GRAPH, false); + } + }} + +#line 6674 "Parser.cpp" + + break; + } + case 205: { + { +#line 842 "Parser.rl" + {te = p+1;{ +#line 842 "Parser.rl" + + currentCls->add(CLASS_GRAPH, true); + } + }} + +#line 6687 "Parser.cpp" + + break; + } + case 206: { + { +#line 845 "Parser.rl" + {te = p+1;{ +#line 845 "Parser.rl" + + currentCls->add(CLASS_LOWER, false); + } + }} + +#line 6700 "Parser.cpp" + + break; + } + case 207: { + { +#line 848 "Parser.rl" + {te = p+1;{ +#line 848 "Parser.rl" + + currentCls->add(CLASS_LOWER, true); + } + }} + +#line 6713 "Parser.cpp" + + break; + } + case 208: { + { +#line 851 "Parser.rl" + {te = p+1;{ +#line 851 "Parser.rl" + + currentCls->add(CLASS_PRINT, false); + } + }} + +#line 6726 "Parser.cpp" + + break; + } + case 209: { + { +#line 854 "Parser.rl" + {te = p+1;{ +#line 854 "Parser.rl" + + currentCls->add(CLASS_PRINT, true); + } + }} + +#line 6739 "Parser.cpp" + + break; + } + case 210: { + { +#line 857 "Parser.rl" + {te = p+1;{ +#line 857 "Parser.rl" + + currentCls->add(CLASS_PUNCT, false); + } + }} + +#line 6752 "Parser.cpp" + + break; + } + case 211: { + { +#line 860 "Parser.rl" + {te = p+1;{ +#line 860 "Parser.rl" + + currentCls->add(CLASS_PUNCT, true); + } + }} + +#line 6765 "Parser.cpp" + + break; + } + case 212: { + { +#line 864 "Parser.rl" + {te = p+1;{ +#line 864 "Parser.rl" + + currentCls->add(CLASS_SPACE, false); + } + }} + +#line 6778 "Parser.cpp" + + break; + } + case 213: { + { +#line 867 "Parser.rl" + {te = p+1;{ +#line 867 "Parser.rl" + + currentCls->add(CLASS_SPACE, true); + } + }} + +#line 6791 "Parser.cpp" + + break; + } + case 214: { + { +#line 870 "Parser.rl" + {te = p+1;{ +#line 870 "Parser.rl" + + currentCls->add(CLASS_UPPER, false); + } + }} + +#line 6804 "Parser.cpp" + + break; + } + case 215: { + { +#line 873 "Parser.rl" + {te = p+1;{ +#line 873 "Parser.rl" + + currentCls->add(CLASS_UPPER, true); + } + }} + +#line 6817 "Parser.cpp" + + break; + } + case 216: { + { +#line 876 "Parser.rl" + {te = p+1;{ +#line 876 "Parser.rl" + + currentCls->add(CLASS_WORD, false); + } + }} + +#line 6830 "Parser.cpp" + + break; + } + case 217: { + { +#line 879 "Parser.rl" + {te = p+1;{ +#line 879 "Parser.rl" + + currentCls->add(CLASS_WORD, true); + } + }} + +#line 6843 "Parser.cpp" + + break; + } + case 218: { + { +#line 882 "Parser.rl" + {te = p+1;{ +#line 882 "Parser.rl" + + currentCls->add(CLASS_XDIGIT, false); + } + }} + +#line 6856 "Parser.cpp" + + break; + } + case 219: { + { +#line 885 "Parser.rl" + {te = p+1;{ +#line 885 "Parser.rl" + + currentCls->add(CLASS_XDIGIT, true); + } + }} + +#line 6869 "Parser.cpp" + + break; + } + case 220: { + { +#line 890 "Parser.rl" + {te = p+1;{ +#line 890 "Parser.rl" + + throw LocatedParseError("Invalid POSIX named class"); + } + }} + +#line 6882 "Parser.cpp" + + break; + } + case 221: { + { +#line 893 "Parser.rl" + {te = p+1;{ +#line 893 "Parser.rl" + + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 843;goto _again;}} + }} + +#line 6902 "Parser.cpp" + + break; + } + case 222: { + { +#line 896 "Parser.rl" + {te = p+1;{ +#line 896 "Parser.rl" + /*noop*/} + }} + +#line 6913 "Parser.cpp" + + break; + } + case 223: { + { +#line 898 "Parser.rl" + {te = p+1;{ +#line 898 "Parser.rl" + + currentCls->add('\x08'); + } + }} + +#line 6926 "Parser.cpp" + + break; + } + case 224: { + { +#line 902 "Parser.rl" + {te = p+1;{ +#line 902 "Parser.rl" + + currentCls->add('\x09'); + } + }} + +#line 6939 "Parser.cpp" + + break; + } + case 225: { + { +#line 906 "Parser.rl" + {te = p+1;{ +#line 906 "Parser.rl" + + currentCls->add('\x0a'); + } + }} + +#line 6952 "Parser.cpp" + + break; + } + case 226: { + { +#line 910 "Parser.rl" + {te = p+1;{ +#line 910 "Parser.rl" + + currentCls->add('\x0d'); + } + }} + +#line 6965 "Parser.cpp" + + break; + } + case 227: { + { +#line 914 "Parser.rl" + {te = p+1;{ +#line 914 "Parser.rl" + + currentCls->add('\x0c'); + } + }} + +#line 6978 "Parser.cpp" + + break; + } + case 228: { + { +#line 918 "Parser.rl" + {te = p+1;{ +#line 918 "Parser.rl" + + currentCls->add('\x07'); + } + }} + +#line 6991 "Parser.cpp" + + break; + } + case 229: { + { +#line 922 "Parser.rl" + {te = p+1;{ +#line 922 "Parser.rl" + + currentCls->add('\x1b'); + } + }} + +#line 7004 "Parser.cpp" + + break; + } + case 230: { + { +#line 926 "Parser.rl" + {te = p+1;{ +#line 926 "Parser.rl" + + currentCls->add(CLASS_HORZ, false); + } + }} + +#line 7017 "Parser.cpp" + + break; + } + case 231: { + { +#line 930 "Parser.rl" + {te = p+1;{ +#line 930 "Parser.rl" + + currentCls->add(CLASS_HORZ, true); + } + }} + +#line 7030 "Parser.cpp" + + break; + } + case 232: { + { +#line 934 "Parser.rl" + {te = p+1;{ +#line 934 "Parser.rl" + + currentCls->add(CLASS_VERT, false); + } + }} + +#line 7043 "Parser.cpp" + + break; + } + case 233: { + { +#line 938 "Parser.rl" + {te = p+1;{ +#line 938 "Parser.rl" + + currentCls->add(CLASS_VERT, true); + } + }} + +#line 7056 "Parser.cpp" + + break; + } + case 234: { + { +#line 942 "Parser.rl" + {te = p+1;{ +#line 942 "Parser.rl" + + negated = false; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 559;goto _again;}} + }} + +#line 7078 "Parser.cpp" + + break; + } + case 235: { + { +#line 948 "Parser.rl" + {te = p+1;{ +#line 948 "Parser.rl" + + negated = false; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 818;goto _again;}} + }} + +#line 7100 "Parser.cpp" + + break; + } + case 236: { + { +#line 954 "Parser.rl" + {te = p+1;{ +#line 954 "Parser.rl" + + negated = true; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 559;goto _again;}} + }} + +#line 7122 "Parser.cpp" + + break; + } + case 237: { + { +#line 960 "Parser.rl" + {te = p+1;{ +#line 960 "Parser.rl" + + negated = true; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 818;goto _again;}} + }} + +#line 7144 "Parser.cpp" + + break; + } + case 238: { + { +#line 970 "Parser.rl" + {te = p+1;{ +#line 970 "Parser.rl" + + currentCls->add(octAccumulator); + } + }} + +#line 7157 "Parser.cpp" + + break; + } + case 239: { + { +#line 973 "Parser.rl" + {te = p+1;{ +#line 973 "Parser.rl" + + currentCls->add(octAccumulator); + } + }} + +#line 7170 "Parser.cpp" + + break; + } + case 240: { + { +#line 977 "Parser.rl" + {te = p+1;{ +#line 977 "Parser.rl" + + string oct(ts + 3, te - ts - 4); + unsigned long val; + try { + val = stoul(oct, nullptr, 8); + } catch (const std::out_of_range &) { + val = MAX_UNICODE + 1; + } + if ((!mode.utf8 && val > 255) || val > MAX_UNICODE) { + throw LocatedParseError("Value in \\o{...} sequence is too large"); + } + currentCls->add((unichar)val); + } + }} + +#line 7193 "Parser.cpp" + + break; + } + case 241: { + { +#line 997 "Parser.rl" + {te = p+1;{ +#line 997 "Parser.rl" + + currentCls->add(accumulator); + } + }} + +#line 7206 "Parser.cpp" + + break; + } + case 242: { + { +#line 1001 "Parser.rl" + {te = p+1;{ +#line 1001 "Parser.rl" + + // whatever we found here + currentCls->add(*(ts + 1)); + + } + }} + +#line 7221 "Parser.cpp" + + break; + } + case 243: { + { +#line 1007 "Parser.rl" + {te = p+1;{ +#line 1007 "Parser.rl" + + string hex(ts + 3, te - ts - 4); + unsigned long val; + try { + val = stoul(hex, nullptr, 16); + } catch (const std::out_of_range &) { + val = MAX_UNICODE + 1; + } + if (val > MAX_UNICODE) { + throw LocatedParseError("Value in \\x{...} sequence is too large"); + } + currentCls->add((unichar)val); + } + }} + +#line 7244 "Parser.cpp" + + break; + } + case 244: { + { +#line 1025 "Parser.rl" + {te = p+1;{ +#line 1025 "Parser.rl" + + if (te - ts < 3) { + assert(te - ts == 2); + throw LocatedParseError(SLASH_C_ERROR); + } else { + assert(te - ts == 3); + currentCls->add(decodeCtrl(ts[2])); + } + } + }} + +#line 7263 "Parser.cpp" + + break; + } + case 245: { + { +#line 1035 "Parser.rl" + {te = p+1;{ +#line 1035 "Parser.rl" + + currentCls->add(CLASS_WORD, false); + } + }} + +#line 7276 "Parser.cpp" + + break; + } + case 246: { + { +#line 1039 "Parser.rl" + {te = p+1;{ +#line 1039 "Parser.rl" + + currentCls->add(CLASS_WORD, true); + } + }} + +#line 7289 "Parser.cpp" + + break; + } + case 247: { + { +#line 1043 "Parser.rl" + {te = p+1;{ +#line 1043 "Parser.rl" + + currentCls->add(CLASS_SPACE, false); + } + }} + +#line 7302 "Parser.cpp" + + break; + } + case 248: { + { +#line 1047 "Parser.rl" + {te = p+1;{ +#line 1047 "Parser.rl" + + currentCls->add(CLASS_SPACE, true); + } + }} + +#line 7315 "Parser.cpp" + + break; + } + case 249: { + { +#line 1051 "Parser.rl" + {te = p+1;{ +#line 1051 "Parser.rl" + + currentCls->add(CLASS_DIGIT, false); + } + }} + +#line 7328 "Parser.cpp" + + break; + } + case 250: { + { +#line 1055 "Parser.rl" + {te = p+1;{ +#line 1055 "Parser.rl" + + currentCls->add(CLASS_DIGIT, true); + } + }} + +#line 7341 "Parser.cpp" + + break; + } + case 251: { + { +#line 1058 "Parser.rl" + {te = p+1;{ +#line 1058 "Parser.rl" + + currentCls->addDash(); + } + }} + +#line 7354 "Parser.cpp" + + break; + } + case 252: { + { +#line 276 "Parser.rl" + {te = p+1;{ +#line 276 "Parser.rl" + + ostringstream str; + str << "'\\" << *(ts + 1) << "' at index " << ts - ptr + << " not supported in a character class."; + throw ParseError(str.str()); + } + }} + +#line 7370 "Parser.cpp" + + break; + } + case 253: { + { +#line 276 "Parser.rl" + {te = p+1;{ +#line 276 "Parser.rl" + + ostringstream str; + str << "'\\" << *(ts + 1) << "' at index " << ts - ptr + << " not supported in a character class."; + throw ParseError(str.str()); + } + }} + +#line 7386 "Parser.cpp" + + break; + } + case 254: { + { +#line 276 "Parser.rl" + {te = p+1;{ +#line 276 "Parser.rl" + + ostringstream str; + str << "'\\" << *(ts + 1) << "' at index " << ts - ptr + << " not supported in a character class."; + throw ParseError(str.str()); + } + }} + +#line 7402 "Parser.cpp" + + break; + } + case 255: { + { +#line 1075 "Parser.rl" + {te = p+1;{ +#line 1075 "Parser.rl" + + // add the literal char + currentCls->add(*(ts + 1)); + } + }} + +#line 7416 "Parser.cpp" + + break; + } + case 256: { + { +#line 1081 "Parser.rl" + {te = p+1;{ +#line 1081 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint2c(ts)); + } + }} + +#line 7430 "Parser.cpp" + + break; + } + case 257: { + { +#line 1086 "Parser.rl" + {te = p+1;{ +#line 1086 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint3c(ts)); + } + }} + +#line 7444 "Parser.cpp" + + break; + } + case 258: { + { +#line 1091 "Parser.rl" + {te = p+1;{ +#line 1091 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint4c(ts)); + } + }} + +#line 7458 "Parser.cpp" + + break; + } + case 259: { + { +#line 1096 "Parser.rl" + {te = p+1;{ +#line 1096 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7472 "Parser.cpp" + + break; + } + case 260: { + { +#line 1102 "Parser.rl" + {te = p+1;{ +#line 1102 "Parser.rl" + + currentCls->add((u8)*ts); + } + }} + +#line 7485 "Parser.cpp" + + break; + } + case 261: { + { +#line 1106 "Parser.rl" + {te = p+1;{ +#line 1106 "Parser.rl" + + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + inCharClass = false; + {cs = 746;goto _again;}} + }} + +#line 7500 "Parser.cpp" + + break; + } + case 262: { + { +#line 966 "Parser.rl" + {te = p;p = p - 1;{ +#line 966 "Parser.rl" + throw LocatedParseError("Malformed property"); } + }} + +#line 7511 "Parser.cpp" + + break; + } + case 263: { + { +#line 967 "Parser.rl" + {te = p;p = p - 1;{ +#line 967 "Parser.rl" + throw LocatedParseError("Malformed property"); } + }} + +#line 7522 "Parser.cpp" + + break; + } + case 264: { + { +#line 970 "Parser.rl" + {te = p;p = p - 1;{ +#line 970 "Parser.rl" + + currentCls->add(octAccumulator); + } + }} + +#line 7535 "Parser.cpp" + + break; + } + case 265: { + { +#line 973 "Parser.rl" + {te = p;p = p - 1;{ +#line 973 "Parser.rl" + + currentCls->add(octAccumulator); + } + }} + +#line 7548 "Parser.cpp" + + break; + } + case 266: { + { +#line 992 "Parser.rl" + {te = p;p = p - 1;{ +#line 992 "Parser.rl" + + throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); + } + }} + +#line 7561 "Parser.cpp" + + break; + } + case 267: { + { +#line 997 "Parser.rl" + {te = p;p = p - 1;{ +#line 997 "Parser.rl" + + currentCls->add(accumulator); + } + }} + +#line 7574 "Parser.cpp" + + break; + } + case 268: { + { +#line 1021 "Parser.rl" + {te = p;p = p - 1;{ +#line 1021 "Parser.rl" + + throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); + } + }} + +#line 7587 "Parser.cpp" + + break; + } + case 269: { + { +#line 1025 "Parser.rl" + {te = p;p = p - 1;{ +#line 1025 "Parser.rl" + + if (te - ts < 3) { + assert(te - ts == 2); + throw LocatedParseError(SLASH_C_ERROR); + } else { + assert(te - ts == 3); + currentCls->add(decodeCtrl(ts[2])); + } + } + }} + +#line 7606 "Parser.cpp" + + break; + } + case 270: { + { +#line 1096 "Parser.rl" + {te = p;p = p - 1;{ +#line 1096 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7620 "Parser.cpp" + + break; + } + case 271: { + { +#line 1102 "Parser.rl" + {te = p;p = p - 1;{ +#line 1102 "Parser.rl" + + currentCls->add((u8)*ts); + } + }} + +#line 7633 "Parser.cpp" + + break; + } + case 272: { + { +#line 992 "Parser.rl" + {p = ((te))-1; + { +#line 992 "Parser.rl" + + throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); + } + }} + +#line 7647 "Parser.cpp" + + break; + } + case 273: { + { +#line 1021 "Parser.rl" + {p = ((te))-1; + { +#line 1021 "Parser.rl" + + throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); + } + }} + +#line 7661 "Parser.cpp" + + break; + } + case 274: { + { +#line 1096 "Parser.rl" + {p = ((te))-1; + { +#line 1096 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7676 "Parser.cpp" + + break; + } + case 275: { + { +#line 1102 "Parser.rl" + {p = ((te))-1; + { +#line 1102 "Parser.rl" + + currentCls->add((u8)*ts); + } + }} + +#line 7690 "Parser.cpp" + + break; + } + case 276: { + { +#line 1120 "Parser.rl" + {te = p+1;{ +#line 1120 "Parser.rl" + + if (currentCls->isNegated()) { + // Already seen a caret; the second one is not a meta-character. + inCharClassEarly = false; + {p = p - 1; } {cs = 819;goto _again;}} else { + currentCls->negate(); + // Note: we cannot switch off inCharClassEarly here, as /[^]]/ + // needs to use the right square bracket path below. + } + } + }} + +#line 7710 "Parser.cpp" + + break; + } + case 277: { + { +#line 1133 "Parser.rl" + {te = p+1;{ +#line 1133 "Parser.rl" + + currentCls->add(']'); + inCharClassEarly = false; + } + }} + +#line 7724 "Parser.cpp" + + break; + } + case 278: { + { +#line 1138 "Parser.rl" + {te = p+1;{ +#line 1138 "Parser.rl" + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 843;goto _again;}} + }} + +#line 7743 "Parser.cpp" + + break; + } + case 279: { + { +#line 1139 "Parser.rl" + {te = p+1;{ +#line 1139 "Parser.rl" + /*noop*/} + }} + +#line 7754 "Parser.cpp" + + break; + } + case 280: { + { +#line 1142 "Parser.rl" + {te = p+1;{ +#line 1142 "Parser.rl" + + inCharClassEarly = false; + {p = p - 1; } + {cs = 819;goto _again;}} + }} + +#line 7768 "Parser.cpp" + + break; + } + case 281: { + { +#line 1142 "Parser.rl" + {te = p;p = p - 1;{ +#line 1142 "Parser.rl" + + inCharClassEarly = false; + {p = p - 1; } + {cs = 819;goto _again;}} + }} + +#line 7782 "Parser.cpp" + + break; + } + case 282: { + { +#line 1154 "Parser.rl" + {te = p+1;{ +#line 1154 "Parser.rl" + + {cs = 746;goto _again;}} + }} + +#line 7794 "Parser.cpp" + + break; + } + case 283: { + { +#line 1159 "Parser.rl" + {te = p+1;{ +#line 1159 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint2c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 7812 "Parser.cpp" + + break; + } + case 284: { + { +#line 1168 "Parser.rl" + {te = p+1;{ +#line 1168 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint3c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 7830 "Parser.cpp" + + break; + } + case 285: { + { +#line 1177 "Parser.rl" + {te = p+1;{ +#line 1177 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint4c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 7848 "Parser.cpp" + + break; + } + case 286: { + { +#line 1186 "Parser.rl" + {te = p+1;{ +#line 1186 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7862 "Parser.cpp" + + break; + } + case 287: { + { +#line 1192 "Parser.rl" + {te = p+1;{ +#line 1192 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 7875 "Parser.cpp" + + break; + } + case 288: { + { +#line 1186 "Parser.rl" + {te = p;p = p - 1;{ +#line 1186 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7889 "Parser.cpp" + + break; + } + case 289: { + { +#line 1192 "Parser.rl" + {te = p;p = p - 1;{ +#line 1192 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 7902 "Parser.cpp" + + break; + } + case 290: { + { +#line 1186 "Parser.rl" + {p = ((te))-1; + { +#line 1186 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7917 "Parser.cpp" + + break; + } + case 291: { + { +#line 1202 "Parser.rl" + {te = p+1;{ +#line 1202 "Parser.rl" + + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 7930 "Parser.cpp" + + break; + } + case 292: { + { +#line 1207 "Parser.rl" + {te = p+1;{ +#line 1207 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint2c(ts)); + inCharClassEarly = false; + } + }} + +#line 7945 "Parser.cpp" + + break; + } + case 293: { + { +#line 1213 "Parser.rl" + {te = p+1;{ +#line 1213 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint3c(ts)); + inCharClassEarly = false; + } + }} + +#line 7960 "Parser.cpp" + + break; + } + case 294: { + { +#line 1219 "Parser.rl" + {te = p+1;{ +#line 1219 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint4c(ts)); + inCharClassEarly = false; + } + }} + +#line 7975 "Parser.cpp" + + break; + } + case 295: { + { +#line 1225 "Parser.rl" + {te = p+1;{ +#line 1225 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7989 "Parser.cpp" + + break; + } + case 296: { + { +#line 1231 "Parser.rl" + {te = p+1;{ +#line 1231 "Parser.rl" + + currentCls->add(*ts); + inCharClassEarly = false; + } + }} + +#line 8003 "Parser.cpp" + + break; + } + case 297: { + { +#line 1225 "Parser.rl" + {te = p;p = p - 1;{ +#line 1225 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 8017 "Parser.cpp" + + break; + } + case 298: { + { +#line 1231 "Parser.rl" + {te = p;p = p - 1;{ +#line 1231 "Parser.rl" + + currentCls->add(*ts); + inCharClassEarly = false; + } + }} + +#line 8031 "Parser.cpp" + + break; + } + case 299: { + { +#line 1225 "Parser.rl" + {p = ((te))-1; + { +#line 1225 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 8046 "Parser.cpp" + + break; + } + case 300: { + { +#line 1243 "Parser.rl" + {te = p+1;{ +#line 1243 "Parser.rl" + inComment = false; {cs = 746;goto _again;}} + }} + +#line 8057 "Parser.cpp" + + break; + } + case 301: { + { +#line 1 "-" + {te = p+1;}} + +#line 8065 "Parser.cpp" + + break; + } + case 302: { + { +#line 1255 "Parser.rl" + {te = p+1;{ +#line 1255 "Parser.rl" + inComment = false; {cs = 746;goto _again;}} + }} + +#line 8076 "Parser.cpp" + + break; + } + case 303: { + { +#line 1 "-" + {te = p+1;}} + +#line 8084 "Parser.cpp" + + break; + } + case 304: { + { +#line 1491 "Parser.rl" + {act = 288;}} + +#line 8092 "Parser.cpp" + + break; + } + case 305: { + { +#line 1508 "Parser.rl" + {act = 290;}} + +#line 8100 "Parser.cpp" + + break; + } + case 306: { + { +#line 1737 "Parser.rl" + {act = 330;}} + +#line 8108 "Parser.cpp" + + break; + } + case 307: { + { +#line 362 "Parser.rl" + {te = p+1;{ +#line 362 "Parser.rl" + + if (sequences.empty()) { + throw LocatedParseError("Unmatched parentheses"); + } + currentSeq->finalize(); + POP_SEQUENCE; + } + }} + +#line 8125 "Parser.cpp" + + break; + } + case 308: { + { +#line 1274 "Parser.rl" + {te = p+1;{ +#line 1274 "Parser.rl" + + currentSeq->addAlternation(); + } + }} + +#line 8138 "Parser.cpp" + + break; + } + case 309: { + { +#line 1279 "Parser.rl" + {te = p+1;{ +#line 1279 "Parser.rl" + + throw LocatedParseError("POSIX named classes are only " + "supported inside a class"); + } + }} + +#line 8152 "Parser.cpp" + + break; + } + case 310: { + { +#line 1286 "Parser.rl" + {te = p+1;{ +#line 1286 "Parser.rl" + + throw LocatedParseError("Unsupported POSIX collating " + "element"); + } + }} + +#line 8166 "Parser.cpp" + + break; + } + case 311: { + { +#line 1293 "Parser.rl" + {te = p+1;{ +#line 1293 "Parser.rl" + + {cs = 838;goto _again;}} + }} + +#line 8178 "Parser.cpp" + + break; + } + case 312: { + { +#line 1297 "Parser.rl" + {te = p+1;{ +#line 1297 "Parser.rl" + /* noop */ } + }} + +#line 8189 "Parser.cpp" + + break; + } + case 313: { + { +#line 1299 "Parser.rl" + {te = p+1;{ +#line 1299 "Parser.rl" + + currentSeq->addComponent(generateComponent(CLASS_ANY, false, mode)); + } + }} + +#line 8202 "Parser.cpp" + + break; + } + case 314: { + { +#line 1303 "Parser.rl" + {te = p+1;{ +#line 1303 "Parser.rl" + + if (mode.utf8) { + throw LocatedParseError("\\C is unsupported in UTF8"); + } + currentSeq->addComponent(std::make_unique()); + } + }} + +#line 8218 "Parser.cpp" + + break; + } + case 315: { + { +#line 1317 "Parser.rl" + {te = p+1;{ +#line 1317 "Parser.rl" + + if (!currentSeq->addRepeat(0, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_NONGREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 8234 "Parser.cpp" + + break; + } + case 316: { + { +#line 1324 "Parser.rl" + {te = p+1;{ +#line 1324 "Parser.rl" + + if (!currentSeq->addRepeat(0, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_POSSESSIVE)) { + throwInvalidRepeat(); + } + } + }} + +#line 8250 "Parser.cpp" + + break; + } + case 317: { + { +#line 1338 "Parser.rl" + {te = p+1;{ +#line 1338 "Parser.rl" + + if (!currentSeq->addRepeat(1, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_NONGREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 8266 "Parser.cpp" + + break; + } + case 318: { + { +#line 1345 "Parser.rl" + {te = p+1;{ +#line 1345 "Parser.rl" + + if (!currentSeq->addRepeat(1, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_POSSESSIVE)) { + throwInvalidRepeat(); + } + } + }} + +#line 8282 "Parser.cpp" + + break; + } + case 319: { + { +#line 1359 "Parser.rl" + {te = p+1;{ +#line 1359 "Parser.rl" + + if (!currentSeq->addRepeat( + 0, 1, ComponentRepeat::REPEAT_NONGREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 8298 "Parser.cpp" + + break; + } + case 320: { + { +#line 1366 "Parser.rl" + {te = p+1;{ +#line 1366 "Parser.rl" + + if (!currentSeq->addRepeat( + 0, 1, ComponentRepeat::REPEAT_POSSESSIVE)) { + throwInvalidRepeat(); + } + } + }} + +#line 8314 "Parser.cpp" + + break; + } + case 321: { + { +#line 1383 "Parser.rl" + {te = p+1;{ +#line 1383 "Parser.rl" + + if (repeatN > repeatM || repeatM == 0) { + throwInvalidRepeat(); + } else if (!currentSeq->addRepeat( + repeatN, repeatM, + ComponentRepeat::REPEAT_NONGREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 8333 "Parser.cpp" + + break; + } + case 322: { + { +#line 1393 "Parser.rl" + {te = p+1;{ +#line 1393 "Parser.rl" + + if (repeatN > repeatM || repeatM == 0) { + throwInvalidRepeat(); + } else if (!currentSeq->addRepeat( + repeatN, repeatM, + ComponentRepeat::REPEAT_POSSESSIVE)) { + throwInvalidRepeat(); + } + } + }} + +#line 8352 "Parser.cpp" + + break; + } + case 323: { + { +#line 322 "Parser.rl" + {te = p+1;{ +#line 322 "Parser.rl" + + inComment = true; + {cs = 849;goto _again;}} + }} + +#line 8365 "Parser.cpp" + + break; + } + case 324: { + { +#line 1410 "Parser.rl" + {te = p+1;{ +#line 1410 "Parser.rl" + {p = p - 1; } {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 787;goto _again;}} + }} + +#line 8384 "Parser.cpp" + + break; + } + case 325: { + { +#line 1414 "Parser.rl" + {te = p+1;{ +#line 1414 "Parser.rl" + assert(0); {p += 1; goto _out; } } + }} + +#line 8395 "Parser.cpp" + + break; + } + case 326: { + { +#line 1421 "Parser.rl" + {te = p+1;{ +#line 1421 "Parser.rl" + + auto bound = mode.multiline ? ComponentBoundary::BEGIN_LINE + : ComponentBoundary::BEGIN_STRING; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8410 "Parser.cpp" + + break; + } + case 327: { + { +#line 1428 "Parser.rl" + {te = p+1;{ +#line 1428 "Parser.rl" + + auto bound = mode.multiline ? ComponentBoundary::END_LINE + : ComponentBoundary::END_STRING_OPTIONAL_LF; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8425 "Parser.cpp" + + break; + } + case 328: { + { +#line 1434 "Parser.rl" + {te = p+1;{ +#line 1434 "Parser.rl" + + auto bound = ComponentBoundary::BEGIN_STRING; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8439 "Parser.cpp" + + break; + } + case 329: { + { +#line 1439 "Parser.rl" + {te = p+1;{ +#line 1439 "Parser.rl" + + auto bound = ComponentBoundary::END_STRING_OPTIONAL_LF; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8453 "Parser.cpp" + + break; + } + case 330: { + { +#line 1444 "Parser.rl" + {te = p+1;{ +#line 1444 "Parser.rl" + + auto bound = ComponentBoundary::END_STRING; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8467 "Parser.cpp" + + break; + } + case 331: { + { +#line 1449 "Parser.rl" + {te = p+1;{ +#line 1449 "Parser.rl" + + currentSeq->addComponent( + std::make_unique(ts - ptr, false, mode)); + } + }} + +#line 8481 "Parser.cpp" + + break; + } + case 332: { + { +#line 1454 "Parser.rl" + {te = p+1;{ +#line 1454 "Parser.rl" + + currentSeq->addComponent( + std::make_unique(ts - ptr, true, mode)); + } + }} + +#line 8495 "Parser.cpp" + + break; + } + case 333: { + { +#line 1464 "Parser.rl" + {te = p+1;{ +#line 1464 "Parser.rl" + + addLiteral(currentSeq, '\x09', mode); + } + }} + +#line 8508 "Parser.cpp" + + break; + } + case 334: { + { +#line 1468 "Parser.rl" + {te = p+1;{ +#line 1468 "Parser.rl" + + addLiteral(currentSeq, '\x0a', mode); + } + }} + +#line 8521 "Parser.cpp" + + break; + } + case 335: { + { +#line 1472 "Parser.rl" + {te = p+1;{ +#line 1472 "Parser.rl" + + addLiteral(currentSeq, '\x0d', mode); + } + }} + +#line 8534 "Parser.cpp" + + break; + } + case 336: { + { +#line 1476 "Parser.rl" + {te = p+1;{ +#line 1476 "Parser.rl" + + addLiteral(currentSeq, '\x0c', mode); + } + }} + +#line 8547 "Parser.cpp" + + break; + } + case 337: { + { +#line 1480 "Parser.rl" + {te = p+1;{ +#line 1480 "Parser.rl" + + addLiteral(currentSeq, '\x07', mode); + } + }} + +#line 8560 "Parser.cpp" + + break; + } + case 338: { + { +#line 1484 "Parser.rl" + {te = p+1;{ +#line 1484 "Parser.rl" + + addLiteral(currentSeq, '\x1b', mode); + } + }} + +#line 8573 "Parser.cpp" + + break; + } + case 339: { + { +#line 1488 "Parser.rl" + {te = p+1;{ +#line 1488 "Parser.rl" + + addLiteral(currentSeq, octAccumulator, mode); + } + }} + +#line 8586 "Parser.cpp" + + break; + } + case 340: { + { +#line 479 "Parser.rl" + {te = p+1;{ +#line 479 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + currentSeq->addComponent(std::make_unique(accumulator)); + } + }} + +#line 8602 "Parser.cpp" + + break; + } + case 341: { + { +#line 486 "Parser.rl" + {te = p+1;{ +#line 486 "Parser.rl" + + // Accumulator is a negative offset. + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + if (accumulator >= groupIndex) { + throw LocatedParseError("Invalid reference"); + } + unsigned idx = groupIndex - accumulator; + currentSeq->addComponent(std::make_unique(idx)); + } + }} + +#line 8623 "Parser.cpp" + + break; + } + case 342: { + { +#line 479 "Parser.rl" + {te = p+1;{ +#line 479 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + currentSeq->addComponent(std::make_unique(accumulator)); + } + }} + +#line 8639 "Parser.cpp" + + break; + } + case 343: { + { +#line 486 "Parser.rl" + {te = p+1;{ +#line 486 "Parser.rl" + + // Accumulator is a negative offset. + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + if (accumulator >= groupIndex) { + throw LocatedParseError("Invalid reference"); + } + unsigned idx = groupIndex - accumulator; + currentSeq->addComponent(std::make_unique(idx)); + } + }} + +#line 8660 "Parser.cpp" + + break; + } + case 344: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8673 "Parser.cpp" + + break; + } + case 345: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8686 "Parser.cpp" + + break; + } + case 346: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8699 "Parser.cpp" + + break; + } + case 347: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8712 "Parser.cpp" + + break; + } + case 348: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8725 "Parser.cpp" + + break; + } + case 349: { + { +#line 1549 "Parser.rl" + {te = p+1;{ +#line 1549 "Parser.rl" + + ostringstream str; + str << "Onigiruma subroutine call at index " << ts - ptr << + " not supported."; + throw ParseError(str.str()); + } + }} + +#line 8741 "Parser.cpp" + + break; + } + case 350: { + { +#line 1560 "Parser.rl" + {te = p+1;{ +#line 1560 "Parser.rl" + + string oct(ts + 3, te - ts - 4); + unsigned long val; + try { + val = stoul(oct, nullptr, 8); + } catch (const std::out_of_range &) { + val = MAX_UNICODE + 1; + } + if ((!mode.utf8 && val > 255) || val > MAX_UNICODE) { + throw LocatedParseError("Value in \\o{...} sequence is too large"); + } + addEscapedOctal(currentSeq, (unichar)val, mode); + } + }} + +#line 8764 "Parser.cpp" + + break; + } + case 351: { + { +#line 1578 "Parser.rl" + {te = p+1;{ +#line 1578 "Parser.rl" + + addEscapedHex(currentSeq, accumulator, mode); + } + }} + +#line 8777 "Parser.cpp" + + break; + } + case 352: { + { +#line 1582 "Parser.rl" + {te = p+1;{ +#line 1582 "Parser.rl" + + string hex(ts + 3, te - ts - 4); + unsigned long val; + try { + val = stoul(hex, nullptr, 16); + } catch (const std::out_of_range &) { + val = MAX_UNICODE + 1; + } + if (val > MAX_UNICODE) { + throw LocatedParseError("Value in \\x{...} sequence is too large"); + } + addEscapedHex(currentSeq, (unichar)val, mode); + } + }} + +#line 8800 "Parser.cpp" + + break; + } + case 353: { + { +#line 1600 "Parser.rl" + {te = p+1;{ +#line 1600 "Parser.rl" + + if (te - ts < 3) { + assert(te - ts == 2); + throw LocatedParseError(SLASH_C_ERROR); + } else { + assert(te - ts == 3); + addLiteral(currentSeq, decodeCtrl(ts[2]), mode); + } + } + }} + +#line 8819 "Parser.cpp" + + break; + } + case 354: { + { +#line 1610 "Parser.rl" + {te = p+1;{ +#line 1610 "Parser.rl" + + ostringstream str; + str << "'\\" << *(ts + 1) << "' at index " << ts - ptr + << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 8835 "Parser.cpp" + + break; + } + case 355: { + { +#line 1618 "Parser.rl" + {te = p+1;{ +#line 1618 "Parser.rl" + + auto cc = generateComponent(CLASS_WORD, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8849 "Parser.cpp" + + break; + } + case 356: { + { +#line 1623 "Parser.rl" + {te = p+1;{ +#line 1623 "Parser.rl" + + auto cc = generateComponent(CLASS_WORD, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8863 "Parser.cpp" + + break; + } + case 357: { + { +#line 1628 "Parser.rl" + {te = p+1;{ +#line 1628 "Parser.rl" + + auto cc = generateComponent(CLASS_SPACE, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8877 "Parser.cpp" + + break; + } + case 358: { + { +#line 1633 "Parser.rl" + {te = p+1;{ +#line 1633 "Parser.rl" + + auto cc = generateComponent(CLASS_SPACE, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8891 "Parser.cpp" + + break; + } + case 359: { + { +#line 1638 "Parser.rl" + {te = p+1;{ +#line 1638 "Parser.rl" + + auto cc = generateComponent(CLASS_DIGIT, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8905 "Parser.cpp" + + break; + } + case 360: { + { +#line 1643 "Parser.rl" + {te = p+1;{ +#line 1643 "Parser.rl" + + auto cc = generateComponent(CLASS_DIGIT, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8919 "Parser.cpp" + + break; + } + case 361: { + { +#line 1648 "Parser.rl" + {te = p+1;{ +#line 1648 "Parser.rl" + + auto cc = generateComponent(CLASS_HORZ, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8933 "Parser.cpp" + + break; + } + case 362: { + { +#line 1653 "Parser.rl" + {te = p+1;{ +#line 1653 "Parser.rl" + + auto cc = generateComponent(CLASS_HORZ, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8947 "Parser.cpp" + + break; + } + case 363: { + { +#line 1658 "Parser.rl" + {te = p+1;{ +#line 1658 "Parser.rl" + + auto cc = generateComponent(CLASS_VERT, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8961 "Parser.cpp" + + break; + } + case 364: { + { +#line 1663 "Parser.rl" + {te = p+1;{ +#line 1663 "Parser.rl" + + auto cc = generateComponent(CLASS_VERT, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8975 "Parser.cpp" + + break; + } + case 365: { + { +#line 1668 "Parser.rl" + {te = p+1;{ +#line 1668 "Parser.rl" + + assert(!currentCls && !inCharClass); + currentCls = getComponentClass(mode); + negated = false; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 559;goto _again;}} + }} + +#line 8999 "Parser.cpp" + + break; + } + case 366: { + { +#line 1676 "Parser.rl" + {te = p+1;{ +#line 1676 "Parser.rl" + + assert(!currentCls && !inCharClass); + currentCls = getComponentClass(mode); + negated = false; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 818;goto _again;}} + }} + +#line 9023 "Parser.cpp" + + break; + } + case 367: { + { +#line 1684 "Parser.rl" + {te = p+1;{ +#line 1684 "Parser.rl" + + assert(!currentCls && !inCharClass); + currentCls = getComponentClass(mode); + negated = true; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 559;goto _again;}} + }} + +#line 9047 "Parser.cpp" + + break; + } + case 368: { + { +#line 1692 "Parser.rl" + {te = p+1;{ +#line 1692 "Parser.rl" + + assert(!currentCls && !inCharClass); + currentCls = getComponentClass(mode); + negated = true; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 818;goto _again;}} + }} + +#line 9071 "Parser.cpp" + + break; + } + case 369: { + { +#line 1704 "Parser.rl" + {te = p+1;{ +#line 1704 "Parser.rl" + + ostringstream str; + str << "\\R at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9086 "Parser.cpp" + + break; + } + case 370: { + { +#line 1711 "Parser.rl" + {te = p+1;{ +#line 1711 "Parser.rl" + + ostringstream str; + str << "\\K at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9101 "Parser.cpp" + + break; + } + case 371: { + { +#line 1726 "Parser.rl" + {te = p+1;{ +#line 1726 "Parser.rl" + + ostringstream str; + str << "\\G at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9116 "Parser.cpp" + + break; + } + case 372: { + { +#line 1732 "Parser.rl" + {te = p+1;{ +#line 1732 "Parser.rl" + + currentSeq->addComponent(std::make_unique(ts - ptr, mode)); + } + }} + +#line 9129 "Parser.cpp" + + break; + } + case 373: { + { +#line 1737 "Parser.rl" + {te = p+1;{ +#line 1737 "Parser.rl" + + addLiteral(currentSeq, *(ts + 1), mode); + } + }} + +#line 9142 "Parser.cpp" + + break; + } + case 374: { + { +#line 316 "Parser.rl" + {te = p+1;{ +#line 316 "Parser.rl" + + inComment = true; + {cs = 848;goto _again;}} + }} + +#line 9155 "Parser.cpp" + + break; + } + case 375: { + { +#line 433 "Parser.rl" + {te = p+1;{ +#line 433 "Parser.rl" + + mode = newMode; + currentSeq->addComponent(std::make_unique()); + } + }} + +#line 9169 "Parser.cpp" + + break; + } + case 376: { + { +#line 355 "Parser.rl" + {te = p+1;{ +#line 355 "Parser.rl" + + PUSH_SEQUENCE; + mode = newMode; + currentSeq = + enterSequence(currentSeq, std::make_unique()); + } + }} + +#line 9185 "Parser.cpp" + + break; + } + case 377: { + { +#line 369 "Parser.rl" + {te = p+1;{ +#line 369 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(ComponentAssertion::LOOKAHEAD, + ComponentAssertion::POS)); + } + }} + +#line 9201 "Parser.cpp" + + break; + } + case 378: { + { +#line 375 "Parser.rl" + {te = p+1;{ +#line 375 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(ComponentAssertion::LOOKAHEAD, + ComponentAssertion::NEG)); + } + }} + +#line 9217 "Parser.cpp" + + break; + } + case 379: { + { +#line 381 "Parser.rl" + {te = p+1;{ +#line 381 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(ComponentAssertion::LOOKBEHIND, + ComponentAssertion::POS)); + } + }} + +#line 9233 "Parser.cpp" + + break; + } + case 380: { + { +#line 387 "Parser.rl" + {te = p+1;{ +#line 387 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(ComponentAssertion::LOOKBEHIND, + ComponentAssertion::NEG)); + } + }} + +#line 9249 "Parser.cpp" + + break; + } + case 381: { + { +#line 393 "Parser.rl" + {te = p+1;{ +#line 393 "Parser.rl" + + throw LocatedParseError("Embedded code is not supported"); + } + }} + +#line 9262 "Parser.cpp" + + break; + } + case 382: { + { +#line 393 "Parser.rl" + {te = p+1;{ +#line 393 "Parser.rl" + + throw LocatedParseError("Embedded code is not supported"); + } + }} + +#line 9275 "Parser.cpp" + + break; + } + case 383: { + { +#line 416 "Parser.rl" + {te = p+1;{ +#line 416 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique()); + } + }} + +#line 9290 "Parser.cpp" + + break; + } + case 384: { + { +#line 336 "Parser.rl" + {te = p+1;{ +#line 336 "Parser.rl" + + assert(!label.empty()); // should be guaranteed by machine + char c = *label.begin(); + if (c >= '0' && c <= '9') { + throw LocatedParseError("Group name cannot begin with a digit"); + } + if (!groupNames.insert(label).second) { + throw LocatedParseError("Two named subpatterns use the name '" + label + "'"); + } + PUSH_SEQUENCE; + auto seq = std::make_unique(); + seq->setCaptureIndex(groupIndex++); + seq->setCaptureName(label); + currentSeq = enterSequence(currentSeq, move(seq)); + } + }} + +#line 9315 "Parser.cpp" + + break; + } + case 385: { + { +#line 399 "Parser.rl" + {te = p+1;{ +#line 399 "Parser.rl" + + throw LocatedParseError("Subpattern reference unsupported"); + } + }} + +#line 9328 "Parser.cpp" + + break; + } + case 386: { + { +#line 399 "Parser.rl" + {te = p+1;{ +#line 399 "Parser.rl" + + throw LocatedParseError("Subpattern reference unsupported"); + } + }} + +#line 9341 "Parser.cpp" + + break; + } + case 387: { + { +#line 1783 "Parser.rl" + {te = p+1;{ +#line 1783 "Parser.rl" + + auto a = std::make_unique( + ComponentAssertion::LOOKAHEAD, ComponentAssertion::POS); + ComponentAssertion *a_seq = a.get(); + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(move(a))); + PUSH_SEQUENCE; + currentSeq = a_seq; + } + }} + +#line 9361 "Parser.cpp" + + break; + } + case 388: { + { +#line 1794 "Parser.rl" + {te = p+1;{ +#line 1794 "Parser.rl" + + auto a = std::make_unique( + ComponentAssertion::LOOKAHEAD, ComponentAssertion::NEG); + ComponentAssertion *a_seq = a.get(); + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(move(a))); + PUSH_SEQUENCE; + currentSeq = a_seq; + } + }} + +#line 9381 "Parser.cpp" + + break; + } + case 389: { + { +#line 1805 "Parser.rl" + {te = p+1;{ +#line 1805 "Parser.rl" + + auto a = std::make_unique( + ComponentAssertion::LOOKBEHIND, ComponentAssertion::POS); + ComponentAssertion *a_seq = a.get(); + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(move(a))); + PUSH_SEQUENCE; + currentSeq = a_seq; + } + }} + +#line 9401 "Parser.cpp" + + break; + } + case 390: { + { +#line 1816 "Parser.rl" + {te = p+1;{ +#line 1816 "Parser.rl" + + auto a = std::make_unique( + ComponentAssertion::LOOKBEHIND, ComponentAssertion::NEG); + ComponentAssertion *a_seq = a.get(); + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(move(a))); + PUSH_SEQUENCE; + currentSeq = a_seq; + } + }} + +#line 9421 "Parser.cpp" + + break; + } + case 391: { + { +#line 1828 "Parser.rl" + {te = p+1;{ +#line 1828 "Parser.rl" + + throw LocatedParseError("Pattern recursion not supported"); + } + }} + +#line 9434 "Parser.cpp" + + break; + } + case 392: { + { +#line 402 "Parser.rl" + {te = p+1;{ +#line 402 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(accumulator)); + } + }} + +#line 9452 "Parser.cpp" + + break; + } + case 393: { + { +#line 410 "Parser.rl" + {te = p+1;{ +#line 410 "Parser.rl" + + PUSH_SEQUENCE; + assert(!label.empty()); + currentSeq = enterSequence(currentSeq, + std::make_unique(label)); + } + }} + +#line 9468 "Parser.cpp" + + break; + } + case 394: { + { +#line 1844 "Parser.rl" + {te = p+1;{ +#line 1844 "Parser.rl" + + ostringstream str; + str << "Callout at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9483 "Parser.cpp" + + break; + } + case 395: { + { +#line 1852 "Parser.rl" + {te = p+1;{ +#line 1852 "Parser.rl" + + throw LocatedParseError("Unrecognised character after (?"); + } + }} + +#line 9496 "Parser.cpp" + + break; + } + case 396: { + { +#line 1857 "Parser.rl" + {te = p+1;{ +#line 1857 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint2c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 9514 "Parser.cpp" + + break; + } + case 397: { + { +#line 1866 "Parser.rl" + {te = p+1;{ +#line 1866 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint3c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 9532 "Parser.cpp" + + break; + } + case 398: { + { +#line 1875 "Parser.rl" + {te = p+1;{ +#line 1875 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint4c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 9550 "Parser.cpp" + + break; + } + case 399: { + { +#line 1884 "Parser.rl" + {te = p+1;{ +#line 1884 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 9564 "Parser.cpp" + + break; + } + case 400: { + { +#line 1893 "Parser.rl" + {te = p+1;{ +#line 1893 "Parser.rl" + + if (mode.ignore_space == false) { + addLiteral(currentSeq, *ts, mode); + } + } + }} + +#line 9579 "Parser.cpp" + + break; + } + case 401: { + { +#line 1898 "Parser.rl" + {te = p+1;{ +#line 1898 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 9592 "Parser.cpp" + + break; + } + case 402: { + { +#line 328 "Parser.rl" + {te = p;p = p - 1;{ +#line 328 "Parser.rl" + + PUSH_SEQUENCE; + auto seq = std::make_unique(); + seq->setCaptureIndex(groupIndex++); + currentSeq = enterSequence(currentSeq, move(seq)); + } + }} + +#line 9608 "Parser.cpp" + + break; + } + case 403: { + { +#line 421 "Parser.rl" + {te = p;p = p - 1;{ +#line 421 "Parser.rl" + + assert(!currentCls); + assert(!inCharClass); // not reentrant + currentCls = getComponentClass(mode); + inCharClass = true; + inCharClassEarly = true; + currentClsBegin = ts; + {cs = 836;goto _again;}} + }} + +#line 9626 "Parser.cpp" + + break; + } + case 404: { + { +#line 1310 "Parser.rl" + {te = p;p = p - 1;{ +#line 1310 "Parser.rl" + + if (!currentSeq->addRepeat(0, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_GREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 9642 "Parser.cpp" + + break; + } + case 405: { + { +#line 1331 "Parser.rl" + {te = p;p = p - 1;{ +#line 1331 "Parser.rl" + + if (!currentSeq->addRepeat(1, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_GREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 9658 "Parser.cpp" + + break; + } + case 406: { + { +#line 1352 "Parser.rl" + {te = p;p = p - 1;{ +#line 1352 "Parser.rl" + + if (!currentSeq->addRepeat( + 0, 1, ComponentRepeat::REPEAT_GREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 9674 "Parser.cpp" + + break; + } + case 407: { + { +#line 1373 "Parser.rl" + {te = p;p = p - 1;{ +#line 1373 "Parser.rl" + + if (repeatN > repeatM || repeatM == 0) { + throwInvalidRepeat(); + } else if (!currentSeq->addRepeat( + repeatN, repeatM, + ComponentRepeat::REPEAT_GREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 9693 "Parser.cpp" + + break; + } + case 408: { + { +#line 1488 "Parser.rl" + {te = p;p = p - 1;{ +#line 1488 "Parser.rl" + + addLiteral(currentSeq, octAccumulator, mode); + } + }} + +#line 9706 "Parser.cpp" + + break; + } + case 409: { + { +#line 1491 "Parser.rl" + {te = p;p = p - 1;{ +#line 1491 "Parser.rl" + + // If there are enough capturing sub expressions, this may be + // a back reference + accumulator = parseAsDecimal(octAccumulator); + if (accumulator < groupIndex) { + currentSeq->addComponent(std::make_unique(accumulator)); + } else { + addEscapedOctal(currentSeq, octAccumulator, mode); + } + } + }} + +#line 9726 "Parser.cpp" + + break; + } + case 410: { + { +#line 479 "Parser.rl" + {te = p;p = p - 1;{ +#line 479 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + currentSeq->addComponent(std::make_unique(accumulator)); + } + }} + +#line 9742 "Parser.cpp" + + break; + } + case 411: { + { +#line 479 "Parser.rl" + {te = p;p = p - 1;{ +#line 479 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + currentSeq->addComponent(std::make_unique(accumulator)); + } + }} + +#line 9758 "Parser.cpp" + + break; + } + case 412: { + { +#line 486 "Parser.rl" + {te = p;p = p - 1;{ +#line 486 "Parser.rl" + + // Accumulator is a negative offset. + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + if (accumulator >= groupIndex) { + throw LocatedParseError("Invalid reference"); + } + unsigned idx = groupIndex - accumulator; + currentSeq->addComponent(std::make_unique(idx)); + } + }} + +#line 9779 "Parser.cpp" + + break; + } + case 413: { + { +#line 1557 "Parser.rl" + {te = p;p = p - 1;{ +#line 1557 "Parser.rl" + + throw LocatedParseError("Invalid reference after \\g"); + } + }} + +#line 9792 "Parser.cpp" + + break; + } + case 414: { + { +#line 1574 "Parser.rl" + {te = p;p = p - 1;{ +#line 1574 "Parser.rl" + + throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); + } + }} + +#line 9805 "Parser.cpp" + + break; + } + case 415: { + { +#line 1578 "Parser.rl" + {te = p;p = p - 1;{ +#line 1578 "Parser.rl" + + addEscapedHex(currentSeq, accumulator, mode); + } + }} + +#line 9818 "Parser.cpp" + + break; + } + case 416: { + { +#line 1596 "Parser.rl" + {te = p;p = p - 1;{ +#line 1596 "Parser.rl" + + throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); + } + }} + +#line 9831 "Parser.cpp" + + break; + } + case 417: { + { +#line 1600 "Parser.rl" + {te = p;p = p - 1;{ +#line 1600 "Parser.rl" + + if (te - ts < 3) { + assert(te - ts == 2); + throw LocatedParseError(SLASH_C_ERROR); + } else { + assert(te - ts == 3); + addLiteral(currentSeq, decodeCtrl(ts[2]), mode); + } + } + }} + +#line 9850 "Parser.cpp" + + break; + } + case 418: { + { +#line 1700 "Parser.rl" + {te = p;p = p - 1;{ +#line 1700 "Parser.rl" + throw LocatedParseError("Malformed property"); } + }} + +#line 9861 "Parser.cpp" + + break; + } + case 419: { + { +#line 1701 "Parser.rl" + {te = p;p = p - 1;{ +#line 1701 "Parser.rl" + throw LocatedParseError("Malformed property"); } + }} + +#line 9872 "Parser.cpp" + + break; + } + case 420: { + { +#line 1719 "Parser.rl" + {te = p;p = p - 1;{ +#line 1719 "Parser.rl" + + ostringstream str; + str << "\\k at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9887 "Parser.cpp" + + break; + } + case 421: { + { +#line 1742 "Parser.rl" + {te = p;p = p - 1;{ +#line 1742 "Parser.rl" + + assert(ts + 1 == pe); + ostringstream str; + str << "Unescaped \\ at end of input, index " << ts - ptr << "."; + throw ParseError(str.str()); + } + }} + +#line 9903 "Parser.cpp" + + break; + } + case 422: { + { +#line 396 "Parser.rl" + {te = p;p = p - 1;{ +#line 396 "Parser.rl" + + throw LocatedParseError("Conditional subpattern unsupported"); + } + }} + +#line 9916 "Parser.cpp" + + break; + } + case 423: { + { +#line 1852 "Parser.rl" + {te = p;p = p - 1;{ +#line 1852 "Parser.rl" + + throw LocatedParseError("Unrecognised character after (?"); + } + }} + +#line 9929 "Parser.cpp" + + break; + } + case 424: { + { +#line 1884 "Parser.rl" + {te = p;p = p - 1;{ +#line 1884 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 9943 "Parser.cpp" + + break; + } + case 425: { + { +#line 1898 "Parser.rl" + {te = p;p = p - 1;{ +#line 1898 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 9956 "Parser.cpp" + + break; + } + case 426: { + { +#line 328 "Parser.rl" + {p = ((te))-1; + { +#line 328 "Parser.rl" + + PUSH_SEQUENCE; + auto seq = std::make_unique(); + seq->setCaptureIndex(groupIndex++); + currentSeq = enterSequence(currentSeq, move(seq)); + } + }} + +#line 9973 "Parser.cpp" + + break; + } + case 427: { + { +#line 421 "Parser.rl" + {p = ((te))-1; + { +#line 421 "Parser.rl" + + assert(!currentCls); + assert(!inCharClass); // not reentrant + currentCls = getComponentClass(mode); + inCharClass = true; + inCharClassEarly = true; + currentClsBegin = ts; + {cs = 836;goto _again;}} + }} + +#line 9992 "Parser.cpp" + + break; + } + case 428: { + { +#line 1557 "Parser.rl" + {p = ((te))-1; + { +#line 1557 "Parser.rl" + + throw LocatedParseError("Invalid reference after \\g"); + } + }} + +#line 10006 "Parser.cpp" + + break; + } + case 429: { + { +#line 1574 "Parser.rl" + {p = ((te))-1; + { +#line 1574 "Parser.rl" + + throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); + } + }} + +#line 10020 "Parser.cpp" + + break; + } + case 430: { + { +#line 1596 "Parser.rl" + {p = ((te))-1; + { +#line 1596 "Parser.rl" + + throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); + } + }} + +#line 10034 "Parser.cpp" + + break; + } + case 431: { + { +#line 1719 "Parser.rl" + {p = ((te))-1; + { +#line 1719 "Parser.rl" + + ostringstream str; + str << "\\k at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 10050 "Parser.cpp" + + break; + } + case 432: { + { +#line 396 "Parser.rl" + {p = ((te))-1; + { +#line 396 "Parser.rl" + + throw LocatedParseError("Conditional subpattern unsupported"); + } + }} + +#line 10064 "Parser.cpp" + + break; + } + case 433: { + { +#line 1852 "Parser.rl" + {p = ((te))-1; + { +#line 1852 "Parser.rl" + + throw LocatedParseError("Unrecognised character after (?"); + } + }} + +#line 10078 "Parser.cpp" + + break; + } + case 434: { + { +#line 1884 "Parser.rl" + {p = ((te))-1; + { +#line 1884 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 10093 "Parser.cpp" + + break; + } + case 435: { + { +#line 1898 "Parser.rl" + {p = ((te))-1; + { +#line 1898 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 10107 "Parser.cpp" + + break; + } + case 436: { + { +#line 1 "NONE" + {switch( act ) { + case 288: { + p = ((te))-1; + { +#line 1491 "Parser.rl" + + // If there are enough capturing sub expressions, this may be + // a back reference + accumulator = parseAsDecimal(octAccumulator); + if (accumulator < groupIndex) { + currentSeq->addComponent(std::make_unique(accumulator)); + } else { + addEscapedOctal(currentSeq, octAccumulator, mode); + } + } + break; + } + case 290: { + p = ((te))-1; + { +#line 1508 "Parser.rl" + + // if there are enough left parens to this point, back ref + if (accumulator < groupIndex) { + currentSeq->addComponent(std::make_unique(accumulator)); + } else { + // Otherwise, we interpret the first three digits as an + // octal escape, and the remaining characters stand for + // themselves as literals. + const char *s = ts; + unsigned int accum = 0; + unsigned int oct_digits = 0; + assert(*s == '\\'); // token starts at backslash + for (++s; s < te && oct_digits < 3; ++oct_digits, ++s) { + u8 digit = *s - '0'; + if (digit < 8) { + accum = digit + accum * 8; + } else { + break; + } + } + + if (oct_digits > 0) { + addEscapedOctal(currentSeq, accum, mode); + } + + // And then the rest of the digits, if any, are literal. + for (; s < te; ++s) { + addLiteral(currentSeq, *s, mode); + } + } + } + break; + } + case 330: { + p = ((te))-1; + { +#line 1737 "Parser.rl" + + addLiteral(currentSeq, *(ts + 1), mode); + } + break; + } + }} + } + +#line 10179 "Parser.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + +} + +_again: {} +if ( p == eof ) { + if ( cs >= 746 ) + goto _out; +} +else { + _acts = ( _regex_actions + (_regex_to_state_actions[cs])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) { + case 23: { + { +#line 1 "NONE" + {ts = 0;}} + +#line 10205 "Parser.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + if ( cs != 0 ) { + p += 1; + goto _resume; + } +} +_out: {} +} + +#line 1983 "Parser.rl" + + +if (p != pe && *p != '\0') { +// didn't make it to the end of our input, but we didn't throw a ParseError? +assert(0); +ostringstream str; +str << "Parse error at index " << (p - ptr) << "."; +throw ParseError(str.str()); +} + +if (currentCls) { +assert(inCharClass); +assert(currentClsBegin); +ostringstream oss; +oss << "Unterminated character class starting at index " +<< currentClsBegin - ptr << "."; +throw ParseError(oss.str()); +} + +if (inComment) { +throw ParseError("Unterminated comment."); +} + +if (!sequences.empty()) { +ostringstream str; +str << "Missing close parenthesis for group started at index " +<< sequences.back().seqOffset << "."; +throw ParseError(str.str()); +} + +// Unlikely, but possible +if (groupIndex > 65535) { +throw ParseError("The maximum number of capturing subexpressions is 65535."); +} + +// Finalize the top-level sequence, which will take care of any +// top-level alternation. +currentSeq->finalize(); +assert(currentSeq == rootSeq.get()); + +// Ensure that all references are valid. +checkReferences(*rootSeq, groupIndex, groupNames); + +return move(rootSeq); +} catch (LocatedParseError &error) { +if (ts >= ptr && ts <= pe) { +error.locate(ts - ptr); +} else { +error.locate(0); +} +throw; +} +} + +} // namespace ue2 diff --git a/contrib/vectorscan-cmake/rageled_files/aarch64/control_verbs.cpp b/contrib/vectorscan-cmake/rageled_files/aarch64/control_verbs.cpp new file mode 100644 index 00000000000..6204fc0a314 --- /dev/null +++ b/contrib/vectorscan-cmake/rageled_files/aarch64/control_verbs.cpp @@ -0,0 +1,547 @@ +#line 1 "control_verbs.rl" +/* +* Copyright (c) 2017, Intel Corporation +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of Intel Corporation nor the names of its contributors +* may be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +/** +* \file +* \brief Parser for control verbs that can occur at the beginning of a pattern. +*/ + +#include "parser/control_verbs.h" + +#include "parser/Parser.h" +#include "parser/parse_error.h" + +#include +#include + +using namespace std; + +namespace ue2 { + + const char *read_control_verbs(const char *ptr, const char *end, size_t start, + ParseMode &mode) { + const char *p = ptr; + const char *pe = end; + const char *eof = pe; + const char *ts, *te; + int cs; + UNUSED int act; + + +#line 56 "control_verbs.cpp" +static const signed char _ControlVerbs_actions[] = { + 0, 1, 0, 1, 1, 1, 2, 1, + 3, 1, 4, 1, 5, 1, 6, 1, + 7, 1, 8, 1, 9, 0 + }; + + static const short _ControlVerbs_key_offsets[] = { + 0, 7, 8, 10, 12, 14, 16, 18, + 20, 21, 23, 25, 27, 30, 32, 34, + 36, 38, 40, 42, 44, 46, 48, 50, + 52, 55, 57, 59, 61, 63, 66, 68, + 70, 72, 74, 76, 79, 82, 84, 86, + 88, 90, 92, 94, 96, 98, 100, 102, + 105, 107, 109, 111, 113, 115, 117, 119, + 121, 123, 125, 127, 129, 131, 133, 135, + 137, 139, 141, 143, 146, 148, 149, 151, + 155, 157, 159, 160, 161, 0 + }; + + static const char _ControlVerbs_trans_keys[] = { + 41u, 65u, 66u, 67u, 76u, 78u, 85u, 41u, + 41u, 78u, 41u, 89u, 41u, 67u, 41u, 82u, + 41u, 76u, 41u, 70u, 41u, 41u, 83u, 41u, + 82u, 41u, 95u, 41u, 65u, 85u, 41u, 78u, + 41u, 89u, 41u, 67u, 41u, 78u, 41u, 73u, + 41u, 67u, 41u, 79u, 41u, 68u, 41u, 69u, + 41u, 82u, 41u, 76u, 41u, 70u, 73u, 41u, + 77u, 41u, 73u, 41u, 84u, 41u, 95u, 41u, + 77u, 82u, 41u, 65u, 41u, 84u, 41u, 67u, + 41u, 72u, 41u, 61u, 41u, 48u, 57u, 41u, + 48u, 57u, 41u, 69u, 41u, 67u, 41u, 85u, + 41u, 82u, 41u, 83u, 41u, 73u, 41u, 79u, + 41u, 78u, 41u, 79u, 41u, 95u, 41u, 65u, + 83u, 41u, 85u, 41u, 84u, 41u, 79u, 41u, + 95u, 41u, 80u, 41u, 79u, 41u, 83u, 41u, + 83u, 41u, 69u, 41u, 83u, 41u, 83u, 41u, + 84u, 41u, 65u, 41u, 82u, 41u, 84u, 41u, + 95u, 41u, 79u, 41u, 80u, 41u, 84u, 41u, + 67u, 84u, 41u, 80u, 41u, 41u, 70u, 41u, + 49u, 51u, 56u, 41u, 54u, 41u, 50u, 41u, + 40u, 42u, 0u + }; + + static const signed char _ControlVerbs_single_lengths[] = { + 7, 1, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 2, 2, 3, 2, 2, + 2, 2, 2, 1, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 3, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 2, 1, 2, 4, + 2, 2, 1, 1, 1, 0 + }; + + static const signed char _ControlVerbs_range_lengths[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 + }; + + static const short _ControlVerbs_index_offsets[] = { + 0, 8, 10, 13, 16, 19, 22, 25, + 28, 30, 33, 36, 39, 43, 46, 49, + 52, 55, 58, 61, 64, 67, 70, 73, + 76, 80, 83, 86, 89, 92, 96, 99, + 102, 105, 108, 111, 114, 117, 120, 123, + 126, 129, 132, 135, 138, 141, 144, 147, + 151, 154, 157, 160, 163, 166, 169, 172, + 175, 178, 181, 184, 187, 190, 193, 196, + 199, 202, 205, 208, 212, 215, 217, 220, + 225, 228, 231, 233, 235, 0 + }; + + static const signed char _ControlVerbs_cond_targs[] = { + 75, 2, 9, 22, 24, 45, 67, 1, + 75, 1, 75, 3, 1, 75, 4, 1, + 75, 5, 1, 75, 6, 1, 75, 7, + 1, 75, 8, 1, 75, 1, 75, 10, + 1, 75, 11, 1, 75, 12, 1, 75, + 13, 16, 1, 75, 14, 1, 75, 15, + 1, 75, 5, 1, 75, 17, 1, 75, + 18, 1, 75, 19, 1, 75, 20, 1, + 75, 21, 1, 75, 8, 1, 75, 23, + 1, 75, 7, 1, 75, 8, 25, 1, + 75, 26, 1, 75, 27, 1, 75, 28, + 1, 75, 29, 1, 75, 30, 37, 1, + 75, 31, 1, 75, 32, 1, 75, 33, + 1, 75, 34, 1, 75, 35, 1, 75, + 36, 1, 75, 36, 1, 75, 38, 1, + 75, 39, 1, 75, 40, 1, 75, 41, + 1, 75, 42, 1, 75, 43, 1, 75, + 44, 1, 75, 34, 1, 75, 46, 1, + 75, 47, 1, 75, 48, 59, 1, 75, + 49, 1, 75, 50, 1, 75, 51, 1, + 75, 52, 1, 75, 53, 1, 75, 54, + 1, 75, 55, 1, 75, 56, 1, 75, + 57, 1, 75, 58, 1, 75, 8, 1, + 75, 60, 1, 75, 61, 1, 75, 62, + 1, 75, 63, 1, 75, 64, 1, 75, + 65, 1, 75, 66, 1, 75, 8, 1, + 75, 68, 70, 1, 75, 69, 1, 75, + 1, 75, 71, 1, 75, 72, 73, 74, + 1, 75, 8, 1, 75, 8, 1, 75, + 1, 76, 75, 0, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 0 + }; + + static const signed char _ControlVerbs_cond_actions[] = { + 19, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 13, 0, 0, 13, 0, 0, + 11, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 11, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 11, 0, 0, 13, 0, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 11, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 0, 13, 0, 0, 9, + 0, 13, 0, 0, 7, 0, 0, 0, + 0, 13, 0, 0, 13, 0, 0, 7, + 0, 5, 15, 0, 17, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 0, 17, 0 + }; + + static const signed char _ControlVerbs_to_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0 + }; + + static const signed char _ControlVerbs_from_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0 + }; + + static const short _ControlVerbs_eof_trans[] = { + 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 0 + }; + + static const int ControlVerbs_start = 75; + static const int ControlVerbs_first_final = 75; + static const int ControlVerbs_error = -1; + + static const int ControlVerbs_en_main = 75; + + +#line 269 "control_verbs.cpp" + { + cs = (int)ControlVerbs_start; + ts = 0; + te = 0; + } + +#line 105 "control_verbs.rl" + + + try { + +#line 278 "control_verbs.cpp" + { + int _klen; + unsigned int _trans = 0; + const char * _keys; + const signed char * _acts; + unsigned int _nacts; + _resume: {} + if ( p == pe && p != eof ) + goto _out; + _acts = ( _ControlVerbs_actions + (_ControlVerbs_from_state_actions[cs])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) { + case 1: { + { +#line 1 "NONE" + {ts = p;}} + +#line 297 "control_verbs.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + if ( p == eof ) { + if ( _ControlVerbs_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_ControlVerbs_eof_trans[cs] - 1; + } + } + else { + _keys = ( _ControlVerbs_trans_keys + (_ControlVerbs_key_offsets[cs])); + _trans = (unsigned int)_ControlVerbs_index_offsets[cs]; + + _klen = (int)_ControlVerbs_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _keys += _klen; + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + ((_upper-_lower) >> 1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 1; + else if ( ( (*( p))) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + } + + _klen = (int)_ControlVerbs_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + (_klen<<1) - 2; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 2; + else if ( ( (*( p))) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + break; + } + } + } + + _match: {} + } + cs = (int)_ControlVerbs_cond_targs[_trans]; + + if ( _ControlVerbs_cond_actions[_trans] != 0 ) { + + _acts = ( _ControlVerbs_actions + (_ControlVerbs_cond_actions[_trans])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) + { + case 2: { + { +#line 1 "NONE" + {te = p+1;}} + +#line 378 "control_verbs.cpp" + + break; + } + case 3: { + { +#line 76 "control_verbs.rl" + {te = p+1;{ +#line 76 "control_verbs.rl" + + mode.utf8 = true; + } + }} + +#line 391 "control_verbs.cpp" + + break; + } + case 4: { + { +#line 80 "control_verbs.rl" + {te = p+1;{ +#line 80 "control_verbs.rl" + + mode.ucp = true; + } + }} + +#line 404 "control_verbs.cpp" + + break; + } + case 5: { + { +#line 84 "control_verbs.rl" + {te = p+1;{ +#line 84 "control_verbs.rl" + + ostringstream str; + str << "Unsupported control verb " << string(ts, te - ts); + throw LocatedParseError(str.str()); + } + }} + +#line 419 "control_verbs.cpp" + + break; + } + case 6: { + { +#line 90 "control_verbs.rl" + {te = p+1;{ +#line 90 "control_verbs.rl" + + ostringstream str; + str << "Unknown control verb " << string(ts, te - ts); + throw LocatedParseError(str.str()); + } + }} + +#line 434 "control_verbs.cpp" + + break; + } + case 7: { + { +#line 97 "control_verbs.rl" + {te = p+1;{ +#line 97 "control_verbs.rl" + + {p = p - 1; } + {p += 1; goto _out; } + } + }} + +#line 448 "control_verbs.cpp" + + break; + } + case 8: { + { +#line 97 "control_verbs.rl" + {te = p;p = p - 1;{ +#line 97 "control_verbs.rl" + + {p = p - 1; } + {p += 1; goto _out; } + } + }} + +#line 462 "control_verbs.cpp" + + break; + } + case 9: { + { +#line 97 "control_verbs.rl" + {p = ((te))-1; + { +#line 97 "control_verbs.rl" + + {p = p - 1; } + {p += 1; goto _out; } + } + }} + +#line 477 "control_verbs.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + } + + if ( p == eof ) { + if ( cs >= 75 ) + goto _out; + } + else { + _acts = ( _ControlVerbs_actions + (_ControlVerbs_to_state_actions[cs])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) { + case 0: { + { +#line 1 "NONE" + {ts = 0;}} + +#line 502 "control_verbs.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + p += 1; + goto _resume; + } + _out: {} + } + +#line 108 "control_verbs.rl" + + } catch (LocatedParseError &error) { + if (ts >= ptr && ts <= pe) { + error.locate(ts - ptr + start); + } else { + error.locate(0); + } + throw; + } + + return p; + } + +} // namespace ue2 diff --git a/contrib/vectorscan-cmake/rageled_files/amd64/Parser.cpp b/contrib/vectorscan-cmake/rageled_files/amd64/Parser.cpp new file mode 100644 index 00000000000..ffda1515582 --- /dev/null +++ b/contrib/vectorscan-cmake/rageled_files/amd64/Parser.cpp @@ -0,0 +1,10725 @@ +#line 1 "Parser.rl" +/* +* Copyright (c) 2015-2017, Intel Corporation +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of Intel Corporation nor the names of its contributors +* may be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +/** \file +* \brief Parser code (generated with Ragel from Parser.rl). +*/ + +#include "config.h" + +/* Parser.cpp is a built source, may not be in same dir as parser files */ +#include "parser/check_refs.h" +#include "parser/control_verbs.h" +#include "parser/ComponentAlternation.h" +#include "parser/ComponentAssertion.h" +#include "parser/ComponentAtomicGroup.h" +#include "parser/ComponentBackReference.h" +#include "parser/ComponentBoundary.h" +#include "parser/ComponentByte.h" +#include "parser/ComponentClass.h" +#include "parser/ComponentCondReference.h" +#include "parser/ComponentEmpty.h" +#include "parser/ComponentEUS.h" +#include "parser/Component.h" +#include "parser/ComponentRepeat.h" +#include "parser/ComponentSequence.h" +#include "parser/ComponentWordBoundary.h" +#include "parser/parse_error.h" +#include "parser/Parser.h" +#include "ue2common.h" +#include "util/compare.h" +#include "util/flat_containers.h" +#include "util/unicode_def.h" +#include "util/verify_types.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +namespace ue2 { + +#define PUSH_SEQUENCE do {\ + sequences.push_back(ExprState(currentSeq, (size_t)(ts - ptr), \ + mode)); \ + } while(0) +#define POP_SEQUENCE do {\ + currentSeq = sequences.back().seq; \ + mode = sequences.back().mode; \ + sequences.pop_back(); \ + } while(0) + + namespace { + + /** \brief Structure representing current state as we're parsing (current + * sequence, current options). Stored in the 'sequences' vector. */ + struct ExprState { + ExprState(ComponentSequence *seq_in, size_t offset, + const ParseMode &mode_in) : + seq(seq_in), seqOffset(offset), mode(mode_in) {} + + ComponentSequence *seq; //!< current sequence + size_t seqOffset; //!< offset seq was entered, for error reporting + ParseMode mode; //!< current mode flags + }; + + } // namespace + + static + unsigned parseAsDecimal(unsigned oct) { + // The input was parsed as octal, but should have been parsed as decimal. + // Deconstruct the octal number and reconstruct into decimal + unsigned ret = 0; + unsigned multiplier = 1; + while (oct) { + ret += (oct & 0x7) * multiplier; + oct >>= 3; + multiplier *= 10; + } + return ret; + } + + /** \brief Maximum value for a positive integer. We use INT_MAX, as that's what + * PCRE uses. */ + static constexpr u32 MAX_NUMBER = INT_MAX; + + static + void pushDec(u32 *acc, char raw_digit) { + assert(raw_digit >= '0' && raw_digit <= '9'); + u32 digit_val = raw_digit - '0'; + + // Ensure that we don't overflow. + u64a val = ((u64a)*acc * 10) + digit_val; + if (val > MAX_NUMBER) { + throw LocatedParseError("Number is too big"); + } + + *acc = verify_u32(val); + } + + static + void pushOct(u32 *acc, char raw_digit) { + assert(raw_digit >= '0' && raw_digit <= '7'); + u32 digit_val = raw_digit - '0'; + + // Ensure that we don't overflow. + u64a val = ((u64a)*acc * 8) + digit_val; + if (val > MAX_NUMBER) { + throw LocatedParseError("Number is too big"); + } + + *acc = verify_u32(val); + } + + static + void throwInvalidRepeat(void) { + throw LocatedParseError("Invalid repeat"); + } + + static + void throwInvalidUtf8(void) { + throw ParseError("Expression is not valid UTF-8."); + } + + /** + * Adds the given child component to the parent sequence, returning a pointer + * to the new (child) "current sequence". + */ + static + ComponentSequence *enterSequence(ComponentSequence *parent, + unique_ptr child) { + assert(parent); + assert(child); + + ComponentSequence *seq = child.get(); + parent->addComponent(move(child)); + return seq; + } + + static + void addLiteral(ComponentSequence *currentSeq, char c, const ParseMode &mode) { + if (mode.utf8 && mode.caseless) { + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + assert(cc); + cc->add(c); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } else { + currentSeq->addComponent(getLiteralComponentClass(c, mode.caseless)); + } + } + + static + void addEscaped(ComponentSequence *currentSeq, unichar accum, + const ParseMode &mode, const char *err_msg) { + if (mode.utf8) { + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + assert(cc); + cc->add(accum); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } else { + if (accum > 255) { + throw LocatedParseError(err_msg); + } + addLiteral(currentSeq, (char)accum, mode); + } + } + + static + void addEscapedOctal(ComponentSequence *currentSeq, unichar accum, + const ParseMode &mode) { + addEscaped(currentSeq, accum, mode, "Octal value is greater than \\377"); + } + + static + void addEscapedHex(ComponentSequence *currentSeq, unichar accum, + const ParseMode &mode) { + addEscaped(currentSeq, accum, mode, + "Hexadecimal value is greater than \\xFF"); + } + +#define SLASH_C_ERROR "\\c must be followed by an ASCII character" + + static + u8 decodeCtrl(char raw) { + if (raw & 0x80) { + throw LocatedParseError(SLASH_C_ERROR); + } + return mytoupper(raw) ^ 0x40; + } + + static + unichar readUtf8CodePoint2c(const char *s) { + auto *ts = (const u8 *)s; + assert(ts[0] >= 0xc0 && ts[0] < 0xe0); + assert(ts[1] >= 0x80 && ts[1] < 0xc0); + unichar val = ts[0] & 0x1f; + val <<= 6; + val |= ts[1] & 0x3f; + DEBUG_PRINTF("utf8 %02hhx %02hhx ->\\x{%x}\n", ts[0], + ts[1], val); + return val; + } + + static + unichar readUtf8CodePoint3c(const char *s) { + auto *ts = (const u8 *)s; + assert(ts[0] >= 0xe0 && ts[0] < 0xf0); + assert(ts[1] >= 0x80 && ts[1] < 0xc0); + assert(ts[2] >= 0x80 && ts[2] < 0xc0); + unichar val = ts[0] & 0x0f; + val <<= 6; + val |= ts[1] & 0x3f; + val <<= 6; + val |= ts[2] & 0x3f; + DEBUG_PRINTF("utf8 %02hhx %02hhx %02hhx ->\\x{%x}\n", ts[0], + ts[1], ts[2], val); + return val; + } + + static + unichar readUtf8CodePoint4c(const char *s) { + auto *ts = (const u8 *)s; + assert(ts[0] >= 0xf0 && ts[0] < 0xf8); + assert(ts[1] >= 0x80 && ts[1] < 0xc0); + assert(ts[2] >= 0x80 && ts[2] < 0xc0); + assert(ts[3] >= 0x80 && ts[3] < 0xc0); + unichar val = ts[0] & 0x07; + val <<= 6; + val |= ts[1] & 0x3f; + val <<= 6; + val |= ts[2] & 0x3f; + val <<= 6; + val |= ts[3] & 0x3f; + DEBUG_PRINTF("utf8 %02hhx %02hhx %02hhx %02hhx ->\\x{%x}\n", ts[0], + ts[1], ts[2], ts[3], val); + return val; + } + + +#line 1909 "Parser.rl" + + + +#line 277 "Parser.cpp" +static const short _regex_actions[] = { + 0, 1, 0, 1, 1, 1, 2, 1, + 3, 1, 4, 1, 7, 1, 8, 1, + 9, 1, 10, 1, 11, 1, 12, 1, + 13, 1, 15, 1, 16, 1, 17, 1, + 18, 1, 19, 1, 20, 1, 21, 1, + 22, 1, 23, 1, 24, 1, 25, 1, + 26, 1, 27, 1, 28, 1, 29, 1, + 30, 1, 31, 1, 32, 1, 33, 1, + 34, 1, 35, 1, 36, 1, 37, 1, + 38, 1, 39, 1, 40, 1, 41, 1, + 42, 1, 43, 1, 44, 1, 45, 1, + 46, 1, 47, 1, 48, 1, 49, 1, + 50, 1, 51, 1, 52, 1, 53, 1, + 54, 1, 55, 1, 56, 1, 57, 1, + 58, 1, 59, 1, 60, 1, 61, 1, + 62, 1, 63, 1, 64, 1, 65, 1, + 66, 1, 67, 1, 68, 1, 69, 1, + 70, 1, 71, 1, 72, 1, 73, 1, + 74, 1, 75, 1, 76, 1, 77, 1, + 78, 1, 79, 1, 80, 1, 81, 1, + 82, 1, 83, 1, 84, 1, 85, 1, + 86, 1, 87, 1, 88, 1, 89, 1, + 90, 1, 91, 1, 92, 1, 93, 1, + 94, 1, 95, 1, 96, 1, 97, 1, + 98, 1, 99, 1, 100, 1, 101, 1, + 102, 1, 103, 1, 104, 1, 105, 1, + 106, 1, 107, 1, 108, 1, 109, 1, + 110, 1, 111, 1, 112, 1, 113, 1, + 114, 1, 115, 1, 116, 1, 117, 1, + 118, 1, 119, 1, 120, 1, 121, 1, + 122, 1, 123, 1, 124, 1, 125, 1, + 126, 1, 127, 1, 128, 1, 129, 1, + 130, 1, 131, 1, 132, 1, 133, 1, + 134, 1, 135, 1, 136, 1, 137, 1, + 138, 1, 139, 1, 140, 1, 141, 1, + 142, 1, 143, 1, 144, 1, 145, 1, + 146, 1, 147, 1, 148, 1, 149, 1, + 150, 1, 151, 1, 152, 1, 153, 1, + 154, 1, 155, 1, 156, 1, 157, 1, + 158, 1, 159, 1, 160, 1, 161, 1, + 162, 1, 163, 1, 164, 1, 165, 1, + 166, 1, 167, 1, 168, 1, 169, 1, + 170, 1, 171, 1, 172, 1, 173, 1, + 174, 1, 175, 1, 176, 1, 177, 1, + 178, 1, 179, 1, 180, 1, 181, 1, + 182, 1, 183, 1, 184, 1, 185, 1, + 186, 1, 187, 1, 188, 1, 189, 1, + 190, 1, 191, 1, 192, 1, 193, 1, + 194, 1, 195, 1, 196, 1, 197, 1, + 198, 1, 199, 1, 200, 1, 201, 1, + 202, 1, 203, 1, 204, 1, 205, 1, + 206, 1, 207, 1, 208, 1, 209, 1, + 210, 1, 211, 1, 212, 1, 213, 1, + 214, 1, 215, 1, 216, 1, 217, 1, + 218, 1, 219, 1, 220, 1, 221, 1, + 222, 1, 223, 1, 224, 1, 225, 1, + 226, 1, 227, 1, 228, 1, 229, 1, + 230, 1, 231, 1, 232, 1, 233, 1, + 234, 1, 235, 1, 236, 1, 237, 1, + 240, 1, 242, 1, 243, 1, 244, 1, + 245, 1, 246, 1, 247, 1, 248, 1, + 249, 1, 250, 1, 251, 1, 252, 1, + 253, 1, 254, 1, 255, 1, 256, 1, + 257, 1, 258, 1, 259, 1, 260, 1, + 261, 1, 262, 1, 263, 1, 264, 1, + 265, 1, 266, 1, 267, 1, 268, 1, + 269, 1, 270, 1, 271, 1, 272, 1, + 273, 1, 274, 1, 275, 1, 276, 1, + 277, 1, 278, 1, 279, 1, 280, 1, + 281, 1, 282, 1, 283, 1, 284, 1, + 285, 1, 286, 1, 287, 1, 288, 1, + 289, 1, 290, 1, 291, 1, 292, 1, + 293, 1, 294, 1, 295, 1, 296, 1, + 297, 1, 298, 1, 299, 1, 300, 1, + 301, 1, 302, 1, 303, 1, 307, 1, + 308, 1, 309, 1, 310, 1, 311, 1, + 312, 1, 313, 1, 314, 1, 315, 1, + 316, 1, 317, 1, 318, 1, 319, 1, + 320, 1, 321, 1, 322, 1, 323, 1, + 324, 1, 325, 1, 326, 1, 327, 1, + 328, 1, 329, 1, 330, 1, 331, 1, + 332, 1, 333, 1, 334, 1, 335, 1, + 336, 1, 337, 1, 338, 1, 342, 1, + 343, 1, 344, 1, 345, 1, 346, 1, + 347, 1, 348, 1, 349, 1, 350, 1, + 352, 1, 353, 1, 354, 1, 355, 1, + 356, 1, 357, 1, 358, 1, 359, 1, + 360, 1, 361, 1, 362, 1, 363, 1, + 364, 1, 365, 1, 366, 1, 367, 1, + 368, 1, 369, 1, 370, 1, 371, 1, + 372, 1, 373, 1, 374, 1, 375, 1, + 376, 1, 377, 1, 378, 1, 379, 1, + 380, 1, 381, 1, 382, 1, 383, 1, + 384, 1, 385, 1, 386, 1, 387, 1, + 388, 1, 389, 1, 390, 1, 391, 1, + 392, 1, 393, 1, 394, 1, 395, 1, + 396, 1, 397, 1, 398, 1, 399, 1, + 400, 1, 401, 1, 402, 1, 403, 1, + 404, 1, 405, 1, 406, 1, 407, 1, + 408, 1, 409, 1, 410, 1, 411, 1, + 412, 1, 413, 1, 414, 1, 415, 1, + 416, 1, 417, 1, 418, 1, 419, 1, + 420, 1, 421, 1, 422, 1, 423, 1, + 424, 1, 425, 1, 426, 1, 427, 1, + 428, 1, 429, 1, 430, 1, 431, 1, + 432, 1, 433, 1, 434, 1, 435, 1, + 436, 2, 3, 0, 2, 4, 5, 2, + 5, 1, 2, 9, 10, 2, 9, 238, + 2, 9, 239, 2, 9, 339, 2, 10, + 1, 2, 10, 340, 2, 10, 341, 2, + 11, 241, 2, 11, 351, 2, 12, 241, + 2, 12, 351, 2, 13, 241, 2, 13, + 351, 2, 14, 375, 2, 14, 376, 2, + 25, 0, 2, 25, 3, 2, 25, 6, + 2, 25, 14, 3, 25, 5, 306, 3, + 25, 10, 305, 3, 25, 14, 15, 4, + 25, 9, 304, 10, 0 + }; + + static const short _regex_key_offsets[] = { + 0, 0, 2, 4, 6, 7, 29, 37, + 45, 52, 60, 61, 69, 77, 85, 92, + 100, 103, 105, 114, 121, 129, 137, 140, + 146, 154, 157, 164, 171, 179, 186, 190, + 197, 200, 203, 205, 208, 211, 213, 216, + 219, 221, 222, 224, 225, 233, 235, 238, + 241, 242, 250, 258, 266, 274, 281, 289, + 296, 304, 311, 319, 321, 324, 331, 335, + 338, 341, 342, 344, 345, 347, 349, 350, + 351, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 369, + 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 392, 393, 394, + 395, 396, 397, 399, 400, 401, 402, 403, + 404, 405, 406, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 429, + 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 561, + 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 631, + 632, 633, 634, 635, 636, 637, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 650, + 651, 652, 653, 654, 655, 656, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, 681, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 704, 705, 706, 707, 708, + 709, 710, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 752, + 753, 754, 755, 756, 757, 758, 759, 760, + 761, 762, 763, 764, 765, 766, 767, 768, + 769, 770, 771, 773, 774, 775, 776, 777, + 778, 779, 780, 781, 782, 783, 784, 785, + 786, 787, 788, 789, 790, 791, 792, 793, + 794, 795, 796, 797, 798, 799, 800, 801, + 802, 803, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 820, + 822, 823, 824, 825, 826, 827, 828, 829, + 830, 833, 834, 835, 836, 837, 838, 839, + 840, 841, 842, 843, 844, 845, 846, 847, + 849, 850, 851, 853, 854, 855, 856, 857, + 858, 859, 860, 861, 862, 863, 864, 865, + 866, 867, 868, 869, 870, 871, 872, 873, + 874, 875, 876, 877, 879, 881, 883, 886, + 889, 891, 906, 909, 912, 914, 928, 933, + 938, 942, 946, 949, 952, 956, 960, 963, + 966, 970, 974, 978, 981, 984, 988, 992, + 996, 1000, 1003, 1006, 1010, 1014, 1018, 1022, + 1025, 1028, 1032, 1036, 1040, 1044, 1047, 1050, + 1054, 1058, 1062, 1066, 1069, 1072, 1076, 1080, + 1084, 1088, 1091, 1094, 1099, 1103, 1107, 1111, + 1114, 1117, 1121, 1125, 1129, 1132, 1135, 1139, + 1143, 1147, 1151, 1154, 1157, 1161, 1165, 1169, + 1173, 1176, 1179, 1183, 1187, 1191, 1194, 1197, + 1201, 1205, 1209, 1213, 1217, 1220, 1223, 1228, + 1233, 1237, 1241, 1244, 1247, 1251, 1255, 1258, + 1261, 1265, 1269, 1273, 1276, 1279, 1283, 1287, + 1291, 1295, 1298, 1301, 1305, 1309, 1313, 1317, + 1320, 1323, 1327, 1331, 1335, 1339, 1342, 1345, + 1349, 1353, 1357, 1361, 1364, 1367, 1371, 1375, + 1379, 1383, 1386, 1389, 1394, 1398, 1402, 1406, + 1409, 1412, 1416, 1420, 1424, 1427, 1430, 1434, + 1438, 1442, 1446, 1449, 1452, 1456, 1460, 1464, + 1468, 1471, 1474, 1478, 1482, 1486, 1489, 1492, + 1496, 1500, 1504, 1508, 1512, 1515, 1518, 1521, + 1524, 1526, 1528, 1531, 1538, 1540, 1542, 1544, + 1546, 1548, 1550, 1577, 1579, 1581, 1583, 1585, + 1592, 1599, 1613, 1615, 1621, 1624, 1633, 1634, + 1637, 1640, 1647, 1649, 1651, 1653, 1656, 1701, + 1703, 1705, 1709, 1713, 1715, 1716, 1716, 1722, + 1724, 1726, 1728, 1730, 1733, 1734, 1735, 1742, + 1748, 1754, 1756, 1758, 1760, 1761, 1764, 1787, + 1790, 1795, 1804, 1806, 1807, 1809, 1814, 1817, + 1819, 1821, 1822, 1824, 1834, 1840, 1841, 1846, + 1850, 1858, 1860, 1869, 1873, 1874, 1875, 1879, + 1880, 1883, 1883, 1890, 1904, 1906, 1908, 1910, + 1913, 1952, 1954, 1956, 1958, 1960, 1961, 1961, + 1962, 1963, 1970, 1976, 1982, 1985, 1987, 1998, + 2000, 2002, 2004, 2005, 2016, 2018, 2020, 2022, + 2023, 2024, 0 + }; + + static const char _regex_trans_keys[] = { + -128, -65, -128, -65, -128, -65, 41, 33, + 35, 38, 39, 40, 41, 43, 45, 58, + 60, 61, 62, 63, 67, 80, 105, 109, + 115, 120, 123, 48, 57, 41, 95, 48, + 57, 65, 90, 97, 122, 39, 95, 48, + 57, 65, 90, 97, 122, 95, 48, 57, + 65, 90, 97, 122, 39, 95, 48, 57, + 65, 90, 97, 122, 41, 41, 95, 48, + 57, 65, 90, 97, 122, 41, 95, 48, + 57, 65, 90, 97, 122, 41, 95, 48, + 57, 65, 90, 97, 122, 95, 48, 57, + 65, 90, 97, 122, 62, 95, 48, 57, + 65, 90, 97, 122, 33, 60, 61, 33, + 61, 38, 41, 95, 48, 57, 65, 90, + 97, 122, 95, 48, 57, 65, 90, 97, + 122, 41, 95, 48, 57, 65, 90, 97, + 122, 41, 95, 48, 57, 65, 90, 97, + 122, 41, 48, 57, 41, 58, 105, 109, + 115, 120, 62, 95, 48, 57, 65, 90, + 97, 122, 41, 48, 57, 95, 48, 57, + 65, 90, 97, 122, 95, 48, 57, 65, + 90, 97, 122, 41, 95, 48, 57, 65, + 90, 97, 122, 95, 48, 57, 65, 90, + 97, 122, 105, 109, 115, 120, 41, 45, + 58, 105, 109, 115, 120, 46, 92, 93, + 46, 92, 93, 46, 92, 58, 92, 93, + 58, 92, 93, 58, 92, 61, 92, 93, + 61, 92, 93, 61, 92, 39, 48, 57, + 62, 45, 95, 48, 57, 65, 90, 97, + 122, 48, 57, 125, 48, 57, 125, 48, + 57, 125, 95, 125, 48, 57, 65, 90, + 97, 122, 95, 125, 48, 57, 65, 90, + 97, 122, 95, 125, 48, 57, 65, 90, + 97, 122, 95, 125, 48, 57, 65, 90, + 97, 122, 95, 48, 57, 65, 90, 97, + 122, 39, 95, 48, 57, 65, 90, 97, + 122, 95, 48, 57, 65, 90, 97, 122, + 62, 95, 48, 57, 65, 90, 97, 122, + 95, 48, 57, 65, 90, 97, 122, 95, + 125, 48, 57, 65, 90, 97, 122, 48, + 55, 125, 48, 55, 125, 48, 57, 65, + 70, 97, 102, 44, 125, 48, 57, 125, + 48, 57, 125, 48, 57, 41, 41, 80, + 41, 41, 70, 41, 56, 41, 121, 97, + 109, 98, 105, 99, 101, 110, 105, 97, + 110, 101, 115, 116, 97, 110, 108, 109, + 116, 105, 110, 101, 115, 101, 117, 109, + 97, 107, 110, 103, 97, 108, 105, 112, + 111, 109, 111, 102, 111, 97, 104, 105, + 109, 105, 108, 108, 101, 103, 104, 105, + 110, 101, 115, 101, 105, 100, 110, 114, + 97, 100, 105, 97, 110, 95, 65, 98, + 111, 114, 105, 103, 105, 110, 97, 108, + 105, 97, 110, 97, 101, 109, 114, 111, + 107, 101, 101, 109, 111, 110, 116, 105, + 99, 110, 101, 105, 102, 111, 114, 109, + 112, 114, 114, 105, 111, 116, 105, 108, + 108, 105, 99, 115, 118, 101, 114, 101, + 116, 97, 110, 97, 103, 97, 114, 105, + 121, 112, 116, 105, 97, 110, 95, 72, + 105, 101, 114, 111, 103, 108, 121, 112, + 104, 115, 104, 105, 111, 112, 105, 99, + 111, 114, 103, 105, 97, 110, 97, 103, + 111, 108, 105, 116, 105, 99, 116, 104, + 105, 99, 101, 101, 107, 106, 114, 97, + 114, 97, 116, 105, 109, 117, 107, 104, + 105, 110, 117, 108, 110, 111, 111, 98, + 114, 101, 119, 114, 97, 103, 97, 110, + 97, 112, 101, 114, 105, 97, 108, 95, + 65, 114, 97, 109, 97, 105, 99, 104, + 115, 101, 114, 105, 116, 101, 100, 99, + 114, 105, 112, 116, 105, 111, 110, 97, + 108, 95, 80, 97, 104, 114, 108, 97, + 118, 105, 116, 104, 105, 97, 110, 118, + 97, 110, 101, 115, 101, 105, 110, 116, + 121, 116, 104, 105, 110, 97, 100, 97, + 97, 107, 97, 110, 97, 97, 104, 95, + 76, 105, 97, 109, 114, 111, 115, 104, + 116, 104, 105, 101, 114, 111, 116, 105, + 110, 112, 99, 104, 97, 109, 110, 115, + 98, 117, 101, 97, 114, 95, 66, 117, + 99, 100, 105, 97, 110, 105, 97, 110, + 108, 110, 97, 121, 97, 108, 97, 109, + 100, 97, 105, 99, 116, 101, 105, 95, + 77, 97, 121, 101, 107, 110, 103, 111, + 108, 105, 97, 110, 97, 110, 109, 97, + 114, 119, 95, 84, 97, 105, 95, 76, + 117, 101, 111, 104, 97, 109, 95, 100, + 67, 104, 105, 107, 105, 95, 73, 80, + 83, 84, 116, 97, 108, 105, 99, 101, + 114, 115, 105, 97, 110, 111, 117, 116, + 104, 95, 65, 114, 97, 98, 105, 97, + 110, 117, 114, 107, 105, 99, 105, 121, + 97, 109, 97, 110, 121, 97, 97, 111, + 103, 115, 95, 80, 97, 101, 110, 105, + 99, 105, 97, 110, 106, 97, 110, 103, + 110, 105, 99, 109, 117, 97, 114, 105, + 116, 97, 110, 114, 97, 115, 104, 116, + 114, 97, 97, 118, 105, 97, 110, 110, + 104, 97, 108, 97, 110, 100, 97, 110, + 101, 115, 101, 108, 114, 111, 116, 105, + 95, 78, 97, 103, 114, 105, 105, 97, + 99, 103, 105, 109, 97, 98, 108, 111, + 103, 97, 110, 119, 97, 95, 76, 84, + 86, 101, 104, 97, 109, 105, 101, 116, + 105, 108, 108, 117, 103, 117, 97, 97, + 105, 110, 97, 98, 102, 101, 116, 97, + 110, 105, 110, 97, 103, 104, 97, 114, + 105, 116, 105, 99, 105, 110, 115, 112, + 100, 123, 94, 125, 94, -128, -65, -128, + -65, -128, -65, 46, 92, 93, 46, 92, + 93, 46, 92, 58, 92, 93, 94, 97, + 98, 99, 100, 103, 108, 112, 115, 117, + 119, 120, 58, 92, 93, 58, 92, 93, + 58, 92, 58, 92, 93, 97, 98, 99, + 100, 103, 108, 112, 115, 117, 119, 120, + 58, 92, 93, 108, 115, 58, 92, 93, + 110, 112, 58, 92, 93, 117, 58, 92, + 93, 109, 58, 92, 93, 58, 92, 93, + 58, 92, 93, 104, 58, 92, 93, 97, + 58, 92, 93, 58, 92, 93, 58, 92, + 93, 99, 58, 92, 93, 105, 58, 92, + 93, 105, 58, 92, 93, 58, 92, 93, + 58, 92, 93, 108, 58, 92, 93, 97, + 58, 92, 93, 110, 58, 92, 93, 107, + 58, 92, 93, 58, 92, 93, 58, 92, + 93, 110, 58, 92, 93, 116, 58, 92, + 93, 114, 58, 92, 93, 108, 58, 92, + 93, 58, 92, 93, 58, 92, 93, 105, + 58, 92, 93, 103, 58, 92, 93, 105, + 58, 92, 93, 116, 58, 92, 93, 58, + 92, 93, 58, 92, 93, 114, 58, 92, + 93, 97, 58, 92, 93, 112, 58, 92, + 93, 104, 58, 92, 93, 58, 92, 93, + 58, 92, 93, 111, 58, 92, 93, 119, + 58, 92, 93, 101, 58, 92, 93, 114, + 58, 92, 93, 58, 92, 93, 58, 92, + 93, 114, 117, 58, 92, 93, 105, 58, + 92, 93, 110, 58, 92, 93, 116, 58, + 92, 93, 58, 92, 93, 58, 92, 93, + 110, 58, 92, 93, 99, 58, 92, 93, + 116, 58, 92, 93, 58, 92, 93, 58, + 92, 93, 112, 58, 92, 93, 97, 58, + 92, 93, 99, 58, 92, 93, 101, 58, + 92, 93, 58, 92, 93, 58, 92, 93, + 112, 58, 92, 93, 112, 58, 92, 93, + 101, 58, 92, 93, 114, 58, 92, 93, + 58, 92, 93, 58, 92, 93, 111, 58, + 92, 93, 114, 58, 92, 93, 100, 58, + 92, 93, 58, 92, 93, 58, 92, 93, + 100, 58, 92, 93, 105, 58, 92, 93, + 103, 58, 92, 93, 105, 58, 92, 93, + 116, 58, 92, 93, 58, 92, 93, 58, + 92, 93, 108, 115, 58, 92, 93, 110, + 112, 58, 92, 93, 117, 58, 92, 93, + 109, 58, 92, 93, 58, 92, 93, 58, + 92, 93, 104, 58, 92, 93, 97, 58, + 92, 93, 58, 92, 93, 58, 92, 93, + 99, 58, 92, 93, 105, 58, 92, 93, + 105, 58, 92, 93, 58, 92, 93, 58, + 92, 93, 108, 58, 92, 93, 97, 58, + 92, 93, 110, 58, 92, 93, 107, 58, + 92, 93, 58, 92, 93, 58, 92, 93, + 110, 58, 92, 93, 116, 58, 92, 93, + 114, 58, 92, 93, 108, 58, 92, 93, + 58, 92, 93, 58, 92, 93, 105, 58, + 92, 93, 103, 58, 92, 93, 105, 58, + 92, 93, 116, 58, 92, 93, 58, 92, + 93, 58, 92, 93, 114, 58, 92, 93, + 97, 58, 92, 93, 112, 58, 92, 93, + 104, 58, 92, 93, 58, 92, 93, 58, + 92, 93, 111, 58, 92, 93, 119, 58, + 92, 93, 101, 58, 92, 93, 114, 58, + 92, 93, 58, 92, 93, 58, 92, 93, + 114, 117, 58, 92, 93, 105, 58, 92, + 93, 110, 58, 92, 93, 116, 58, 92, + 93, 58, 92, 93, 58, 92, 93, 110, + 58, 92, 93, 99, 58, 92, 93, 116, + 58, 92, 93, 58, 92, 93, 58, 92, + 93, 112, 58, 92, 93, 97, 58, 92, + 93, 99, 58, 92, 93, 101, 58, 92, + 93, 58, 92, 93, 58, 92, 93, 112, + 58, 92, 93, 112, 58, 92, 93, 101, + 58, 92, 93, 114, 58, 92, 93, 58, + 92, 93, 58, 92, 93, 111, 58, 92, + 93, 114, 58, 92, 93, 100, 58, 92, + 93, 58, 92, 93, 58, 92, 93, 100, + 58, 92, 93, 105, 58, 92, 93, 103, + 58, 92, 93, 105, 58, 92, 93, 116, + 58, 92, 93, 58, 92, 93, 61, 92, + 93, 61, 92, 93, 61, 92, 48, 55, + 125, 48, 55, 125, 48, 57, 65, 70, + 97, 102, -128, -65, -128, -65, -128, -65, + -128, -65, -128, -65, -128, -65, 0, 32, + 35, 36, 40, 41, 42, 43, 46, 63, + 91, 92, 94, 123, 124, -128, -65, -64, + -33, -32, -17, -16, -9, -8, -1, 9, + 13, -128, -65, -128, -65, -128, -65, 42, + 63, 95, 48, 57, 65, 90, 97, 122, + 95, 48, 57, 65, 90, 97, 122, 39, + 48, 60, 63, 82, 95, 49, 55, 56, + 57, 65, 90, 97, 122, 48, 57, 105, + 109, 115, 120, 48, 57, 41, 48, 57, + 33, 61, 95, 48, 57, 65, 90, 97, + 122, 123, 41, 48, 57, 60, 61, 62, + 41, 45, 58, 105, 109, 115, 120, 43, + 63, 43, 63, 43, 63, 46, 58, 61, + 48, 65, 66, 67, 68, 69, 71, 72, + 75, 76, 78, 80, 81, 82, 83, 85, + 86, 87, 88, 90, 97, 98, 99, 100, + 101, 102, 103, 104, 107, 108, 110, 111, + 112, 114, 115, 116, 117, 118, 119, 120, + 122, 49, 55, 56, 57, 48, 55, 48, + 55, 48, 55, 56, 57, 48, 55, 56, + 57, 48, 57, 123, 39, 45, 60, 123, + 48, 57, 48, 57, 48, 57, 48, 57, + 48, 57, 39, 60, 123, 123, 123, 123, + 48, 57, 65, 70, 97, 102, 48, 57, + 65, 70, 97, 102, 48, 57, 65, 70, + 97, 102, 48, 57, 43, 63, 41, 85, + 41, 41, 67, 84, 65, 66, 67, 68, + 69, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 82, 83, 84, 85, 86, + 88, 89, 90, 110, 114, 118, 97, 101, + 111, 114, 117, 97, 99, 102, 104, 110, + 111, 115, 117, 121, 109, 112, 101, 103, + 116, 101, 108, 111, 114, 117, 97, 101, + 105, 103, 117, 109, 110, 97, 97, 104, + 38, 97, 101, 105, 108, 109, 111, 116, + 117, 121, 97, 99, 101, 110, 111, 121, + 101, 100, 101, 107, 108, 111, 103, 108, + 114, 115, 99, 100, 101, 102, 104, 105, + 111, 115, 101, 117, 97, 99, 104, 105, + 107, 109, 111, 117, 121, 97, 101, 104, + 105, 103, 97, 97, 112, 115, 119, 105, + 108, 112, 115, 67, 76, 77, 78, 80, + 83, 90, 45, 91, 92, 93, -128, -65, + -64, -33, -32, -17, -16, -9, -8, -1, + -128, -65, -128, -65, -128, -65, 46, 58, + 61, 48, 68, 69, 72, 76, 78, 80, + 81, 83, 85, 86, 87, 97, 98, 99, + 100, 101, 102, 103, 104, 108, 110, 111, + 112, 114, 115, 116, 117, 118, 119, 120, + 49, 55, 56, 57, 65, 90, 105, 122, + 48, 55, 48, 55, 48, 55, 48, 55, + 123, 123, 123, 123, 48, 57, 65, 70, + 97, 102, 48, 57, 65, 70, 97, 102, + 48, 57, 65, 70, 97, 102, 92, 93, + 94, 69, 81, 92, -128, -65, -64, -33, + -32, -17, -16, -9, -8, -1, -128, -65, + -128, -65, -128, -65, 69, 92, -128, -65, + -64, -33, -32, -17, -16, -9, -8, -1, + -128, -65, -128, -65, -128, -65, 69, 41, + 10, 0 + }; + + static const signed char _regex_single_lengths[] = { + 0, 0, 0, 0, 1, 20, 2, 2, + 1, 2, 1, 2, 2, 2, 1, 2, + 3, 2, 3, 1, 2, 2, 1, 6, + 2, 1, 1, 1, 2, 1, 4, 7, + 3, 3, 2, 3, 3, 2, 3, 3, + 2, 1, 0, 1, 2, 0, 1, 1, + 1, 2, 2, 2, 2, 1, 2, 1, + 2, 1, 2, 0, 1, 1, 2, 1, + 1, 1, 2, 1, 2, 2, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 4, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 2, + 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 3, 3, + 2, 15, 3, 3, 2, 14, 5, 5, + 4, 4, 3, 3, 4, 4, 3, 3, + 4, 4, 4, 3, 3, 4, 4, 4, + 4, 3, 3, 4, 4, 4, 4, 3, + 3, 4, 4, 4, 4, 3, 3, 4, + 4, 4, 4, 3, 3, 4, 4, 4, + 4, 3, 3, 5, 4, 4, 4, 3, + 3, 4, 4, 4, 3, 3, 4, 4, + 4, 4, 3, 3, 4, 4, 4, 4, + 3, 3, 4, 4, 4, 3, 3, 4, + 4, 4, 4, 4, 3, 3, 5, 5, + 4, 4, 3, 3, 4, 4, 3, 3, + 4, 4, 4, 3, 3, 4, 4, 4, + 4, 3, 3, 4, 4, 4, 4, 3, + 3, 4, 4, 4, 4, 3, 3, 4, + 4, 4, 4, 3, 3, 4, 4, 4, + 4, 3, 3, 5, 4, 4, 4, 3, + 3, 4, 4, 4, 3, 3, 4, 4, + 4, 4, 3, 3, 4, 4, 4, 4, + 3, 3, 4, 4, 4, 3, 3, 4, + 4, 4, 4, 4, 3, 3, 3, 3, + 2, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 15, 0, 0, 0, 2, 1, + 1, 6, 0, 4, 1, 3, 1, 1, + 3, 7, 2, 2, 2, 3, 41, 0, + 0, 0, 0, 0, 1, 0, 4, 0, + 0, 0, 0, 3, 1, 1, 1, 0, + 0, 0, 2, 2, 1, 3, 23, 3, + 5, 9, 2, 1, 2, 5, 3, 2, + 2, 1, 2, 10, 6, 1, 5, 4, + 8, 2, 9, 4, 1, 1, 4, 1, + 3, 0, 7, 4, 0, 0, 0, 3, + 31, 0, 0, 0, 0, 1, 0, 1, + 1, 1, 0, 0, 3, 2, 1, 0, + 0, 0, 1, 1, 0, 0, 0, 1, + 1, 1, 0 + }; + + static const signed char _regex_range_lengths[] = { + 0, 1, 1, 1, 0, 1, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 3, + 0, 0, 3, 3, 3, 3, 1, 0, + 3, 1, 3, 3, 3, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 3, 1, 1, 1, + 0, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 1, 1, 3, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 3, 1, 1, 1, 1, + 1, 1, 6, 1, 1, 1, 0, 3, + 3, 4, 1, 1, 1, 3, 0, 1, + 0, 0, 0, 0, 0, 0, 2, 1, + 1, 2, 2, 1, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 3, 3, + 3, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 1, 1, 1, 0, + 4, 1, 1, 1, 1, 0, 0, 0, + 0, 3, 3, 3, 0, 0, 5, 1, + 1, 1, 0, 5, 1, 1, 1, 0, + 0, 0, 0 + }; + + static const short _regex_index_offsets[] = { + 0, 0, 2, 4, 6, 8, 30, 36, + 42, 47, 53, 55, 61, 67, 73, 78, + 84, 88, 91, 98, 103, 109, 115, 118, + 125, 131, 134, 139, 144, 150, 155, 160, + 168, 172, 176, 179, 183, 187, 190, 194, + 198, 201, 203, 205, 207, 213, 215, 218, + 221, 223, 229, 235, 241, 247, 252, 258, + 263, 269, 274, 280, 282, 285, 290, 294, + 297, 300, 302, 305, 307, 310, 313, 315, + 317, 320, 322, 324, 326, 328, 330, 332, + 334, 336, 338, 340, 342, 344, 346, 350, + 352, 354, 356, 358, 360, 362, 364, 366, + 368, 370, 372, 374, 376, 378, 380, 382, + 384, 386, 388, 390, 392, 395, 397, 399, + 401, 403, 405, 408, 410, 412, 414, 416, + 418, 420, 422, 425, 427, 429, 431, 433, + 435, 437, 439, 441, 443, 445, 447, 449, + 451, 453, 455, 457, 459, 461, 463, 466, + 468, 470, 472, 474, 476, 478, 480, 482, + 484, 486, 488, 490, 492, 494, 496, 498, + 500, 502, 504, 507, 509, 511, 513, 515, + 517, 519, 521, 523, 525, 528, 530, 532, + 534, 536, 538, 540, 542, 544, 546, 548, + 550, 552, 554, 556, 558, 560, 562, 564, + 566, 568, 570, 572, 574, 576, 578, 580, + 582, 584, 586, 588, 590, 592, 594, 596, + 598, 600, 602, 604, 606, 608, 610, 612, + 614, 616, 618, 620, 622, 624, 626, 628, + 630, 632, 634, 636, 638, 640, 643, 645, + 647, 649, 651, 653, 655, 657, 659, 661, + 663, 665, 667, 669, 671, 673, 675, 677, + 679, 681, 683, 685, 687, 689, 691, 693, + 695, 697, 699, 701, 703, 705, 707, 709, + 711, 713, 715, 717, 719, 721, 723, 726, + 728, 730, 732, 734, 736, 738, 740, 742, + 744, 746, 748, 750, 752, 754, 756, 758, + 760, 762, 764, 767, 769, 771, 773, 775, + 777, 779, 781, 783, 785, 787, 789, 791, + 793, 795, 797, 802, 804, 806, 808, 810, + 812, 814, 816, 818, 820, 822, 824, 826, + 828, 830, 832, 834, 836, 839, 841, 843, + 845, 847, 849, 851, 853, 855, 857, 860, + 862, 864, 866, 868, 870, 872, 876, 878, + 880, 882, 884, 886, 888, 890, 892, 895, + 897, 899, 901, 903, 905, 907, 910, 912, + 914, 916, 918, 920, 922, 924, 926, 928, + 930, 932, 934, 936, 938, 940, 942, 944, + 946, 948, 950, 952, 954, 956, 958, 960, + 962, 964, 966, 968, 970, 972, 974, 976, + 978, 980, 982, 984, 986, 988, 990, 992, + 994, 996, 998, 1001, 1003, 1005, 1007, 1009, + 1011, 1013, 1018, 1020, 1022, 1024, 1026, 1028, + 1030, 1032, 1034, 1036, 1038, 1040, 1042, 1044, + 1046, 1048, 1050, 1052, 1054, 1056, 1058, 1060, + 1062, 1064, 1066, 1068, 1070, 1072, 1074, 1076, + 1078, 1080, 1082, 1084, 1086, 1088, 1090, 1093, + 1095, 1097, 1099, 1101, 1103, 1105, 1107, 1109, + 1111, 1113, 1115, 1117, 1119, 1121, 1123, 1125, + 1127, 1129, 1131, 1134, 1136, 1138, 1140, 1142, + 1144, 1146, 1148, 1150, 1152, 1154, 1156, 1158, + 1160, 1162, 1164, 1166, 1168, 1170, 1172, 1174, + 1176, 1178, 1180, 1182, 1184, 1186, 1188, 1190, + 1192, 1194, 1197, 1199, 1201, 1203, 1205, 1207, + 1209, 1211, 1213, 1215, 1217, 1219, 1221, 1225, + 1228, 1230, 1232, 1234, 1236, 1238, 1240, 1242, + 1244, 1248, 1250, 1252, 1254, 1256, 1258, 1260, + 1262, 1264, 1266, 1268, 1270, 1272, 1274, 1276, + 1279, 1281, 1283, 1286, 1288, 1290, 1292, 1294, + 1296, 1298, 1300, 1302, 1304, 1306, 1308, 1310, + 1312, 1314, 1316, 1318, 1320, 1322, 1324, 1326, + 1328, 1330, 1332, 1334, 1336, 1338, 1340, 1344, + 1348, 1351, 1367, 1371, 1375, 1378, 1393, 1399, + 1405, 1410, 1415, 1419, 1423, 1428, 1433, 1437, + 1441, 1446, 1451, 1456, 1460, 1464, 1469, 1474, + 1479, 1484, 1488, 1492, 1497, 1502, 1507, 1512, + 1516, 1520, 1525, 1530, 1535, 1540, 1544, 1548, + 1553, 1558, 1563, 1568, 1572, 1576, 1581, 1586, + 1591, 1596, 1600, 1604, 1610, 1615, 1620, 1625, + 1629, 1633, 1638, 1643, 1648, 1652, 1656, 1661, + 1666, 1671, 1676, 1680, 1684, 1689, 1694, 1699, + 1704, 1708, 1712, 1717, 1722, 1727, 1731, 1735, + 1740, 1745, 1750, 1755, 1760, 1764, 1768, 1774, + 1780, 1785, 1790, 1794, 1798, 1803, 1808, 1812, + 1816, 1821, 1826, 1831, 1835, 1839, 1844, 1849, + 1854, 1859, 1863, 1867, 1872, 1877, 1882, 1887, + 1891, 1895, 1900, 1905, 1910, 1915, 1919, 1923, + 1928, 1933, 1938, 1943, 1947, 1951, 1956, 1961, + 1966, 1971, 1975, 1979, 1985, 1990, 1995, 2000, + 2004, 2008, 2013, 2018, 2023, 2027, 2031, 2036, + 2041, 2046, 2051, 2055, 2059, 2064, 2069, 2074, + 2079, 2083, 2087, 2092, 2097, 2102, 2106, 2110, + 2115, 2120, 2125, 2130, 2135, 2139, 2143, 2147, + 2151, 2154, 2156, 2159, 2164, 2166, 2168, 2170, + 2172, 2174, 2176, 2198, 2200, 2202, 2204, 2207, + 2212, 2217, 2228, 2230, 2236, 2239, 2246, 2248, + 2251, 2255, 2263, 2266, 2269, 2272, 2276, 2320, + 2322, 2324, 2327, 2330, 2332, 2334, 2335, 2341, + 2343, 2345, 2347, 2349, 2353, 2355, 2357, 2362, + 2366, 2370, 2372, 2375, 2378, 2380, 2384, 2408, + 2412, 2418, 2428, 2431, 2433, 2436, 2442, 2446, + 2449, 2452, 2454, 2457, 2468, 2475, 2477, 2483, + 2488, 2497, 2500, 2510, 2515, 2517, 2519, 2524, + 2526, 2530, 2531, 2539, 2549, 2551, 2553, 2555, + 2559, 2595, 2597, 2599, 2601, 2603, 2605, 2606, + 2608, 2610, 2615, 2619, 2623, 2627, 2630, 2637, + 2639, 2641, 2643, 2645, 2652, 2654, 2656, 2658, + 2660, 2662, 0 + }; + + static const signed char _regex_trans_cond_spaces[] = { + 0, -1, 0, -1, 0, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, -1, + 0, -1, 0, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 0, -1, 0, -1, + 0, -1, 0, -1, 0, -1, 0, -1, + -1, -1, 1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + 0, -1, 0, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 0, + 0, 0, 0, 0, -1, 0, -1, 0, + -1, 0, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + 2, 2, -1, -1, -1, -1, -1, 0, + 0, 0, 0, 0, -1, 0, -1, 0, + -1, 0, -1, -1, -1, -1, 0, 0, + 0, 0, 0, -1, 0, -1, 0, -1, + 0, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 0 + }; + + static const short _regex_trans_offsets[] = { + 0, 2, 3, 5, 6, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, 681, 682, + 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, + 755, 756, 757, 758, 759, 760, 761, 762, + 763, 764, 765, 766, 767, 768, 769, 770, + 771, 772, 773, 774, 775, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 785, 786, + 787, 788, 789, 790, 791, 792, 793, 794, + 795, 796, 797, 798, 799, 800, 801, 802, + 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 817, 818, + 819, 820, 821, 822, 823, 824, 825, 826, + 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, + 843, 844, 845, 846, 847, 848, 849, 850, + 851, 852, 853, 854, 855, 856, 857, 858, + 859, 860, 861, 862, 863, 864, 865, 866, + 867, 868, 869, 870, 871, 872, 873, 874, + 875, 876, 877, 878, 879, 880, 881, 882, + 883, 884, 885, 886, 887, 888, 889, 890, + 891, 892, 893, 894, 895, 896, 897, 898, + 899, 900, 901, 902, 903, 904, 905, 906, + 907, 908, 909, 910, 911, 912, 913, 914, + 915, 916, 917, 918, 919, 920, 921, 922, + 923, 924, 925, 926, 927, 928, 929, 930, + 931, 932, 933, 934, 935, 936, 937, 938, + 939, 940, 941, 942, 943, 944, 945, 946, + 947, 948, 949, 950, 951, 952, 953, 954, + 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 965, 966, 967, 968, 969, 970, + 971, 972, 973, 974, 975, 976, 977, 978, + 979, 980, 981, 982, 983, 984, 985, 986, + 987, 988, 989, 990, 991, 992, 993, 994, + 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, + 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, + 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, + 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, + 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, + 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, + 1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, + 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, + 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082, + 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, + 1091, 1092, 1093, 1094, 1095, 1096, 1097, 1098, + 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106, + 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, + 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, + 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, + 1131, 1132, 1133, 1134, 1135, 1136, 1137, 1138, + 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, + 1147, 1148, 1149, 1150, 1151, 1152, 1153, 1154, + 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, + 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, + 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, + 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, + 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, + 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, + 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, + 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, + 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, + 1227, 1228, 1229, 1230, 1231, 1232, 1233, 1234, + 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, + 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, + 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, + 1259, 1260, 1261, 1262, 1263, 1264, 1265, 1266, + 1267, 1268, 1269, 1270, 1271, 1272, 1273, 1274, + 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, + 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, + 1291, 1292, 1293, 1294, 1295, 1296, 1297, 1298, + 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, + 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, + 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, + 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, + 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1339, + 1340, 1342, 1343, 1345, 1346, 1347, 1348, 1349, + 1350, 1351, 1352, 1353, 1354, 1355, 1356, 1357, + 1358, 1359, 1360, 1361, 1362, 1363, 1364, 1365, + 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1373, + 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, + 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, + 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, + 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1405, + 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, + 1414, 1415, 1416, 1417, 1418, 1419, 1420, 1421, + 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1429, + 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1437, + 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, + 1446, 1447, 1448, 1449, 1450, 1451, 1452, 1453, + 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, + 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, + 1470, 1471, 1472, 1473, 1474, 1475, 1476, 1477, + 1478, 1479, 1480, 1481, 1482, 1483, 1484, 1485, + 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, + 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, + 1510, 1511, 1512, 1513, 1514, 1515, 1516, 1517, + 1518, 1519, 1520, 1521, 1522, 1523, 1524, 1525, + 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, + 1534, 1535, 1536, 1537, 1538, 1539, 1540, 1541, + 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, + 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, + 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, + 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1573, + 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, + 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, + 1590, 1591, 1592, 1593, 1594, 1595, 1596, 1597, + 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, + 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, + 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, + 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, + 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, + 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, + 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, + 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, + 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, + 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, + 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, + 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, + 1694, 1695, 1696, 1697, 1698, 1699, 1700, 1701, + 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, + 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, + 1718, 1719, 1720, 1721, 1722, 1723, 1724, 1725, + 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, + 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, + 1742, 1743, 1744, 1745, 1746, 1747, 1748, 1749, + 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, + 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765, + 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, + 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, + 1782, 1783, 1784, 1785, 1786, 1787, 1788, 1789, + 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, + 1798, 1799, 1800, 1801, 1802, 1803, 1804, 1805, + 1806, 1807, 1808, 1809, 1810, 1811, 1812, 1813, + 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821, + 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, + 1830, 1831, 1832, 1833, 1834, 1835, 1836, 1837, + 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, + 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, + 1854, 1855, 1856, 1857, 1858, 1859, 1860, 1861, + 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, + 1870, 1871, 1872, 1873, 1874, 1875, 1876, 1877, + 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, + 1886, 1887, 1888, 1889, 1890, 1891, 1892, 1893, + 1894, 1895, 1896, 1897, 1898, 1899, 1900, 1901, + 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, + 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, + 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, + 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, + 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, + 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, + 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, + 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, + 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, + 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, + 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, + 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, + 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, + 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, + 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, + 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, + 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, + 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, + 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, + 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, + 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, + 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, + 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, + 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, + 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, + 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2109, + 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, + 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, + 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, + 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, + 2142, 2143, 2144, 2145, 2146, 2147, 2148, 2149, + 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, + 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, + 2166, 2167, 2168, 2169, 2170, 2172, 2173, 2175, + 2176, 2178, 2179, 2181, 2182, 2184, 2185, 2187, + 2188, 2189, 2190, 2192, 2193, 2194, 2195, 2196, + 2197, 2198, 2199, 2200, 2201, 2202, 2203, 2204, + 2206, 2208, 2210, 2212, 2214, 2215, 2216, 2218, + 2219, 2221, 2222, 2224, 2225, 2226, 2227, 2228, + 2229, 2230, 2231, 2232, 2233, 2234, 2235, 2236, + 2237, 2238, 2239, 2240, 2241, 2242, 2243, 2244, + 2245, 2246, 2247, 2248, 2249, 2250, 2251, 2252, + 2253, 2254, 2255, 2256, 2257, 2258, 2259, 2260, + 2261, 2262, 2263, 2264, 2265, 2266, 2267, 2268, + 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, + 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, + 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, + 2293, 2294, 2295, 2296, 2297, 2298, 2299, 2300, + 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, + 2309, 2310, 2311, 2312, 2313, 2314, 2315, 2316, + 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, + 2325, 2326, 2327, 2328, 2329, 2330, 2331, 2332, + 2333, 2334, 2335, 2336, 2337, 2338, 2339, 2340, + 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, + 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, + 2357, 2358, 2359, 2360, 2361, 2362, 2363, 2364, + 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, + 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, + 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, + 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, + 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, + 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, + 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, + 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, + 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, + 2437, 2438, 2439, 2440, 2441, 2442, 2443, 2444, + 2445, 2446, 2447, 2448, 2449, 2450, 2451, 2452, + 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, + 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, + 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, + 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, + 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, + 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500, + 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, + 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, + 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, + 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, + 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, + 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, + 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2556, + 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, + 2566, 2568, 2570, 2572, 2574, 2575, 2577, 2578, + 2580, 2581, 2583, 2584, 2585, 2586, 2587, 2588, + 2589, 2590, 2591, 2592, 2593, 2594, 2595, 2596, + 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, + 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2612, + 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, + 2621, 2622, 2623, 2624, 2625, 2626, 2627, 2628, + 2629, 2630, 2631, 2632, 2633, 2634, 2635, 2636, + 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, + 2645, 2646, 2647, 2648, 2649, 2650, 2651, 2652, + 2653, 2655, 2657, 2658, 2659, 2660, 2661, 2662, + 2664, 2666, 2668, 2670, 2672, 2673, 2675, 2676, + 2678, 2679, 2681, 2682, 2683, 2684, 2685, 2687, + 2689, 2691, 2693, 2695, 2696, 2698, 2699, 2701, + 2702, 2704, 2705, 2706, 2707, 2708, 2709, 2710, + 2711, 2712, 2713, 2714, 2715, 2716, 2717, 2718, + 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, + 2727, 2728, 2729, 2730, 2731, 2732, 2733, 2734, + 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2742, + 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, + 2751, 2752, 2753, 2754, 2755, 2756, 2757, 2758, + 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, + 2767, 2768, 2769, 2770, 2771, 2772, 2773, 2774, + 2775, 2776, 2777, 2778, 2779, 2780, 2781, 2782, + 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, + 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, + 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, + 2807, 2808, 2809, 2810, 2811, 2812, 2813, 2814, + 2815, 2816, 2817, 2818, 2819, 2820, 2821, 2822, + 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, + 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, + 2839, 2840, 2841, 2842, 2843, 2844, 2845, 2846, + 2847, 2848, 2849, 2850, 2851, 2852, 2853, 2854, + 2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, + 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, + 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, + 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, + 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, + 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, + 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, + 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, + 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, + 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, + 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, + 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, + 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, + 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, + 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, + 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, + 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, + 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, + 2999, 3000, 3001, 3002, 3003, 3004, 3005, 3006, + 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, + 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, + 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, + 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, + 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046, + 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, + 3055, 3056, 3057, 3058, 3059, 3060, 3061, 3062, + 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, + 3071, 3072, 3073, 3074, 3075, 3076, 3077, 3078, + 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, + 3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, + 3095, 3096, 3097, 3098, 3099, 3100, 3101, 3102, + 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, + 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, + 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, + 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, + 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, + 3143, 3144, 3145, 3146, 3147, 3148, 3149, 3150, + 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, + 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, + 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, + 3175, 3176, 3177, 3178, 3179, 3180, 3181, 3182, + 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, + 3191, 3192, 3193, 3194, 3195, 3196, 3197, 3198, + 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3206, + 3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, + 3215, 3216, 3217, 3218, 3219, 3220, 3221, 3222, + 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, + 3231, 3232, 3233, 3234, 3235, 3236, 3237, 3238, + 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, + 3247, 3248, 3249, 3250, 3251, 3252, 3253, 3254, + 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, + 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3270, + 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, + 3279, 3280, 3281, 3282, 3283, 3284, 3285, 3286, + 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, + 3295, 3296, 3297, 3298, 3299, 3300, 3301, 3302, + 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, + 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, + 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, + 3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, + 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3342, + 3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, + 3351, 3352, 3353, 3354, 3355, 3356, 3357, 3358, + 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, + 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, + 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, + 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, + 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, + 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, + 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, + 3415, 3416, 3417, 3418, 3419, 3420, 3421, 3422, + 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, + 3431, 3432, 3433, 3434, 3435, 3436, 3437, 3438, + 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, + 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454, + 3455, 3456, 3457, 3458, 3459, 3460, 3461, 3462, + 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, + 3471, 3472, 3473, 3474, 3475, 3476, 3477, 3478, + 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, + 3487, 3488, 3489, 3490, 3491, 3492, 3493, 3494, + 3495, 3496, 3497, 3498, 3499, 3500, 3501, 3502, + 3503, 3504, 3505, 3506, 3507, 3508, 3509, 3510, + 3511, 3512, 3513, 3514, 3515, 3516, 3517, 3518, + 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, + 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3534, + 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, + 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, + 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, + 3559, 3560, 0 + }; + + static const signed char _regex_trans_lengths[] = { + 2, 1, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, + 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, + 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 1, 1, 2, 1, + 2, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 1, 2, 1, 2, + 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 2, + 2, 2, 2, 2, 1, 2, 1, 2, + 1, 2, 1, 1, 1, 1, 2, 2, + 2, 2, 2, 1, 2, 1, 2, 1, + 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0 + }; + + static const signed char _regex_cond_keys[] = { + 0, 1, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 0, + 1, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, + 0, 0, 1, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, + 0, 1, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 + }; + + static const short _regex_cond_targs[] = { + 746, 746, 746, 746, 3, 746, 746, 746, + 746, 746, 746, 746, 746, 751, 752, 753, + 746, 754, 755, 746, 757, 746, 746, 758, + 759, 760, 761, 761, 761, 761, 746, 756, + 746, 746, 6, 6, 6, 6, 746, 746, + 7, 7, 7, 7, 746, 9, 9, 9, + 9, 746, 10, 9, 9, 9, 9, 746, + 746, 746, 746, 11, 11, 11, 11, 746, + 746, 11, 12, 11, 11, 746, 746, 11, + 12, 11, 11, 746, 15, 15, 15, 15, + 746, 10, 15, 15, 15, 15, 746, 746, + 17, 746, 746, 746, 746, 746, 19, 746, + 11, 21, 11, 11, 746, 20, 20, 20, + 20, 746, 746, 20, 20, 20, 20, 746, + 746, 11, 21, 11, 11, 746, 746, 22, + 746, 746, 746, 23, 23, 23, 23, 746, + 746, 24, 24, 24, 24, 746, 746, 25, + 746, 24, 24, 24, 24, 746, 28, 28, + 28, 28, 746, 746, 28, 28, 28, 28, + 746, 6, 6, 6, 6, 746, 23, 23, + 23, 23, 746, 746, 30, 746, 31, 31, + 31, 31, 746, 33, 34, 746, 32, 33, + 34, 746, 32, 33, 34, 32, 36, 37, + 746, 35, 36, 37, 746, 35, 36, 37, + 35, 39, 40, 746, 38, 39, 40, 746, + 38, 39, 40, 38, 746, 41, 775, 746, + 746, 43, 45, 52, 49, 52, 52, 746, + 46, 746, 746, 47, 746, 746, 48, 746, + 746, 746, 52, 746, 50, 52, 52, 746, + 52, 746, 51, 52, 52, 746, 52, 746, + 52, 52, 52, 746, 52, 746, 52, 52, + 52, 746, 54, 54, 54, 54, 746, 746, + 54, 54, 54, 54, 746, 56, 56, 56, + 56, 746, 746, 56, 56, 56, 56, 746, + 58, 58, 58, 58, 746, 58, 746, 58, + 58, 58, 746, 60, 746, 746, 60, 746, + 746, 61, 61, 61, 746, 63, 786, 62, + 746, 786, 64, 746, 786, 64, 746, 787, + 65, 787, 67, 65, 787, 65, 787, 69, + 65, 787, 70, 65, 787, 65, 790, 790, + 73, 76, 790, 74, 790, 75, 790, 790, + 790, 77, 790, 78, 790, 79, 790, 80, + 790, 790, 790, 82, 790, 83, 790, 84, + 790, 85, 790, 790, 790, 87, 92, 94, + 790, 88, 790, 89, 790, 90, 790, 91, + 790, 790, 790, 93, 790, 790, 790, 95, + 790, 790, 790, 97, 790, 98, 790, 99, + 790, 100, 790, 790, 790, 102, 790, 103, + 790, 104, 790, 105, 790, 106, 790, 790, + 790, 108, 790, 109, 111, 790, 110, 790, + 790, 790, 112, 790, 113, 790, 790, 790, + 115, 120, 790, 116, 790, 117, 790, 118, + 790, 119, 790, 790, 790, 121, 790, 790, + 790, 123, 139, 790, 124, 790, 125, 790, + 126, 790, 127, 790, 128, 790, 129, 790, + 130, 790, 131, 790, 132, 790, 133, 790, + 134, 790, 135, 790, 136, 790, 137, 790, + 138, 790, 790, 790, 140, 790, 141, 790, + 790, 790, 143, 144, 790, 790, 790, 145, + 790, 146, 790, 147, 790, 148, 790, 790, + 790, 150, 790, 151, 790, 790, 790, 153, + 790, 154, 790, 790, 790, 156, 790, 157, + 790, 158, 790, 159, 790, 160, 790, 161, + 790, 790, 790, 163, 167, 790, 164, 790, + 165, 790, 166, 790, 790, 790, 168, 790, + 169, 790, 170, 790, 171, 790, 790, 790, + 173, 177, 790, 174, 790, 175, 790, 176, + 790, 790, 790, 178, 790, 179, 790, 180, + 790, 181, 790, 182, 790, 183, 790, 790, + 790, 185, 790, 186, 790, 187, 790, 188, + 790, 189, 790, 190, 790, 191, 790, 192, + 790, 193, 790, 194, 790, 195, 790, 196, + 790, 197, 790, 198, 790, 199, 790, 200, + 790, 201, 790, 790, 790, 203, 790, 204, + 790, 205, 790, 206, 790, 207, 790, 790, + 790, 209, 790, 210, 790, 211, 790, 212, + 790, 213, 790, 790, 790, 215, 790, 216, + 790, 217, 790, 218, 790, 219, 790, 220, + 790, 221, 790, 790, 790, 223, 790, 224, + 790, 225, 790, 790, 790, 227, 790, 228, + 790, 790, 790, 230, 235, 790, 231, 790, + 232, 790, 233, 790, 234, 790, 790, 790, + 236, 790, 237, 790, 238, 790, 239, 790, + 790, 790, 799, 790, 242, 790, 790, 790, + 244, 790, 245, 790, 790, 790, 247, 790, + 248, 790, 249, 790, 790, 790, 251, 790, + 252, 790, 253, 790, 254, 790, 255, 790, + 790, 790, 257, 790, 258, 790, 259, 790, + 260, 790, 261, 790, 262, 790, 263, 790, + 264, 790, 265, 790, 266, 790, 267, 790, + 268, 790, 269, 790, 790, 790, 271, 277, + 790, 272, 790, 273, 790, 274, 790, 275, + 790, 276, 790, 790, 790, 278, 790, 279, + 790, 280, 790, 281, 790, 282, 790, 283, + 790, 284, 790, 285, 790, 286, 790, 287, + 790, 288, 790, 289, 790, 290, 790, 291, + 295, 790, 292, 790, 293, 790, 294, 790, + 790, 790, 296, 790, 297, 790, 298, 790, + 299, 790, 790, 790, 301, 790, 302, 790, + 303, 790, 304, 790, 305, 790, 790, 790, + 307, 310, 314, 319, 790, 308, 790, 309, + 790, 790, 790, 311, 790, 312, 790, 313, + 790, 790, 790, 315, 790, 316, 790, 317, + 790, 318, 790, 790, 790, 320, 790, 321, + 790, 322, 790, 323, 790, 790, 790, 325, + 332, 790, 326, 790, 327, 790, 328, 790, + 329, 790, 330, 790, 331, 790, 790, 790, + 333, 790, 790, 790, 790, 335, 790, 336, + 790, 790, 790, 338, 790, 339, 790, 340, + 790, 790, 790, 342, 344, 349, 790, 343, + 790, 790, 790, 345, 790, 346, 790, 347, + 790, 348, 790, 790, 790, 790, 790, 351, + 354, 790, 352, 790, 353, 790, 790, 790, + 355, 790, 356, 790, 790, 790, 358, 364, + 790, 359, 790, 360, 790, 361, 790, 362, + 790, 363, 790, 790, 790, 365, 790, 366, + 790, 367, 790, 790, 790, 369, 790, 370, + 790, 371, 790, 372, 790, 373, 790, 374, + 790, 375, 790, 376, 790, 790, 790, 378, + 790, 379, 790, 380, 790, 381, 790, 382, + 790, 383, 790, 790, 790, 385, 790, 386, + 790, 387, 790, 388, 790, 790, 790, 390, + 790, 391, 790, 392, 790, 393, 790, 394, + 790, 395, 790, 396, 790, 397, 790, 790, + 790, 790, 790, 400, 790, 401, 790, 790, + 790, 403, 408, 790, 404, 790, 405, 790, + 406, 790, 407, 790, 790, 790, 409, 790, + 410, 415, 421, 433, 790, 411, 790, 412, + 790, 413, 790, 414, 790, 790, 790, 416, + 790, 417, 790, 418, 790, 419, 790, 420, + 790, 790, 790, 422, 790, 423, 790, 424, + 790, 425, 790, 426, 790, 427, 790, 428, + 790, 429, 790, 430, 790, 431, 790, 432, + 790, 790, 790, 434, 790, 435, 790, 436, + 790, 437, 790, 790, 790, 439, 790, 440, + 790, 790, 790, 442, 790, 443, 790, 444, + 790, 445, 790, 790, 790, 447, 452, 790, + 448, 790, 449, 790, 450, 790, 451, 790, + 790, 790, 453, 790, 454, 790, 455, 790, + 456, 790, 457, 790, 458, 790, 790, 790, + 460, 790, 461, 790, 462, 790, 790, 790, + 464, 790, 465, 790, 790, 790, 467, 473, + 790, 468, 790, 469, 790, 470, 790, 471, + 790, 472, 790, 790, 790, 474, 790, 475, + 790, 476, 790, 477, 790, 478, 790, 479, + 790, 790, 790, 481, 790, 482, 790, 483, + 790, 484, 790, 790, 790, 486, 790, 487, + 790, 488, 790, 489, 790, 790, 790, 491, + 790, 492, 790, 493, 790, 494, 790, 495, + 790, 496, 790, 790, 790, 498, 507, 790, + 499, 790, 500, 790, 501, 790, 502, 790, + 503, 790, 504, 790, 505, 790, 506, 790, + 790, 790, 508, 790, 509, 790, 790, 790, + 511, 519, 528, 790, 512, 515, 790, 513, + 790, 514, 790, 790, 790, 516, 790, 517, + 790, 518, 790, 790, 790, 520, 790, 521, + 522, 525, 790, 790, 790, 523, 790, 524, + 790, 790, 790, 526, 790, 527, 790, 790, + 790, 529, 790, 790, 790, 531, 790, 532, + 790, 533, 790, 790, 790, 535, 790, 536, + 790, 790, 537, 790, 790, 790, 539, 543, + 790, 540, 790, 541, 790, 542, 790, 790, + 790, 544, 790, 545, 790, 546, 790, 547, + 790, 790, 790, 549, 790, 550, 790, 551, + 790, 552, 790, 553, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 560, 0, 562, 561, 817, 0, 0, + 561, 819, 819, 819, 819, 565, 819, 819, + 819, 819, 567, 568, 819, 566, 567, 568, + 819, 566, 567, 568, 566, 571, 572, 819, + 573, 654, 669, 675, 681, 687, 693, 699, + 710, 716, 722, 727, 570, 571, 572, 819, + 570, 571, 572, 819, 570, 571, 572, 570, + 571, 572, 819, 574, 589, 595, 601, 607, + 613, 619, 630, 636, 642, 647, 570, 571, + 572, 819, 575, 584, 570, 571, 572, 819, + 576, 580, 570, 571, 572, 819, 577, 570, + 571, 572, 819, 578, 570, 579, 572, 819, + 570, 571, 572, 819, 570, 571, 572, 819, + 581, 570, 571, 572, 819, 582, 570, 583, + 572, 819, 570, 571, 572, 819, 570, 571, + 572, 819, 585, 570, 571, 572, 819, 586, + 570, 571, 572, 819, 587, 570, 588, 572, + 819, 570, 571, 572, 819, 570, 571, 572, + 819, 590, 570, 571, 572, 819, 591, 570, + 571, 572, 819, 592, 570, 571, 572, 819, + 593, 570, 594, 572, 819, 570, 571, 572, + 819, 570, 571, 572, 819, 596, 570, 571, + 572, 819, 597, 570, 571, 572, 819, 598, + 570, 571, 572, 819, 599, 570, 600, 572, + 819, 570, 571, 572, 819, 570, 571, 572, + 819, 602, 570, 571, 572, 819, 603, 570, + 571, 572, 819, 604, 570, 571, 572, 819, + 605, 570, 606, 572, 819, 570, 571, 572, + 819, 570, 571, 572, 819, 608, 570, 571, + 572, 819, 609, 570, 571, 572, 819, 610, + 570, 571, 572, 819, 611, 570, 612, 572, + 819, 570, 571, 572, 819, 570, 571, 572, + 819, 614, 570, 571, 572, 819, 615, 570, + 571, 572, 819, 616, 570, 571, 572, 819, + 617, 570, 618, 572, 819, 570, 571, 572, + 819, 570, 571, 572, 819, 620, 625, 570, + 571, 572, 819, 621, 570, 571, 572, 819, + 622, 570, 571, 572, 819, 623, 570, 624, + 572, 819, 570, 571, 572, 819, 570, 571, + 572, 819, 626, 570, 571, 572, 819, 627, + 570, 571, 572, 819, 628, 570, 629, 572, + 819, 570, 571, 572, 819, 570, 571, 572, + 819, 631, 570, 571, 572, 819, 632, 570, + 571, 572, 819, 633, 570, 571, 572, 819, + 634, 570, 635, 572, 819, 570, 571, 572, + 819, 570, 571, 572, 819, 637, 570, 571, + 572, 819, 638, 570, 571, 572, 819, 639, + 570, 571, 572, 819, 640, 570, 641, 572, + 819, 570, 571, 572, 819, 570, 571, 572, + 819, 643, 570, 571, 572, 819, 644, 570, + 571, 572, 819, 645, 570, 646, 572, 819, + 570, 571, 572, 819, 570, 571, 572, 819, + 648, 570, 571, 572, 819, 649, 570, 571, + 572, 819, 650, 570, 571, 572, 819, 651, + 570, 571, 572, 819, 652, 570, 653, 572, + 819, 570, 571, 572, 819, 570, 571, 572, + 819, 655, 664, 570, 571, 572, 819, 656, + 660, 570, 571, 572, 819, 657, 570, 571, + 572, 819, 658, 570, 659, 572, 819, 570, + 571, 572, 819, 570, 571, 572, 819, 661, + 570, 571, 572, 819, 662, 570, 663, 572, + 819, 570, 571, 572, 819, 570, 571, 572, + 819, 665, 570, 571, 572, 819, 666, 570, + 571, 572, 819, 667, 570, 668, 572, 819, + 570, 571, 572, 819, 570, 571, 572, 819, + 670, 570, 571, 572, 819, 671, 570, 571, + 572, 819, 672, 570, 571, 572, 819, 673, + 570, 674, 572, 819, 570, 571, 572, 819, + 570, 571, 572, 819, 676, 570, 571, 572, + 819, 677, 570, 571, 572, 819, 678, 570, + 571, 572, 819, 679, 570, 680, 572, 819, + 570, 571, 572, 819, 570, 571, 572, 819, + 682, 570, 571, 572, 819, 683, 570, 571, + 572, 819, 684, 570, 571, 572, 819, 685, + 570, 686, 572, 819, 570, 571, 572, 819, + 570, 571, 572, 819, 688, 570, 571, 572, + 819, 689, 570, 571, 572, 819, 690, 570, + 571, 572, 819, 691, 570, 692, 572, 819, + 570, 571, 572, 819, 570, 571, 572, 819, + 694, 570, 571, 572, 819, 695, 570, 571, + 572, 819, 696, 570, 571, 572, 819, 697, + 570, 698, 572, 819, 570, 571, 572, 819, + 570, 571, 572, 819, 700, 705, 570, 571, + 572, 819, 701, 570, 571, 572, 819, 702, + 570, 571, 572, 819, 703, 570, 704, 572, + 819, 570, 571, 572, 819, 570, 571, 572, + 819, 706, 570, 571, 572, 819, 707, 570, + 571, 572, 819, 708, 570, 709, 572, 819, + 570, 571, 572, 819, 570, 571, 572, 819, + 711, 570, 571, 572, 819, 712, 570, 571, + 572, 819, 713, 570, 571, 572, 819, 714, + 570, 715, 572, 819, 570, 571, 572, 819, + 570, 571, 572, 819, 717, 570, 571, 572, + 819, 718, 570, 571, 572, 819, 719, 570, + 571, 572, 819, 720, 570, 721, 572, 819, + 570, 571, 572, 819, 570, 571, 572, 819, + 723, 570, 571, 572, 819, 724, 570, 571, + 572, 819, 725, 570, 726, 572, 819, 570, + 571, 572, 819, 570, 571, 572, 819, 728, + 570, 571, 572, 819, 729, 570, 571, 572, + 819, 730, 570, 571, 572, 819, 731, 570, + 571, 572, 819, 732, 570, 733, 572, 819, + 570, 571, 572, 819, 570, 735, 736, 819, + 734, 735, 736, 819, 734, 735, 736, 734, + 738, 819, 819, 738, 819, 819, 739, 739, + 739, 819, 838, 838, 838, 838, 742, 838, + 838, 838, 838, 843, 843, 843, 843, 745, + 843, 843, 843, 843, 746, 746, 746, 746, + 746, 750, 746, 762, 763, 746, 764, 765, + 766, 746, 785, 746, 746, 746, 746, 747, + 746, 748, 746, 749, 746, 746, 746, 746, + 746, 746, 746, 746, 1, 746, 746, 2, + 746, 4, 5, 746, 6, 6, 6, 6, + 746, 7, 7, 7, 7, 746, 8, 11, + 14, 16, 18, 11, 12, 13, 11, 11, + 746, 22, 746, 23, 23, 23, 23, 22, + 746, 746, 22, 746, 746, 746, 24, 24, + 24, 24, 746, 746, 746, 746, 25, 746, + 26, 27, 29, 746, 746, 30, 746, 31, + 31, 31, 31, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 32, 35, 38, + 746, 767, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 772, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 773, + 746, 746, 746, 774, 746, 779, 746, 746, + 780, 781, 746, 746, 746, 746, 746, 746, + 782, 746, 769, 771, 746, 768, 746, 746, + 746, 770, 771, 746, 771, 771, 746, 771, + 746, 746, 746, 746, 41, 42, 43, 44, + 777, 746, 776, 746, 746, 746, 778, 746, + 746, 746, 53, 55, 57, 746, 59, 746, + 746, 746, 784, 783, 783, 783, 746, 746, + 746, 746, 746, 61, 61, 61, 746, 62, + 746, 746, 746, 746, 787, 789, 788, 787, + 65, 787, 66, 68, 65, 791, 792, 793, + 795, 796, 797, 798, 800, 801, 802, 803, + 804, 806, 807, 808, 809, 810, 811, 812, + 813, 814, 815, 816, 790, 71, 72, 81, + 790, 86, 96, 101, 107, 114, 790, 122, + 790, 790, 142, 790, 794, 790, 155, 162, + 790, 149, 152, 790, 172, 790, 184, 202, + 790, 208, 214, 222, 226, 229, 790, 240, + 246, 250, 790, 241, 243, 790, 256, 270, + 790, 300, 790, 306, 324, 790, 790, 334, + 337, 341, 790, 790, 790, 790, 790, 350, + 790, 357, 790, 805, 790, 377, 384, 790, + 368, 790, 790, 389, 398, 790, 790, 790, + 399, 402, 438, 441, 790, 790, 790, 790, + 790, 446, 790, 790, 790, 790, 459, 463, + 790, 466, 790, 480, 485, 790, 790, 790, + 490, 497, 790, 510, 530, 534, 538, 790, + 548, 790, 554, 790, 555, 556, 557, 558, + 790, 790, 790, 790, 790, 790, 790, 0, + 818, 818, 818, 818, 818, 818, 818, 818, + 819, 823, 824, 819, 819, 819, 819, 820, + 819, 821, 819, 822, 819, 819, 819, 819, + 819, 819, 819, 563, 819, 819, 564, 819, + 566, 569, 734, 819, 825, 819, 819, 819, + 819, 819, 829, 819, 819, 819, 819, 819, + 819, 819, 830, 819, 819, 819, 819, 819, + 819, 819, 831, 832, 819, 819, 819, 819, + 819, 819, 833, 827, 819, 819, 819, 819, + 826, 819, 819, 819, 828, 819, 819, 819, + 819, 819, 819, 737, 819, 819, 819, 835, + 834, 834, 834, 819, 819, 819, 819, 819, + 739, 739, 739, 819, 837, 836, 836, 836, + 836, 836, 836, 836, 836, 842, 838, 838, + 838, 839, 838, 840, 838, 841, 838, 838, + 838, 838, 838, 838, 838, 740, 838, 838, + 741, 838, 838, 838, 847, 843, 843, 843, + 844, 843, 845, 843, 846, 843, 843, 843, + 843, 843, 843, 843, 743, 843, 843, 744, + 843, 843, 843, 848, 848, 849, 849, 0, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 787, 787, 787, 787, 787, 787, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 559, 560, + 561, 562, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 838, 838, 838, 843, 843, + 843, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, + 746, 746, 787, 787, 787, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 790, 790, 790, 790, 790, 790, 790, 790, + 817, 818, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 819, 819, 819, 819, 819, + 819, 819, 819, 836, 836, 838, 838, 838, + 838, 838, 843, 843, 843, 843, 843, 848, + 849, 0 + }; + + static const short _regex_cond_actions[] = { + 843, 769, 843, 843, 0, 843, 843, 771, + 843, 827, 631, 731, 723, 45, 903, 903, + 897, 45, 912, 900, 903, 729, 741, 0, + 45, 45, 923, 923, 923, 923, 737, 45, + 765, 747, 0, 0, 0, 0, 841, 743, + 3, 3, 3, 3, 841, 3, 3, 3, + 3, 839, 0, 3, 3, 3, 3, 839, + 761, 839, 761, 3, 3, 3, 3, 839, + 759, 3, 870, 3, 3, 839, 761, 3, + 870, 3, 3, 839, 3, 3, 3, 3, + 839, 0, 3, 3, 3, 3, 839, 751, + 0, 749, 839, 755, 753, 839, 0, 757, + 3, 3, 3, 3, 839, 0, 0, 0, + 0, 839, 757, 0, 0, 0, 0, 839, + 757, 3, 3, 3, 3, 839, 745, 0, + 841, 725, 727, 27, 27, 27, 27, 841, + 743, 3, 3, 3, 3, 841, 763, 0, + 841, 3, 3, 3, 3, 841, 3, 3, + 3, 3, 841, 673, 3, 3, 3, 3, + 841, 0, 0, 0, 0, 841, 27, 27, + 27, 27, 841, 725, 0, 727, 25, 25, + 25, 25, 841, 0, 0, 829, 0, 0, + 0, 603, 0, 0, 0, 0, 0, 0, + 829, 0, 0, 0, 601, 0, 0, 0, + 0, 0, 0, 829, 0, 0, 0, 603, + 0, 0, 0, 0, 675, 0, 17, 831, + 675, 0, 7, 3, 870, 3, 3, 831, + 17, 831, 663, 17, 831, 663, 17, 831, + 663, 831, 3, 661, 870, 3, 3, 831, + 3, 661, 870, 3, 3, 831, 3, 661, + 3, 3, 3, 831, 3, 665, 3, 3, + 3, 831, 3, 3, 3, 3, 837, 671, + 3, 3, 3, 3, 837, 3, 3, 3, + 3, 837, 669, 3, 3, 3, 3, 837, + 3, 3, 3, 3, 837, 3, 667, 3, + 3, 3, 837, 0, 833, 677, 0, 833, + 679, 0, 0, 0, 835, 0, 29, 11, + 845, 31, 13, 845, 0, 13, 845, 53, + 0, 53, 0, 0, 51, 0, 53, 0, + 0, 49, 0, 0, 47, 0, 315, 359, + 0, 0, 359, 0, 359, 0, 359, 127, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 129, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 131, 359, 0, 0, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 133, 359, 0, 359, 135, 359, 0, + 359, 137, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 139, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 141, + 359, 0, 359, 0, 0, 359, 0, 359, + 143, 359, 0, 359, 0, 359, 145, 359, + 0, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 147, 359, 0, 359, 149, + 359, 0, 0, 341, 0, 341, 0, 341, + 0, 341, 0, 341, 0, 341, 0, 341, + 0, 341, 0, 341, 0, 341, 0, 341, + 0, 341, 0, 341, 0, 341, 0, 341, + 0, 341, 151, 341, 0, 341, 0, 341, + 153, 341, 0, 0, 341, 155, 341, 0, + 341, 0, 341, 0, 341, 0, 341, 157, + 341, 0, 343, 0, 343, 159, 343, 0, + 343, 0, 343, 161, 343, 0, 341, 0, + 341, 0, 341, 0, 341, 0, 341, 0, + 341, 163, 341, 0, 0, 341, 0, 341, + 0, 341, 0, 341, 165, 341, 0, 341, + 0, 341, 0, 341, 0, 341, 167, 341, + 0, 0, 359, 0, 359, 0, 359, 0, + 359, 169, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 171, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 173, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 175, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 177, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 179, 359, 0, 359, 0, + 359, 0, 359, 181, 359, 0, 359, 0, + 359, 183, 359, 0, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 185, 359, + 0, 359, 0, 359, 0, 359, 0, 359, + 187, 359, 45, 359, 0, 357, 189, 357, + 0, 357, 0, 357, 191, 357, 0, 359, + 0, 359, 0, 359, 193, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 0, 359, + 195, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 197, 359, 0, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 199, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 0, 359, 0, 359, 0, 359, 0, 359, + 201, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 203, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 205, 359, + 0, 0, 0, 0, 359, 0, 359, 0, + 359, 207, 359, 0, 359, 0, 359, 0, + 359, 209, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 211, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 213, 359, 0, + 0, 359, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 0, 359, 215, 359, + 0, 359, 217, 359, 219, 0, 345, 0, + 345, 221, 345, 0, 345, 0, 345, 0, + 345, 223, 345, 0, 0, 0, 345, 0, + 345, 225, 345, 0, 345, 0, 345, 0, + 345, 0, 345, 227, 345, 229, 345, 0, + 0, 345, 0, 345, 0, 345, 231, 345, + 0, 345, 0, 345, 233, 345, 0, 0, + 347, 0, 347, 0, 347, 0, 347, 0, + 347, 0, 347, 235, 347, 0, 347, 0, + 347, 0, 347, 237, 347, 0, 349, 0, + 349, 0, 349, 0, 349, 0, 349, 0, + 349, 0, 349, 0, 349, 239, 349, 0, + 347, 0, 347, 0, 347, 0, 347, 0, + 347, 0, 347, 241, 347, 0, 347, 0, + 347, 0, 347, 0, 347, 243, 347, 0, + 351, 0, 351, 0, 351, 0, 351, 0, + 351, 0, 351, 0, 351, 0, 351, 245, + 351, 247, 351, 0, 359, 0, 359, 249, + 359, 0, 0, 359, 0, 359, 0, 359, + 0, 359, 0, 359, 251, 359, 0, 359, + 0, 0, 0, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 253, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 255, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 257, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 259, 359, 0, 359, 0, + 359, 261, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 263, 359, 0, 0, 353, + 0, 353, 0, 353, 0, 353, 0, 353, + 265, 353, 0, 353, 0, 353, 0, 353, + 0, 353, 0, 353, 0, 353, 267, 353, + 0, 359, 0, 359, 0, 359, 269, 359, + 0, 359, 0, 359, 271, 359, 0, 0, + 355, 0, 355, 0, 355, 0, 355, 0, + 355, 0, 355, 273, 355, 0, 355, 0, + 355, 0, 355, 0, 355, 0, 355, 0, + 355, 275, 355, 0, 355, 0, 355, 0, + 355, 0, 355, 277, 355, 0, 355, 0, + 355, 0, 355, 0, 355, 279, 355, 0, + 355, 0, 355, 0, 355, 0, 355, 0, + 355, 0, 355, 281, 355, 0, 0, 355, + 0, 355, 0, 355, 0, 355, 0, 355, + 0, 355, 0, 355, 0, 355, 0, 355, + 283, 355, 0, 355, 0, 355, 285, 355, + 0, 0, 0, 359, 0, 0, 359, 0, + 359, 0, 359, 287, 359, 0, 359, 0, + 359, 0, 359, 289, 359, 0, 359, 0, + 0, 0, 359, 291, 359, 0, 359, 0, + 359, 293, 359, 0, 359, 0, 359, 295, + 359, 0, 359, 297, 359, 0, 359, 0, + 359, 0, 359, 299, 359, 0, 359, 0, + 303, 359, 0, 359, 301, 359, 0, 0, + 359, 0, 359, 0, 359, 0, 359, 305, + 359, 0, 359, 0, 359, 0, 359, 0, + 359, 307, 359, 0, 359, 0, 359, 0, + 359, 0, 359, 0, 359, 309, 359, 311, + 359, 119, 359, 121, 359, 123, 359, 125, + 359, 0, 39, 33, 35, 37, 39, 39, + 35, 537, 503, 537, 537, 0, 537, 537, + 505, 537, 0, 0, 539, 0, 0, 0, + 377, 0, 0, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 539, + 0, 0, 0, 435, 0, 0, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 381, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 385, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 389, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 393, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 397, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 401, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 405, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 409, 0, 0, 0, 539, 0, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 413, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 417, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 421, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 425, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 429, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 433, 0, 0, 0, + 539, 0, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 379, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 383, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 387, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 391, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 395, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 399, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 403, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 407, + 0, 0, 0, 539, 0, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 411, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 415, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 419, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 423, 0, 0, 0, 539, + 0, 0, 0, 0, 539, 0, 0, 0, + 0, 539, 0, 0, 0, 0, 539, 0, + 0, 0, 427, 0, 0, 0, 539, 0, + 0, 0, 0, 539, 0, 0, 0, 0, + 539, 0, 0, 0, 0, 539, 0, 0, + 0, 0, 539, 0, 0, 0, 0, 539, + 0, 0, 0, 431, 0, 0, 0, 539, + 0, 0, 0, 377, 0, 0, 0, 0, + 0, 533, 471, 0, 533, 475, 0, 0, + 0, 535, 569, 557, 569, 569, 0, 569, + 569, 559, 569, 587, 575, 587, 587, 0, + 587, 587, 577, 587, 633, 775, 777, 629, + 637, 45, 597, 0, 0, 609, 0, 45, + 0, 635, 909, 599, 777, 773, 777, 0, + 777, 45, 777, 45, 777, 773, 775, 777, + 823, 767, 823, 823, 0, 823, 823, 0, + 823, 0, 0, 779, 0, 0, 0, 0, + 821, 3, 3, 3, 3, 821, 1, 3, + 1, 0, 3, 3, 855, 855, 3, 3, + 819, 0, 821, 27, 27, 27, 27, 0, + 821, 745, 0, 821, 735, 733, 3, 3, + 3, 3, 821, 739, 821, 763, 0, 821, + 1, 1, 0, 821, 725, 0, 727, 25, + 25, 25, 25, 821, 615, 613, 783, 619, + 617, 785, 623, 621, 787, 0, 0, 0, + 781, 5, 639, 647, 611, 695, 607, 717, + 699, 715, 683, 683, 0, 605, 713, 691, + 683, 703, 687, 719, 641, 657, 645, 0, + 693, 659, 655, 906, 697, 45, 683, 651, + 45, 0, 653, 689, 649, 683, 701, 685, + 7, 643, 852, 915, 721, 15, 791, 867, + 791, 858, 919, 795, 927, 919, 793, 919, + 847, 709, 711, 681, 0, 7, 0, 849, + 17, 801, 17, 799, 876, 799, 17, 797, + 873, 797, 1, 1, 1, 815, 0, 803, + 705, 707, 45, 19, 23, 21, 805, 882, + 894, 888, 805, 0, 0, 0, 807, 11, + 825, 627, 625, 789, 55, 45, 45, 53, + 0, 53, 0, 0, 0, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 0, 0, 317, 0, 0, 0, + 339, 0, 0, 0, 0, 0, 339, 0, + 61, 63, 0, 65, 45, 67, 0, 0, + 319, 0, 0, 321, 0, 339, 0, 0, + 339, 0, 0, 0, 0, 0, 339, 0, + 0, 0, 339, 0, 0, 337, 0, 0, + 339, 0, 339, 0, 0, 339, 79, 0, + 0, 0, 69, 71, 73, 75, 77, 0, + 323, 0, 81, 45, 83, 0, 0, 325, + 0, 327, 85, 0, 0, 87, 89, 329, + 0, 0, 0, 0, 339, 91, 93, 95, + 97, 0, 99, 101, 103, 331, 0, 0, + 339, 0, 105, 0, 0, 107, 109, 111, + 0, 0, 333, 0, 0, 0, 0, 339, + 0, 339, 0, 339, 0, 0, 0, 0, + 339, 313, 339, 113, 115, 117, 335, 39, + 361, 363, 365, 367, 369, 371, 373, 375, + 491, 45, 0, 511, 509, 507, 509, 0, + 509, 45, 509, 45, 509, 507, 509, 529, + 501, 529, 529, 0, 529, 529, 0, 529, + 0, 0, 0, 531, 5, 489, 439, 457, + 493, 493, 0, 437, 485, 493, 461, 481, + 451, 441, 0, 487, 453, 449, 495, 455, + 493, 445, 45, 0, 447, 483, 443, 493, + 459, 479, 7, 9, 473, 497, 497, 499, + 15, 517, 861, 517, 15, 519, 864, 519, + 467, 469, 477, 0, 521, 463, 465, 45, + 19, 23, 21, 523, 879, 891, 885, 523, + 0, 0, 0, 525, 0, 549, 543, 549, + 541, 549, 547, 545, 551, 0, 563, 561, + 563, 0, 563, 45, 563, 45, 563, 561, + 563, 565, 555, 565, 565, 0, 565, 565, + 0, 565, 553, 567, 0, 581, 579, 581, + 0, 581, 45, 581, 45, 581, 579, 581, + 583, 573, 583, 583, 0, 583, 583, 0, + 583, 571, 585, 589, 591, 593, 595, 0, + 843, 843, 843, 827, 827, 841, 841, 839, + 839, 839, 839, 839, 839, 839, 839, 839, + 839, 839, 839, 839, 839, 841, 841, 841, + 841, 841, 841, 841, 841, 841, 841, 829, + 829, 829, 829, 829, 829, 829, 829, 829, + 831, 831, 831, 831, 831, 831, 831, 831, + 831, 831, 831, 831, 837, 837, 837, 837, + 837, 837, 833, 833, 835, 845, 845, 845, + 59, 59, 59, 59, 59, 59, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 343, 343, 343, 343, + 343, 343, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 341, 341, 341, 341, 341, + 341, 341, 341, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 357, 357, 357, 357, 357, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 345, 345, 345, + 345, 345, 345, 345, 345, 345, 345, 345, + 345, 345, 345, 345, 345, 345, 345, 345, + 345, 345, 345, 345, 347, 347, 347, 347, + 347, 347, 347, 347, 347, 347, 347, 349, + 349, 349, 349, 349, 349, 349, 349, 349, + 347, 347, 347, 347, 347, 347, 347, 347, + 347, 347, 347, 347, 351, 351, 351, 351, + 351, 351, 351, 351, 351, 351, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 353, 353, + 353, 353, 359, 359, 359, 359, 359, 359, + 359, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 355, 355, 355, + 355, 355, 355, 355, 355, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 39, 39, + 39, 39, 537, 537, 537, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 539, 539, 539, + 533, 533, 535, 569, 569, 569, 587, 587, + 587, 0, 823, 823, 823, 779, 821, 821, + 819, 821, 821, 821, 821, 821, 821, 821, + 821, 783, 785, 787, 781, 817, 791, 791, + 795, 793, 847, 811, 809, 801, 799, 799, + 797, 797, 815, 803, 813, 805, 805, 807, + 825, 789, 0, 57, 57, 0, 339, 339, + 319, 321, 339, 339, 339, 339, 337, 339, + 339, 339, 323, 325, 327, 329, 339, 331, + 339, 333, 339, 339, 339, 339, 339, 335, + 0, 0, 0, 529, 529, 529, 531, 531, + 517, 517, 519, 519, 513, 527, 521, 515, + 523, 523, 525, 0, 551, 0, 565, 565, + 565, 567, 0, 583, 583, 583, 585, 0, + 0, 0 + }; + + static const signed char _regex_to_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 41, + 0, 41, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 41, 0, 0, 41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 41, 41, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 41, 0, 41, 0, + 0, 0, 0, 41, 0, 0, 0, 0, + 41, 41, 0 + }; + + static const signed char _regex_from_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 43, 0, 0, 43, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43, 0, 43, 0, + 0, 0, 0, 43, 0, 0, 0, 0, + 43, 43, 0 + }; + + static const short _regex_eof_trans[] = { + 2665, 2666, 2667, 2668, 2669, 2670, 2671, 2672, + 2673, 2674, 2675, 2676, 2677, 2678, 2679, 2680, + 2681, 2682, 2683, 2684, 2685, 2686, 2687, 2688, + 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, + 2697, 2698, 2699, 2700, 2701, 2702, 2703, 2704, + 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, + 2713, 2714, 2715, 2716, 2717, 2718, 2719, 2720, + 2721, 2722, 2723, 2724, 2725, 2726, 2727, 2728, + 2729, 2730, 2731, 2732, 2733, 2734, 2735, 2736, + 2737, 2738, 2739, 2740, 2741, 2742, 2743, 2744, + 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, + 2753, 2754, 2755, 2756, 2757, 2758, 2759, 2760, + 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, + 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, + 2777, 2778, 2779, 2780, 2781, 2782, 2783, 2784, + 2785, 2786, 2787, 2788, 2789, 2790, 2791, 2792, + 2793, 2794, 2795, 2796, 2797, 2798, 2799, 2800, + 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, + 2809, 2810, 2811, 2812, 2813, 2814, 2815, 2816, + 2817, 2818, 2819, 2820, 2821, 2822, 2823, 2824, + 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, + 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, + 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, + 2849, 2850, 2851, 2852, 2853, 2854, 2855, 2856, + 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, + 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, + 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, + 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, + 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, + 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, + 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, + 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, + 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, + 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, + 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, + 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, + 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, + 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, + 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, + 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, + 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, + 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, + 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, + 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, + 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, + 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032, + 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, + 3041, 3042, 3043, 3044, 3045, 3046, 3047, 3048, + 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, + 3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, + 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, + 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, + 3081, 3082, 3083, 3084, 3085, 3086, 3087, 3088, + 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, + 3097, 3098, 3099, 3100, 3101, 3102, 3103, 3104, + 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, + 3113, 3114, 3115, 3116, 3117, 3118, 3119, 3120, + 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, + 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, + 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, + 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, + 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, + 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, + 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, + 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, + 3185, 3186, 3187, 3188, 3189, 3190, 3191, 3192, + 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, + 3201, 3202, 3203, 3204, 3205, 3206, 3207, 3208, + 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, + 3217, 3218, 3219, 3220, 3221, 3222, 3223, 3224, + 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, + 3233, 3234, 3235, 3236, 3237, 3238, 3239, 3240, + 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, + 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, + 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, + 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, + 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, + 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, + 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, + 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, + 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, + 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, + 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, + 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, + 3337, 3338, 3339, 3340, 3341, 3342, 3343, 3344, + 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, + 3353, 3354, 3355, 3356, 3357, 3358, 3359, 3360, + 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, + 3369, 3370, 3371, 3372, 3373, 3374, 3375, 3376, + 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, + 3385, 3386, 3387, 3388, 3389, 3390, 3391, 3392, + 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, + 3401, 3402, 3403, 3404, 3405, 3406, 3407, 3408, + 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, + 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, + 3425, 3426, 3427, 3428, 3429, 3430, 3431, 3432, + 3433, 3434, 3435, 3436, 3437, 3438, 3439, 3440, + 3441, 3442, 3443, 3444, 3445, 3446, 3447, 3448, + 3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, + 3457, 3458, 3459, 3460, 3461, 3462, 3463, 3464, + 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, + 3473, 3474, 3475, 3476, 3477, 3478, 3479, 3480, + 3481, 3482, 3483, 3484, 3485, 3486, 3487, 3488, + 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, + 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, + 3505, 3506, 3507, 3508, 3509, 3510, 3511, 3512, + 3513, 3514, 0 + }; + + static const int regex_start = 746; + static const int regex_error = 0; + + static const int regex_en_readVerb = 787; + static const int regex_en_readUCP = 790; + static const int regex_en_readBracedUCP = 559; + static const int regex_en_readUCPSingle = 818; + static const int regex_en_charClassGuts = 819; + static const int regex_en_readClass = 836; + static const int regex_en_readQuotedLiteral = 838; + static const int regex_en_readQuotedClass = 843; + static const int regex_en_readComment = 848; + static const int regex_en_readNewlineTerminatedComment = 849; + static const int regex_en_main = 746; + + +#line 1911 "Parser.rl" + + + /** \brief Main parser call, returns root Component or nullptr. */ + unique_ptr parse(const char *ptr, ParseMode &globalMode) { + assert(ptr); + + const char *p = ptr; + const char *pe = ptr + strlen(ptr); + + // First, read the control verbs, set any global mode flags and move the + // ptr forward. + p = read_control_verbs(p, pe, 0, globalMode); + + const char *eof = pe; + int cs; + UNUSED int act; + int top; + vector stack; + const char *ts, *te; + unichar accumulator = 0; + unichar octAccumulator = 0; /* required as we are also accumulating for + * back ref when looking for octals */ + unsigned repeatN = 0; + unsigned repeatM = 0; + string label; + + ParseMode mode = globalMode; + ParseMode newMode; + + bool negated = false; + bool inComment = false; + + // Stack of sequences and flags used to store state when we enter + // sub-sequences. + vector sequences; + + // Index of the next capturing group. Note that zero is reserved for the + // root sequence. + unsigned groupIndex = 1; + + // Set storing group names that are currently in use. + flat_set groupNames; + + // Root sequence. + unique_ptr rootSeq = std::make_unique(); + rootSeq->setCaptureIndex(0); + + // Current sequence being appended to + ComponentSequence *currentSeq = rootSeq.get(); + + // The current character class being appended to. This is used as the + // accumulator for both character class and UCP properties. + unique_ptr currentCls; + + // True if the machine is currently inside a character class, i.e. square + // brackets [..]. + bool inCharClass = false; + + // True if the machine is inside a character class but it has not processed + // any "real" elements yet, i.e. it's still processing meta-characters like + // '^'. + bool inCharClassEarly = false; + + // Location at which the current character class began. + const char *currentClsBegin = p; + + // We throw exceptions on various parsing failures beyond this point: we + // use a try/catch block here to clean up our allocated memory before we + // re-throw the exception to the caller. + try { + // Embed the Ragel machine here + +#line 4187 "Parser.cpp" + { + cs = (int)regex_start; + top = 0; + ts = 0; + te = 0; + act = 0; + } + +#line 1982 "Parser.rl" + + +#line 4196 "Parser.cpp" + { + int _cpc; + int _klen; + const signed char * _ckeys; + unsigned int _trans = 0; + unsigned int _cond = 0; + const char * _keys; + const short * _acts; + unsigned int _nacts; + _resume: {} + if ( p == pe && p != eof ) + goto _out; + _acts = ( _regex_actions + (_regex_from_state_actions[cs])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) { + case 24: { + { +#line 1 "NONE" + {ts = p;}} + +#line 4218 "Parser.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + if ( p == eof ) { + if ( _regex_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_regex_eof_trans[cs] - 1; + } + } + else { + _keys = ( _regex_trans_keys + (_regex_key_offsets[cs])); + _trans = (unsigned int)_regex_index_offsets[cs]; + + _klen = (int)_regex_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _keys += _klen; + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + ((_upper-_lower) >> 1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 1; + else if ( ( (*( p))) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + } + + _klen = (int)_regex_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + (_klen<<1) - 2; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 2; + else if ( ( (*( p))) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + break; + } + } + } + + _match: {} + } + _ckeys = ( _regex_cond_keys + (_regex_trans_offsets[_trans])); + _klen = (int)_regex_trans_lengths[_trans]; + _cond = (unsigned int)_regex_trans_offsets[_trans]; + + _cpc = 0; + switch ( _regex_trans_cond_spaces[_trans] ) { + + case 0: { + if ( ( mode.utf8 ) +#line 4293 "Parser.cpp" + ) _cpc += 1; + break; + } + case 1: { + if ( ( mode.ignore_space ) +#line 4298 "Parser.cpp" + ) _cpc += 1; + break; + } + case 2: { + if ( ( inCharClassEarly ) +#line 4303 "Parser.cpp" + ) _cpc += 1; + break; + } + } + { + const signed char *_lower = _ckeys; + const signed char *_upper = _ckeys + _klen - 1; + const signed char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _cond = 3561; + + break; + } + + _mid = _lower + ((_upper-_lower) >> 1); + if ( _cpc < (int)(*( _mid)) ) + _upper = _mid - 1; + else if ( _cpc > (int)(*( _mid)) ) + _lower = _mid + 1; + else { + _cond += (unsigned int)(_mid - _ckeys); + + break; + } + } + } + cs = (int)_regex_cond_targs[_cond]; + + if ( _regex_cond_actions[_cond] != 0 ) { + + _acts = ( _regex_actions + (_regex_cond_actions[_cond])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) + { + case 0: { + { +#line 285 "Parser.rl" + label.clear();} + +#line 4345 "Parser.cpp" + + break; + } + case 1: { + { +#line 286 "Parser.rl" + label.push_back((( (*( p)))));} + +#line 4353 "Parser.cpp" + + break; + } + case 2: { + { +#line 287 "Parser.rl" + octAccumulator = 0;} + +#line 4361 "Parser.cpp" + + break; + } + case 3: { + { +#line 288 "Parser.rl" + accumulator = 0;} + +#line 4369 "Parser.cpp" + + break; + } + case 4: { + { +#line 289 "Parser.rl" + + octAccumulator = 0; + pushOct(&octAccumulator, (( (*( p))))); + } + +#line 4380 "Parser.cpp" + + break; + } + case 5: { + { +#line 293 "Parser.rl" + + accumulator = 0; + pushDec(&accumulator, (( (*( p))))); + } + +#line 4391 "Parser.cpp" + + break; + } + case 6: { + { +#line 297 "Parser.rl" + repeatN = 0; repeatM = 0; } + +#line 4399 "Parser.cpp" + + break; + } + case 7: { + { +#line 298 "Parser.rl" + pushDec(&repeatN, (( (*( p))))); } + +#line 4407 "Parser.cpp" + + break; + } + case 8: { + { +#line 299 "Parser.rl" + pushDec(&repeatM, (( (*( p))))); } + +#line 4415 "Parser.cpp" + + break; + } + case 9: { + { +#line 300 "Parser.rl" + pushOct(&octAccumulator, (( (*( p))))); } + +#line 4423 "Parser.cpp" + + break; + } + case 10: { + { +#line 301 "Parser.rl" + pushDec(&accumulator, (( (*( p))))); } + +#line 4431 "Parser.cpp" + + break; + } + case 11: { + { +#line 302 "Parser.rl" + + accumulator *= 16; + accumulator += (( (*( p)))) - '0'; + } + +#line 4442 "Parser.cpp" + + break; + } + case 12: { + { +#line 306 "Parser.rl" + + accumulator *= 16; + accumulator += 10 + (( (*( p)))) - 'a'; + } + +#line 4453 "Parser.cpp" + + break; + } + case 13: { + { +#line 310 "Parser.rl" + + accumulator *= 16; + accumulator += 10 + (( (*( p)))) - 'A'; + } + +#line 4464 "Parser.cpp" + + break; + } + case 14: { + { +#line 430 "Parser.rl" + + newMode = mode; + } + +#line 4474 "Parser.cpp" + + break; + } + case 15: { + { +#line 437 "Parser.rl" + + switch ((( (*( p))))) { + case 'i': + newMode.caseless = true; + break; + case 'm': + newMode.multiline = true; + break; + case 's': + newMode.dotall = true; + break; + case 'x': + newMode.ignore_space = true; + break; + default: + assert(0); // this action only called for [imsx] + break; + } + } + +#line 4500 "Parser.cpp" + + break; + } + case 16: { + { +#line 456 "Parser.rl" + + switch ((( (*( p))))) { + case 'i': + newMode.caseless = false; + break; + case 'm': + newMode.multiline = false; + break; + case 's': + newMode.dotall = false; + break; + case 'x': + newMode.ignore_space = false; + break; + default: + assert(0); // this action only called for [imsx] + break; + } + } + +#line 4526 "Parser.cpp" + + break; + } + case 17: { + { +#line 510 "Parser.rl" + repeatM = repeatN;} + +#line 4534 "Parser.cpp" + + break; + } + case 18: { + { +#line 510 "Parser.rl" + repeatM = ComponentRepeat::NoLimit;} + +#line 4542 "Parser.cpp" + + break; + } + case 19: { + { +#line 722 "Parser.rl" + negated = !negated; } + +#line 4550 "Parser.cpp" + + break; + } + case 20: { + { +#line 723 "Parser.rl" + {p = p - 1; } {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 790;goto _again;}} + +#line 4566 "Parser.cpp" + + break; + } + case 21: { + { +#line 724 "Parser.rl" + if (!inCharClass) { // not inside [..] + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + +#line 4579 "Parser.cpp" + + break; + } + case 22: { + { +#line 730 "Parser.rl" + throw LocatedParseError("Malformed property"); } + +#line 4587 "Parser.cpp" + + break; + } + case 25: { + { +#line 1 "NONE" + {te = p+1;}} + +#line 4595 "Parser.cpp" + + break; + } + case 26: { + { +#line 550 "Parser.rl" + {te = p+1;{ +#line 550 "Parser.rl" + + throw LocatedParseError("(*UTF8) must be at start of " + "expression, encountered"); + } + }} + +#line 4609 "Parser.cpp" + + break; + } + case 27: { + { +#line 554 "Parser.rl" + {te = p+1;{ +#line 554 "Parser.rl" + + throw LocatedParseError("(*UTF) must be at start of " + "expression, encountered"); + } + }} + +#line 4623 "Parser.cpp" + + break; + } + case 28: { + { +#line 558 "Parser.rl" + {te = p+1;{ +#line 558 "Parser.rl" + + throw LocatedParseError("(*UCP) must be at start of " + "expression, encountered"); + } + }} + +#line 4637 "Parser.cpp" + + break; + } + case 29: { + { +#line 564 "Parser.rl" + {te = p+1;{ +#line 564 "Parser.rl" + + ParseMode temp_mode; + assert(ts - 2 >= ptr); // parser needs the '(*' at the start too. + read_control_verbs(ts - 2, te, (ts - 2 - ptr), temp_mode); + assert(0); // Should have thrown a parse error. + throw LocatedParseError("Unknown control verb"); + } + }} + +#line 4654 "Parser.cpp" + + break; + } + case 30: { + { +#line 571 "Parser.rl" + {te = p+1;{ +#line 571 "Parser.rl" + + throw LocatedParseError("Unknown control verb"); + } + }} + +#line 4667 "Parser.cpp" + + break; + } + case 31: { + { +#line 571 "Parser.rl" + {te = p;p = p - 1;{ +#line 571 "Parser.rl" + + throw LocatedParseError("Unknown control verb"); + } + }} + +#line 4680 "Parser.cpp" + + break; + } + case 32: { + { +#line 571 "Parser.rl" + {p = ((te))-1; + { +#line 571 "Parser.rl" + + throw LocatedParseError("Unknown control verb"); + } + }} + +#line 4694 "Parser.cpp" + + break; + } + case 33: { + { +#line 581 "Parser.rl" + {te = p+1;{ +#line 581 "Parser.rl" + currentCls->add(CLASS_UCP_CC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4705 "Parser.cpp" + + break; + } + case 34: { + { +#line 582 "Parser.rl" + {te = p+1;{ +#line 582 "Parser.rl" + currentCls->add(CLASS_UCP_CF, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4716 "Parser.cpp" + + break; + } + case 35: { + { +#line 583 "Parser.rl" + {te = p+1;{ +#line 583 "Parser.rl" + currentCls->add(CLASS_UCP_CN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4727 "Parser.cpp" + + break; + } + case 36: { + { +#line 585 "Parser.rl" + {te = p+1;{ +#line 585 "Parser.rl" + currentCls->add(CLASS_UCP_CS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4738 "Parser.cpp" + + break; + } + case 37: { + { +#line 587 "Parser.rl" + {te = p+1;{ +#line 587 "Parser.rl" + currentCls->add(CLASS_UCP_LL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4749 "Parser.cpp" + + break; + } + case 38: { + { +#line 588 "Parser.rl" + {te = p+1;{ +#line 588 "Parser.rl" + currentCls->add(CLASS_UCP_LM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4760 "Parser.cpp" + + break; + } + case 39: { + { +#line 589 "Parser.rl" + {te = p+1;{ +#line 589 "Parser.rl" + currentCls->add(CLASS_UCP_LO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4771 "Parser.cpp" + + break; + } + case 40: { + { +#line 590 "Parser.rl" + {te = p+1;{ +#line 590 "Parser.rl" + currentCls->add(CLASS_UCP_LT, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4782 "Parser.cpp" + + break; + } + case 41: { + { +#line 591 "Parser.rl" + {te = p+1;{ +#line 591 "Parser.rl" + currentCls->add(CLASS_UCP_LU, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4793 "Parser.cpp" + + break; + } + case 42: { + { +#line 592 "Parser.rl" + {te = p+1;{ +#line 592 "Parser.rl" + currentCls->add(CLASS_UCP_L_AND, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4804 "Parser.cpp" + + break; + } + case 43: { + { +#line 594 "Parser.rl" + {te = p+1;{ +#line 594 "Parser.rl" + currentCls->add(CLASS_UCP_MC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4815 "Parser.cpp" + + break; + } + case 44: { + { +#line 596 "Parser.rl" + {te = p+1;{ +#line 596 "Parser.rl" + currentCls->add(CLASS_UCP_MN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4826 "Parser.cpp" + + break; + } + case 45: { + { +#line 598 "Parser.rl" + {te = p+1;{ +#line 598 "Parser.rl" + currentCls->add(CLASS_UCP_ND, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4837 "Parser.cpp" + + break; + } + case 46: { + { +#line 599 "Parser.rl" + {te = p+1;{ +#line 599 "Parser.rl" + currentCls->add(CLASS_UCP_NL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4848 "Parser.cpp" + + break; + } + case 47: { + { +#line 600 "Parser.rl" + {te = p+1;{ +#line 600 "Parser.rl" + currentCls->add(CLASS_UCP_NO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4859 "Parser.cpp" + + break; + } + case 48: { + { +#line 602 "Parser.rl" + {te = p+1;{ +#line 602 "Parser.rl" + currentCls->add(CLASS_UCP_PC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4870 "Parser.cpp" + + break; + } + case 49: { + { +#line 603 "Parser.rl" + {te = p+1;{ +#line 603 "Parser.rl" + currentCls->add(CLASS_UCP_PD, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4881 "Parser.cpp" + + break; + } + case 50: { + { +#line 604 "Parser.rl" + {te = p+1;{ +#line 604 "Parser.rl" + currentCls->add(CLASS_UCP_PE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4892 "Parser.cpp" + + break; + } + case 51: { + { +#line 605 "Parser.rl" + {te = p+1;{ +#line 605 "Parser.rl" + currentCls->add(CLASS_UCP_PF, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4903 "Parser.cpp" + + break; + } + case 52: { + { +#line 606 "Parser.rl" + {te = p+1;{ +#line 606 "Parser.rl" + currentCls->add(CLASS_UCP_PI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4914 "Parser.cpp" + + break; + } + case 53: { + { +#line 607 "Parser.rl" + {te = p+1;{ +#line 607 "Parser.rl" + currentCls->add(CLASS_UCP_PO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4925 "Parser.cpp" + + break; + } + case 54: { + { +#line 608 "Parser.rl" + {te = p+1;{ +#line 608 "Parser.rl" + currentCls->add(CLASS_UCP_PS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4936 "Parser.cpp" + + break; + } + case 55: { + { +#line 610 "Parser.rl" + {te = p+1;{ +#line 610 "Parser.rl" + currentCls->add(CLASS_UCP_SC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4947 "Parser.cpp" + + break; + } + case 56: { + { +#line 611 "Parser.rl" + {te = p+1;{ +#line 611 "Parser.rl" + currentCls->add(CLASS_UCP_SK, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4958 "Parser.cpp" + + break; + } + case 57: { + { +#line 612 "Parser.rl" + {te = p+1;{ +#line 612 "Parser.rl" + currentCls->add(CLASS_UCP_SM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4969 "Parser.cpp" + + break; + } + case 58: { + { +#line 613 "Parser.rl" + {te = p+1;{ +#line 613 "Parser.rl" + currentCls->add(CLASS_UCP_SO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4980 "Parser.cpp" + + break; + } + case 59: { + { +#line 615 "Parser.rl" + {te = p+1;{ +#line 615 "Parser.rl" + currentCls->add(CLASS_UCP_ZL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 4991 "Parser.cpp" + + break; + } + case 60: { + { +#line 616 "Parser.rl" + {te = p+1;{ +#line 616 "Parser.rl" + currentCls->add(CLASS_UCP_ZP, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5002 "Parser.cpp" + + break; + } + case 61: { + { +#line 617 "Parser.rl" + {te = p+1;{ +#line 617 "Parser.rl" + currentCls->add(CLASS_UCP_ZS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5013 "Parser.cpp" + + break; + } + case 62: { + { +#line 618 "Parser.rl" + {te = p+1;{ +#line 618 "Parser.rl" + currentCls->add(CLASS_UCP_XAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5024 "Parser.cpp" + + break; + } + case 63: { + { +#line 619 "Parser.rl" + {te = p+1;{ +#line 619 "Parser.rl" + currentCls->add(CLASS_UCP_XPS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5035 "Parser.cpp" + + break; + } + case 64: { + { +#line 620 "Parser.rl" + {te = p+1;{ +#line 620 "Parser.rl" + currentCls->add(CLASS_UCP_XSP, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5046 "Parser.cpp" + + break; + } + case 65: { + { +#line 621 "Parser.rl" + {te = p+1;{ +#line 621 "Parser.rl" + currentCls->add(CLASS_UCP_XWD, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5057 "Parser.cpp" + + break; + } + case 66: { + { +#line 622 "Parser.rl" + {te = p+1;{ +#line 622 "Parser.rl" + currentCls->add(CLASS_SCRIPT_ARABIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5068 "Parser.cpp" + + break; + } + case 67: { + { +#line 623 "Parser.rl" + {te = p+1;{ +#line 623 "Parser.rl" + currentCls->add(CLASS_SCRIPT_ARMENIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5079 "Parser.cpp" + + break; + } + case 68: { + { +#line 624 "Parser.rl" + {te = p+1;{ +#line 624 "Parser.rl" + currentCls->add(CLASS_SCRIPT_AVESTAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5090 "Parser.cpp" + + break; + } + case 69: { + { +#line 625 "Parser.rl" + {te = p+1;{ +#line 625 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BALINESE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5101 "Parser.cpp" + + break; + } + case 70: { + { +#line 626 "Parser.rl" + {te = p+1;{ +#line 626 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BAMUM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5112 "Parser.cpp" + + break; + } + case 71: { + { +#line 627 "Parser.rl" + {te = p+1;{ +#line 627 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BATAK, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5123 "Parser.cpp" + + break; + } + case 72: { + { +#line 628 "Parser.rl" + {te = p+1;{ +#line 628 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BENGALI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5134 "Parser.cpp" + + break; + } + case 73: { + { +#line 629 "Parser.rl" + {te = p+1;{ +#line 629 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BOPOMOFO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5145 "Parser.cpp" + + break; + } + case 74: { + { +#line 630 "Parser.rl" + {te = p+1;{ +#line 630 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BRAHMI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5156 "Parser.cpp" + + break; + } + case 75: { + { +#line 631 "Parser.rl" + {te = p+1;{ +#line 631 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BRAILLE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5167 "Parser.cpp" + + break; + } + case 76: { + { +#line 632 "Parser.rl" + {te = p+1;{ +#line 632 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BUGINESE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5178 "Parser.cpp" + + break; + } + case 77: { + { +#line 633 "Parser.rl" + {te = p+1;{ +#line 633 "Parser.rl" + currentCls->add(CLASS_SCRIPT_BUHID, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5189 "Parser.cpp" + + break; + } + case 78: { + { +#line 634 "Parser.rl" + {te = p+1;{ +#line 634 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CANADIAN_ABORIGINAL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5200 "Parser.cpp" + + break; + } + case 79: { + { +#line 635 "Parser.rl" + {te = p+1;{ +#line 635 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CARIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5211 "Parser.cpp" + + break; + } + case 80: { + { +#line 636 "Parser.rl" + {te = p+1;{ +#line 636 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CHAM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5222 "Parser.cpp" + + break; + } + case 81: { + { +#line 637 "Parser.rl" + {te = p+1;{ +#line 637 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CHEROKEE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5233 "Parser.cpp" + + break; + } + case 82: { + { +#line 638 "Parser.rl" + {te = p+1;{ +#line 638 "Parser.rl" + currentCls->add(CLASS_SCRIPT_COMMON, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5244 "Parser.cpp" + + break; + } + case 83: { + { +#line 639 "Parser.rl" + {te = p+1;{ +#line 639 "Parser.rl" + currentCls->add(CLASS_SCRIPT_COPTIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5255 "Parser.cpp" + + break; + } + case 84: { + { +#line 640 "Parser.rl" + {te = p+1;{ +#line 640 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CUNEIFORM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5266 "Parser.cpp" + + break; + } + case 85: { + { +#line 641 "Parser.rl" + {te = p+1;{ +#line 641 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CYPRIOT, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5277 "Parser.cpp" + + break; + } + case 86: { + { +#line 642 "Parser.rl" + {te = p+1;{ +#line 642 "Parser.rl" + currentCls->add(CLASS_SCRIPT_CYRILLIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5288 "Parser.cpp" + + break; + } + case 87: { + { +#line 643 "Parser.rl" + {te = p+1;{ +#line 643 "Parser.rl" + currentCls->add(CLASS_SCRIPT_DESERET, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5299 "Parser.cpp" + + break; + } + case 88: { + { +#line 644 "Parser.rl" + {te = p+1;{ +#line 644 "Parser.rl" + currentCls->add(CLASS_SCRIPT_DEVANAGARI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5310 "Parser.cpp" + + break; + } + case 89: { + { +#line 645 "Parser.rl" + {te = p+1;{ +#line 645 "Parser.rl" + currentCls->add(CLASS_SCRIPT_EGYPTIAN_HIEROGLYPHS, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5321 "Parser.cpp" + + break; + } + case 90: { + { +#line 646 "Parser.rl" + {te = p+1;{ +#line 646 "Parser.rl" + currentCls->add(CLASS_SCRIPT_ETHIOPIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5332 "Parser.cpp" + + break; + } + case 91: { + { +#line 647 "Parser.rl" + {te = p+1;{ +#line 647 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GEORGIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5343 "Parser.cpp" + + break; + } + case 92: { + { +#line 648 "Parser.rl" + {te = p+1;{ +#line 648 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GLAGOLITIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5354 "Parser.cpp" + + break; + } + case 93: { + { +#line 649 "Parser.rl" + {te = p+1;{ +#line 649 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GOTHIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5365 "Parser.cpp" + + break; + } + case 94: { + { +#line 650 "Parser.rl" + {te = p+1;{ +#line 650 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GREEK, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5376 "Parser.cpp" + + break; + } + case 95: { + { +#line 651 "Parser.rl" + {te = p+1;{ +#line 651 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GUJARATI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5387 "Parser.cpp" + + break; + } + case 96: { + { +#line 652 "Parser.rl" + {te = p+1;{ +#line 652 "Parser.rl" + currentCls->add(CLASS_SCRIPT_GURMUKHI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5398 "Parser.cpp" + + break; + } + case 97: { + { +#line 654 "Parser.rl" + {te = p+1;{ +#line 654 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HANGUL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5409 "Parser.cpp" + + break; + } + case 98: { + { +#line 655 "Parser.rl" + {te = p+1;{ +#line 655 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HANUNOO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5420 "Parser.cpp" + + break; + } + case 99: { + { +#line 656 "Parser.rl" + {te = p+1;{ +#line 656 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HEBREW, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5431 "Parser.cpp" + + break; + } + case 100: { + { +#line 657 "Parser.rl" + {te = p+1;{ +#line 657 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HIRAGANA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5442 "Parser.cpp" + + break; + } + case 101: { + { +#line 658 "Parser.rl" + {te = p+1;{ +#line 658 "Parser.rl" + currentCls->add(CLASS_SCRIPT_IMPERIAL_ARAMAIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5453 "Parser.cpp" + + break; + } + case 102: { + { +#line 659 "Parser.rl" + {te = p+1;{ +#line 659 "Parser.rl" + currentCls->add(CLASS_SCRIPT_INHERITED, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5464 "Parser.cpp" + + break; + } + case 103: { + { +#line 660 "Parser.rl" + {te = p+1;{ +#line 660 "Parser.rl" + currentCls->add(CLASS_SCRIPT_INSCRIPTIONAL_PAHLAVI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5475 "Parser.cpp" + + break; + } + case 104: { + { +#line 661 "Parser.rl" + {te = p+1;{ +#line 661 "Parser.rl" + currentCls->add(CLASS_SCRIPT_INSCRIPTIONAL_PARTHIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5486 "Parser.cpp" + + break; + } + case 105: { + { +#line 662 "Parser.rl" + {te = p+1;{ +#line 662 "Parser.rl" + currentCls->add(CLASS_SCRIPT_JAVANESE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5497 "Parser.cpp" + + break; + } + case 106: { + { +#line 663 "Parser.rl" + {te = p+1;{ +#line 663 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KAITHI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5508 "Parser.cpp" + + break; + } + case 107: { + { +#line 664 "Parser.rl" + {te = p+1;{ +#line 664 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KANNADA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5519 "Parser.cpp" + + break; + } + case 108: { + { +#line 665 "Parser.rl" + {te = p+1;{ +#line 665 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KATAKANA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5530 "Parser.cpp" + + break; + } + case 109: { + { +#line 666 "Parser.rl" + {te = p+1;{ +#line 666 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KAYAH_LI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5541 "Parser.cpp" + + break; + } + case 110: { + { +#line 667 "Parser.rl" + {te = p+1;{ +#line 667 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KHAROSHTHI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5552 "Parser.cpp" + + break; + } + case 111: { + { +#line 668 "Parser.rl" + {te = p+1;{ +#line 668 "Parser.rl" + currentCls->add(CLASS_SCRIPT_KHMER, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5563 "Parser.cpp" + + break; + } + case 112: { + { +#line 669 "Parser.rl" + {te = p+1;{ +#line 669 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LAO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5574 "Parser.cpp" + + break; + } + case 113: { + { +#line 670 "Parser.rl" + {te = p+1;{ +#line 670 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LATIN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5585 "Parser.cpp" + + break; + } + case 114: { + { +#line 671 "Parser.rl" + {te = p+1;{ +#line 671 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LEPCHA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5596 "Parser.cpp" + + break; + } + case 115: { + { +#line 672 "Parser.rl" + {te = p+1;{ +#line 672 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LIMBU, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5607 "Parser.cpp" + + break; + } + case 116: { + { +#line 673 "Parser.rl" + {te = p+1;{ +#line 673 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LINEAR_B, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5618 "Parser.cpp" + + break; + } + case 117: { + { +#line 674 "Parser.rl" + {te = p+1;{ +#line 674 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LISU, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5629 "Parser.cpp" + + break; + } + case 118: { + { +#line 675 "Parser.rl" + {te = p+1;{ +#line 675 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LYCIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5640 "Parser.cpp" + + break; + } + case 119: { + { +#line 676 "Parser.rl" + {te = p+1;{ +#line 676 "Parser.rl" + currentCls->add(CLASS_SCRIPT_LYDIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5651 "Parser.cpp" + + break; + } + case 120: { + { +#line 677 "Parser.rl" + {te = p+1;{ +#line 677 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MALAYALAM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5662 "Parser.cpp" + + break; + } + case 121: { + { +#line 678 "Parser.rl" + {te = p+1;{ +#line 678 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MANDAIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5673 "Parser.cpp" + + break; + } + case 122: { + { +#line 679 "Parser.rl" + {te = p+1;{ +#line 679 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MEETEI_MAYEK, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5684 "Parser.cpp" + + break; + } + case 123: { + { +#line 680 "Parser.rl" + {te = p+1;{ +#line 680 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MONGOLIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5695 "Parser.cpp" + + break; + } + case 124: { + { +#line 681 "Parser.rl" + {te = p+1;{ +#line 681 "Parser.rl" + currentCls->add(CLASS_SCRIPT_MYANMAR, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5706 "Parser.cpp" + + break; + } + case 125: { + { +#line 682 "Parser.rl" + {te = p+1;{ +#line 682 "Parser.rl" + currentCls->add(CLASS_SCRIPT_NEW_TAI_LUE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5717 "Parser.cpp" + + break; + } + case 126: { + { +#line 683 "Parser.rl" + {te = p+1;{ +#line 683 "Parser.rl" + currentCls->add(CLASS_SCRIPT_NKO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5728 "Parser.cpp" + + break; + } + case 127: { + { +#line 684 "Parser.rl" + {te = p+1;{ +#line 684 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OGHAM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5739 "Parser.cpp" + + break; + } + case 128: { + { +#line 685 "Parser.rl" + {te = p+1;{ +#line 685 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OL_CHIKI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5750 "Parser.cpp" + + break; + } + case 129: { + { +#line 686 "Parser.rl" + {te = p+1;{ +#line 686 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OLD_ITALIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5761 "Parser.cpp" + + break; + } + case 130: { + { +#line 687 "Parser.rl" + {te = p+1;{ +#line 687 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OLD_PERSIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5772 "Parser.cpp" + + break; + } + case 131: { + { +#line 688 "Parser.rl" + {te = p+1;{ +#line 688 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OLD_SOUTH_ARABIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5783 "Parser.cpp" + + break; + } + case 132: { + { +#line 689 "Parser.rl" + {te = p+1;{ +#line 689 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OLD_TURKIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5794 "Parser.cpp" + + break; + } + case 133: { + { +#line 690 "Parser.rl" + {te = p+1;{ +#line 690 "Parser.rl" + currentCls->add(CLASS_SCRIPT_ORIYA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5805 "Parser.cpp" + + break; + } + case 134: { + { +#line 691 "Parser.rl" + {te = p+1;{ +#line 691 "Parser.rl" + currentCls->add(CLASS_SCRIPT_OSMANYA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5816 "Parser.cpp" + + break; + } + case 135: { + { +#line 692 "Parser.rl" + {te = p+1;{ +#line 692 "Parser.rl" + currentCls->add(CLASS_SCRIPT_PHAGS_PA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5827 "Parser.cpp" + + break; + } + case 136: { + { +#line 693 "Parser.rl" + {te = p+1;{ +#line 693 "Parser.rl" + currentCls->add(CLASS_SCRIPT_PHOENICIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5838 "Parser.cpp" + + break; + } + case 137: { + { +#line 694 "Parser.rl" + {te = p+1;{ +#line 694 "Parser.rl" + currentCls->add(CLASS_SCRIPT_REJANG, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5849 "Parser.cpp" + + break; + } + case 138: { + { +#line 695 "Parser.rl" + {te = p+1;{ +#line 695 "Parser.rl" + currentCls->add(CLASS_SCRIPT_RUNIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5860 "Parser.cpp" + + break; + } + case 139: { + { +#line 696 "Parser.rl" + {te = p+1;{ +#line 696 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SAMARITAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5871 "Parser.cpp" + + break; + } + case 140: { + { +#line 697 "Parser.rl" + {te = p+1;{ +#line 697 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SAURASHTRA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5882 "Parser.cpp" + + break; + } + case 141: { + { +#line 698 "Parser.rl" + {te = p+1;{ +#line 698 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SHAVIAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5893 "Parser.cpp" + + break; + } + case 142: { + { +#line 699 "Parser.rl" + {te = p+1;{ +#line 699 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SINHALA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5904 "Parser.cpp" + + break; + } + case 143: { + { +#line 700 "Parser.rl" + {te = p+1;{ +#line 700 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SUNDANESE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5915 "Parser.cpp" + + break; + } + case 144: { + { +#line 701 "Parser.rl" + {te = p+1;{ +#line 701 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SYLOTI_NAGRI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5926 "Parser.cpp" + + break; + } + case 145: { + { +#line 702 "Parser.rl" + {te = p+1;{ +#line 702 "Parser.rl" + currentCls->add(CLASS_SCRIPT_SYRIAC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5937 "Parser.cpp" + + break; + } + case 146: { + { +#line 703 "Parser.rl" + {te = p+1;{ +#line 703 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAGALOG, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5948 "Parser.cpp" + + break; + } + case 147: { + { +#line 704 "Parser.rl" + {te = p+1;{ +#line 704 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAGBANWA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5959 "Parser.cpp" + + break; + } + case 148: { + { +#line 705 "Parser.rl" + {te = p+1;{ +#line 705 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAI_LE, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5970 "Parser.cpp" + + break; + } + case 149: { + { +#line 706 "Parser.rl" + {te = p+1;{ +#line 706 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAI_THAM, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5981 "Parser.cpp" + + break; + } + case 150: { + { +#line 707 "Parser.rl" + {te = p+1;{ +#line 707 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAI_VIET, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 5992 "Parser.cpp" + + break; + } + case 151: { + { +#line 708 "Parser.rl" + {te = p+1;{ +#line 708 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TAMIL, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6003 "Parser.cpp" + + break; + } + case 152: { + { +#line 709 "Parser.rl" + {te = p+1;{ +#line 709 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TELUGU, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6014 "Parser.cpp" + + break; + } + case 153: { + { +#line 710 "Parser.rl" + {te = p+1;{ +#line 710 "Parser.rl" + currentCls->add(CLASS_SCRIPT_THAANA, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6025 "Parser.cpp" + + break; + } + case 154: { + { +#line 711 "Parser.rl" + {te = p+1;{ +#line 711 "Parser.rl" + currentCls->add(CLASS_SCRIPT_THAI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6036 "Parser.cpp" + + break; + } + case 155: { + { +#line 712 "Parser.rl" + {te = p+1;{ +#line 712 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TIBETAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6047 "Parser.cpp" + + break; + } + case 156: { + { +#line 713 "Parser.rl" + {te = p+1;{ +#line 713 "Parser.rl" + currentCls->add(CLASS_SCRIPT_TIFINAGH, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6058 "Parser.cpp" + + break; + } + case 157: { + { +#line 714 "Parser.rl" + {te = p+1;{ +#line 714 "Parser.rl" + currentCls->add(CLASS_SCRIPT_UGARITIC, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6069 "Parser.cpp" + + break; + } + case 158: { + { +#line 715 "Parser.rl" + {te = p+1;{ +#line 715 "Parser.rl" + currentCls->add(CLASS_SCRIPT_VAI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6080 "Parser.cpp" + + break; + } + case 159: { + { +#line 716 "Parser.rl" + {te = p+1;{ +#line 716 "Parser.rl" + currentCls->add(CLASS_SCRIPT_YI, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6091 "Parser.cpp" + + break; + } + case 160: { + { +#line 717 "Parser.rl" + {te = p+1;{ +#line 717 "Parser.rl" + currentCls->add(CLASS_UCP_ANY, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6102 "Parser.cpp" + + break; + } + case 161: { + { +#line 718 "Parser.rl" + {te = p+1;{ +#line 718 "Parser.rl" + throw LocatedParseError("Unknown property"); } + }} + +#line 6113 "Parser.cpp" + + break; + } + case 162: { + { +#line 580 "Parser.rl" + {te = p;p = p - 1;{ +#line 580 "Parser.rl" + currentCls->add(CLASS_UCP_C, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6124 "Parser.cpp" + + break; + } + case 163: { + { +#line 584 "Parser.rl" + {te = p;p = p - 1;{ +#line 584 "Parser.rl" + currentCls->add(CLASS_UCP_CO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6135 "Parser.cpp" + + break; + } + case 164: { + { +#line 586 "Parser.rl" + {te = p;p = p - 1;{ +#line 586 "Parser.rl" + currentCls->add(CLASS_UCP_L, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6146 "Parser.cpp" + + break; + } + case 165: { + { +#line 593 "Parser.rl" + {te = p;p = p - 1;{ +#line 593 "Parser.rl" + currentCls->add(CLASS_UCP_M, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6157 "Parser.cpp" + + break; + } + case 166: { + { +#line 595 "Parser.rl" + {te = p;p = p - 1;{ +#line 595 "Parser.rl" + currentCls->add(CLASS_UCP_ME, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6168 "Parser.cpp" + + break; + } + case 167: { + { +#line 597 "Parser.rl" + {te = p;p = p - 1;{ +#line 597 "Parser.rl" + currentCls->add(CLASS_UCP_N, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6179 "Parser.cpp" + + break; + } + case 168: { + { +#line 601 "Parser.rl" + {te = p;p = p - 1;{ +#line 601 "Parser.rl" + currentCls->add(CLASS_UCP_P, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6190 "Parser.cpp" + + break; + } + case 169: { + { +#line 609 "Parser.rl" + {te = p;p = p - 1;{ +#line 609 "Parser.rl" + currentCls->add(CLASS_UCP_S, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6201 "Parser.cpp" + + break; + } + case 170: { + { +#line 614 "Parser.rl" + {te = p;p = p - 1;{ +#line 614 "Parser.rl" + currentCls->add(CLASS_UCP_Z, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6212 "Parser.cpp" + + break; + } + case 171: { + { +#line 653 "Parser.rl" + {te = p;p = p - 1;{ +#line 653 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6223 "Parser.cpp" + + break; + } + case 172: { + { +#line 718 "Parser.rl" + {te = p;p = p - 1;{ +#line 718 "Parser.rl" + throw LocatedParseError("Unknown property"); } + }} + +#line 6234 "Parser.cpp" + + break; + } + case 173: { + { +#line 580 "Parser.rl" + {p = ((te))-1; + { +#line 580 "Parser.rl" + currentCls->add(CLASS_UCP_C, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6246 "Parser.cpp" + + break; + } + case 174: { + { +#line 584 "Parser.rl" + {p = ((te))-1; + { +#line 584 "Parser.rl" + currentCls->add(CLASS_UCP_CO, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6258 "Parser.cpp" + + break; + } + case 175: { + { +#line 586 "Parser.rl" + {p = ((te))-1; + { +#line 586 "Parser.rl" + currentCls->add(CLASS_UCP_L, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6270 "Parser.cpp" + + break; + } + case 176: { + { +#line 593 "Parser.rl" + {p = ((te))-1; + { +#line 593 "Parser.rl" + currentCls->add(CLASS_UCP_M, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6282 "Parser.cpp" + + break; + } + case 177: { + { +#line 595 "Parser.rl" + {p = ((te))-1; + { +#line 595 "Parser.rl" + currentCls->add(CLASS_UCP_ME, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6294 "Parser.cpp" + + break; + } + case 178: { + { +#line 597 "Parser.rl" + {p = ((te))-1; + { +#line 597 "Parser.rl" + currentCls->add(CLASS_UCP_N, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6306 "Parser.cpp" + + break; + } + case 179: { + { +#line 601 "Parser.rl" + {p = ((te))-1; + { +#line 601 "Parser.rl" + currentCls->add(CLASS_UCP_P, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6318 "Parser.cpp" + + break; + } + case 180: { + { +#line 609 "Parser.rl" + {p = ((te))-1; + { +#line 609 "Parser.rl" + currentCls->add(CLASS_UCP_S, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6330 "Parser.cpp" + + break; + } + case 181: { + { +#line 653 "Parser.rl" + {p = ((te))-1; + { +#line 653 "Parser.rl" + currentCls->add(CLASS_SCRIPT_HAN, negated); {top -= 1;cs = stack[top];goto _again;} } + }} + +#line 6342 "Parser.cpp" + + break; + } + case 182: { + { +#line 718 "Parser.rl" + {p = ((te))-1; + { +#line 718 "Parser.rl" + throw LocatedParseError("Unknown property"); } + }} + +#line 6354 "Parser.cpp" + + break; + } + case 183: { + { +#line 733 "Parser.rl" + {te = p+1;{ +#line 733 "Parser.rl" + + currentCls->add(CLASS_UCP_C, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6372 "Parser.cpp" + + break; + } + case 184: { + { +#line 741 "Parser.rl" + {te = p+1;{ +#line 741 "Parser.rl" + + currentCls->add(CLASS_UCP_L, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6390 "Parser.cpp" + + break; + } + case 185: { + { +#line 749 "Parser.rl" + {te = p+1;{ +#line 749 "Parser.rl" + + currentCls->add(CLASS_UCP_M, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6408 "Parser.cpp" + + break; + } + case 186: { + { +#line 757 "Parser.rl" + {te = p+1;{ +#line 757 "Parser.rl" + + currentCls->add(CLASS_UCP_N, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6426 "Parser.cpp" + + break; + } + case 187: { + { +#line 765 "Parser.rl" + {te = p+1;{ +#line 765 "Parser.rl" + + currentCls->add(CLASS_UCP_P, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6444 "Parser.cpp" + + break; + } + case 188: { + { +#line 773 "Parser.rl" + {te = p+1;{ +#line 773 "Parser.rl" + + currentCls->add(CLASS_UCP_S, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6462 "Parser.cpp" + + break; + } + case 189: { + { +#line 781 "Parser.rl" + {te = p+1;{ +#line 781 "Parser.rl" + + currentCls->add(CLASS_UCP_Z, negated); + if (!inCharClass) { + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + } + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 6480 "Parser.cpp" + + break; + } + case 190: { + { +#line 790 "Parser.rl" + {te = p+1;{ +#line 790 "Parser.rl" + throw LocatedParseError("Unknown property"); } + }} + +#line 6491 "Parser.cpp" + + break; + } + case 191: { + { +#line 796 "Parser.rl" + {te = p+1;{ +#line 796 "Parser.rl" + + throw LocatedParseError("Unsupported POSIX collating " + "element"); + } + }} + +#line 6505 "Parser.cpp" + + break; + } + case 192: { + { +#line 803 "Parser.rl" + {te = p+1;{ +#line 803 "Parser.rl" + + currentCls->add(CLASS_ALNUM, false); + } + }} + +#line 6518 "Parser.cpp" + + break; + } + case 193: { + { +#line 806 "Parser.rl" + {te = p+1;{ +#line 806 "Parser.rl" + + currentCls->add(CLASS_ALNUM, true); + } + }} + +#line 6531 "Parser.cpp" + + break; + } + case 194: { + { +#line 809 "Parser.rl" + {te = p+1;{ +#line 809 "Parser.rl" + + currentCls->add(CLASS_ALPHA, false); + } + }} + +#line 6544 "Parser.cpp" + + break; + } + case 195: { + { +#line 812 "Parser.rl" + {te = p+1;{ +#line 812 "Parser.rl" + + currentCls->add(CLASS_ALPHA, true); + } + }} + +#line 6557 "Parser.cpp" + + break; + } + case 196: { + { +#line 815 "Parser.rl" + {te = p+1;{ +#line 815 "Parser.rl" + + currentCls->add(CLASS_ASCII, false); + } + }} + +#line 6570 "Parser.cpp" + + break; + } + case 197: { + { +#line 818 "Parser.rl" + {te = p+1;{ +#line 818 "Parser.rl" + + currentCls->add(CLASS_ASCII, true); + } + }} + +#line 6583 "Parser.cpp" + + break; + } + case 198: { + { +#line 821 "Parser.rl" + {te = p+1;{ +#line 821 "Parser.rl" + + currentCls->add(CLASS_BLANK, false); + } + }} + +#line 6596 "Parser.cpp" + + break; + } + case 199: { + { +#line 824 "Parser.rl" + {te = p+1;{ +#line 824 "Parser.rl" + + currentCls->add(CLASS_BLANK, true); + } + }} + +#line 6609 "Parser.cpp" + + break; + } + case 200: { + { +#line 827 "Parser.rl" + {te = p+1;{ +#line 827 "Parser.rl" + + currentCls->add(CLASS_CNTRL, false); + } + }} + +#line 6622 "Parser.cpp" + + break; + } + case 201: { + { +#line 830 "Parser.rl" + {te = p+1;{ +#line 830 "Parser.rl" + + currentCls->add(CLASS_CNTRL, true); + } + }} + +#line 6635 "Parser.cpp" + + break; + } + case 202: { + { +#line 833 "Parser.rl" + {te = p+1;{ +#line 833 "Parser.rl" + + currentCls->add(CLASS_DIGIT, false); + } + }} + +#line 6648 "Parser.cpp" + + break; + } + case 203: { + { +#line 836 "Parser.rl" + {te = p+1;{ +#line 836 "Parser.rl" + + currentCls->add(CLASS_DIGIT, true); + } + }} + +#line 6661 "Parser.cpp" + + break; + } + case 204: { + { +#line 839 "Parser.rl" + {te = p+1;{ +#line 839 "Parser.rl" + + currentCls->add(CLASS_GRAPH, false); + } + }} + +#line 6674 "Parser.cpp" + + break; + } + case 205: { + { +#line 842 "Parser.rl" + {te = p+1;{ +#line 842 "Parser.rl" + + currentCls->add(CLASS_GRAPH, true); + } + }} + +#line 6687 "Parser.cpp" + + break; + } + case 206: { + { +#line 845 "Parser.rl" + {te = p+1;{ +#line 845 "Parser.rl" + + currentCls->add(CLASS_LOWER, false); + } + }} + +#line 6700 "Parser.cpp" + + break; + } + case 207: { + { +#line 848 "Parser.rl" + {te = p+1;{ +#line 848 "Parser.rl" + + currentCls->add(CLASS_LOWER, true); + } + }} + +#line 6713 "Parser.cpp" + + break; + } + case 208: { + { +#line 851 "Parser.rl" + {te = p+1;{ +#line 851 "Parser.rl" + + currentCls->add(CLASS_PRINT, false); + } + }} + +#line 6726 "Parser.cpp" + + break; + } + case 209: { + { +#line 854 "Parser.rl" + {te = p+1;{ +#line 854 "Parser.rl" + + currentCls->add(CLASS_PRINT, true); + } + }} + +#line 6739 "Parser.cpp" + + break; + } + case 210: { + { +#line 857 "Parser.rl" + {te = p+1;{ +#line 857 "Parser.rl" + + currentCls->add(CLASS_PUNCT, false); + } + }} + +#line 6752 "Parser.cpp" + + break; + } + case 211: { + { +#line 860 "Parser.rl" + {te = p+1;{ +#line 860 "Parser.rl" + + currentCls->add(CLASS_PUNCT, true); + } + }} + +#line 6765 "Parser.cpp" + + break; + } + case 212: { + { +#line 864 "Parser.rl" + {te = p+1;{ +#line 864 "Parser.rl" + + currentCls->add(CLASS_SPACE, false); + } + }} + +#line 6778 "Parser.cpp" + + break; + } + case 213: { + { +#line 867 "Parser.rl" + {te = p+1;{ +#line 867 "Parser.rl" + + currentCls->add(CLASS_SPACE, true); + } + }} + +#line 6791 "Parser.cpp" + + break; + } + case 214: { + { +#line 870 "Parser.rl" + {te = p+1;{ +#line 870 "Parser.rl" + + currentCls->add(CLASS_UPPER, false); + } + }} + +#line 6804 "Parser.cpp" + + break; + } + case 215: { + { +#line 873 "Parser.rl" + {te = p+1;{ +#line 873 "Parser.rl" + + currentCls->add(CLASS_UPPER, true); + } + }} + +#line 6817 "Parser.cpp" + + break; + } + case 216: { + { +#line 876 "Parser.rl" + {te = p+1;{ +#line 876 "Parser.rl" + + currentCls->add(CLASS_WORD, false); + } + }} + +#line 6830 "Parser.cpp" + + break; + } + case 217: { + { +#line 879 "Parser.rl" + {te = p+1;{ +#line 879 "Parser.rl" + + currentCls->add(CLASS_WORD, true); + } + }} + +#line 6843 "Parser.cpp" + + break; + } + case 218: { + { +#line 882 "Parser.rl" + {te = p+1;{ +#line 882 "Parser.rl" + + currentCls->add(CLASS_XDIGIT, false); + } + }} + +#line 6856 "Parser.cpp" + + break; + } + case 219: { + { +#line 885 "Parser.rl" + {te = p+1;{ +#line 885 "Parser.rl" + + currentCls->add(CLASS_XDIGIT, true); + } + }} + +#line 6869 "Parser.cpp" + + break; + } + case 220: { + { +#line 890 "Parser.rl" + {te = p+1;{ +#line 890 "Parser.rl" + + throw LocatedParseError("Invalid POSIX named class"); + } + }} + +#line 6882 "Parser.cpp" + + break; + } + case 221: { + { +#line 893 "Parser.rl" + {te = p+1;{ +#line 893 "Parser.rl" + + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 843;goto _again;}} + }} + +#line 6902 "Parser.cpp" + + break; + } + case 222: { + { +#line 896 "Parser.rl" + {te = p+1;{ +#line 896 "Parser.rl" + /*noop*/} + }} + +#line 6913 "Parser.cpp" + + break; + } + case 223: { + { +#line 898 "Parser.rl" + {te = p+1;{ +#line 898 "Parser.rl" + + currentCls->add('\x08'); + } + }} + +#line 6926 "Parser.cpp" + + break; + } + case 224: { + { +#line 902 "Parser.rl" + {te = p+1;{ +#line 902 "Parser.rl" + + currentCls->add('\x09'); + } + }} + +#line 6939 "Parser.cpp" + + break; + } + case 225: { + { +#line 906 "Parser.rl" + {te = p+1;{ +#line 906 "Parser.rl" + + currentCls->add('\x0a'); + } + }} + +#line 6952 "Parser.cpp" + + break; + } + case 226: { + { +#line 910 "Parser.rl" + {te = p+1;{ +#line 910 "Parser.rl" + + currentCls->add('\x0d'); + } + }} + +#line 6965 "Parser.cpp" + + break; + } + case 227: { + { +#line 914 "Parser.rl" + {te = p+1;{ +#line 914 "Parser.rl" + + currentCls->add('\x0c'); + } + }} + +#line 6978 "Parser.cpp" + + break; + } + case 228: { + { +#line 918 "Parser.rl" + {te = p+1;{ +#line 918 "Parser.rl" + + currentCls->add('\x07'); + } + }} + +#line 6991 "Parser.cpp" + + break; + } + case 229: { + { +#line 922 "Parser.rl" + {te = p+1;{ +#line 922 "Parser.rl" + + currentCls->add('\x1b'); + } + }} + +#line 7004 "Parser.cpp" + + break; + } + case 230: { + { +#line 926 "Parser.rl" + {te = p+1;{ +#line 926 "Parser.rl" + + currentCls->add(CLASS_HORZ, false); + } + }} + +#line 7017 "Parser.cpp" + + break; + } + case 231: { + { +#line 930 "Parser.rl" + {te = p+1;{ +#line 930 "Parser.rl" + + currentCls->add(CLASS_HORZ, true); + } + }} + +#line 7030 "Parser.cpp" + + break; + } + case 232: { + { +#line 934 "Parser.rl" + {te = p+1;{ +#line 934 "Parser.rl" + + currentCls->add(CLASS_VERT, false); + } + }} + +#line 7043 "Parser.cpp" + + break; + } + case 233: { + { +#line 938 "Parser.rl" + {te = p+1;{ +#line 938 "Parser.rl" + + currentCls->add(CLASS_VERT, true); + } + }} + +#line 7056 "Parser.cpp" + + break; + } + case 234: { + { +#line 942 "Parser.rl" + {te = p+1;{ +#line 942 "Parser.rl" + + negated = false; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 559;goto _again;}} + }} + +#line 7078 "Parser.cpp" + + break; + } + case 235: { + { +#line 948 "Parser.rl" + {te = p+1;{ +#line 948 "Parser.rl" + + negated = false; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 818;goto _again;}} + }} + +#line 7100 "Parser.cpp" + + break; + } + case 236: { + { +#line 954 "Parser.rl" + {te = p+1;{ +#line 954 "Parser.rl" + + negated = true; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 559;goto _again;}} + }} + +#line 7122 "Parser.cpp" + + break; + } + case 237: { + { +#line 960 "Parser.rl" + {te = p+1;{ +#line 960 "Parser.rl" + + negated = true; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 818;goto _again;}} + }} + +#line 7144 "Parser.cpp" + + break; + } + case 238: { + { +#line 970 "Parser.rl" + {te = p+1;{ +#line 970 "Parser.rl" + + currentCls->add(octAccumulator); + } + }} + +#line 7157 "Parser.cpp" + + break; + } + case 239: { + { +#line 973 "Parser.rl" + {te = p+1;{ +#line 973 "Parser.rl" + + currentCls->add(octAccumulator); + } + }} + +#line 7170 "Parser.cpp" + + break; + } + case 240: { + { +#line 977 "Parser.rl" + {te = p+1;{ +#line 977 "Parser.rl" + + string oct(ts + 3, te - ts - 4); + unsigned long val; + try { + val = stoul(oct, nullptr, 8); + } catch (const std::out_of_range &) { + val = MAX_UNICODE + 1; + } + if ((!mode.utf8 && val > 255) || val > MAX_UNICODE) { + throw LocatedParseError("Value in \\o{...} sequence is too large"); + } + currentCls->add((unichar)val); + } + }} + +#line 7193 "Parser.cpp" + + break; + } + case 241: { + { +#line 997 "Parser.rl" + {te = p+1;{ +#line 997 "Parser.rl" + + currentCls->add(accumulator); + } + }} + +#line 7206 "Parser.cpp" + + break; + } + case 242: { + { +#line 1001 "Parser.rl" + {te = p+1;{ +#line 1001 "Parser.rl" + + // whatever we found here + currentCls->add(*(ts + 1)); + + } + }} + +#line 7221 "Parser.cpp" + + break; + } + case 243: { + { +#line 1007 "Parser.rl" + {te = p+1;{ +#line 1007 "Parser.rl" + + string hex(ts + 3, te - ts - 4); + unsigned long val; + try { + val = stoul(hex, nullptr, 16); + } catch (const std::out_of_range &) { + val = MAX_UNICODE + 1; + } + if (val > MAX_UNICODE) { + throw LocatedParseError("Value in \\x{...} sequence is too large"); + } + currentCls->add((unichar)val); + } + }} + +#line 7244 "Parser.cpp" + + break; + } + case 244: { + { +#line 1025 "Parser.rl" + {te = p+1;{ +#line 1025 "Parser.rl" + + if (te - ts < 3) { + assert(te - ts == 2); + throw LocatedParseError(SLASH_C_ERROR); + } else { + assert(te - ts == 3); + currentCls->add(decodeCtrl(ts[2])); + } + } + }} + +#line 7263 "Parser.cpp" + + break; + } + case 245: { + { +#line 1035 "Parser.rl" + {te = p+1;{ +#line 1035 "Parser.rl" + + currentCls->add(CLASS_WORD, false); + } + }} + +#line 7276 "Parser.cpp" + + break; + } + case 246: { + { +#line 1039 "Parser.rl" + {te = p+1;{ +#line 1039 "Parser.rl" + + currentCls->add(CLASS_WORD, true); + } + }} + +#line 7289 "Parser.cpp" + + break; + } + case 247: { + { +#line 1043 "Parser.rl" + {te = p+1;{ +#line 1043 "Parser.rl" + + currentCls->add(CLASS_SPACE, false); + } + }} + +#line 7302 "Parser.cpp" + + break; + } + case 248: { + { +#line 1047 "Parser.rl" + {te = p+1;{ +#line 1047 "Parser.rl" + + currentCls->add(CLASS_SPACE, true); + } + }} + +#line 7315 "Parser.cpp" + + break; + } + case 249: { + { +#line 1051 "Parser.rl" + {te = p+1;{ +#line 1051 "Parser.rl" + + currentCls->add(CLASS_DIGIT, false); + } + }} + +#line 7328 "Parser.cpp" + + break; + } + case 250: { + { +#line 1055 "Parser.rl" + {te = p+1;{ +#line 1055 "Parser.rl" + + currentCls->add(CLASS_DIGIT, true); + } + }} + +#line 7341 "Parser.cpp" + + break; + } + case 251: { + { +#line 1058 "Parser.rl" + {te = p+1;{ +#line 1058 "Parser.rl" + + currentCls->addDash(); + } + }} + +#line 7354 "Parser.cpp" + + break; + } + case 252: { + { +#line 276 "Parser.rl" + {te = p+1;{ +#line 276 "Parser.rl" + + ostringstream str; + str << "'\\" << *(ts + 1) << "' at index " << ts - ptr + << " not supported in a character class."; + throw ParseError(str.str()); + } + }} + +#line 7370 "Parser.cpp" + + break; + } + case 253: { + { +#line 276 "Parser.rl" + {te = p+1;{ +#line 276 "Parser.rl" + + ostringstream str; + str << "'\\" << *(ts + 1) << "' at index " << ts - ptr + << " not supported in a character class."; + throw ParseError(str.str()); + } + }} + +#line 7386 "Parser.cpp" + + break; + } + case 254: { + { +#line 276 "Parser.rl" + {te = p+1;{ +#line 276 "Parser.rl" + + ostringstream str; + str << "'\\" << *(ts + 1) << "' at index " << ts - ptr + << " not supported in a character class."; + throw ParseError(str.str()); + } + }} + +#line 7402 "Parser.cpp" + + break; + } + case 255: { + { +#line 1075 "Parser.rl" + {te = p+1;{ +#line 1075 "Parser.rl" + + // add the literal char + currentCls->add(*(ts + 1)); + } + }} + +#line 7416 "Parser.cpp" + + break; + } + case 256: { + { +#line 1081 "Parser.rl" + {te = p+1;{ +#line 1081 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint2c(ts)); + } + }} + +#line 7430 "Parser.cpp" + + break; + } + case 257: { + { +#line 1086 "Parser.rl" + {te = p+1;{ +#line 1086 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint3c(ts)); + } + }} + +#line 7444 "Parser.cpp" + + break; + } + case 258: { + { +#line 1091 "Parser.rl" + {te = p+1;{ +#line 1091 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint4c(ts)); + } + }} + +#line 7458 "Parser.cpp" + + break; + } + case 259: { + { +#line 1096 "Parser.rl" + {te = p+1;{ +#line 1096 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7472 "Parser.cpp" + + break; + } + case 260: { + { +#line 1102 "Parser.rl" + {te = p+1;{ +#line 1102 "Parser.rl" + + currentCls->add((u8)*ts); + } + }} + +#line 7485 "Parser.cpp" + + break; + } + case 261: { + { +#line 1106 "Parser.rl" + {te = p+1;{ +#line 1106 "Parser.rl" + + currentCls->finalize(); + currentSeq->addComponent(move(currentCls)); + inCharClass = false; + {cs = 746;goto _again;}} + }} + +#line 7500 "Parser.cpp" + + break; + } + case 262: { + { +#line 966 "Parser.rl" + {te = p;p = p - 1;{ +#line 966 "Parser.rl" + throw LocatedParseError("Malformed property"); } + }} + +#line 7511 "Parser.cpp" + + break; + } + case 263: { + { +#line 967 "Parser.rl" + {te = p;p = p - 1;{ +#line 967 "Parser.rl" + throw LocatedParseError("Malformed property"); } + }} + +#line 7522 "Parser.cpp" + + break; + } + case 264: { + { +#line 970 "Parser.rl" + {te = p;p = p - 1;{ +#line 970 "Parser.rl" + + currentCls->add(octAccumulator); + } + }} + +#line 7535 "Parser.cpp" + + break; + } + case 265: { + { +#line 973 "Parser.rl" + {te = p;p = p - 1;{ +#line 973 "Parser.rl" + + currentCls->add(octAccumulator); + } + }} + +#line 7548 "Parser.cpp" + + break; + } + case 266: { + { +#line 992 "Parser.rl" + {te = p;p = p - 1;{ +#line 992 "Parser.rl" + + throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); + } + }} + +#line 7561 "Parser.cpp" + + break; + } + case 267: { + { +#line 997 "Parser.rl" + {te = p;p = p - 1;{ +#line 997 "Parser.rl" + + currentCls->add(accumulator); + } + }} + +#line 7574 "Parser.cpp" + + break; + } + case 268: { + { +#line 1021 "Parser.rl" + {te = p;p = p - 1;{ +#line 1021 "Parser.rl" + + throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); + } + }} + +#line 7587 "Parser.cpp" + + break; + } + case 269: { + { +#line 1025 "Parser.rl" + {te = p;p = p - 1;{ +#line 1025 "Parser.rl" + + if (te - ts < 3) { + assert(te - ts == 2); + throw LocatedParseError(SLASH_C_ERROR); + } else { + assert(te - ts == 3); + currentCls->add(decodeCtrl(ts[2])); + } + } + }} + +#line 7606 "Parser.cpp" + + break; + } + case 270: { + { +#line 1096 "Parser.rl" + {te = p;p = p - 1;{ +#line 1096 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7620 "Parser.cpp" + + break; + } + case 271: { + { +#line 1102 "Parser.rl" + {te = p;p = p - 1;{ +#line 1102 "Parser.rl" + + currentCls->add((u8)*ts); + } + }} + +#line 7633 "Parser.cpp" + + break; + } + case 272: { + { +#line 992 "Parser.rl" + {p = ((te))-1; + { +#line 992 "Parser.rl" + + throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); + } + }} + +#line 7647 "Parser.cpp" + + break; + } + case 273: { + { +#line 1021 "Parser.rl" + {p = ((te))-1; + { +#line 1021 "Parser.rl" + + throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); + } + }} + +#line 7661 "Parser.cpp" + + break; + } + case 274: { + { +#line 1096 "Parser.rl" + {p = ((te))-1; + { +#line 1096 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7676 "Parser.cpp" + + break; + } + case 275: { + { +#line 1102 "Parser.rl" + {p = ((te))-1; + { +#line 1102 "Parser.rl" + + currentCls->add((u8)*ts); + } + }} + +#line 7690 "Parser.cpp" + + break; + } + case 276: { + { +#line 1120 "Parser.rl" + {te = p+1;{ +#line 1120 "Parser.rl" + + if (currentCls->isNegated()) { + // Already seen a caret; the second one is not a meta-character. + inCharClassEarly = false; + {p = p - 1; } {cs = 819;goto _again;}} else { + currentCls->negate(); + // Note: we cannot switch off inCharClassEarly here, as /[^]]/ + // needs to use the right square bracket path below. + } + } + }} + +#line 7710 "Parser.cpp" + + break; + } + case 277: { + { +#line 1133 "Parser.rl" + {te = p+1;{ +#line 1133 "Parser.rl" + + currentCls->add(']'); + inCharClassEarly = false; + } + }} + +#line 7724 "Parser.cpp" + + break; + } + case 278: { + { +#line 1138 "Parser.rl" + {te = p+1;{ +#line 1138 "Parser.rl" + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 843;goto _again;}} + }} + +#line 7743 "Parser.cpp" + + break; + } + case 279: { + { +#line 1139 "Parser.rl" + {te = p+1;{ +#line 1139 "Parser.rl" + /*noop*/} + }} + +#line 7754 "Parser.cpp" + + break; + } + case 280: { + { +#line 1142 "Parser.rl" + {te = p+1;{ +#line 1142 "Parser.rl" + + inCharClassEarly = false; + {p = p - 1; } + {cs = 819;goto _again;}} + }} + +#line 7768 "Parser.cpp" + + break; + } + case 281: { + { +#line 1142 "Parser.rl" + {te = p;p = p - 1;{ +#line 1142 "Parser.rl" + + inCharClassEarly = false; + {p = p - 1; } + {cs = 819;goto _again;}} + }} + +#line 7782 "Parser.cpp" + + break; + } + case 282: { + { +#line 1154 "Parser.rl" + {te = p+1;{ +#line 1154 "Parser.rl" + + {cs = 746;goto _again;}} + }} + +#line 7794 "Parser.cpp" + + break; + } + case 283: { + { +#line 1159 "Parser.rl" + {te = p+1;{ +#line 1159 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint2c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 7812 "Parser.cpp" + + break; + } + case 284: { + { +#line 1168 "Parser.rl" + {te = p+1;{ +#line 1168 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint3c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 7830 "Parser.cpp" + + break; + } + case 285: { + { +#line 1177 "Parser.rl" + {te = p+1;{ +#line 1177 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint4c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 7848 "Parser.cpp" + + break; + } + case 286: { + { +#line 1186 "Parser.rl" + {te = p+1;{ +#line 1186 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7862 "Parser.cpp" + + break; + } + case 287: { + { +#line 1192 "Parser.rl" + {te = p+1;{ +#line 1192 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 7875 "Parser.cpp" + + break; + } + case 288: { + { +#line 1186 "Parser.rl" + {te = p;p = p - 1;{ +#line 1186 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7889 "Parser.cpp" + + break; + } + case 289: { + { +#line 1192 "Parser.rl" + {te = p;p = p - 1;{ +#line 1192 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 7902 "Parser.cpp" + + break; + } + case 290: { + { +#line 1186 "Parser.rl" + {p = ((te))-1; + { +#line 1186 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7917 "Parser.cpp" + + break; + } + case 291: { + { +#line 1202 "Parser.rl" + {te = p+1;{ +#line 1202 "Parser.rl" + + {top -= 1;cs = stack[top];goto _again;} + } + }} + +#line 7930 "Parser.cpp" + + break; + } + case 292: { + { +#line 1207 "Parser.rl" + {te = p+1;{ +#line 1207 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint2c(ts)); + inCharClassEarly = false; + } + }} + +#line 7945 "Parser.cpp" + + break; + } + case 293: { + { +#line 1213 "Parser.rl" + {te = p+1;{ +#line 1213 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint3c(ts)); + inCharClassEarly = false; + } + }} + +#line 7960 "Parser.cpp" + + break; + } + case 294: { + { +#line 1219 "Parser.rl" + {te = p+1;{ +#line 1219 "Parser.rl" + + assert(mode.utf8); + currentCls->add(readUtf8CodePoint4c(ts)); + inCharClassEarly = false; + } + }} + +#line 7975 "Parser.cpp" + + break; + } + case 295: { + { +#line 1225 "Parser.rl" + {te = p+1;{ +#line 1225 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 7989 "Parser.cpp" + + break; + } + case 296: { + { +#line 1231 "Parser.rl" + {te = p+1;{ +#line 1231 "Parser.rl" + + currentCls->add(*ts); + inCharClassEarly = false; + } + }} + +#line 8003 "Parser.cpp" + + break; + } + case 297: { + { +#line 1225 "Parser.rl" + {te = p;p = p - 1;{ +#line 1225 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 8017 "Parser.cpp" + + break; + } + case 298: { + { +#line 1231 "Parser.rl" + {te = p;p = p - 1;{ +#line 1231 "Parser.rl" + + currentCls->add(*ts); + inCharClassEarly = false; + } + }} + +#line 8031 "Parser.cpp" + + break; + } + case 299: { + { +#line 1225 "Parser.rl" + {p = ((te))-1; + { +#line 1225 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 8046 "Parser.cpp" + + break; + } + case 300: { + { +#line 1243 "Parser.rl" + {te = p+1;{ +#line 1243 "Parser.rl" + inComment = false; {cs = 746;goto _again;}} + }} + +#line 8057 "Parser.cpp" + + break; + } + case 301: { + { +#line 1 "-" + {te = p+1;}} + +#line 8065 "Parser.cpp" + + break; + } + case 302: { + { +#line 1255 "Parser.rl" + {te = p+1;{ +#line 1255 "Parser.rl" + inComment = false; {cs = 746;goto _again;}} + }} + +#line 8076 "Parser.cpp" + + break; + } + case 303: { + { +#line 1 "-" + {te = p+1;}} + +#line 8084 "Parser.cpp" + + break; + } + case 304: { + { +#line 1491 "Parser.rl" + {act = 288;}} + +#line 8092 "Parser.cpp" + + break; + } + case 305: { + { +#line 1508 "Parser.rl" + {act = 290;}} + +#line 8100 "Parser.cpp" + + break; + } + case 306: { + { +#line 1737 "Parser.rl" + {act = 330;}} + +#line 8108 "Parser.cpp" + + break; + } + case 307: { + { +#line 362 "Parser.rl" + {te = p+1;{ +#line 362 "Parser.rl" + + if (sequences.empty()) { + throw LocatedParseError("Unmatched parentheses"); + } + currentSeq->finalize(); + POP_SEQUENCE; + } + }} + +#line 8125 "Parser.cpp" + + break; + } + case 308: { + { +#line 1274 "Parser.rl" + {te = p+1;{ +#line 1274 "Parser.rl" + + currentSeq->addAlternation(); + } + }} + +#line 8138 "Parser.cpp" + + break; + } + case 309: { + { +#line 1279 "Parser.rl" + {te = p+1;{ +#line 1279 "Parser.rl" + + throw LocatedParseError("POSIX named classes are only " + "supported inside a class"); + } + }} + +#line 8152 "Parser.cpp" + + break; + } + case 310: { + { +#line 1286 "Parser.rl" + {te = p+1;{ +#line 1286 "Parser.rl" + + throw LocatedParseError("Unsupported POSIX collating " + "element"); + } + }} + +#line 8166 "Parser.cpp" + + break; + } + case 311: { + { +#line 1293 "Parser.rl" + {te = p+1;{ +#line 1293 "Parser.rl" + + {cs = 838;goto _again;}} + }} + +#line 8178 "Parser.cpp" + + break; + } + case 312: { + { +#line 1297 "Parser.rl" + {te = p+1;{ +#line 1297 "Parser.rl" + /* noop */ } + }} + +#line 8189 "Parser.cpp" + + break; + } + case 313: { + { +#line 1299 "Parser.rl" + {te = p+1;{ +#line 1299 "Parser.rl" + + currentSeq->addComponent(generateComponent(CLASS_ANY, false, mode)); + } + }} + +#line 8202 "Parser.cpp" + + break; + } + case 314: { + { +#line 1303 "Parser.rl" + {te = p+1;{ +#line 1303 "Parser.rl" + + if (mode.utf8) { + throw LocatedParseError("\\C is unsupported in UTF8"); + } + currentSeq->addComponent(std::make_unique()); + } + }} + +#line 8218 "Parser.cpp" + + break; + } + case 315: { + { +#line 1317 "Parser.rl" + {te = p+1;{ +#line 1317 "Parser.rl" + + if (!currentSeq->addRepeat(0, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_NONGREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 8234 "Parser.cpp" + + break; + } + case 316: { + { +#line 1324 "Parser.rl" + {te = p+1;{ +#line 1324 "Parser.rl" + + if (!currentSeq->addRepeat(0, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_POSSESSIVE)) { + throwInvalidRepeat(); + } + } + }} + +#line 8250 "Parser.cpp" + + break; + } + case 317: { + { +#line 1338 "Parser.rl" + {te = p+1;{ +#line 1338 "Parser.rl" + + if (!currentSeq->addRepeat(1, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_NONGREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 8266 "Parser.cpp" + + break; + } + case 318: { + { +#line 1345 "Parser.rl" + {te = p+1;{ +#line 1345 "Parser.rl" + + if (!currentSeq->addRepeat(1, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_POSSESSIVE)) { + throwInvalidRepeat(); + } + } + }} + +#line 8282 "Parser.cpp" + + break; + } + case 319: { + { +#line 1359 "Parser.rl" + {te = p+1;{ +#line 1359 "Parser.rl" + + if (!currentSeq->addRepeat( + 0, 1, ComponentRepeat::REPEAT_NONGREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 8298 "Parser.cpp" + + break; + } + case 320: { + { +#line 1366 "Parser.rl" + {te = p+1;{ +#line 1366 "Parser.rl" + + if (!currentSeq->addRepeat( + 0, 1, ComponentRepeat::REPEAT_POSSESSIVE)) { + throwInvalidRepeat(); + } + } + }} + +#line 8314 "Parser.cpp" + + break; + } + case 321: { + { +#line 1383 "Parser.rl" + {te = p+1;{ +#line 1383 "Parser.rl" + + if (repeatN > repeatM || repeatM == 0) { + throwInvalidRepeat(); + } else if (!currentSeq->addRepeat( + repeatN, repeatM, + ComponentRepeat::REPEAT_NONGREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 8333 "Parser.cpp" + + break; + } + case 322: { + { +#line 1393 "Parser.rl" + {te = p+1;{ +#line 1393 "Parser.rl" + + if (repeatN > repeatM || repeatM == 0) { + throwInvalidRepeat(); + } else if (!currentSeq->addRepeat( + repeatN, repeatM, + ComponentRepeat::REPEAT_POSSESSIVE)) { + throwInvalidRepeat(); + } + } + }} + +#line 8352 "Parser.cpp" + + break; + } + case 323: { + { +#line 322 "Parser.rl" + {te = p+1;{ +#line 322 "Parser.rl" + + inComment = true; + {cs = 849;goto _again;}} + }} + +#line 8365 "Parser.cpp" + + break; + } + case 324: { + { +#line 1410 "Parser.rl" + {te = p+1;{ +#line 1410 "Parser.rl" + {p = p - 1; } {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 787;goto _again;}} + }} + +#line 8384 "Parser.cpp" + + break; + } + case 325: { + { +#line 1414 "Parser.rl" + {te = p+1;{ +#line 1414 "Parser.rl" + assert(0); {p += 1; goto _out; } } + }} + +#line 8395 "Parser.cpp" + + break; + } + case 326: { + { +#line 1421 "Parser.rl" + {te = p+1;{ +#line 1421 "Parser.rl" + + auto bound = mode.multiline ? ComponentBoundary::BEGIN_LINE + : ComponentBoundary::BEGIN_STRING; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8410 "Parser.cpp" + + break; + } + case 327: { + { +#line 1428 "Parser.rl" + {te = p+1;{ +#line 1428 "Parser.rl" + + auto bound = mode.multiline ? ComponentBoundary::END_LINE + : ComponentBoundary::END_STRING_OPTIONAL_LF; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8425 "Parser.cpp" + + break; + } + case 328: { + { +#line 1434 "Parser.rl" + {te = p+1;{ +#line 1434 "Parser.rl" + + auto bound = ComponentBoundary::BEGIN_STRING; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8439 "Parser.cpp" + + break; + } + case 329: { + { +#line 1439 "Parser.rl" + {te = p+1;{ +#line 1439 "Parser.rl" + + auto bound = ComponentBoundary::END_STRING_OPTIONAL_LF; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8453 "Parser.cpp" + + break; + } + case 330: { + { +#line 1444 "Parser.rl" + {te = p+1;{ +#line 1444 "Parser.rl" + + auto bound = ComponentBoundary::END_STRING; + currentSeq->addComponent(std::make_unique(bound)); + } + }} + +#line 8467 "Parser.cpp" + + break; + } + case 331: { + { +#line 1449 "Parser.rl" + {te = p+1;{ +#line 1449 "Parser.rl" + + currentSeq->addComponent( + std::make_unique(ts - ptr, false, mode)); + } + }} + +#line 8481 "Parser.cpp" + + break; + } + case 332: { + { +#line 1454 "Parser.rl" + {te = p+1;{ +#line 1454 "Parser.rl" + + currentSeq->addComponent( + std::make_unique(ts - ptr, true, mode)); + } + }} + +#line 8495 "Parser.cpp" + + break; + } + case 333: { + { +#line 1464 "Parser.rl" + {te = p+1;{ +#line 1464 "Parser.rl" + + addLiteral(currentSeq, '\x09', mode); + } + }} + +#line 8508 "Parser.cpp" + + break; + } + case 334: { + { +#line 1468 "Parser.rl" + {te = p+1;{ +#line 1468 "Parser.rl" + + addLiteral(currentSeq, '\x0a', mode); + } + }} + +#line 8521 "Parser.cpp" + + break; + } + case 335: { + { +#line 1472 "Parser.rl" + {te = p+1;{ +#line 1472 "Parser.rl" + + addLiteral(currentSeq, '\x0d', mode); + } + }} + +#line 8534 "Parser.cpp" + + break; + } + case 336: { + { +#line 1476 "Parser.rl" + {te = p+1;{ +#line 1476 "Parser.rl" + + addLiteral(currentSeq, '\x0c', mode); + } + }} + +#line 8547 "Parser.cpp" + + break; + } + case 337: { + { +#line 1480 "Parser.rl" + {te = p+1;{ +#line 1480 "Parser.rl" + + addLiteral(currentSeq, '\x07', mode); + } + }} + +#line 8560 "Parser.cpp" + + break; + } + case 338: { + { +#line 1484 "Parser.rl" + {te = p+1;{ +#line 1484 "Parser.rl" + + addLiteral(currentSeq, '\x1b', mode); + } + }} + +#line 8573 "Parser.cpp" + + break; + } + case 339: { + { +#line 1488 "Parser.rl" + {te = p+1;{ +#line 1488 "Parser.rl" + + addLiteral(currentSeq, octAccumulator, mode); + } + }} + +#line 8586 "Parser.cpp" + + break; + } + case 340: { + { +#line 479 "Parser.rl" + {te = p+1;{ +#line 479 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + currentSeq->addComponent(std::make_unique(accumulator)); + } + }} + +#line 8602 "Parser.cpp" + + break; + } + case 341: { + { +#line 486 "Parser.rl" + {te = p+1;{ +#line 486 "Parser.rl" + + // Accumulator is a negative offset. + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + if (accumulator >= groupIndex) { + throw LocatedParseError("Invalid reference"); + } + unsigned idx = groupIndex - accumulator; + currentSeq->addComponent(std::make_unique(idx)); + } + }} + +#line 8623 "Parser.cpp" + + break; + } + case 342: { + { +#line 479 "Parser.rl" + {te = p+1;{ +#line 479 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + currentSeq->addComponent(std::make_unique(accumulator)); + } + }} + +#line 8639 "Parser.cpp" + + break; + } + case 343: { + { +#line 486 "Parser.rl" + {te = p+1;{ +#line 486 "Parser.rl" + + // Accumulator is a negative offset. + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + if (accumulator >= groupIndex) { + throw LocatedParseError("Invalid reference"); + } + unsigned idx = groupIndex - accumulator; + currentSeq->addComponent(std::make_unique(idx)); + } + }} + +#line 8660 "Parser.cpp" + + break; + } + case 344: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8673 "Parser.cpp" + + break; + } + case 345: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8686 "Parser.cpp" + + break; + } + case 346: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8699 "Parser.cpp" + + break; + } + case 347: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8712 "Parser.cpp" + + break; + } + case 348: { + { +#line 498 "Parser.rl" + {te = p+1;{ +#line 498 "Parser.rl" + + currentSeq->addComponent(std::make_unique(label)); + } + }} + +#line 8725 "Parser.cpp" + + break; + } + case 349: { + { +#line 1549 "Parser.rl" + {te = p+1;{ +#line 1549 "Parser.rl" + + ostringstream str; + str << "Onigiruma subroutine call at index " << ts - ptr << + " not supported."; + throw ParseError(str.str()); + } + }} + +#line 8741 "Parser.cpp" + + break; + } + case 350: { + { +#line 1560 "Parser.rl" + {te = p+1;{ +#line 1560 "Parser.rl" + + string oct(ts + 3, te - ts - 4); + unsigned long val; + try { + val = stoul(oct, nullptr, 8); + } catch (const std::out_of_range &) { + val = MAX_UNICODE + 1; + } + if ((!mode.utf8 && val > 255) || val > MAX_UNICODE) { + throw LocatedParseError("Value in \\o{...} sequence is too large"); + } + addEscapedOctal(currentSeq, (unichar)val, mode); + } + }} + +#line 8764 "Parser.cpp" + + break; + } + case 351: { + { +#line 1578 "Parser.rl" + {te = p+1;{ +#line 1578 "Parser.rl" + + addEscapedHex(currentSeq, accumulator, mode); + } + }} + +#line 8777 "Parser.cpp" + + break; + } + case 352: { + { +#line 1582 "Parser.rl" + {te = p+1;{ +#line 1582 "Parser.rl" + + string hex(ts + 3, te - ts - 4); + unsigned long val; + try { + val = stoul(hex, nullptr, 16); + } catch (const std::out_of_range &) { + val = MAX_UNICODE + 1; + } + if (val > MAX_UNICODE) { + throw LocatedParseError("Value in \\x{...} sequence is too large"); + } + addEscapedHex(currentSeq, (unichar)val, mode); + } + }} + +#line 8800 "Parser.cpp" + + break; + } + case 353: { + { +#line 1600 "Parser.rl" + {te = p+1;{ +#line 1600 "Parser.rl" + + if (te - ts < 3) { + assert(te - ts == 2); + throw LocatedParseError(SLASH_C_ERROR); + } else { + assert(te - ts == 3); + addLiteral(currentSeq, decodeCtrl(ts[2]), mode); + } + } + }} + +#line 8819 "Parser.cpp" + + break; + } + case 354: { + { +#line 1610 "Parser.rl" + {te = p+1;{ +#line 1610 "Parser.rl" + + ostringstream str; + str << "'\\" << *(ts + 1) << "' at index " << ts - ptr + << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 8835 "Parser.cpp" + + break; + } + case 355: { + { +#line 1618 "Parser.rl" + {te = p+1;{ +#line 1618 "Parser.rl" + + auto cc = generateComponent(CLASS_WORD, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8849 "Parser.cpp" + + break; + } + case 356: { + { +#line 1623 "Parser.rl" + {te = p+1;{ +#line 1623 "Parser.rl" + + auto cc = generateComponent(CLASS_WORD, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8863 "Parser.cpp" + + break; + } + case 357: { + { +#line 1628 "Parser.rl" + {te = p+1;{ +#line 1628 "Parser.rl" + + auto cc = generateComponent(CLASS_SPACE, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8877 "Parser.cpp" + + break; + } + case 358: { + { +#line 1633 "Parser.rl" + {te = p+1;{ +#line 1633 "Parser.rl" + + auto cc = generateComponent(CLASS_SPACE, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8891 "Parser.cpp" + + break; + } + case 359: { + { +#line 1638 "Parser.rl" + {te = p+1;{ +#line 1638 "Parser.rl" + + auto cc = generateComponent(CLASS_DIGIT, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8905 "Parser.cpp" + + break; + } + case 360: { + { +#line 1643 "Parser.rl" + {te = p+1;{ +#line 1643 "Parser.rl" + + auto cc = generateComponent(CLASS_DIGIT, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8919 "Parser.cpp" + + break; + } + case 361: { + { +#line 1648 "Parser.rl" + {te = p+1;{ +#line 1648 "Parser.rl" + + auto cc = generateComponent(CLASS_HORZ, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8933 "Parser.cpp" + + break; + } + case 362: { + { +#line 1653 "Parser.rl" + {te = p+1;{ +#line 1653 "Parser.rl" + + auto cc = generateComponent(CLASS_HORZ, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8947 "Parser.cpp" + + break; + } + case 363: { + { +#line 1658 "Parser.rl" + {te = p+1;{ +#line 1658 "Parser.rl" + + auto cc = generateComponent(CLASS_VERT, false, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8961 "Parser.cpp" + + break; + } + case 364: { + { +#line 1663 "Parser.rl" + {te = p+1;{ +#line 1663 "Parser.rl" + + auto cc = generateComponent(CLASS_VERT, true, mode); + currentSeq->addComponent(move(cc)); + } + }} + +#line 8975 "Parser.cpp" + + break; + } + case 365: { + { +#line 1668 "Parser.rl" + {te = p+1;{ +#line 1668 "Parser.rl" + + assert(!currentCls && !inCharClass); + currentCls = getComponentClass(mode); + negated = false; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 559;goto _again;}} + }} + +#line 8999 "Parser.cpp" + + break; + } + case 366: { + { +#line 1676 "Parser.rl" + {te = p+1;{ +#line 1676 "Parser.rl" + + assert(!currentCls && !inCharClass); + currentCls = getComponentClass(mode); + negated = false; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 818;goto _again;}} + }} + +#line 9023 "Parser.cpp" + + break; + } + case 367: { + { +#line 1684 "Parser.rl" + {te = p+1;{ +#line 1684 "Parser.rl" + + assert(!currentCls && !inCharClass); + currentCls = getComponentClass(mode); + negated = true; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 559;goto _again;}} + }} + +#line 9047 "Parser.cpp" + + break; + } + case 368: { + { +#line 1692 "Parser.rl" + {te = p+1;{ +#line 1692 "Parser.rl" + + assert(!currentCls && !inCharClass); + currentCls = getComponentClass(mode); + negated = true; + {p = p - 1; } + {{ +#line 1903 "Parser.rl" + + DEBUG_PRINTF("stack %zu top %d\n", stack.size(), top); + if ((int)stack.size() == top) { + stack.resize(2 * (top + 1)); + } + } + stack[top] = cs; top += 1;cs = 818;goto _again;}} + }} + +#line 9071 "Parser.cpp" + + break; + } + case 369: { + { +#line 1704 "Parser.rl" + {te = p+1;{ +#line 1704 "Parser.rl" + + ostringstream str; + str << "\\R at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9086 "Parser.cpp" + + break; + } + case 370: { + { +#line 1711 "Parser.rl" + {te = p+1;{ +#line 1711 "Parser.rl" + + ostringstream str; + str << "\\K at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9101 "Parser.cpp" + + break; + } + case 371: { + { +#line 1726 "Parser.rl" + {te = p+1;{ +#line 1726 "Parser.rl" + + ostringstream str; + str << "\\G at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9116 "Parser.cpp" + + break; + } + case 372: { + { +#line 1732 "Parser.rl" + {te = p+1;{ +#line 1732 "Parser.rl" + + currentSeq->addComponent(std::make_unique(ts - ptr, mode)); + } + }} + +#line 9129 "Parser.cpp" + + break; + } + case 373: { + { +#line 1737 "Parser.rl" + {te = p+1;{ +#line 1737 "Parser.rl" + + addLiteral(currentSeq, *(ts + 1), mode); + } + }} + +#line 9142 "Parser.cpp" + + break; + } + case 374: { + { +#line 316 "Parser.rl" + {te = p+1;{ +#line 316 "Parser.rl" + + inComment = true; + {cs = 848;goto _again;}} + }} + +#line 9155 "Parser.cpp" + + break; + } + case 375: { + { +#line 433 "Parser.rl" + {te = p+1;{ +#line 433 "Parser.rl" + + mode = newMode; + currentSeq->addComponent(std::make_unique()); + } + }} + +#line 9169 "Parser.cpp" + + break; + } + case 376: { + { +#line 355 "Parser.rl" + {te = p+1;{ +#line 355 "Parser.rl" + + PUSH_SEQUENCE; + mode = newMode; + currentSeq = + enterSequence(currentSeq, std::make_unique()); + } + }} + +#line 9185 "Parser.cpp" + + break; + } + case 377: { + { +#line 369 "Parser.rl" + {te = p+1;{ +#line 369 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(ComponentAssertion::LOOKAHEAD, + ComponentAssertion::POS)); + } + }} + +#line 9201 "Parser.cpp" + + break; + } + case 378: { + { +#line 375 "Parser.rl" + {te = p+1;{ +#line 375 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(ComponentAssertion::LOOKAHEAD, + ComponentAssertion::NEG)); + } + }} + +#line 9217 "Parser.cpp" + + break; + } + case 379: { + { +#line 381 "Parser.rl" + {te = p+1;{ +#line 381 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(ComponentAssertion::LOOKBEHIND, + ComponentAssertion::POS)); + } + }} + +#line 9233 "Parser.cpp" + + break; + } + case 380: { + { +#line 387 "Parser.rl" + {te = p+1;{ +#line 387 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(ComponentAssertion::LOOKBEHIND, + ComponentAssertion::NEG)); + } + }} + +#line 9249 "Parser.cpp" + + break; + } + case 381: { + { +#line 393 "Parser.rl" + {te = p+1;{ +#line 393 "Parser.rl" + + throw LocatedParseError("Embedded code is not supported"); + } + }} + +#line 9262 "Parser.cpp" + + break; + } + case 382: { + { +#line 393 "Parser.rl" + {te = p+1;{ +#line 393 "Parser.rl" + + throw LocatedParseError("Embedded code is not supported"); + } + }} + +#line 9275 "Parser.cpp" + + break; + } + case 383: { + { +#line 416 "Parser.rl" + {te = p+1;{ +#line 416 "Parser.rl" + + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique()); + } + }} + +#line 9290 "Parser.cpp" + + break; + } + case 384: { + { +#line 336 "Parser.rl" + {te = p+1;{ +#line 336 "Parser.rl" + + assert(!label.empty()); // should be guaranteed by machine + char c = *label.begin(); + if (c >= '0' && c <= '9') { + throw LocatedParseError("Group name cannot begin with a digit"); + } + if (!groupNames.insert(label).second) { + throw LocatedParseError("Two named subpatterns use the name '" + label + "'"); + } + PUSH_SEQUENCE; + auto seq = std::make_unique(); + seq->setCaptureIndex(groupIndex++); + seq->setCaptureName(label); + currentSeq = enterSequence(currentSeq, move(seq)); + } + }} + +#line 9315 "Parser.cpp" + + break; + } + case 385: { + { +#line 399 "Parser.rl" + {te = p+1;{ +#line 399 "Parser.rl" + + throw LocatedParseError("Subpattern reference unsupported"); + } + }} + +#line 9328 "Parser.cpp" + + break; + } + case 386: { + { +#line 399 "Parser.rl" + {te = p+1;{ +#line 399 "Parser.rl" + + throw LocatedParseError("Subpattern reference unsupported"); + } + }} + +#line 9341 "Parser.cpp" + + break; + } + case 387: { + { +#line 1783 "Parser.rl" + {te = p+1;{ +#line 1783 "Parser.rl" + + auto a = std::make_unique( + ComponentAssertion::LOOKAHEAD, ComponentAssertion::POS); + ComponentAssertion *a_seq = a.get(); + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(move(a))); + PUSH_SEQUENCE; + currentSeq = a_seq; + } + }} + +#line 9361 "Parser.cpp" + + break; + } + case 388: { + { +#line 1794 "Parser.rl" + {te = p+1;{ +#line 1794 "Parser.rl" + + auto a = std::make_unique( + ComponentAssertion::LOOKAHEAD, ComponentAssertion::NEG); + ComponentAssertion *a_seq = a.get(); + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(move(a))); + PUSH_SEQUENCE; + currentSeq = a_seq; + } + }} + +#line 9381 "Parser.cpp" + + break; + } + case 389: { + { +#line 1805 "Parser.rl" + {te = p+1;{ +#line 1805 "Parser.rl" + + auto a = std::make_unique( + ComponentAssertion::LOOKBEHIND, ComponentAssertion::POS); + ComponentAssertion *a_seq = a.get(); + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(move(a))); + PUSH_SEQUENCE; + currentSeq = a_seq; + } + }} + +#line 9401 "Parser.cpp" + + break; + } + case 390: { + { +#line 1816 "Parser.rl" + {te = p+1;{ +#line 1816 "Parser.rl" + + auto a = std::make_unique( + ComponentAssertion::LOOKBEHIND, ComponentAssertion::NEG); + ComponentAssertion *a_seq = a.get(); + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(move(a))); + PUSH_SEQUENCE; + currentSeq = a_seq; + } + }} + +#line 9421 "Parser.cpp" + + break; + } + case 391: { + { +#line 1828 "Parser.rl" + {te = p+1;{ +#line 1828 "Parser.rl" + + throw LocatedParseError("Pattern recursion not supported"); + } + }} + +#line 9434 "Parser.cpp" + + break; + } + case 392: { + { +#line 402 "Parser.rl" + {te = p+1;{ +#line 402 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + PUSH_SEQUENCE; + currentSeq = enterSequence(currentSeq, + std::make_unique(accumulator)); + } + }} + +#line 9452 "Parser.cpp" + + break; + } + case 393: { + { +#line 410 "Parser.rl" + {te = p+1;{ +#line 410 "Parser.rl" + + PUSH_SEQUENCE; + assert(!label.empty()); + currentSeq = enterSequence(currentSeq, + std::make_unique(label)); + } + }} + +#line 9468 "Parser.cpp" + + break; + } + case 394: { + { +#line 1844 "Parser.rl" + {te = p+1;{ +#line 1844 "Parser.rl" + + ostringstream str; + str << "Callout at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9483 "Parser.cpp" + + break; + } + case 395: { + { +#line 1852 "Parser.rl" + {te = p+1;{ +#line 1852 "Parser.rl" + + throw LocatedParseError("Unrecognised character after (?"); + } + }} + +#line 9496 "Parser.cpp" + + break; + } + case 396: { + { +#line 1857 "Parser.rl" + {te = p+1;{ +#line 1857 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint2c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 9514 "Parser.cpp" + + break; + } + case 397: { + { +#line 1866 "Parser.rl" + {te = p+1;{ +#line 1866 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint3c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 9532 "Parser.cpp" + + break; + } + case 398: { + { +#line 1875 "Parser.rl" + {te = p+1;{ +#line 1875 "Parser.rl" + + assert(mode.utf8); + /* leverage ComponentClass to generate the vertices */ + auto cc = getComponentClass(mode); + cc->add(readUtf8CodePoint4c(ts)); + cc->finalize(); + currentSeq->addComponent(move(cc)); + } + }} + +#line 9550 "Parser.cpp" + + break; + } + case 399: { + { +#line 1884 "Parser.rl" + {te = p+1;{ +#line 1884 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 9564 "Parser.cpp" + + break; + } + case 400: { + { +#line 1893 "Parser.rl" + {te = p+1;{ +#line 1893 "Parser.rl" + + if (mode.ignore_space == false) { + addLiteral(currentSeq, *ts, mode); + } + } + }} + +#line 9579 "Parser.cpp" + + break; + } + case 401: { + { +#line 1898 "Parser.rl" + {te = p+1;{ +#line 1898 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 9592 "Parser.cpp" + + break; + } + case 402: { + { +#line 328 "Parser.rl" + {te = p;p = p - 1;{ +#line 328 "Parser.rl" + + PUSH_SEQUENCE; + auto seq = std::make_unique(); + seq->setCaptureIndex(groupIndex++); + currentSeq = enterSequence(currentSeq, move(seq)); + } + }} + +#line 9608 "Parser.cpp" + + break; + } + case 403: { + { +#line 421 "Parser.rl" + {te = p;p = p - 1;{ +#line 421 "Parser.rl" + + assert(!currentCls); + assert(!inCharClass); // not reentrant + currentCls = getComponentClass(mode); + inCharClass = true; + inCharClassEarly = true; + currentClsBegin = ts; + {cs = 836;goto _again;}} + }} + +#line 9626 "Parser.cpp" + + break; + } + case 404: { + { +#line 1310 "Parser.rl" + {te = p;p = p - 1;{ +#line 1310 "Parser.rl" + + if (!currentSeq->addRepeat(0, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_GREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 9642 "Parser.cpp" + + break; + } + case 405: { + { +#line 1331 "Parser.rl" + {te = p;p = p - 1;{ +#line 1331 "Parser.rl" + + if (!currentSeq->addRepeat(1, ComponentRepeat::NoLimit, + ComponentRepeat::REPEAT_GREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 9658 "Parser.cpp" + + break; + } + case 406: { + { +#line 1352 "Parser.rl" + {te = p;p = p - 1;{ +#line 1352 "Parser.rl" + + if (!currentSeq->addRepeat( + 0, 1, ComponentRepeat::REPEAT_GREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 9674 "Parser.cpp" + + break; + } + case 407: { + { +#line 1373 "Parser.rl" + {te = p;p = p - 1;{ +#line 1373 "Parser.rl" + + if (repeatN > repeatM || repeatM == 0) { + throwInvalidRepeat(); + } else if (!currentSeq->addRepeat( + repeatN, repeatM, + ComponentRepeat::REPEAT_GREEDY)) { + throwInvalidRepeat(); + } + } + }} + +#line 9693 "Parser.cpp" + + break; + } + case 408: { + { +#line 1488 "Parser.rl" + {te = p;p = p - 1;{ +#line 1488 "Parser.rl" + + addLiteral(currentSeq, octAccumulator, mode); + } + }} + +#line 9706 "Parser.cpp" + + break; + } + case 409: { + { +#line 1491 "Parser.rl" + {te = p;p = p - 1;{ +#line 1491 "Parser.rl" + + // If there are enough capturing sub expressions, this may be + // a back reference + accumulator = parseAsDecimal(octAccumulator); + if (accumulator < groupIndex) { + currentSeq->addComponent(std::make_unique(accumulator)); + } else { + addEscapedOctal(currentSeq, octAccumulator, mode); + } + } + }} + +#line 9726 "Parser.cpp" + + break; + } + case 410: { + { +#line 479 "Parser.rl" + {te = p;p = p - 1;{ +#line 479 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + currentSeq->addComponent(std::make_unique(accumulator)); + } + }} + +#line 9742 "Parser.cpp" + + break; + } + case 411: { + { +#line 479 "Parser.rl" + {te = p;p = p - 1;{ +#line 479 "Parser.rl" + + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + currentSeq->addComponent(std::make_unique(accumulator)); + } + }} + +#line 9758 "Parser.cpp" + + break; + } + case 412: { + { +#line 486 "Parser.rl" + {te = p;p = p - 1;{ +#line 486 "Parser.rl" + + // Accumulator is a negative offset. + if (accumulator == 0) { + throw LocatedParseError("Numbered reference cannot be zero"); + } + if (accumulator >= groupIndex) { + throw LocatedParseError("Invalid reference"); + } + unsigned idx = groupIndex - accumulator; + currentSeq->addComponent(std::make_unique(idx)); + } + }} + +#line 9779 "Parser.cpp" + + break; + } + case 413: { + { +#line 1557 "Parser.rl" + {te = p;p = p - 1;{ +#line 1557 "Parser.rl" + + throw LocatedParseError("Invalid reference after \\g"); + } + }} + +#line 9792 "Parser.cpp" + + break; + } + case 414: { + { +#line 1574 "Parser.rl" + {te = p;p = p - 1;{ +#line 1574 "Parser.rl" + + throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); + } + }} + +#line 9805 "Parser.cpp" + + break; + } + case 415: { + { +#line 1578 "Parser.rl" + {te = p;p = p - 1;{ +#line 1578 "Parser.rl" + + addEscapedHex(currentSeq, accumulator, mode); + } + }} + +#line 9818 "Parser.cpp" + + break; + } + case 416: { + { +#line 1596 "Parser.rl" + {te = p;p = p - 1;{ +#line 1596 "Parser.rl" + + throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); + } + }} + +#line 9831 "Parser.cpp" + + break; + } + case 417: { + { +#line 1600 "Parser.rl" + {te = p;p = p - 1;{ +#line 1600 "Parser.rl" + + if (te - ts < 3) { + assert(te - ts == 2); + throw LocatedParseError(SLASH_C_ERROR); + } else { + assert(te - ts == 3); + addLiteral(currentSeq, decodeCtrl(ts[2]), mode); + } + } + }} + +#line 9850 "Parser.cpp" + + break; + } + case 418: { + { +#line 1700 "Parser.rl" + {te = p;p = p - 1;{ +#line 1700 "Parser.rl" + throw LocatedParseError("Malformed property"); } + }} + +#line 9861 "Parser.cpp" + + break; + } + case 419: { + { +#line 1701 "Parser.rl" + {te = p;p = p - 1;{ +#line 1701 "Parser.rl" + throw LocatedParseError("Malformed property"); } + }} + +#line 9872 "Parser.cpp" + + break; + } + case 420: { + { +#line 1719 "Parser.rl" + {te = p;p = p - 1;{ +#line 1719 "Parser.rl" + + ostringstream str; + str << "\\k at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 9887 "Parser.cpp" + + break; + } + case 421: { + { +#line 1742 "Parser.rl" + {te = p;p = p - 1;{ +#line 1742 "Parser.rl" + + assert(ts + 1 == pe); + ostringstream str; + str << "Unescaped \\ at end of input, index " << ts - ptr << "."; + throw ParseError(str.str()); + } + }} + +#line 9903 "Parser.cpp" + + break; + } + case 422: { + { +#line 396 "Parser.rl" + {te = p;p = p - 1;{ +#line 396 "Parser.rl" + + throw LocatedParseError("Conditional subpattern unsupported"); + } + }} + +#line 9916 "Parser.cpp" + + break; + } + case 423: { + { +#line 1852 "Parser.rl" + {te = p;p = p - 1;{ +#line 1852 "Parser.rl" + + throw LocatedParseError("Unrecognised character after (?"); + } + }} + +#line 9929 "Parser.cpp" + + break; + } + case 424: { + { +#line 1884 "Parser.rl" + {te = p;p = p - 1;{ +#line 1884 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 9943 "Parser.cpp" + + break; + } + case 425: { + { +#line 1898 "Parser.rl" + {te = p;p = p - 1;{ +#line 1898 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 9956 "Parser.cpp" + + break; + } + case 426: { + { +#line 328 "Parser.rl" + {p = ((te))-1; + { +#line 328 "Parser.rl" + + PUSH_SEQUENCE; + auto seq = std::make_unique(); + seq->setCaptureIndex(groupIndex++); + currentSeq = enterSequence(currentSeq, move(seq)); + } + }} + +#line 9973 "Parser.cpp" + + break; + } + case 427: { + { +#line 421 "Parser.rl" + {p = ((te))-1; + { +#line 421 "Parser.rl" + + assert(!currentCls); + assert(!inCharClass); // not reentrant + currentCls = getComponentClass(mode); + inCharClass = true; + inCharClassEarly = true; + currentClsBegin = ts; + {cs = 836;goto _again;}} + }} + +#line 9992 "Parser.cpp" + + break; + } + case 428: { + { +#line 1557 "Parser.rl" + {p = ((te))-1; + { +#line 1557 "Parser.rl" + + throw LocatedParseError("Invalid reference after \\g"); + } + }} + +#line 10006 "Parser.cpp" + + break; + } + case 429: { + { +#line 1574 "Parser.rl" + {p = ((te))-1; + { +#line 1574 "Parser.rl" + + throw LocatedParseError("Value in \\o{...} sequence is non-octal or missing braces"); + } + }} + +#line 10020 "Parser.cpp" + + break; + } + case 430: { + { +#line 1596 "Parser.rl" + {p = ((te))-1; + { +#line 1596 "Parser.rl" + + throw LocatedParseError("Value in \\x{...} sequence is non-hex or missing }"); + } + }} + +#line 10034 "Parser.cpp" + + break; + } + case 431: { + { +#line 1719 "Parser.rl" + {p = ((te))-1; + { +#line 1719 "Parser.rl" + + ostringstream str; + str << "\\k at index " << ts - ptr << " not supported."; + throw ParseError(str.str()); + } + }} + +#line 10050 "Parser.cpp" + + break; + } + case 432: { + { +#line 396 "Parser.rl" + {p = ((te))-1; + { +#line 396 "Parser.rl" + + throw LocatedParseError("Conditional subpattern unsupported"); + } + }} + +#line 10064 "Parser.cpp" + + break; + } + case 433: { + { +#line 1852 "Parser.rl" + {p = ((te))-1; + { +#line 1852 "Parser.rl" + + throw LocatedParseError("Unrecognised character after (?"); + } + }} + +#line 10078 "Parser.cpp" + + break; + } + case 434: { + { +#line 1884 "Parser.rl" + {p = ((te))-1; + { +#line 1884 "Parser.rl" + + assert(mode.utf8); + throwInvalidUtf8(); + } + }} + +#line 10093 "Parser.cpp" + + break; + } + case 435: { + { +#line 1898 "Parser.rl" + {p = ((te))-1; + { +#line 1898 "Parser.rl" + + addLiteral(currentSeq, *ts, mode); + } + }} + +#line 10107 "Parser.cpp" + + break; + } + case 436: { + { +#line 1 "NONE" + {switch( act ) { + case 288: { + p = ((te))-1; + { +#line 1491 "Parser.rl" + + // If there are enough capturing sub expressions, this may be + // a back reference + accumulator = parseAsDecimal(octAccumulator); + if (accumulator < groupIndex) { + currentSeq->addComponent(std::make_unique(accumulator)); + } else { + addEscapedOctal(currentSeq, octAccumulator, mode); + } + } + break; + } + case 290: { + p = ((te))-1; + { +#line 1508 "Parser.rl" + + // if there are enough left parens to this point, back ref + if (accumulator < groupIndex) { + currentSeq->addComponent(std::make_unique(accumulator)); + } else { + // Otherwise, we interpret the first three digits as an + // octal escape, and the remaining characters stand for + // themselves as literals. + const char *s = ts; + unsigned int accum = 0; + unsigned int oct_digits = 0; + assert(*s == '\\'); // token starts at backslash + for (++s; s < te && oct_digits < 3; ++oct_digits, ++s) { + u8 digit = *s - '0'; + if (digit < 8) { + accum = digit + accum * 8; + } else { + break; + } + } + + if (oct_digits > 0) { + addEscapedOctal(currentSeq, accum, mode); + } + + // And then the rest of the digits, if any, are literal. + for (; s < te; ++s) { + addLiteral(currentSeq, *s, mode); + } + } + } + break; + } + case 330: { + p = ((te))-1; + { +#line 1737 "Parser.rl" + + addLiteral(currentSeq, *(ts + 1), mode); + } + break; + } + }} + } + +#line 10179 "Parser.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + +} + +_again: {} +if ( p == eof ) { + if ( cs >= 746 ) + goto _out; +} +else { + _acts = ( _regex_actions + (_regex_to_state_actions[cs])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) { + case 23: { + { +#line 1 "NONE" + {ts = 0;}} + +#line 10205 "Parser.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + if ( cs != 0 ) { + p += 1; + goto _resume; + } +} +_out: {} +} + +#line 1983 "Parser.rl" + + +if (p != pe && *p != '\0') { +// didn't make it to the end of our input, but we didn't throw a ParseError? +assert(0); +ostringstream str; +str << "Parse error at index " << (p - ptr) << "."; +throw ParseError(str.str()); +} + +if (currentCls) { +assert(inCharClass); +assert(currentClsBegin); +ostringstream oss; +oss << "Unterminated character class starting at index " +<< currentClsBegin - ptr << "."; +throw ParseError(oss.str()); +} + +if (inComment) { +throw ParseError("Unterminated comment."); +} + +if (!sequences.empty()) { +ostringstream str; +str << "Missing close parenthesis for group started at index " +<< sequences.back().seqOffset << "."; +throw ParseError(str.str()); +} + +// Unlikely, but possible +if (groupIndex > 65535) { +throw ParseError("The maximum number of capturing subexpressions is 65535."); +} + +// Finalize the top-level sequence, which will take care of any +// top-level alternation. +currentSeq->finalize(); +assert(currentSeq == rootSeq.get()); + +// Ensure that all references are valid. +checkReferences(*rootSeq, groupIndex, groupNames); + +return move(rootSeq); +} catch (LocatedParseError &error) { +if (ts >= ptr && ts <= pe) { +error.locate(ts - ptr); +} else { +error.locate(0); +} +throw; +} +} + +} // namespace ue2 diff --git a/contrib/vectorscan-cmake/rageled_files/amd64/control_verbs.cpp b/contrib/vectorscan-cmake/rageled_files/amd64/control_verbs.cpp new file mode 100644 index 00000000000..e0393e49355 --- /dev/null +++ b/contrib/vectorscan-cmake/rageled_files/amd64/control_verbs.cpp @@ -0,0 +1,547 @@ +#line 1 "control_verbs.rl" +/* +* Copyright (c) 2017, Intel Corporation +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of Intel Corporation nor the names of its contributors +* may be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +/** +* \file +* \brief Parser for control verbs that can occur at the beginning of a pattern. +*/ + +#include "parser/control_verbs.h" + +#include "parser/Parser.h" +#include "parser/parse_error.h" + +#include +#include + +using namespace std; + +namespace ue2 { + + const char *read_control_verbs(const char *ptr, const char *end, size_t start, + ParseMode &mode) { + const char *p = ptr; + const char *pe = end; + const char *eof = pe; + const char *ts, *te; + int cs; + UNUSED int act; + + +#line 56 "control_verbs.cpp" +static const signed char _ControlVerbs_actions[] = { + 0, 1, 0, 1, 1, 1, 2, 1, + 3, 1, 4, 1, 5, 1, 6, 1, + 7, 1, 8, 1, 9, 0 + }; + + static const short _ControlVerbs_key_offsets[] = { + 0, 7, 8, 10, 12, 14, 16, 18, + 20, 21, 23, 25, 27, 30, 32, 34, + 36, 38, 40, 42, 44, 46, 48, 50, + 52, 55, 57, 59, 61, 63, 66, 68, + 70, 72, 74, 76, 79, 82, 84, 86, + 88, 90, 92, 94, 96, 98, 100, 102, + 105, 107, 109, 111, 113, 115, 117, 119, + 121, 123, 125, 127, 129, 131, 133, 135, + 137, 139, 141, 143, 146, 148, 149, 151, + 155, 157, 159, 160, 161, 0 + }; + + static const char _ControlVerbs_trans_keys[] = { + 41, 65, 66, 67, 76, 78, 85, 41, + 41, 78, 41, 89, 41, 67, 41, 82, + 41, 76, 41, 70, 41, 41, 83, 41, + 82, 41, 95, 41, 65, 85, 41, 78, + 41, 89, 41, 67, 41, 78, 41, 73, + 41, 67, 41, 79, 41, 68, 41, 69, + 41, 82, 41, 76, 41, 70, 73, 41, + 77, 41, 73, 41, 84, 41, 95, 41, + 77, 82, 41, 65, 41, 84, 41, 67, + 41, 72, 41, 61, 41, 48, 57, 41, + 48, 57, 41, 69, 41, 67, 41, 85, + 41, 82, 41, 83, 41, 73, 41, 79, + 41, 78, 41, 79, 41, 95, 41, 65, + 83, 41, 85, 41, 84, 41, 79, 41, + 95, 41, 80, 41, 79, 41, 83, 41, + 83, 41, 69, 41, 83, 41, 83, 41, + 84, 41, 65, 41, 82, 41, 84, 41, + 95, 41, 79, 41, 80, 41, 84, 41, + 67, 84, 41, 80, 41, 41, 70, 41, + 49, 51, 56, 41, 54, 41, 50, 41, + 40, 42, 0 + }; + + static const signed char _ControlVerbs_single_lengths[] = { + 7, 1, 2, 2, 2, 2, 2, 2, + 1, 2, 2, 2, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 2, 2, 3, 2, 2, + 2, 2, 2, 1, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 3, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 2, 1, 2, 4, + 2, 2, 1, 1, 1, 0 + }; + + static const signed char _ControlVerbs_range_lengths[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 + }; + + static const short _ControlVerbs_index_offsets[] = { + 0, 8, 10, 13, 16, 19, 22, 25, + 28, 30, 33, 36, 39, 43, 46, 49, + 52, 55, 58, 61, 64, 67, 70, 73, + 76, 80, 83, 86, 89, 92, 96, 99, + 102, 105, 108, 111, 114, 117, 120, 123, + 126, 129, 132, 135, 138, 141, 144, 147, + 151, 154, 157, 160, 163, 166, 169, 172, + 175, 178, 181, 184, 187, 190, 193, 196, + 199, 202, 205, 208, 212, 215, 217, 220, + 225, 228, 231, 233, 235, 0 + }; + + static const signed char _ControlVerbs_cond_targs[] = { + 75, 2, 9, 22, 24, 45, 67, 1, + 75, 1, 75, 3, 1, 75, 4, 1, + 75, 5, 1, 75, 6, 1, 75, 7, + 1, 75, 8, 1, 75, 1, 75, 10, + 1, 75, 11, 1, 75, 12, 1, 75, + 13, 16, 1, 75, 14, 1, 75, 15, + 1, 75, 5, 1, 75, 17, 1, 75, + 18, 1, 75, 19, 1, 75, 20, 1, + 75, 21, 1, 75, 8, 1, 75, 23, + 1, 75, 7, 1, 75, 8, 25, 1, + 75, 26, 1, 75, 27, 1, 75, 28, + 1, 75, 29, 1, 75, 30, 37, 1, + 75, 31, 1, 75, 32, 1, 75, 33, + 1, 75, 34, 1, 75, 35, 1, 75, + 36, 1, 75, 36, 1, 75, 38, 1, + 75, 39, 1, 75, 40, 1, 75, 41, + 1, 75, 42, 1, 75, 43, 1, 75, + 44, 1, 75, 34, 1, 75, 46, 1, + 75, 47, 1, 75, 48, 59, 1, 75, + 49, 1, 75, 50, 1, 75, 51, 1, + 75, 52, 1, 75, 53, 1, 75, 54, + 1, 75, 55, 1, 75, 56, 1, 75, + 57, 1, 75, 58, 1, 75, 8, 1, + 75, 60, 1, 75, 61, 1, 75, 62, + 1, 75, 63, 1, 75, 64, 1, 75, + 65, 1, 75, 66, 1, 75, 8, 1, + 75, 68, 70, 1, 75, 69, 1, 75, + 1, 75, 71, 1, 75, 72, 73, 74, + 1, 75, 8, 1, 75, 8, 1, 75, + 1, 76, 75, 0, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 0 + }; + + static const signed char _ControlVerbs_cond_actions[] = { + 19, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 13, 0, 0, 13, 0, 0, + 11, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 11, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 11, 0, 0, 13, 0, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 11, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 13, 0, 0, 13, 0, + 0, 13, 0, 0, 13, 0, 0, 13, + 0, 0, 13, 0, 0, 13, 0, 0, + 13, 0, 0, 0, 13, 0, 0, 9, + 0, 13, 0, 0, 7, 0, 0, 0, + 0, 13, 0, 0, 13, 0, 0, 7, + 0, 5, 15, 0, 17, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, + 0, 17, 0 + }; + + static const signed char _ControlVerbs_to_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0 + }; + + static const signed char _ControlVerbs_from_state_actions[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0 + }; + + static const short _ControlVerbs_eof_trans[] = { + 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 0 + }; + + static const int ControlVerbs_start = 75; + static const int ControlVerbs_first_final = 75; + static const int ControlVerbs_error = -1; + + static const int ControlVerbs_en_main = 75; + + +#line 269 "control_verbs.cpp" + { + cs = (int)ControlVerbs_start; + ts = 0; + te = 0; + } + +#line 105 "control_verbs.rl" + + + try { + +#line 278 "control_verbs.cpp" + { + int _klen; + unsigned int _trans = 0; + const char * _keys; + const signed char * _acts; + unsigned int _nacts; + _resume: {} + if ( p == pe && p != eof ) + goto _out; + _acts = ( _ControlVerbs_actions + (_ControlVerbs_from_state_actions[cs])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) { + case 1: { + { +#line 1 "NONE" + {ts = p;}} + +#line 297 "control_verbs.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + if ( p == eof ) { + if ( _ControlVerbs_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_ControlVerbs_eof_trans[cs] - 1; + } + } + else { + _keys = ( _ControlVerbs_trans_keys + (_ControlVerbs_key_offsets[cs])); + _trans = (unsigned int)_ControlVerbs_index_offsets[cs]; + + _klen = (int)_ControlVerbs_single_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + _klen - 1; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _keys += _klen; + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + ((_upper-_lower) >> 1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 1; + else if ( ( (*( p))) > (*( _mid)) ) + _lower = _mid + 1; + else { + _trans += (unsigned int)(_mid - _keys); + goto _match; + } + } + } + + _klen = (int)_ControlVerbs_range_lengths[cs]; + if ( _klen > 0 ) { + const char *_lower = _keys; + const char *_upper = _keys + (_klen<<1) - 2; + const char *_mid; + while ( 1 ) { + if ( _upper < _lower ) { + _trans += (unsigned int)_klen; + break; + } + + _mid = _lower + (((_upper-_lower) >> 1) & ~1); + if ( ( (*( p))) < (*( _mid)) ) + _upper = _mid - 2; + else if ( ( (*( p))) > (*( _mid + 1)) ) + _lower = _mid + 2; + else { + _trans += (unsigned int)((_mid - _keys)>>1); + break; + } + } + } + + _match: {} + } + cs = (int)_ControlVerbs_cond_targs[_trans]; + + if ( _ControlVerbs_cond_actions[_trans] != 0 ) { + + _acts = ( _ControlVerbs_actions + (_ControlVerbs_cond_actions[_trans])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) + { + case 2: { + { +#line 1 "NONE" + {te = p+1;}} + +#line 378 "control_verbs.cpp" + + break; + } + case 3: { + { +#line 76 "control_verbs.rl" + {te = p+1;{ +#line 76 "control_verbs.rl" + + mode.utf8 = true; + } + }} + +#line 391 "control_verbs.cpp" + + break; + } + case 4: { + { +#line 80 "control_verbs.rl" + {te = p+1;{ +#line 80 "control_verbs.rl" + + mode.ucp = true; + } + }} + +#line 404 "control_verbs.cpp" + + break; + } + case 5: { + { +#line 84 "control_verbs.rl" + {te = p+1;{ +#line 84 "control_verbs.rl" + + ostringstream str; + str << "Unsupported control verb " << string(ts, te - ts); + throw LocatedParseError(str.str()); + } + }} + +#line 419 "control_verbs.cpp" + + break; + } + case 6: { + { +#line 90 "control_verbs.rl" + {te = p+1;{ +#line 90 "control_verbs.rl" + + ostringstream str; + str << "Unknown control verb " << string(ts, te - ts); + throw LocatedParseError(str.str()); + } + }} + +#line 434 "control_verbs.cpp" + + break; + } + case 7: { + { +#line 97 "control_verbs.rl" + {te = p+1;{ +#line 97 "control_verbs.rl" + + {p = p - 1; } + {p += 1; goto _out; } + } + }} + +#line 448 "control_verbs.cpp" + + break; + } + case 8: { + { +#line 97 "control_verbs.rl" + {te = p;p = p - 1;{ +#line 97 "control_verbs.rl" + + {p = p - 1; } + {p += 1; goto _out; } + } + }} + +#line 462 "control_verbs.cpp" + + break; + } + case 9: { + { +#line 97 "control_verbs.rl" + {p = ((te))-1; + { +#line 97 "control_verbs.rl" + + {p = p - 1; } + {p += 1; goto _out; } + } + }} + +#line 477 "control_verbs.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + } + + if ( p == eof ) { + if ( cs >= 75 ) + goto _out; + } + else { + _acts = ( _ControlVerbs_actions + (_ControlVerbs_to_state_actions[cs])); + _nacts = (unsigned int)(*( _acts)); + _acts += 1; + while ( _nacts > 0 ) { + switch ( (*( _acts)) ) { + case 0: { + { +#line 1 "NONE" + {ts = 0;}} + +#line 502 "control_verbs.cpp" + + break; + } + } + _nacts -= 1; + _acts += 1; + } + + p += 1; + goto _resume; + } + _out: {} + } + +#line 108 "control_verbs.rl" + + } catch (LocatedParseError &error) { + if (ts >= ptr && ts <= pe) { + error.locate(ts - ptr + start); + } else { + error.locate(0); + } + throw; + } + + return p; + } + +} // namespace ue2 diff --git a/contrib/vectorscan-cmake/rageled_files/control_verbs.cpp b/contrib/vectorscan-cmake/rageled_files/control_verbs.cpp deleted file mode 100644 index 19b5c6955e1..00000000000 --- a/contrib/vectorscan-cmake/rageled_files/control_verbs.cpp +++ /dev/null @@ -1,443 +0,0 @@ - -#line 1 "control_verbs.rl" -/* - * Copyright (c) 2017, Intel Corporation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of Intel Corporation nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * \file - * \brief Parser for control verbs that can occur at the beginning of a pattern. - */ - -#include "parser/control_verbs.h" - -#include "parser/Parser.h" -#include "parser/parse_error.h" - -#include -#include - -using namespace std; - -namespace ue2 { - -const char *read_control_verbs(const char *ptr, const char *end, size_t start, - ParseMode &mode) { - const char *p = ptr; - const char *pe = end; - const char *eof = pe; - const char *ts, *te; - int cs; - UNUSED int act; - - -#line 59 "control_verbs.cpp" -static const char _ControlVerbs_actions[] = { - 0, 1, 0, 1, 1, 1, 2, 1, - 3, 1, 4, 1, 5, 1, 6, 1, - 7, 1, 8, 1, 9 -}; - -static const unsigned char _ControlVerbs_key_offsets[] = { - 0, 7, 8, 10, 12, 14, 16, 18, - 20, 21, 23, 25, 27, 30, 32, 34, - 36, 38, 40, 42, 44, 46, 48, 50, - 52, 55, 57, 59, 61, 63, 66, 68, - 70, 72, 74, 76, 79, 82, 84, 86, - 88, 90, 92, 94, 96, 98, 100, 102, - 105, 107, 109, 111, 113, 115, 117, 119, - 121, 123, 125, 127, 129, 131, 133, 135, - 137, 139, 141, 143, 146, 148, 149, 151, - 155, 157, 159, 160, 161 -}; - -static const char _ControlVerbs_trans_keys[] = { - 41, 65, 66, 67, 76, 78, 85, 41, - 41, 78, 41, 89, 41, 67, 41, 82, - 41, 76, 41, 70, 41, 41, 83, 41, - 82, 41, 95, 41, 65, 85, 41, 78, - 41, 89, 41, 67, 41, 78, 41, 73, - 41, 67, 41, 79, 41, 68, 41, 69, - 41, 82, 41, 76, 41, 70, 73, 41, - 77, 41, 73, 41, 84, 41, 95, 41, - 77, 82, 41, 65, 41, 84, 41, 67, - 41, 72, 41, 61, 41, 48, 57, 41, - 48, 57, 41, 69, 41, 67, 41, 85, - 41, 82, 41, 83, 41, 73, 41, 79, - 41, 78, 41, 79, 41, 95, 41, 65, - 83, 41, 85, 41, 84, 41, 79, 41, - 95, 41, 80, 41, 79, 41, 83, 41, - 83, 41, 69, 41, 83, 41, 83, 41, - 84, 41, 65, 41, 82, 41, 84, 41, - 95, 41, 79, 41, 80, 41, 84, 41, - 67, 84, 41, 80, 41, 41, 70, 41, - 49, 51, 56, 41, 54, 41, 50, 41, - 40, 42, 0 -}; - -static const char _ControlVerbs_single_lengths[] = { - 7, 1, 2, 2, 2, 2, 2, 2, - 1, 2, 2, 2, 3, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 3, 2, 2, 2, 2, 3, 2, 2, - 2, 2, 2, 1, 1, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 3, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 2, 1, 2, 4, - 2, 2, 1, 1, 1 -}; - -static const char _ControlVerbs_range_lengths[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 -}; - -static const short _ControlVerbs_index_offsets[] = { - 0, 8, 10, 13, 16, 19, 22, 25, - 28, 30, 33, 36, 39, 43, 46, 49, - 52, 55, 58, 61, 64, 67, 70, 73, - 76, 80, 83, 86, 89, 92, 96, 99, - 102, 105, 108, 111, 114, 117, 120, 123, - 126, 129, 132, 135, 138, 141, 144, 147, - 151, 154, 157, 160, 163, 166, 169, 172, - 175, 178, 181, 184, 187, 190, 193, 196, - 199, 202, 205, 208, 212, 215, 217, 220, - 225, 228, 231, 233, 235 -}; - -static const char _ControlVerbs_indicies[] = { - 0, 2, 3, 4, 5, 6, 7, 1, - 8, 1, 8, 9, 1, 8, 10, 1, - 11, 12, 1, 8, 13, 1, 8, 14, - 1, 8, 15, 1, 11, 1, 8, 16, - 1, 8, 17, 1, 8, 18, 1, 8, - 19, 20, 1, 8, 21, 1, 8, 22, - 1, 8, 12, 1, 8, 23, 1, 8, - 24, 1, 8, 25, 1, 8, 26, 1, - 8, 27, 1, 8, 15, 1, 8, 28, - 1, 11, 14, 1, 8, 15, 29, 1, - 8, 30, 1, 8, 31, 1, 8, 32, - 1, 8, 33, 1, 8, 34, 35, 1, - 8, 36, 1, 8, 37, 1, 8, 38, - 1, 8, 39, 1, 8, 40, 1, 8, - 41, 1, 11, 41, 1, 8, 42, 1, - 8, 43, 1, 8, 44, 1, 8, 45, - 1, 8, 46, 1, 8, 47, 1, 8, - 48, 1, 8, 39, 1, 8, 49, 1, - 8, 50, 1, 8, 51, 52, 1, 8, - 53, 1, 8, 54, 1, 8, 55, 1, - 8, 56, 1, 8, 57, 1, 8, 58, - 1, 8, 59, 1, 8, 60, 1, 8, - 61, 1, 8, 62, 1, 8, 15, 1, - 8, 63, 1, 8, 64, 1, 8, 65, - 1, 8, 66, 1, 8, 67, 1, 8, - 68, 1, 8, 69, 1, 8, 15, 1, - 8, 70, 71, 1, 8, 72, 1, 73, - 1, 8, 74, 1, 75, 76, 77, 78, - 1, 8, 15, 1, 8, 15, 1, 75, - 1, 80, 79, 82, 81, 0 -}; - -static const char _ControlVerbs_trans_targs[] = { - 75, 1, 2, 9, 22, 24, 45, 67, - 75, 3, 4, 75, 5, 6, 7, 8, - 10, 11, 12, 13, 16, 14, 15, 17, - 18, 19, 20, 21, 23, 25, 26, 27, - 28, 29, 30, 37, 31, 32, 33, 34, - 35, 36, 38, 39, 40, 41, 42, 43, - 44, 46, 47, 48, 59, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 60, - 61, 62, 63, 64, 65, 66, 68, 70, - 69, 75, 71, 75, 72, 73, 74, 75, - 76, 75, 0 -}; - -static const char _ControlVerbs_trans_actions[] = { - 19, 0, 0, 0, 0, 0, 0, 0, - 13, 0, 0, 11, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 7, 0, 0, 0, 15, - 5, 17, 0 -}; - -static const char _ControlVerbs_to_state_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0 -}; - -static const char _ControlVerbs_from_state_actions[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 0 -}; - -static const short _ControlVerbs_eof_trans[] = { - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 82 -}; - -static const int ControlVerbs_start = 75; -static const int ControlVerbs_first_final = 75; -static const int ControlVerbs_error = -1; - -static const int ControlVerbs_en_main = 75; - - -#line 249 "control_verbs.cpp" - { - cs = ControlVerbs_start; - ts = 0; - te = 0; - act = 0; - } - -#line 105 "control_verbs.rl" - - - try { - -#line 262 "control_verbs.cpp" - { - int _klen; - unsigned int _trans; - const char *_acts; - unsigned int _nacts; - const char *_keys; - - if ( p == pe ) - goto _test_eof; -_resume: - _acts = _ControlVerbs_actions + _ControlVerbs_from_state_actions[cs]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) { - switch ( *_acts++ ) { - case 1: -#line 1 "NONE" - {ts = p;} - break; -#line 281 "control_verbs.cpp" - } - } - - _keys = _ControlVerbs_trans_keys + _ControlVerbs_key_offsets[cs]; - _trans = _ControlVerbs_index_offsets[cs]; - - _klen = _ControlVerbs_single_lengths[cs]; - if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_mid; - const char *_upper = _keys + _klen - 1; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (*p) < *_mid ) - _upper = _mid - 1; - else if ( (*p) > *_mid ) - _lower = _mid + 1; - else { - _trans += (unsigned int)(_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _ControlVerbs_range_lengths[cs]; - if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_mid; - const char *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (*p) < _mid[0] ) - _upper = _mid - 2; - else if ( (*p) > _mid[1] ) - _lower = _mid + 2; - else { - _trans += (unsigned int)((_mid - _keys)>>1); - goto _match; - } - } - _trans += _klen; - } - -_match: - _trans = _ControlVerbs_indicies[_trans]; -_eof_trans: - cs = _ControlVerbs_trans_targs[_trans]; - - if ( _ControlVerbs_trans_actions[_trans] == 0 ) - goto _again; - - _acts = _ControlVerbs_actions + _ControlVerbs_trans_actions[_trans]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) - { - switch ( *_acts++ ) - { - case 2: -#line 1 "NONE" - {te = p+1;} - break; - case 3: -#line 76 "control_verbs.rl" - {te = p+1;{ - mode.utf8 = true; - }} - break; - case 4: -#line 80 "control_verbs.rl" - {te = p+1;{ - mode.ucp = true; - }} - break; - case 5: -#line 84 "control_verbs.rl" - {te = p+1;{ - ostringstream str; - str << "Unsupported control verb " << string(ts, te - ts); - throw LocatedParseError(str.str()); - }} - break; - case 6: -#line 90 "control_verbs.rl" - {te = p+1;{ - ostringstream str; - str << "Unknown control verb " << string(ts, te - ts); - throw LocatedParseError(str.str()); - }} - break; - case 7: -#line 97 "control_verbs.rl" - {te = p+1;{ - p--; - {p++; goto _out; } - }} - break; - case 8: -#line 97 "control_verbs.rl" - {te = p;p--;{ - p--; - {p++; goto _out; } - }} - break; - case 9: -#line 97 "control_verbs.rl" - {{p = ((te))-1;}{ - p--; - {p++; goto _out; } - }} - break; -#line 400 "control_verbs.cpp" - } - } - -_again: - _acts = _ControlVerbs_actions + _ControlVerbs_to_state_actions[cs]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) { - switch ( *_acts++ ) { - case 0: -#line 1 "NONE" - {ts = 0;} - break; -#line 413 "control_verbs.cpp" - } - } - - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) - { - if ( _ControlVerbs_eof_trans[cs] > 0 ) { - _trans = _ControlVerbs_eof_trans[cs] - 1; - goto _eof_trans; - } - } - - _out: {} - } - -#line 109 "control_verbs.rl" - } catch (LocatedParseError &error) { - if (ts >= ptr && ts <= pe) { - error.locate(ts - ptr + start); - } else { - error.locate(0); - } - throw; - } - - return p; -} - -} // namespace ue2 diff --git a/contrib/zlib-ng-cmake/CMakeLists.txt b/contrib/zlib-ng-cmake/CMakeLists.txt index 371a07dd31a..aa067ba37e0 100644 --- a/contrib/zlib-ng-cmake/CMakeLists.txt +++ b/contrib/zlib-ng-cmake/CMakeLists.txt @@ -2,8 +2,10 @@ set (SOURCE_DIR ${CMAKE_SOURCE_DIR}/contrib/zlib-ng) add_definitions(-DZLIB_COMPAT) add_definitions(-DWITH_GZFILEOP) -add_definitions(-DUNALIGNED_OK) -add_definitions(-DUNALIGNED64_OK) +if(NOT ARCH_S390X) + add_definitions(-DUNALIGNED_OK) + add_definitions(-DUNALIGNED64_OK) +endif() set (HAVE_UNISTD_H 1) add_definitions(-D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64) diff --git a/docker/packager/binary/Dockerfile b/docker/packager/binary/Dockerfile index b9b0c5c2c6c..db55c950241 100644 --- a/docker/packager/binary/Dockerfile +++ b/docker/packager/binary/Dockerfile @@ -46,7 +46,7 @@ RUN apt-get install binutils-riscv64-linux-gnu # Architecture of the image when BuildKit/buildx is used ARG TARGETARCH -ARG NFPM_VERSION=2.16.0 +ARG NFPM_VERSION=2.18.1 RUN arch=${TARGETARCH:-amd64} \ && curl -Lo /tmp/nfpm.deb "https://github.com/goreleaser/nfpm/releases/download/v${NFPM_VERSION}/nfpm_${arch}.deb" \ @@ -67,24 +67,5 @@ ENV GOCACHE=/workdir/ RUN mkdir /workdir && chmod 777 /workdir WORKDIR /workdir -# NOTE: thread sanitizer is broken in clang-14, we have to build it with clang-15 -# https://github.com/ClickHouse/ClickHouse/pull/39450 -# https://github.com/google/sanitizers/issues/1540 -# https://github.com/google/sanitizers/issues/1552 - -RUN export CODENAME="$(lsb_release --codename --short | tr 'A-Z' 'a-z')" \ - && echo "deb [trusted=yes] https://apt.llvm.org/${CODENAME}/ llvm-toolchain-${CODENAME}-15 main" >> \ - /etc/apt/sources.list.d/clang.list \ - && apt-get update \ - && apt-get install \ - clang-15 \ - llvm-15 \ - clang-tidy-15 \ - --yes --no-install-recommends \ - && apt-get clean - -# for external_symbolizer_path -RUN ln -s /usr/bin/llvm-symbolizer-15 /usr/bin/llvm-symbolizer - COPY build.sh / CMD ["bash", "-c", "/build.sh 2>&1"] diff --git a/docker/packager/packager b/docker/packager/packager index 66eb568d460..b4aa4ebdd91 100755 --- a/docker/packager/packager +++ b/docker/packager/packager @@ -128,8 +128,10 @@ def parse_env_variables( DARWIN_SUFFIX = "-darwin" DARWIN_ARM_SUFFIX = "-darwin-aarch64" ARM_SUFFIX = "-aarch64" + ARM_V80COMPAT_SUFFIX = "-aarch64-v80compat" FREEBSD_SUFFIX = "-freebsd" PPC_SUFFIX = "-ppc64le" + AMD64_SSE2_SUFFIX = "-amd64sse2" result = [] result.append("OUTPUT_DIR=/output") @@ -139,8 +141,10 @@ def parse_env_variables( is_cross_darwin = compiler.endswith(DARWIN_SUFFIX) is_cross_darwin_arm = compiler.endswith(DARWIN_ARM_SUFFIX) is_cross_arm = compiler.endswith(ARM_SUFFIX) + is_cross_arm_v80compat = compiler.endswith(ARM_V80COMPAT_SUFFIX) is_cross_ppc = compiler.endswith(PPC_SUFFIX) is_cross_freebsd = compiler.endswith(FREEBSD_SUFFIX) + is_amd64_sse2 = compiler.endswith(AMD64_SSE2_SUFFIX) if is_cross_darwin: cc = compiler[: -len(DARWIN_SUFFIX)] @@ -176,6 +180,13 @@ def parse_env_variables( "-DCMAKE_TOOLCHAIN_FILE=/build/cmake/linux/toolchain-aarch64.cmake" ) result.append("DEB_ARCH=arm64") + elif is_cross_arm_v80compat: + cc = compiler[: -len(ARM_V80COMPAT_SUFFIX)] + cmake_flags.append( + "-DCMAKE_TOOLCHAIN_FILE=/build/cmake/linux/toolchain-aarch64.cmake" + ) + cmake_flags.append("-DNO_ARMV81_OR_HIGHER=1") + result.append("DEB_ARCH=arm64") elif is_cross_freebsd: cc = compiler[: -len(FREEBSD_SUFFIX)] cmake_flags.append( @@ -186,6 +197,10 @@ def parse_env_variables( cmake_flags.append( "-DCMAKE_TOOLCHAIN_FILE=/build/cmake/linux/toolchain-ppc64le.cmake" ) + elif is_amd64_sse2: + cc = compiler[: -len(AMD64_SSE2_SUFFIX)] + result.append("DEB_ARCH=amd64") + cmake_flags.append("-DNO_SSE3_OR_HIGHER=1") else: cc = compiler result.append("DEB_ARCH=amd64") @@ -333,16 +348,17 @@ if __name__ == "__main__": parser.add_argument( "--compiler", choices=( - "clang-15", # For TSAN builds, see #39450 - "clang-14", - "clang-14-darwin", - "clang-14-darwin-aarch64", - "clang-14-aarch64", - "clang-14-ppc64le", - "clang-14-freebsd", + "clang-15", + "clang-15-darwin", + "clang-15-darwin-aarch64", + "clang-15-aarch64", + "clang-15-aarch64-v80compat", + "clang-15-ppc64le", + "clang-15-amd64sse2", + "clang-15-freebsd", "gcc-11", ), - default="clang-14", + default="clang-15", help="a compiler to use", ) parser.add_argument( diff --git a/docker/server/Dockerfile.alpine b/docker/server/Dockerfile.alpine index b01dba1e22f..d40e6dd5379 100644 --- a/docker/server/Dockerfile.alpine +++ b/docker/server/Dockerfile.alpine @@ -33,7 +33,7 @@ RUN arch=${TARGETARCH:-amd64} \ # lts / testing / prestable / etc ARG REPO_CHANNEL="stable" ARG REPOSITORY="https://packages.clickhouse.com/tgz/${REPO_CHANNEL}" -ARG VERSION="20.9.3.45" +ARG VERSION="22.9.2.7" ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static" # user/group precreated explicitly with fixed uid/gid on purpose. diff --git a/docker/server/Dockerfile.ubuntu b/docker/server/Dockerfile.ubuntu index f4102a6ccaf..1d70c46d9ba 100644 --- a/docker/server/Dockerfile.ubuntu +++ b/docker/server/Dockerfile.ubuntu @@ -21,7 +21,7 @@ RUN sed -i "s|http://archive.ubuntu.com|${apt_archive}|g" /etc/apt/sources.list ARG REPO_CHANNEL="stable" ARG REPOSITORY="deb https://packages.clickhouse.com/deb ${REPO_CHANNEL} main" -ARG VERSION=22.6.1.* +ARG VERSION="22.9.2.7" ARG PACKAGES="clickhouse-client clickhouse-server clickhouse-common-static" # set non-empty deb_location_url url to create a docker image diff --git a/docker/server/entrypoint.sh b/docker/server/entrypoint.sh index 16372230d91..52f4f67281e 100755 --- a/docker/server/entrypoint.sh +++ b/docker/server/entrypoint.sh @@ -38,6 +38,7 @@ FORMAT_SCHEMA_PATH="$(clickhouse extract-from-config --config-file "$CLICKHOUSE_ # There could be many disks declared in config readarray -t DISKS_PATHS < <(clickhouse extract-from-config --config-file "$CLICKHOUSE_CONFIG" --key='storage_configuration.disks.*.path' || true) +readarray -t DISKS_METADATA_PATHS < <(clickhouse extract-from-config --config-file "$CLICKHOUSE_CONFIG" --key='storage_configuration.disks.*.metadata_path' || true) CLICKHOUSE_USER="${CLICKHOUSE_USER:-default}" CLICKHOUSE_PASSWORD="${CLICKHOUSE_PASSWORD:-}" @@ -50,7 +51,8 @@ for dir in "$DATA_DIR" \ "$TMP_DIR" \ "$USER_PATH" \ "$FORMAT_SCHEMA_PATH" \ - "${DISKS_PATHS[@]}" + "${DISKS_PATHS[@]}" \ + "${DISKS_METADATA_PATHS[@]}" do # check if variable not empty [ -z "$dir" ] && continue @@ -104,9 +106,9 @@ fi if [ -n "$(ls /docker-entrypoint-initdb.d/)" ] || [ -n "$CLICKHOUSE_DB" ]; then # port is needed to check if clickhouse-server is ready for connections - HTTP_PORT="$(clickhouse extract-from-config --config-file "$CLICKHOUSE_CONFIG" --key=http_port)" - HTTPS_PORT="$(clickhouse extract-from-config --config-file "$CLICKHOUSE_CONFIG" --key=https_port)" - + HTTP_PORT="$(clickhouse extract-from-config --config-file "$CLICKHOUSE_CONFIG" --key=http_port --try)" + HTTPS_PORT="$(clickhouse extract-from-config --config-file "$CLICKHOUSE_CONFIG" --key=https_port --try)" + if [ -n "$HTTP_PORT" ]; then URL="http://127.0.0.1:$HTTP_PORT/ping" else diff --git a/docker/test/base/Dockerfile b/docker/test/base/Dockerfile index 43cfca1fdfc..4e42fce1a1d 100644 --- a/docker/test/base/Dockerfile +++ b/docker/test/base/Dockerfile @@ -16,11 +16,10 @@ RUN apt-get update \ # and MEMORY_LIMIT_EXCEEDED exceptions in Functional tests (total memory limit in Functional tests is ~55.24 GiB). # TSAN will flush shadow memory when reaching this limit. # It may cause false-negatives, but it's better than OOM. -RUN echo "TSAN_OPTIONS='verbosity=1000 halt_on_error=1 history_size=7 memory_limit_mb=46080'" >> /etc/environment; \ - echo "UBSAN_OPTIONS='print_stacktrace=1'" >> /etc/environment; \ - echo "MSAN_OPTIONS='abort_on_error=1 poison_in_dtor=1'" >> /etc/environment; \ - echo "LSAN_OPTIONS='suppressions=/usr/share/clickhouse-test/config/lsan_suppressions.txt'" >> /etc/environment; \ - ln -s /usr/lib/llvm-${LLVM_VERSION}/bin/llvm-symbolizer /usr/bin/llvm-symbolizer; +RUN echo "TSAN_OPTIONS='verbosity=1000 halt_on_error=1 history_size=7 memory_limit_mb=46080'" >> /etc/environment +RUN echo "UBSAN_OPTIONS='print_stacktrace=1'" >> /etc/environment +RUN echo "MSAN_OPTIONS='abort_on_error=1 poison_in_dtor=1'" >> /etc/environment +RUN echo "LSAN_OPTIONS='suppressions=/usr/share/clickhouse-test/config/lsan_suppressions.txt'" >> /etc/environment # Sanitizer options for current shell (not current, but the one that will be spawned on "docker run") # (but w/o verbosity for TSAN, otherwise test.reference will not match) ENV TSAN_OPTIONS='halt_on_error=1 history_size=7 memory_limit_mb=46080' diff --git a/docker/test/codebrowser/Dockerfile b/docker/test/codebrowser/Dockerfile index c7aed618f6a..ceed93c3ac7 100644 --- a/docker/test/codebrowser/Dockerfile +++ b/docker/test/codebrowser/Dockerfile @@ -8,16 +8,41 @@ FROM clickhouse/binary-builder:$FROM_TAG ARG apt_archive="http://archive.ubuntu.com" RUN sed -i "s|http://archive.ubuntu.com|$apt_archive|g" /etc/apt/sources.list -RUN apt-get update && apt-get --yes --allow-unauthenticated install clang-14 libllvm14 libclang-14-dev libmlir-14-dev +RUN apt-get update && apt-get --yes --allow-unauthenticated install libclang-${LLVM_VERSION}-dev libmlir-${LLVM_VERSION}-dev + +# libclang-15-dev does not contain proper symlink: +# +# This is what cmake will search for: +# +# # readlink -f /usr/lib/llvm-15/lib/libclang-15.so.1 +# /usr/lib/x86_64-linux-gnu/libclang-15.so.1 +# +# This is what exists: +# +# # ls -l /usr/lib/x86_64-linux-gnu/libclang-15* +# lrwxrwxrwx 1 root root 16 Sep 5 13:31 /usr/lib/x86_64-linux-gnu/libclang-15.so -> libclang-15.so.1 +# lrwxrwxrwx 1 root root 21 Sep 5 13:31 /usr/lib/x86_64-linux-gnu/libclang-15.so.15 -> libclang-15.so.15.0.0 +# -rw-r--r-- 1 root root 31835760 Sep 5 13:31 /usr/lib/x86_64-linux-gnu/libclang-15.so.15.0.0 +# +ARG TARGETARCH +RUN arch=${TARGETARCH:-amd64} \ + && case $arch in \ + amd64) rarch=x86_64 ;; \ + arm64) rarch=aarch64 ;; \ + *) exit 1 ;; \ + esac \ + && ln -rsf /usr/lib/$rarch-linux-gnu/libclang-15.so.15 /usr/lib/$rarch-linux-gnu/libclang-15.so.1 # repo versions doesn't work correctly with C++17 # also we push reports to s3, so we add index.html to subfolder urls # https://github.com/ClickHouse-Extras/woboq_codebrowser/commit/37e15eaf377b920acb0b48dbe82471be9203f76b # TODO: remove branch in a few weeks after merge, e.g. in May or June 2022 -RUN git clone https://github.com/ClickHouse-Extras/woboq_codebrowser --branch llvm-14 \ +# +# FIXME: update location of a repo +RUN git clone https://github.com/azat/woboq_codebrowser --branch llvm-15 \ && cd woboq_codebrowser \ - && cmake . -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang\+\+-14 -DCMAKE_C_COMPILER=clang-14 \ - && make -j \ + && cmake . -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang\+\+-${LLVM_VERSION} -DCMAKE_C_COMPILER=clang-${LLVM_VERSION} \ + && ninja \ && cd .. \ && rm -rf woboq_codebrowser @@ -32,7 +57,7 @@ ENV SHA=nosha ENV DATA="https://s3.amazonaws.com/clickhouse-test-reports/codebrowser/data" CMD mkdir -p $BUILD_DIRECTORY && cd $BUILD_DIRECTORY && \ - cmake $SOURCE_DIRECTORY -DCMAKE_CXX_COMPILER=/usr/bin/clang\+\+-14 -DCMAKE_C_COMPILER=/usr/bin/clang-14 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DENABLE_EMBEDDED_COMPILER=0 -DENABLE_S3=0 && \ + cmake $SOURCE_DIRECTORY -DCMAKE_CXX_COMPILER=/usr/bin/clang\+\+-${LLVM_VERSION} -DCMAKE_C_COMPILER=/usr/bin/clang-${LLVM_VERSION} -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DENABLE_EMBEDDED_COMPILER=0 -DENABLE_S3=0 && \ mkdir -p $HTML_RESULT_DIRECTORY && \ $CODEGEN -b $BUILD_DIRECTORY -a -o $HTML_RESULT_DIRECTORY -p ClickHouse:$SOURCE_DIRECTORY:$SHA -d $DATA | ts '%Y-%m-%d %H:%M:%S' && \ cp -r $STATIC_DATA $HTML_RESULT_DIRECTORY/ &&\ diff --git a/docker/test/fuzzer/run-fuzzer.sh b/docker/test/fuzzer/run-fuzzer.sh index 11ddb0bd2d3..bab87865b42 100755 --- a/docker/test/fuzzer/run-fuzzer.sh +++ b/docker/test/fuzzer/run-fuzzer.sh @@ -1,8 +1,15 @@ #!/bin/bash # shellcheck disable=SC2086,SC2001,SC2046,SC2030,SC2031 -set -eux +set -x + +# core.COMM.PID-TID +sysctl kernel.core_pattern='core.%e.%p-%P' + +set -e +set -u set -o pipefail + trap "exit" INT TERM # The watchdog is in the separate process group, so we have to kill it separately # if the script terminates earlier. @@ -12,7 +19,7 @@ stage=${stage:-} script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" echo "$script_dir" repo_dir=ch -BINARY_TO_DOWNLOAD=${BINARY_TO_DOWNLOAD:="clang-14_debug_none_unsplitted_disable_False_binary"} +BINARY_TO_DOWNLOAD=${BINARY_TO_DOWNLOAD:="clang-15_debug_none_unsplitted_disable_False_binary"} BINARY_URL_TO_DOWNLOAD=${BINARY_URL_TO_DOWNLOAD:="https://clickhouse-builds.s3.amazonaws.com/$PR_TO_TEST/$SHA_TO_TEST/clickhouse_build_check/$BINARY_TO_DOWNLOAD/clickhouse"} function clone @@ -87,6 +94,19 @@ function configure # TODO figure out which ones are needed cp -av --dereference "$repo_dir"/tests/config/config.d/listen.xml db/config.d cp -av --dereference "$script_dir"/query-fuzzer-tweaks-users.xml db/users.d + + cat > db/config.d/core.xml < + + + 107374182400 + + + $PWD + +EOL } function watchdog @@ -180,7 +200,6 @@ handle SIGUSR2 nostop noprint pass handle SIG$RTMIN nostop noprint pass info signals continue -gcore backtrace full thread apply all backtrace full info registers diff --git a/docker/test/integration/runner/compose/docker_compose_keeper.yml b/docker/test/integration/runner/compose/docker_compose_keeper.yml index 811bbdd800d..8524823ed87 100644 --- a/docker/test/integration/runner/compose/docker_compose_keeper.yml +++ b/docker/test/integration/runner/compose/docker_compose_keeper.yml @@ -8,6 +8,9 @@ services: - type: bind source: ${keeper_binary:-} target: /usr/bin/clickhouse + - type: bind + source: ${keeper_binary:-} + target: /usr/bin/clickhouse-keeper - type: bind source: ${keeper_config_dir1:-} target: /etc/clickhouse-keeper @@ -38,6 +41,9 @@ services: - type: bind source: ${keeper_binary:-} target: /usr/bin/clickhouse + - type: bind + source: ${keeper_binary:-} + target: /usr/bin/clickhouse-keeper - type: bind source: ${keeper_config_dir2:-} target: /etc/clickhouse-keeper @@ -68,6 +74,9 @@ services: - type: bind source: ${keeper_binary:-} target: /usr/bin/clickhouse + - type: bind + source: ${keeper_binary:-} + target: /usr/bin/clickhouse-keeper - type: bind source: ${keeper_config_dir3:-} target: /etc/clickhouse-keeper diff --git a/docker/test/integration/runner/dockerd-entrypoint.sh b/docker/test/integration/runner/dockerd-entrypoint.sh index bcaa064fe4f..5ae880ddf36 100755 --- a/docker/test/integration/runner/dockerd-entrypoint.sh +++ b/docker/test/integration/runner/dockerd-entrypoint.sh @@ -28,10 +28,9 @@ done set -e # cleanup for retry run if volume is not recreated -# shellcheck disable=SC2046 { - docker ps -aq | xargs -r docker kill || true - docker ps -aq | xargs -r docker rm || true + docker ps --all --quiet | xargs --no-run-if-empty docker kill || true + docker ps --all --quiet | xargs --no-run-if-empty docker rm || true } echo "Start tests" diff --git a/docker/test/keeper-jepsen/run.sh b/docker/test/keeper-jepsen/run.sh index c43e6b2c54d..adf99c029a9 100644 --- a/docker/test/keeper-jepsen/run.sh +++ b/docker/test/keeper-jepsen/run.sh @@ -2,7 +2,7 @@ set -euo pipefail -CLICKHOUSE_PACKAGE=${CLICKHOUSE_PACKAGE:="https://clickhouse-builds.s3.amazonaws.com/$PR_TO_TEST/$SHA_TO_TEST/clickhouse_build_check/clang-14_relwithdebuginfo_none_unsplitted_disable_False_binary/clickhouse"} +CLICKHOUSE_PACKAGE=${CLICKHOUSE_PACKAGE:="https://clickhouse-builds.s3.amazonaws.com/$PR_TO_TEST/$SHA_TO_TEST/clickhouse_build_check/clang-15_relwithdebuginfo_none_unsplitted_disable_False_binary/clickhouse"} CLICKHOUSE_REPO_PATH=${CLICKHOUSE_REPO_PATH:=""} diff --git a/docker/test/performance-comparison/compare.sh b/docker/test/performance-comparison/compare.sh index d3d7084f37f..b0b5ebdb2e2 100755 --- a/docker/test/performance-comparison/compare.sh +++ b/docker/test/performance-comparison/compare.sh @@ -61,7 +61,7 @@ function configure cp -rv right/config left ||: # Start a temporary server to rename the tables - while pkill clickhouse-serv; do echo . ; sleep 1 ; done + while pkill -f clickhouse-serv ; do echo . ; sleep 1 ; done echo all killed set -m # Spawn temporary in its own process groups @@ -88,7 +88,7 @@ function configure clickhouse-client --port $LEFT_SERVER_PORT --query "create database test" ||: clickhouse-client --port $LEFT_SERVER_PORT --query "rename table datasets.hits_v1 to test.hits" ||: - while pkill clickhouse-serv; do echo . ; sleep 1 ; done + while pkill -f clickhouse-serv ; do echo . ; sleep 1 ; done echo all killed # Make copies of the original db for both servers. Use hardlinks instead @@ -106,7 +106,7 @@ function configure function restart { - while pkill clickhouse-serv; do echo . ; sleep 1 ; done + while pkill -f clickhouse-serv ; do echo . ; sleep 1 ; done echo all killed # Change the jemalloc settings here. @@ -1400,7 +1400,7 @@ case "$stage" in while env kill -- -$watchdog_pid ; do sleep 1; done # Stop the servers to free memory for the subsequent query analysis. - while pkill clickhouse-serv; do echo . ; sleep 1 ; done + while pkill -f clickhouse-serv ; do echo . ; sleep 1 ; done echo Servers stopped. ;& "analyze_queries") diff --git a/docker/test/stateless/run.sh b/docker/test/stateless/run.sh index 72b0eb5bda1..8151ec9d5e4 100755 --- a/docker/test/stateless/run.sh +++ b/docker/test/stateless/run.sh @@ -179,17 +179,17 @@ pigz < /var/log/clickhouse-server/clickhouse-server.log > /test_output/clickhous # for files >64MB, we want this files to be compressed explicitly for table in query_log zookeeper_log trace_log transactions_info_log do - clickhouse-local --path /var/lib/clickhouse/ -q "select * from system.$table format TSVWithNamesAndTypes" | pigz > /test_output/$table.tsv.gz ||: + clickhouse-local --path /var/lib/clickhouse/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | pigz > /test_output/$table.tsv.gz ||: if [[ -n "$USE_DATABASE_REPLICATED" ]] && [[ "$USE_DATABASE_REPLICATED" -eq 1 ]]; then - clickhouse-local --path /var/lib/clickhouse1/ -q "select * from system.$table format TSVWithNamesAndTypes" | pigz > /test_output/$table.1.tsv.gz ||: - clickhouse-local --path /var/lib/clickhouse2/ -q "select * from system.$table format TSVWithNamesAndTypes" | pigz > /test_output/$table.2.tsv.gz ||: + clickhouse-local --path /var/lib/clickhouse1/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | pigz > /test_output/$table.1.tsv.gz ||: + clickhouse-local --path /var/lib/clickhouse2/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | pigz > /test_output/$table.2.tsv.gz ||: fi done # Also export trace log in flamegraph-friendly format. for trace_type in CPU Memory Real do - clickhouse-local --path /var/lib/clickhouse/ -q " + clickhouse-local --path /var/lib/clickhouse/ --only-system-tables -q " select arrayStringConcat((arrayMap(x -> concat(splitByChar('/', addressToLine(x))[-1], '#', demangle(addressToSymbol(x)) ), trace)), ';') AS stack, count(*) AS samples diff --git a/docker/test/stateless/setup_minio.sh b/docker/test/stateless/setup_minio.sh index e4625bfba75..a1de7f2d6ed 100755 --- a/docker/test/stateless/setup_minio.sh +++ b/docker/test/stateless/setup_minio.sh @@ -22,8 +22,8 @@ ls -lha mkdir -p ./minio_data if [ ! -f ./minio ]; then - MINIO_SERVER_VERSION=${MINIO_SERVER_VERSION:-2022-01-03T18-22-58Z} - MINIO_CLIENT_VERSION=${MINIO_CLIENT_VERSION:-2022-01-05T23-52-51Z} + MINIO_SERVER_VERSION=${MINIO_SERVER_VERSION:-2022-09-07T22-25-02Z} + MINIO_CLIENT_VERSION=${MINIO_CLIENT_VERSION:-2022-08-28T20-08-11Z} case $(uname -m) in x86_64) BIN_ARCH=amd64 ;; aarch64) BIN_ARCH=arm64 ;; diff --git a/docker/test/stress/run.sh b/docker/test/stress/run.sh index 43dbe08d765..bf76fb20928 100755 --- a/docker/test/stress/run.sh +++ b/docker/test/stress/run.sh @@ -8,6 +8,9 @@ dmesg --clear set -x +# core.COMM.PID-TID +sysctl kernel.core_pattern='core.%e.%p-%P' + # Thread Fuzzer allows to check more permutations of possible thread scheduling # and find more potential issues. @@ -104,6 +107,19 @@ EOL +EOL + + cat > /etc/clickhouse-server/config.d/core.xml < + + + 107374182400 + + + $PWD + EOL } @@ -160,7 +176,6 @@ handle SIGUSR2 nostop noprint pass handle SIG$RTMIN nostop noprint pass info signals continue -gcore backtrace full thread apply all backtrace full info registers @@ -228,7 +243,7 @@ export USE_S3_STORAGE_FOR_MERGE_TREE=1 configure # But we still need default disk because some tables loaded only into it -sudo cat /etc/clickhouse-server/config.d/s3_storage_policy_by_default.xml | sed "s|s3|s3default|" > /etc/clickhouse-server/config.d/s3_storage_policy_by_default.xml.tmp +sudo cat /etc/clickhouse-server/config.d/s3_storage_policy_by_default.xml | sed "s|
s3
|
s3
default|" > /etc/clickhouse-server/config.d/s3_storage_policy_by_default.xml.tmp mv /etc/clickhouse-server/config.d/s3_storage_policy_by_default.xml.tmp /etc/clickhouse-server/config.d/s3_storage_policy_by_default.xml sudo chown clickhouse /etc/clickhouse-server/config.d/s3_storage_policy_by_default.xml sudo chgrp clickhouse /etc/clickhouse-server/config.d/s3_storage_policy_by_default.xml @@ -323,6 +338,12 @@ echo $previous_release_tag | download_release_packets && echo -e 'Download scrip || echo -e 'Download script failed\tFAIL' >> /test_output/test_results.tsv mv /var/log/clickhouse-server/clickhouse-server.log /var/log/clickhouse-server/clickhouse-server.clean.log +for table in query_log trace_log +do + clickhouse-local --path /var/lib/clickhouse/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | pigz > /test_output/$table.tsv.gz ||: +done + +tar -chf /test_output/coordination.tar /var/lib/clickhouse/coordination ||: # Check if we cloned previous release repository successfully if ! [ "$(ls -A previous_release_repository/tests/queries)" ] @@ -355,6 +376,7 @@ else # Avoid "Setting s3_check_objects_after_upload is neither a builtin setting..." rm -f /etc/clickhouse-server/users.d/enable_blobs_check.xml ||: + rm -f /etc/clickhouse-server/users.d/marks.xml ||: # Remove s3 related configs to avoid "there is no disk type `cache`" rm -f /etc/clickhouse-server/config.d/storage_conf.xml ||: @@ -438,6 +460,7 @@ else -e "This engine is deprecated and is not supported in transactions" \ -e "[Queue = DB::MergeMutateRuntimeQueue]: Code: 235. DB::Exception: Part" \ -e "The set of parts restored in place of" \ + -e "(ReplicatedMergeTreeAttachThread): Initialization failed. Error" \ /var/log/clickhouse-server/clickhouse-server.backward.clean.log | zgrep -Fa "" > /test_output/bc_check_error_messages.txt \ && echo -e 'Backward compatibility check: Error message in clickhouse-server.log (see bc_check_error_messages.txt)\tFAIL' >> /test_output/test_results.tsv \ || echo -e 'Backward compatibility check: No Error messages in clickhouse-server.log\tOK' >> /test_output/test_results.tsv @@ -480,6 +503,12 @@ else # Remove file bc_check_fatal_messages.txt if it's empty [ -s /test_output/bc_check_fatal_messages.txt ] || rm /test_output/bc_check_fatal_messages.txt + + tar -chf /test_output/coordination.backward.tar /var/lib/clickhouse/coordination ||: + for table in query_log trace_log + do + clickhouse-local --path /var/lib/clickhouse/ --only-system-tables -q "select * from system.$table format TSVWithNamesAndTypes" | pigz > /test_output/$table.backward.tsv.gz ||: + done fi dmesg -T > /test_output/dmesg.log @@ -489,23 +518,13 @@ grep -q -F -e 'Out of memory: Killed process' -e 'oom_reaper: reaped process' -e && echo -e 'OOM in dmesg\tFAIL' >> /test_output/test_results.tsv \ || echo -e 'No OOM in dmesg\tOK' >> /test_output/test_results.tsv -tar -chf /test_output/coordination.tar /var/lib/clickhouse/coordination ||: mv /var/log/clickhouse-server/stderr.log /test_output/ -# Replace the engine with Ordinary to avoid extra symlinks stuff in artifacts. -# (so that clickhouse-local --path can read it w/o extra care). -sed -i -e "s/ATTACH DATABASE _ UUID '[^']*'/ATTACH DATABASE system/" -e "s/Atomic/Ordinary/" /var/lib/clickhouse/metadata/system.sql -for table in query_log trace_log; do - sed -i "s/ATTACH TABLE _ UUID '[^']*'/ATTACH TABLE $table/" /var/lib/clickhouse/metadata/system/${table}.sql - tar -chf /test_output/${table}_dump.tar /var/lib/clickhouse/metadata/system.sql /var/lib/clickhouse/metadata/system/${table}.sql /var/lib/clickhouse/data/system/${table} ||: -done - # Write check result into check_status.tsv clickhouse-local --structure "test String, res String" -q "SELECT 'failure', test FROM table WHERE res != 'OK' order by (lower(test) like '%hung%'), rowNumberInAllBlocks() LIMIT 1" < /test_output/test_results.tsv > /test_output/check_status.tsv [ -s /test_output/check_status.tsv ] || echo -e "success\tNo errors found" > /test_output/check_status.tsv -# Core dumps (see gcore) -# Default filename is 'core.PROCESS_ID' +# Core dumps for core in core.*; do pigz $core mv $core.gz /test_output/ diff --git a/docker/test/util/Dockerfile b/docker/test/util/Dockerfile index b891b71492c..57880bfc1d6 100644 --- a/docker/test/util/Dockerfile +++ b/docker/test/util/Dockerfile @@ -5,7 +5,7 @@ FROM ubuntu:20.04 ARG apt_archive="http://archive.ubuntu.com" RUN sed -i "s|http://archive.ubuntu.com|$apt_archive|g" /etc/apt/sources.list -ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=14 +ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=15 RUN apt-get update \ && apt-get install \ @@ -56,6 +56,8 @@ RUN apt-get update \ # This symlink required by gcc to find lld compiler RUN ln -s /usr/bin/lld-${LLVM_VERSION} /usr/bin/ld.lld +# for external_symbolizer_path +RUN ln -s /usr/bin/llvm-symbolizer-${LLVM_VERSION} /usr/bin/llvm-symbolizer ARG CCACHE_VERSION=4.6.1 RUN mkdir /tmp/ccache \ diff --git a/docs/_includes/install/universal.sh b/docs/_includes/install/universal.sh index c2970924fb0..0fb5373a3ae 100755 --- a/docs/_includes/install/universal.sh +++ b/docs/_includes/install/universal.sh @@ -12,7 +12,16 @@ then DIR="amd64" elif [ "${ARCH}" = "aarch64" -o "${ARCH}" = "arm64" ] then - DIR="aarch64" + # If the system has >=ARMv8.2 (https://en.wikipedia.org/wiki/AArch64), choose the corresponding build, else fall back to a v8.0 + # compat build. Unfortunately, the ARM ISA level cannot be read directly, we need to guess from the "features" in /proc/cpuinfo. + # Also, the flags in /proc/cpuinfo are named differently than the flags passed to the compiler (cmake/cpu_features.cmake). + ARMV82=$(grep -m 1 'Features' /proc/cpuinfo | awk '/asimd/ && /sha1/ && /aes/ && /atomics/') + if [ "${ARMV82}" ] + then + DIR="aarch64" + else + DIR="aarch64v80compat" + fi elif [ "${ARCH}" = "powerpc64le" -o "${ARCH}" = "ppc64le" ] then DIR="powerpc64le" @@ -22,12 +31,6 @@ then if [ "${ARCH}" = "x86_64" -o "${ARCH}" = "amd64" ] then DIR="freebsd" - elif [ "${ARCH}" = "aarch64" -o "${ARCH}" = "arm64" ] - then - DIR="freebsd-aarch64" - elif [ "${ARCH}" = "powerpc64le" -o "${ARCH}" = "ppc64le" ] - then - DIR="freebsd-powerpc64le" fi elif [ "${OS}" = "Darwin" ] then @@ -42,7 +45,7 @@ fi if [ -z "${DIR}" ] then - echo "The '${OS}' operating system with the '${ARCH}' architecture is not supported." + echo "Operating system '${OS}' / architecture '${ARCH}' is unsupported." exit 1 fi diff --git a/docs/changelogs/v22.6.8.35-stable.md b/docs/changelogs/v22.6.8.35-stable.md new file mode 100644 index 00000000000..ffc5e03e489 --- /dev/null +++ b/docs/changelogs/v22.6.8.35-stable.md @@ -0,0 +1,34 @@ +--- +sidebar_position: 1 +sidebar_label: 2022 +--- + +# 2022 Changelog + +### ClickHouse release v22.6.8.35-stable (b91dc59a565) FIXME as compared to v22.6.7.7-stable (8eae2af3b9a) + +#### New Feature +* Backported in [#40868](https://github.com/ClickHouse/ClickHouse/issues/40868): Add setting to disable limit on kafka_num_consumers. Closes [#40331](https://github.com/ClickHouse/ClickHouse/issues/40331). [#40670](https://github.com/ClickHouse/ClickHouse/pull/40670) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Bug Fix +* Backported in [#41274](https://github.com/ClickHouse/ClickHouse/issues/41274): Fix memory safety issues with functions `encrypt` and `contingency` if Array of Nullable is used as an argument. This fixes [#41004](https://github.com/ClickHouse/ClickHouse/issues/41004). [#40195](https://github.com/ClickHouse/ClickHouse/pull/40195) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Backported in [#41282](https://github.com/ClickHouse/ClickHouse/issues/41282): Fix unused unknown columns introduced by WITH statement. This fixes [#37812](https://github.com/ClickHouse/ClickHouse/issues/37812) . [#39131](https://github.com/ClickHouse/ClickHouse/pull/39131) ([Amos Bird](https://github.com/amosbird)). +* Backported in [#40905](https://github.com/ClickHouse/ClickHouse/issues/40905): Fix potential deadlock in WriteBufferFromS3 during task scheduling failure. [#40070](https://github.com/ClickHouse/ClickHouse/pull/40070) ([Maksim Kita](https://github.com/kitaisreal)). +* Backported in [#40864](https://github.com/ClickHouse/ClickHouse/issues/40864): - Fix crash while parsing values of type `Object` that contains arrays of variadic dimension. [#40483](https://github.com/ClickHouse/ClickHouse/pull/40483) ([Duc Canh Le](https://github.com/canhld94)). +* Backported in [#40803](https://github.com/ClickHouse/ClickHouse/issues/40803): During insertion of a new query to the `ProcessList` allocations happen. If we reach the memory limit during these allocations we can not use `OvercommitTracker`, because `ProcessList::mutex` is already acquired. Fixes [#40611](https://github.com/ClickHouse/ClickHouse/issues/40611). [#40677](https://github.com/ClickHouse/ClickHouse/pull/40677) ([Dmitry Novik](https://github.com/novikd)). +* Backported in [#40891](https://github.com/ClickHouse/ClickHouse/issues/40891): Fix memory leak while pushing to MVs w/o query context (from Kafka/...). [#40732](https://github.com/ClickHouse/ClickHouse/pull/40732) ([Azat Khuzhin](https://github.com/azat)). +* Backported in [#41133](https://github.com/ClickHouse/ClickHouse/issues/41133): Fix access rights for `DESCRIBE TABLE url()` and some other `DESCRIBE TABLE ()`. [#40975](https://github.com/ClickHouse/ClickHouse/pull/40975) ([Vitaly Baranov](https://github.com/vitlibar)). +* Backported in [#41360](https://github.com/ClickHouse/ClickHouse/issues/41360): Fix incorrect logical error `Expected relative path` in disk object storage. Related to [#41246](https://github.com/ClickHouse/ClickHouse/issues/41246). [#41297](https://github.com/ClickHouse/ClickHouse/pull/41297) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Backported in [#41357](https://github.com/ClickHouse/ClickHouse/issues/41357): Add column type check before UUID insertion in MsgPack format. [#41309](https://github.com/ClickHouse/ClickHouse/pull/41309) ([Kruglov Pavel](https://github.com/Avogar)). + +#### NOT FOR CHANGELOG / INSIGNIFICANT + +* use ROBOT_CLICKHOUSE_COMMIT_TOKEN for create-pull-request [#40067](https://github.com/ClickHouse/ClickHouse/pull/40067) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* use input token instead of env var [#40421](https://github.com/ClickHouse/ClickHouse/pull/40421) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Migrate artifactory [#40831](https://github.com/ClickHouse/ClickHouse/pull/40831) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Docker server version [#41256](https://github.com/ClickHouse/ClickHouse/pull/41256) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Increase open files limit [#41345](https://github.com/ClickHouse/ClickHouse/pull/41345) ([Eugene Konkov](https://github.com/ekonkov)). + diff --git a/docs/changelogs/v22.8.5.29-lts.md b/docs/changelogs/v22.8.5.29-lts.md new file mode 100644 index 00000000000..0ce13b7c36e --- /dev/null +++ b/docs/changelogs/v22.8.5.29-lts.md @@ -0,0 +1,34 @@ +--- +sidebar_position: 1 +sidebar_label: 2022 +--- + +# 2022 Changelog + +### ClickHouse release v22.8.5.29-lts (74ffb843807) FIXME as compared to v22.8.4.7-lts (baad27bcd2f) + +#### New Feature +* Backported in [#40870](https://github.com/ClickHouse/ClickHouse/issues/40870): Add setting to disable limit on kafka_num_consumers. Closes [#40331](https://github.com/ClickHouse/ClickHouse/issues/40331). [#40670](https://github.com/ClickHouse/ClickHouse/pull/40670) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Improvement +* Backported in [#40817](https://github.com/ClickHouse/ClickHouse/issues/40817): The setting `show_addresses_in_stack_traces` was accidentally disabled in default `config.xml`. It's removed from the config now, so the setting is enabled by default. [#40749](https://github.com/ClickHouse/ClickHouse/pull/40749) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Backported in [#40944](https://github.com/ClickHouse/ClickHouse/issues/40944): Fix issue with passing MySQL timeouts for MySQL database engine and MySQL table function. Closes [#34168](https://github.com/ClickHouse/ClickHouse/issues/34168)?notification_referrer_id=NT_kwDOAzsV57MzMDMxNjAzNTY5OjU0MjAzODc5. [#40751](https://github.com/ClickHouse/ClickHouse/pull/40751) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Build/Testing/Packaging Improvement +* Backported in [#41157](https://github.com/ClickHouse/ClickHouse/issues/41157): Add macOS binaries to GH release assets, it fixes [#37718](https://github.com/ClickHouse/ClickHouse/issues/37718). [#41088](https://github.com/ClickHouse/ClickHouse/pull/41088) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Backported in [#40866](https://github.com/ClickHouse/ClickHouse/issues/40866): - Fix crash while parsing values of type `Object` that contains arrays of variadic dimension. [#40483](https://github.com/ClickHouse/ClickHouse/pull/40483) ([Duc Canh Le](https://github.com/canhld94)). +* Backported in [#40805](https://github.com/ClickHouse/ClickHouse/issues/40805): During insertion of a new query to the `ProcessList` allocations happen. If we reach the memory limit during these allocations we can not use `OvercommitTracker`, because `ProcessList::mutex` is already acquired. Fixes [#40611](https://github.com/ClickHouse/ClickHouse/issues/40611). [#40677](https://github.com/ClickHouse/ClickHouse/pull/40677) ([Dmitry Novik](https://github.com/novikd)). +* Backported in [#40777](https://github.com/ClickHouse/ClickHouse/issues/40777): Fix memory leak while pushing to MVs w/o query context (from Kafka/...). [#40732](https://github.com/ClickHouse/ClickHouse/pull/40732) ([Azat Khuzhin](https://github.com/azat)). +* Backported in [#41135](https://github.com/ClickHouse/ClickHouse/issues/41135): Fix access rights for `DESCRIBE TABLE url()` and some other `DESCRIBE TABLE ()`. [#40975](https://github.com/ClickHouse/ClickHouse/pull/40975) ([Vitaly Baranov](https://github.com/vitlibar)). +* Backported in [#41242](https://github.com/ClickHouse/ClickHouse/issues/41242): Fixed "possible deadlock avoided" error on automatic conversion of database engine from Ordinary to Atomic. [#41146](https://github.com/ClickHouse/ClickHouse/pull/41146) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Backported in [#41234](https://github.com/ClickHouse/ClickHouse/issues/41234): Fix background clean up of broken detached parts. [#41190](https://github.com/ClickHouse/ClickHouse/pull/41190) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### NOT FOR CHANGELOG / INSIGNIFICANT + +* use ROBOT_CLICKHOUSE_COMMIT_TOKEN for create-pull-request [#40067](https://github.com/ClickHouse/ClickHouse/pull/40067) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* use input token instead of env var [#40421](https://github.com/ClickHouse/ClickHouse/pull/40421) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* CaresPTRResolver small safety improvement [#40890](https://github.com/ClickHouse/ClickHouse/pull/40890) ([Arthur Passos](https://github.com/arthurpassos)). + diff --git a/docs/changelogs/v22.9.2.7-stable.md b/docs/changelogs/v22.9.2.7-stable.md new file mode 100644 index 00000000000..d5bbc8ac8c5 --- /dev/null +++ b/docs/changelogs/v22.9.2.7-stable.md @@ -0,0 +1,20 @@ +--- +sidebar_position: 1 +sidebar_label: 2022 +--- + +# 2022 Changelog + +### ClickHouse release v22.9.2.7-stable (362e2cefcef) FIXME as compared to v22.9.1.2603-stable (3030d4c7ff0) + +#### Improvement +* Backported in [#41709](https://github.com/ClickHouse/ClickHouse/issues/41709): Check file path for path traversal attacks in errors logger for input formats. [#41694](https://github.com/ClickHouse/ClickHouse/pull/41694) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Backported in [#41696](https://github.com/ClickHouse/ClickHouse/issues/41696): Fixes issue when docker run will fail if "https_port" is not present in config. [#41693](https://github.com/ClickHouse/ClickHouse/pull/41693) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). + +#### NOT FOR CHANGELOG / INSIGNIFICANT + +* Fix typos in JSON formats after [#40910](https://github.com/ClickHouse/ClickHouse/issues/40910) [#41614](https://github.com/ClickHouse/ClickHouse/pull/41614) ([Kruglov Pavel](https://github.com/Avogar)). + diff --git a/docs/en/development/build.md b/docs/en/development/build.md index fa04fbf2680..8712aa3e2bc 100644 --- a/docs/en/development/build.md +++ b/docs/en/development/build.md @@ -140,6 +140,6 @@ hash cmake ClickHouse is available in pre-built binaries and packages. Binaries are portable and can be run on any Linux flavour. -They are built for stable, prestable and testing releases as long as for every commit to master and for every pull request. +Binaries are built for stable and LTS releases and also every commit to `master` for each pull request. To find the freshest build from `master`, go to [commits page](https://github.com/ClickHouse/ClickHouse/commits/master), click on the first green check mark or red cross near commit, and click to the “Details” link right after “ClickHouse Build Check”. diff --git a/docs/en/engines/table-engines/mergetree-family/annindexes.md b/docs/en/engines/table-engines/mergetree-family/annindexes.md new file mode 100644 index 00000000000..3b2431e4b5b --- /dev/null +++ b/docs/en/engines/table-engines/mergetree-family/annindexes.md @@ -0,0 +1,127 @@ +# Approximate Nearest Neighbor Search Indexes [experimental] {#table_engines-ANNIndex} + +The main task that indexes achieve is to quickly find nearest neighbors for multidimensional data. An example of such a problem can be finding similar pictures (texts) for a given picture (text). That problem can be reduced to finding the nearest [embeddings](https://cloud.google.com/architecture/overview-extracting-and-serving-feature-embeddings-for-machine-learning). They can be created from data using [UDF](../../../sql-reference/functions/index.md#executable-user-defined-functions). + +The next query finds the closest neighbors in N-dimensional space using the L2 (Euclidean) distance: +``` sql +SELECT * +FROM table_name +WHERE L2Distance(Column, Point) < MaxDistance +LIMIT N +``` +But it will take some time for execution because of the long calculation of the distance between `TargetEmbedding` and all other vectors. This is where ANN indexes can help. They store a compact approximation of the search space (e.g. using clustering, search trees, etc.) and are able to compute approximate neighbors quickly. + +## Indexes Structure + +Approximate Nearest Neighbor Search Indexes (`ANNIndexes`) are similar to skip indexes. They are constructed by some granules and determine which of them should be skipped. Compared to skip indices, ANN indices use their results not only to skip some group of granules, but also to select particular granules from a set of granules. + +`ANNIndexes` are designed to speed up two types of queries: + +- ###### Type 1: Where + ``` sql + SELECT * + FROM table_name + WHERE DistanceFunction(Column, Point) < MaxDistance + LIMIT N + ``` +- ###### Type 2: Order by + ``` sql + SELECT * + FROM table_name [WHERE ...] + ORDER BY DistanceFunction(Column, Point) + LIMIT N + ``` + +In these queries, `DistanceFunction` is selected from [distance functions](../../../sql-reference/functions/distance-functions). `Point` is a known vector (something like `(0.1, 0.1, ... )`). To avoid writing large vectors, use [client parameters](../../../interfaces/cli.md#queries-with-parameters-cli-queries-with-parameters). `Value` - a float value that will bound the neighbourhood. + +!!! note "Note" + ANN index can't speed up query that satisfies both types(`where + order by`, only one of them). All queries must have the limit, as algorithms are used to find nearest neighbors and need a specific number of them. + +!!! note "Note" + Indexes are applied only to queries with a limit less than the `max_limit_for_ann_queries` setting. This helps to avoid memory overflows in queries with a large limit. `max_limit_for_ann_queries` setting can be changed if you know you can provide enough memory. The default value is `1000000`. + +Both types of queries are handled the same way. The indexes get `n` neighbors (where `n` is taken from the `LIMIT` clause) and work with them. In `ORDER BY` query they remember the numbers of all parts of the granule that have at least one of neighbor. In `WHERE` query they remember only those parts that satisfy the requirements. + + + +## Create table with ANNIndex + +This feature is disabled by default. To enable it, set `allow_experimental_annoy_index` to 1. Also, this feature is disabled for arm, due to likely problems with the algorithm. + +```sql +CREATE TABLE t +( + `id` Int64, + `number` Tuple(Float32, Float32, Float32), + INDEX x number TYPE annoy GRANULARITY N +) +ENGINE = MergeTree +ORDER BY id; +``` + +```sql +CREATE TABLE t +( + `id` Int64, + `number` Array(Float32), + INDEX x number TYPE annoy GRANULARITY N +) +ENGINE = MergeTree +ORDER BY id; +``` + +With greater `GRANULARITY` indexes remember the data structure better. The `GRANULARITY` indicates how many granules will be used to construct the index. The more data is provided for the index, the more of it can be handled by one index and the more chances that with the right hyperparameters the index will remember the data structure better. But some indexes can't be built if they don't have enough data, so this granule will always participate in the query. For more information, see the description of indexes. + +As the indexes are built only during insertions into table, `INSERT` and `OPTIMIZE` queries are slower than for ordinary table. At this stage indexes remember all the information about the given data. ANNIndexes should be used if you have immutable or rarely changed data and many read requests. + +You can create your table with index which uses certain algorithm. Now only indices based on the following algorithms are supported: + +# Index list +- [Annoy](../../../engines/table-engines/mergetree-family/annindexes.md#annoy-annoy) + +# Annoy {#annoy} +Implementation of the algorithm was taken from [this repository](https://github.com/spotify/annoy). + +Short description of the algorithm: +The algorithm recursively divides in half all space by random linear surfaces (lines in 2D, planes in 3D e.t.c.). Thus it makes tree of polyhedrons and points that they contains. Repeating the operation several times for greater accuracy it creates a forest. +To find K Nearest Neighbours it goes down through the trees and fills the buffer of closest points using the priority queue of polyhedrons. Next, it sorts buffer and return the nearest K points. + +__Examples__: +```sql +CREATE TABLE t +( + id Int64, + number Tuple(Float32, Float32, Float32), + INDEX x number TYPE annoy(T) GRANULARITY N +) +ENGINE = MergeTree +ORDER BY id; +``` + +```sql +CREATE TABLE t +( + id Int64, + number Array(Float32), + INDEX x number TYPE annoy(T) GRANULARITY N +) +ENGINE = MergeTree +ORDER BY id; +``` +!!! note "Note" + Table with array field will work faster, but all arrays **must** have same length. Use [CONSTRAINT](../../../sql-reference/statements/create/table.md#constraints) to avoid errors. For example, `CONSTRAINT constraint_name_1 CHECK length(number) = 256`. + +Parameter `T` is the number of trees which algorithm will create. The bigger it is, the slower (approximately linear) it works (in both `CREATE` and `SELECT` requests), but the better accuracy you get (adjusted for randomness). + +Annoy supports only `L2Distance`. + +In the `SELECT` in the settings (`ann_index_select_query_params`) you can specify the size of the internal buffer (more details in the description above or in the [original repository](https://github.com/spotify/annoy)). During the query it will inspect up to `search_k` nodes which defaults to `n_trees * n` if not provided. `search_k` gives you a run-time tradeoff between better accuracy and speed. + +__Example__: +``` sql +SELECT * +FROM table_name [WHERE ...] +ORDER BY L2Distance(Column, Point) +LIMIT N +SETTING ann_index_select_query_params=`k_search=100` +``` diff --git a/docs/en/engines/table-engines/mergetree-family/mergetree.md b/docs/en/engines/table-engines/mergetree-family/mergetree.md index 0ebe3c99f35..9dc7e300d45 100644 --- a/docs/en/engines/table-engines/mergetree-family/mergetree.md +++ b/docs/en/engines/table-engines/mergetree-family/mergetree.md @@ -481,6 +481,10 @@ For example: - `NOT startsWith(s, 'test')` ::: + +## Approximate Nearest Neighbor Search Indexes [experimental] {#table_engines-ANNIndex} +In addition to skip indices, there are also [Approximate Nearest Neighbor Search Indexes](../../../engines/table-engines/mergetree-family/annindexes.md). + ## Projections {#projections} Projections are like [materialized views](../../../sql-reference/statements/create/view.md#materialized) but defined in part-level. It provides consistency guarantees along with automatic usage in queries. diff --git a/docs/en/engines/table-engines/special/materializedview.md b/docs/en/engines/table-engines/special/materializedview.md index 7b06560ec98..807f7bc9eae 100644 --- a/docs/en/engines/table-engines/special/materializedview.md +++ b/docs/en/engines/table-engines/special/materializedview.md @@ -8,4 +8,4 @@ sidebar_label: MaterializedView Used for implementing materialized views (for more information, see [CREATE VIEW](../../../sql-reference/statements/create/view.md#materialized)). For storing data, it uses a different engine that was specified when creating the view. When reading from a table, it just uses that engine. -[Original article](https://clickhouse.com/docs/en/engines/table-engines/special/materializedview/) +[Original article](https://clickhouse.com/docs/en/sql-reference/statements/create/view#materialized-view) diff --git a/docs/en/getting-started/example-datasets/cell-towers.md b/docs/en/getting-started/example-datasets/cell-towers.md index e31ce3de5ce..eaa9cdfde88 100644 --- a/docs/en/getting-started/example-datasets/cell-towers.md +++ b/docs/en/getting-started/example-datasets/cell-towers.md @@ -16,19 +16,21 @@ OpenCelliD Project is licensed under a Creative Commons Attribution-ShareAlike 4 1. Download the snapshot of the dataset from February 2021: [cell_towers.csv.xz](https://datasets.clickhouse.com/cell_towers.csv.xz) (729 MB). 2. Validate the integrity (optional step): -``` +```bash md5sum cell_towers.csv.xz +``` +```response 8cf986f4a0d9f12c6f384a0e9192c908 cell_towers.csv.xz ``` 3. Decompress it with the following command: -``` +```bash xz -d cell_towers.csv.xz ``` 4. Create a table: -``` +```sql CREATE TABLE cell_towers ( radio Enum8('' = 0, 'CDMA' = 1, 'GSM' = 2, 'LTE' = 3, 'NR' = 4, 'UMTS' = 5), @@ -50,7 +52,7 @@ ENGINE = MergeTree ORDER BY (radio, mcc, net, created); ``` 5. Insert the dataset: -``` +```bash clickhouse-client --query "INSERT INTO cell_towers FORMAT CSVWithNames" < cell_towers.csv ``` @@ -58,9 +60,10 @@ clickhouse-client --query "INSERT INTO cell_towers FORMAT CSVWithNames" < cell_t 1. A number of cell towers by type: -``` +```sql SELECT radio, count() AS c FROM cell_towers GROUP BY radio ORDER BY c DESC - +``` +```response ┌─radio─┬────────c─┐ │ UMTS │ 20686487 │ │ LTE │ 12101148 │ @@ -74,9 +77,10 @@ SELECT radio, count() AS c FROM cell_towers GROUP BY radio ORDER BY c DESC 2. Cell towers by [mobile country code (MCC)](https://en.wikipedia.org/wiki/Mobile_country_code): -``` +```sql SELECT mcc, count() FROM cell_towers GROUP BY mcc ORDER BY count() DESC LIMIT 10 - +``` +```response ┌─mcc─┬─count()─┐ │ 310 │ 5024650 │ │ 262 │ 2622423 │ @@ -104,21 +108,72 @@ Using `pointInPolygon` function. 1. Create a table where we will store polygons: -``` -CREATE TEMPORARY TABLE moscow (polygon Array(Tuple(Float64, Float64))); +```sql +CREATE TEMPORARY TABLE +moscow (polygon Array(Tuple(Float64, Float64))); ``` 2. This is a rough shape of Moscow (without "new Moscow"): -``` -INSERT INTO moscow VALUES ([(37.84172564285271, 55.78000432402266), (37.8381207618713, 55.775874525970494), (37.83979446823122, 55.775626746008065), (37.84243326983639, 55.77446586811748), (37.84262672750849, 55.771974101091104), (37.84153238623039, 55.77114545193181), (37.841124690460184, 55.76722010265554), (37.84239076983644, 55.76654891107098), (37.842283558197025, 55.76258709833121), (37.8421759312134, 55.758073999993734), (37.84198330422974, 55.75381499999371), (37.8416827275085, 55.749277102484484), (37.84157576190186, 55.74794544108413), (37.83897929098507, 55.74525257875241), (37.83739676451868, 55.74404373042019), (37.838732481460525, 55.74298009816793), (37.841183997352545, 55.743060321833575), (37.84097476190185, 55.73938799999373), (37.84048155819702, 55.73570799999372), (37.840095812164286, 55.73228210777237), (37.83983814285274, 55.73080491981639), (37.83846476321406, 55.729799917464675), (37.83835745269769, 55.72919751082619), (37.838636380279524, 55.72859509486539), (37.8395161005249, 55.727705075632784), (37.83897964285276, 55.722727886185154), (37.83862557539366, 55.72034817326636), (37.83559735744853, 55.71944437307499), (37.835370708803126, 55.71831419154461), (37.83738169402022, 55.71765218986692), (37.83823396494291, 55.71691750159089), (37.838056931213345, 55.71547311301385), (37.836812846557606, 55.71221445615604), (37.83522525396725, 55.709331054395555), (37.83269301586908, 55.70953687463627), (37.829667367706236, 55.70903403789297), (37.83311126588435, 55.70552351822608), (37.83058993121339, 55.70041317726053), (37.82983872750851, 55.69883771404813), (37.82934501586913, 55.69718947487017), (37.828926414016685, 55.69504441658371), (37.82876530422971, 55.69287499999378), (37.82894754100031, 55.690759754047335), (37.827697554878185, 55.68951421135665), (37.82447346292115, 55.68965045405069), (37.83136543914793, 55.68322046195302), (37.833554015869154, 55.67814012759211), (37.83544184655761, 55.67295011628339), (37.837480388885474, 55.6672498719639), (37.838960677246064, 55.66316274139358), (37.83926093121332, 55.66046999999383), (37.839025050262435, 55.65869897264431), (37.83670784390257, 55.65794084879904), (37.835656529083245, 55.65694309303843), (37.83704060449217, 55.65689306460552), (37.83696819873806, 55.65550363526252), (37.83760389616388, 55.65487847246661), (37.83687972750851, 55.65356745541324), (37.83515216004943, 55.65155951234079), (37.83312418518067, 55.64979413590619), (37.82801726983639, 55.64640836412121), (37.820614174591, 55.64164525405531), (37.818908190475426, 55.6421883258084), (37.81717543386075, 55.64112490388471), (37.81690987037274, 55.63916106913107), (37.815099354492155, 55.637925371757085), (37.808769150787356, 55.633798276884455), (37.80100123544311, 55.62873670012244), (37.79598013491824, 55.62554336109055), (37.78634567724606, 55.62033499605651), (37.78334147619623, 55.618768681480326), (37.77746201055901, 55.619855533402706), (37.77527329626457, 55.61909966711279), (37.77801986242668, 55.618770300976294), (37.778212973541216, 55.617257701952106), (37.77784818518065, 55.61574504433011), (37.77016867724609, 55.61148576294007), (37.760191219573976, 55.60599579539028), (37.75338926983641, 55.60227892751446), (37.746329965606634, 55.59920577639331), (37.73939925396728, 55.59631430313617), (37.73273665739439, 55.5935318803559), (37.7299954450912, 55.59350760316188), (37.7268679946899, 55.59469840523759), (37.72626726983634, 55.59229549697373), (37.7262673598022, 55.59081598950582), (37.71897193121335, 55.5877595845419), (37.70871550793456, 55.58393177431724), (37.700497489410374, 55.580917323756644), (37.69204305026244, 55.57778089778455), (37.68544477378839, 55.57815154690915), (37.68391050793454, 55.57472945079756), (37.678803592590306, 55.57328235936491), (37.6743402539673, 55.57255251445782), (37.66813862698363, 55.57216388774464), (37.617927457672096, 55.57505691895805), (37.60443099999999, 55.5757737568051), (37.599683515869145, 55.57749105910326), (37.59754177842709, 55.57796291823627), (37.59625834786988, 55.57906686095235), (37.59501783265684, 55.57746616444403), (37.593090671936025, 55.57671634534502), (37.587018007904, 55.577944600233785), (37.578692203704804, 55.57982895000019), (37.57327546607398, 55.58116294118248), (37.57385012109279, 55.581550362779), (37.57399562266922, 55.5820107079112), (37.5735356072979, 55.58226289171689), (37.57290393054962, 55.582393529795155), (37.57037722355653, 55.581919415056234), (37.5592298306885, 55.584471614867844), (37.54189249206543, 55.58867650795186), (37.5297256269836, 55.59158133551745), (37.517837865081766, 55.59443656218868), (37.51200186508174, 55.59635625174229), (37.506808949737554, 55.59907823904434), (37.49820432275389, 55.6062944994944), (37.494406071441674, 55.60967103463367), (37.494760001358024, 55.61066689753365), (37.49397137107085, 55.61220931698269), (37.49016528606031, 55.613417718449064), (37.48773249206542, 55.61530616333343), (37.47921386508177, 55.622640129112334), (37.470652153442394, 55.62993723476164), (37.46273446298218, 55.6368075123157), (37.46350692265317, 55.64068225239439), (37.46050283203121, 55.640794546982576), (37.457627470916734, 55.64118904154646), (37.450718034393326, 55.64690488145138), (37.44239252645875, 55.65397824729769), (37.434587576721185, 55.66053543155961), (37.43582144975277, 55.661693766520735), (37.43576786245721, 55.662755031737014), (37.430982915344174, 55.664610641628116), (37.428547447097685, 55.66778515273695), (37.42945134592044, 55.668633314343566), (37.42859571562949, 55.66948145750025), (37.4262836402282, 55.670813882451405), (37.418709037048295, 55.6811141674414), (37.41922139651101, 55.68235377885389), (37.419218771842885, 55.68359335082235), (37.417196501327446, 55.684375235224735), (37.41607020370478, 55.68540557585352), (37.415640857147146, 55.68686637150793), (37.414632153442334, 55.68903015131686), (37.413344899475064, 55.690896881757396), (37.41171432275391, 55.69264232162232), (37.40948282275393, 55.69455101638112), (37.40703674603271, 55.69638690385348), (37.39607169577025, 55.70451821283731), (37.38952706878662, 55.70942491932811), (37.387778313491815, 55.71149057784176), (37.39049275399779, 55.71419814298992), (37.385557272491454, 55.7155489617061), (37.38388335714726, 55.71849856042102), (37.378368238098155, 55.7292763261685), (37.37763597123337, 55.730845879211614), (37.37890062088197, 55.73167906388319), (37.37750451918789, 55.734703664681774), (37.375610832015965, 55.734851959522246), (37.3723813571472, 55.74105626086403), (37.37014935714723, 55.746115620904355), (37.36944173016362, 55.750883999993725), (37.36975304365541, 55.76335905525834), (37.37244070571134, 55.76432079697595), (37.3724259757175, 55.76636979670426), (37.369922155757884, 55.76735417953104), (37.369892695770275, 55.76823419316575), (37.370214730163575, 55.782312184391266), (37.370493611114505, 55.78436801120489), (37.37120164550783, 55.78596427165359), (37.37284851456452, 55.7874378183096), (37.37608325135799, 55.7886695054807), (37.3764587460632, 55.78947647305964), (37.37530000265506, 55.79146512926804), (37.38235915344241, 55.79899647809345), (37.384344043655396, 55.80113596939471), (37.38594269577028, 55.80322699999366), (37.38711208598329, 55.804919036911976), (37.3880239841309, 55.806610999993666), (37.38928977249147, 55.81001864976979), (37.39038389947512, 55.81348641242801), (37.39235781481933, 55.81983538336746), (37.393709457672124, 55.82417822811877), (37.394685720901464, 55.82792275755836), (37.39557615344238, 55.830447148154136), (37.39844478226658, 55.83167107969975), (37.40019761214057, 55.83151823557964), (37.400398790382326, 55.83264967594742), (37.39659544313046, 55.83322180909622), (37.39667059524539, 55.83402792148566), (37.39682089947515, 55.83638877400216), (37.39643489154053, 55.83861656112751), (37.3955338994751, 55.84072348043264), (37.392680272491454, 55.84502158126453), (37.39241188227847, 55.84659117913199), (37.392529730163616, 55.84816071336481), (37.39486835714723, 55.85288092980303), (37.39873052645878, 55.859893456073635), (37.40272161111449, 55.86441833633205), (37.40697072750854, 55.867579567544375), (37.410007082016016, 55.868369880337), (37.4120992989502, 55.86920843741314), (37.412668021163924, 55.87055369615854), (37.41482461111453, 55.87170587948249), (37.41862266137694, 55.873183961039565), (37.42413732540892, 55.874879126654704), (37.4312182698669, 55.875614937236705), (37.43111093783558, 55.8762723478417), (37.43332105622856, 55.87706546369396), (37.43385747619623, 55.87790681284802), (37.441303050262405, 55.88027084462084), (37.44747234260555, 55.87942070143253), (37.44716141796871, 55.88072960917233), (37.44769797085568, 55.88121221323979), (37.45204320500181, 55.882080694420715), (37.45673176190186, 55.882346110794586), (37.463383999999984, 55.88252729504517), (37.46682797486874, 55.88294937719063), (37.470014457672086, 55.88361266759345), (37.47751410450743, 55.88546991372396), (37.47860317658232, 55.88534929207307), (37.48165826025772, 55.882563306475106), (37.48316434442331, 55.8815803226785), (37.483831555817645, 55.882427612793315), (37.483182967125686, 55.88372791409729), (37.483092277908824, 55.88495581062434), (37.4855716508179, 55.8875561994203), (37.486440636245746, 55.887827444039566), (37.49014203439328, 55.88897899871799), (37.493210285705544, 55.890208937135604), (37.497512451065035, 55.891342397444696), (37.49780744510645, 55.89174030252967), (37.49940333499519, 55.89239745507079), (37.50018383334346, 55.89339220941865), (37.52421672750851, 55.903869074155224), (37.52977457672118, 55.90564076517974), (37.53503220370484, 55.90661661218259), (37.54042858064267, 55.90714113744566), (37.54320461007303, 55.905645048442985), (37.545686966066306, 55.906608607018505), (37.54743976120755, 55.90788552162358), (37.55796999999999, 55.90901557907218), (37.572711542327866, 55.91059395704873), (37.57942799999998, 55.91073854155573), (37.58502865872187, 55.91009969268444), (37.58739968913264, 55.90794809960554), (37.59131567193598, 55.908713267595054), (37.612687423278814, 55.902866854295375), (37.62348079629517, 55.90041967242986), (37.635797880950896, 55.898141151686396), (37.649487626983664, 55.89639275532968), (37.65619302513125, 55.89572360207488), (37.66294133862307, 55.895295577183965), (37.66874564418033, 55.89505457604897), (37.67375601586915, 55.89254677027454), (37.67744661901856, 55.8947775867987), (37.688347, 55.89450045676125), (37.69480554232789, 55.89422926332761), (37.70107096560668, 55.89322256101114), (37.705962965606716, 55.891763491662616), (37.711885134918205, 55.889110234998974), (37.71682005026245, 55.886577568759876), (37.7199315476074, 55.88458159806678), (37.72234560316464, 55.882281005794134), (37.72364385977171, 55.8809452036196), (37.725371142837474, 55.8809722706006), (37.727870902099546, 55.88037213862385), (37.73394330422971, 55.877941504088696), (37.745339592590376, 55.87208120378722), (37.75525267724611, 55.86703807949492), (37.76919976190188, 55.859821640197474), (37.827835219574, 55.82962968399116), (37.83341438888553, 55.82575289922351), (37.83652584655761, 55.82188784027888), (37.83809213491821, 55.81612575504693), (37.83605359521481, 55.81460347077685), (37.83632178569025, 55.81276696067908), (37.838623105812026, 55.811486181656385), (37.83912198147584, 55.807329380532785), (37.839079078033414, 55.80510270463816), (37.83965844708251, 55.79940712529036), (37.840581150787344, 55.79131399999368), (37.84172564285271, 55.78000432402266)]); +```sql +INSERT INTO moscow VALUES ([(37.84172564285271, 55.78000432402266), +(37.8381207618713, 55.775874525970494), (37.83979446823122, 55.775626746008065), (37.84243326983639, 55.77446586811748), (37.84262672750849, 55.771974101091104), (37.84153238623039, 55.77114545193181), (37.841124690460184, 55.76722010265554), +(37.84239076983644, 55.76654891107098), (37.842283558197025, 55.76258709833121), (37.8421759312134, 55.758073999993734), (37.84198330422974, 55.75381499999371), (37.8416827275085, 55.749277102484484), (37.84157576190186, 55.74794544108413), +(37.83897929098507, 55.74525257875241), (37.83739676451868, 55.74404373042019), (37.838732481460525, 55.74298009816793), (37.841183997352545, 55.743060321833575), (37.84097476190185, 55.73938799999373), (37.84048155819702, 55.73570799999372), +(37.840095812164286, 55.73228210777237), (37.83983814285274, 55.73080491981639), (37.83846476321406, 55.729799917464675), (37.83835745269769, 55.72919751082619), (37.838636380279524, 55.72859509486539), (37.8395161005249, 55.727705075632784), +(37.83897964285276, 55.722727886185154), (37.83862557539366, 55.72034817326636), (37.83559735744853, 55.71944437307499), (37.835370708803126, 55.71831419154461), (37.83738169402022, 55.71765218986692), (37.83823396494291, 55.71691750159089), +(37.838056931213345, 55.71547311301385), (37.836812846557606, 55.71221445615604), (37.83522525396725, 55.709331054395555), (37.83269301586908, 55.70953687463627), (37.829667367706236, 55.70903403789297), (37.83311126588435, 55.70552351822608), +(37.83058993121339, 55.70041317726053), (37.82983872750851, 55.69883771404813), (37.82934501586913, 55.69718947487017), (37.828926414016685, 55.69504441658371), (37.82876530422971, 55.69287499999378), (37.82894754100031, 55.690759754047335), +(37.827697554878185, 55.68951421135665), (37.82447346292115, 55.68965045405069), (37.83136543914793, 55.68322046195302), (37.833554015869154, 55.67814012759211), (37.83544184655761, 55.67295011628339), (37.837480388885474, 55.6672498719639), +(37.838960677246064, 55.66316274139358), (37.83926093121332, 55.66046999999383), (37.839025050262435, 55.65869897264431), (37.83670784390257, 55.65794084879904), (37.835656529083245, 55.65694309303843), (37.83704060449217, 55.65689306460552), +(37.83696819873806, 55.65550363526252), (37.83760389616388, 55.65487847246661), (37.83687972750851, 55.65356745541324), (37.83515216004943, 55.65155951234079), (37.83312418518067, 55.64979413590619), (37.82801726983639, 55.64640836412121), +(37.820614174591, 55.64164525405531), (37.818908190475426, 55.6421883258084), (37.81717543386075, 55.64112490388471), (37.81690987037274, 55.63916106913107), (37.815099354492155, 55.637925371757085), (37.808769150787356, 55.633798276884455), +(37.80100123544311, 55.62873670012244), (37.79598013491824, 55.62554336109055), (37.78634567724606, 55.62033499605651), (37.78334147619623, 55.618768681480326), (37.77746201055901, 55.619855533402706), (37.77527329626457, 55.61909966711279), +(37.77801986242668, 55.618770300976294), (37.778212973541216, 55.617257701952106), (37.77784818518065, 55.61574504433011), (37.77016867724609, 55.61148576294007), (37.760191219573976, 55.60599579539028), (37.75338926983641, 55.60227892751446), +(37.746329965606634, 55.59920577639331), (37.73939925396728, 55.59631430313617), (37.73273665739439, 55.5935318803559), (37.7299954450912, 55.59350760316188), (37.7268679946899, 55.59469840523759), (37.72626726983634, 55.59229549697373), +(37.7262673598022, 55.59081598950582), (37.71897193121335, 55.5877595845419), (37.70871550793456, 55.58393177431724), (37.700497489410374, 55.580917323756644), (37.69204305026244, 55.57778089778455), (37.68544477378839, 55.57815154690915), +(37.68391050793454, 55.57472945079756), (37.678803592590306, 55.57328235936491), (37.6743402539673, 55.57255251445782), (37.66813862698363, 55.57216388774464), (37.617927457672096, 55.57505691895805), (37.60443099999999, 55.5757737568051), +(37.599683515869145, 55.57749105910326), (37.59754177842709, 55.57796291823627), (37.59625834786988, 55.57906686095235), (37.59501783265684, 55.57746616444403), (37.593090671936025, 55.57671634534502), (37.587018007904, 55.577944600233785), +(37.578692203704804, 55.57982895000019), (37.57327546607398, 55.58116294118248), (37.57385012109279, 55.581550362779), (37.57399562266922, 55.5820107079112), (37.5735356072979, 55.58226289171689), (37.57290393054962, 55.582393529795155), +(37.57037722355653, 55.581919415056234), (37.5592298306885, 55.584471614867844), (37.54189249206543, 55.58867650795186), (37.5297256269836, 55.59158133551745), (37.517837865081766, 55.59443656218868), (37.51200186508174, 55.59635625174229), +(37.506808949737554, 55.59907823904434), (37.49820432275389, 55.6062944994944), (37.494406071441674, 55.60967103463367), (37.494760001358024, 55.61066689753365), (37.49397137107085, 55.61220931698269), (37.49016528606031, 55.613417718449064), +(37.48773249206542, 55.61530616333343), (37.47921386508177, 55.622640129112334), (37.470652153442394, 55.62993723476164), (37.46273446298218, 55.6368075123157), (37.46350692265317, 55.64068225239439), (37.46050283203121, 55.640794546982576), +(37.457627470916734, 55.64118904154646), (37.450718034393326, 55.64690488145138), (37.44239252645875, 55.65397824729769), (37.434587576721185, 55.66053543155961), (37.43582144975277, 55.661693766520735), (37.43576786245721, 55.662755031737014), +(37.430982915344174, 55.664610641628116), (37.428547447097685, 55.66778515273695), (37.42945134592044, 55.668633314343566), (37.42859571562949, 55.66948145750025), (37.4262836402282, 55.670813882451405), (37.418709037048295, 55.6811141674414), +(37.41922139651101, 55.68235377885389), (37.419218771842885, 55.68359335082235), (37.417196501327446, 55.684375235224735), (37.41607020370478, 55.68540557585352), (37.415640857147146, 55.68686637150793), (37.414632153442334, 55.68903015131686), +(37.413344899475064, 55.690896881757396), (37.41171432275391, 55.69264232162232), (37.40948282275393, 55.69455101638112), (37.40703674603271, 55.69638690385348), (37.39607169577025, 55.70451821283731), (37.38952706878662, 55.70942491932811), +(37.387778313491815, 55.71149057784176), (37.39049275399779, 55.71419814298992), (37.385557272491454, 55.7155489617061), (37.38388335714726, 55.71849856042102), (37.378368238098155, 55.7292763261685), (37.37763597123337, 55.730845879211614), +(37.37890062088197, 55.73167906388319), (37.37750451918789, 55.734703664681774), (37.375610832015965, 55.734851959522246), (37.3723813571472, 55.74105626086403), (37.37014935714723, 55.746115620904355), (37.36944173016362, 55.750883999993725), +(37.36975304365541, 55.76335905525834), (37.37244070571134, 55.76432079697595), (37.3724259757175, 55.76636979670426), (37.369922155757884, 55.76735417953104), (37.369892695770275, 55.76823419316575), (37.370214730163575, 55.782312184391266), +(37.370493611114505, 55.78436801120489), (37.37120164550783, 55.78596427165359), (37.37284851456452, 55.7874378183096), (37.37608325135799, 55.7886695054807), (37.3764587460632, 55.78947647305964), (37.37530000265506, 55.79146512926804), +(37.38235915344241, 55.79899647809345), (37.384344043655396, 55.80113596939471), (37.38594269577028, 55.80322699999366), (37.38711208598329, 55.804919036911976), (37.3880239841309, 55.806610999993666), (37.38928977249147, 55.81001864976979), +(37.39038389947512, 55.81348641242801), (37.39235781481933, 55.81983538336746), (37.393709457672124, 55.82417822811877), (37.394685720901464, 55.82792275755836), (37.39557615344238, 55.830447148154136), (37.39844478226658, 55.83167107969975), +(37.40019761214057, 55.83151823557964), (37.400398790382326, 55.83264967594742), (37.39659544313046, 55.83322180909622), (37.39667059524539, 55.83402792148566), (37.39682089947515, 55.83638877400216), (37.39643489154053, 55.83861656112751), +(37.3955338994751, 55.84072348043264), (37.392680272491454, 55.84502158126453), (37.39241188227847, 55.84659117913199), (37.392529730163616, 55.84816071336481), (37.39486835714723, 55.85288092980303), (37.39873052645878, 55.859893456073635), +(37.40272161111449, 55.86441833633205), (37.40697072750854, 55.867579567544375), (37.410007082016016, 55.868369880337), (37.4120992989502, 55.86920843741314), (37.412668021163924, 55.87055369615854), (37.41482461111453, 55.87170587948249), +(37.41862266137694, 55.873183961039565), (37.42413732540892, 55.874879126654704), (37.4312182698669, 55.875614937236705), (37.43111093783558, 55.8762723478417), (37.43332105622856, 55.87706546369396), (37.43385747619623, 55.87790681284802), +(37.441303050262405, 55.88027084462084), (37.44747234260555, 55.87942070143253), (37.44716141796871, 55.88072960917233), (37.44769797085568, 55.88121221323979), (37.45204320500181, 55.882080694420715), (37.45673176190186, 55.882346110794586), +(37.463383999999984, 55.88252729504517), (37.46682797486874, 55.88294937719063), (37.470014457672086, 55.88361266759345), (37.47751410450743, 55.88546991372396), (37.47860317658232, 55.88534929207307), (37.48165826025772, 55.882563306475106), +(37.48316434442331, 55.8815803226785), (37.483831555817645, 55.882427612793315), (37.483182967125686, 55.88372791409729), (37.483092277908824, 55.88495581062434), (37.4855716508179, 55.8875561994203), (37.486440636245746, 55.887827444039566), +(37.49014203439328, 55.88897899871799), (37.493210285705544, 55.890208937135604), (37.497512451065035, 55.891342397444696), (37.49780744510645, 55.89174030252967), (37.49940333499519, 55.89239745507079), (37.50018383334346, 55.89339220941865), +(37.52421672750851, 55.903869074155224), (37.52977457672118, 55.90564076517974), (37.53503220370484, 55.90661661218259), (37.54042858064267, 55.90714113744566), (37.54320461007303, 55.905645048442985), (37.545686966066306, 55.906608607018505), +(37.54743976120755, 55.90788552162358), (37.55796999999999, 55.90901557907218), (37.572711542327866, 55.91059395704873), (37.57942799999998, 55.91073854155573), (37.58502865872187, 55.91009969268444), (37.58739968913264, 55.90794809960554), +(37.59131567193598, 55.908713267595054), (37.612687423278814, 55.902866854295375), (37.62348079629517, 55.90041967242986), (37.635797880950896, 55.898141151686396), (37.649487626983664, 55.89639275532968), (37.65619302513125, 55.89572360207488), +(37.66294133862307, 55.895295577183965), (37.66874564418033, 55.89505457604897), (37.67375601586915, 55.89254677027454), (37.67744661901856, 55.8947775867987), (37.688347, 55.89450045676125), (37.69480554232789, 55.89422926332761), +(37.70107096560668, 55.89322256101114), (37.705962965606716, 55.891763491662616), (37.711885134918205, 55.889110234998974), (37.71682005026245, 55.886577568759876), (37.7199315476074, 55.88458159806678), (37.72234560316464, 55.882281005794134), +(37.72364385977171, 55.8809452036196), (37.725371142837474, 55.8809722706006), (37.727870902099546, 55.88037213862385), (37.73394330422971, 55.877941504088696), (37.745339592590376, 55.87208120378722), (37.75525267724611, 55.86703807949492), +(37.76919976190188, 55.859821640197474), (37.827835219574, 55.82962968399116), (37.83341438888553, 55.82575289922351), (37.83652584655761, 55.82188784027888), (37.83809213491821, 55.81612575504693), (37.83605359521481, 55.81460347077685), +(37.83632178569025, 55.81276696067908), (37.838623105812026, 55.811486181656385), (37.83912198147584, 55.807329380532785), (37.839079078033414, 55.80510270463816), (37.83965844708251, 55.79940712529036), (37.840581150787344, 55.79131399999368), +(37.84172564285271, 55.78000432402266)]); ``` 3. Check how many cell towers are in Moscow: +```sql +SELECT count() FROM cell_towers +WHERE pointInPolygon((lon, lat), (SELECT * FROM moscow)) ``` -SELECT count() FROM cell_towers WHERE pointInPolygon((lon, lat), (SELECT * FROM moscow)) - +```response ┌─count()─┐ │ 310463 │ └─────────┘ diff --git a/docs/en/getting-started/install.md b/docs/en/getting-started/install.md index 1a17e63a274..83561b07ade 100644 --- a/docs/en/getting-started/install.md +++ b/docs/en/getting-started/install.md @@ -4,10 +4,9 @@ sidebar_position: 1 keywords: [clickhouse, install, installation, docs] description: ClickHouse can run on any Linux, FreeBSD, or Mac OS X with x86_64, AArch64, or PowerPC64LE CPU architecture. slug: /en/getting-started/install +title: Installation --- -# Installation - ## System Requirements {#system-requirements} ClickHouse can run on any Linux, FreeBSD, or Mac OS X with x86_64, AArch64, or PowerPC64LE CPU architecture. @@ -221,7 +220,7 @@ For non-Linux operating systems and for AArch64 CPU architecture, ClickHouse bui curl -O 'https://builds.clickhouse.com/master/aarch64/clickhouse' && chmod a+x ./clickhouse ``` -Run `sudo ./clickhouse install` to install ClickHouse system-wide (also with needed configuration files, configuring users etc.). Then run `clickhouse start` commands to start the clickhouse-server and `clickhouse-client` to connect to it. +Run `sudo ./clickhouse install` to install ClickHouse system-wide (also with needed configuration files, configuring users etc.). Then run `sudo clickhouse start` commands to start the clickhouse-server and `clickhouse-client` to connect to it. Use the `clickhouse client` to connect to the server, or `clickhouse local` to process local data. diff --git a/docs/en/interfaces/formats.md b/docs/en/interfaces/formats.md index 640c49377d0..9b8354f23a2 100644 --- a/docs/en/interfaces/formats.md +++ b/docs/en/interfaces/formats.md @@ -2,10 +2,9 @@ slug: /en/interfaces/formats sidebar_position: 21 sidebar_label: Input and Output Formats +title: Formats for Input and Output Data --- -# Formats for Input and Output Data - ClickHouse can accept and return data in various formats. A format supported for input can be used to parse the data provided to `INSERT`s, to perform `SELECT`s from a file-backed table such as File, URL or HDFS, or to read an external dictionary. A format supported for output can be used to arrange the results of a `SELECT`, and to perform `INSERT`s into a file-backed table. @@ -30,12 +29,12 @@ The supported formats are: | [SQLInsert](#sqlinsert) | ✗ | ✔ | | [Values](#data-format-values) | ✔ | ✔ | | [Vertical](#vertical) | ✗ | ✔ | -| [JSON](#json) | ✗ | ✔ | +| [JSON](#json) | ✔ | ✔ | | [JSONAsString](#jsonasstring) | ✔ | ✗ | -| [JSONStrings](#jsonstrings) | ✗ | ✔ | +| [JSONStrings](#jsonstrings) | ✔ | ✔ | | [JSONColumns](#jsoncolumns) | ✔ | ✔ | -| [JSONColumnsWithMetadata](#jsoncolumnswithmetadata) | ✗ | ✔ | -| [JSONCompact](#jsoncompact) | ✗ | ✔ | +| [JSONColumnsWithMetadata](#jsoncolumnswithmetadata) | ✔ | ✔ | +| [JSONCompact](#jsoncompact) | ✔ | ✔ | | [JSONCompactStrings](#jsoncompactstrings) | ✗ | ✔ | | [JSONCompactColumns](#jsoncompactcolumns) | ✔ | ✔ | | [JSONEachRow](#jsoneachrow) | ✔ | ✔ | @@ -48,6 +47,7 @@ The supported formats are: | [JSONCompactStringsEachRow](#jsoncompactstringseachrow) | ✔ | ✔ | | [JSONCompactStringsEachRowWithNames](#jsoncompactstringseachrowwithnames) | ✔ | ✔ | | [JSONCompactStringsEachRowWithNamesAndTypes](#jsoncompactstringseachrowwithnamesandtypes) | ✔ | ✔ | +| [JSONObjectEachRow](#jsonobjecteachrow) | ✔ | ✔ | | [TSKV](#tskv) | ✔ | ✔ | | [Pretty](#pretty) | ✗ | ✔ | | [PrettyNoEscapes](#prettynoescapes) | ✗ | ✔ | @@ -609,8 +609,6 @@ If the query contains GROUP BY, rows_before_limit_at_least is the exact number o `extremes` – Extreme values (when extremes are set to 1). -This format is only appropriate for outputting a query result, but not for parsing (retrieving data to insert in a table). - ClickHouse supports [NULL](../sql-reference/syntax.md), which is displayed as `null` in the JSON output. To enable `+nan`, `-nan`, `+inf`, `-inf` values in output, set the [output_format_json_quote_denormals](../operations/settings/settings.md#output_format_json_quote_denormals) to 1. **See Also** @@ -618,6 +616,9 @@ ClickHouse supports [NULL](../sql-reference/syntax.md), which is displayed as `n - [JSONEachRow](#jsoneachrow) format - [output_format_json_array_of_rows](../operations/settings/settings.md#output_format_json_array_of_rows) setting +For JSON input format, if setting [input_format_json_validate_types_from_metadata](../operations/settings/settings.md#input_format_json_validate_types_from_metadata) is set to 1, +the types from metadata in input data will be compared with the types of the corresponding columns from the table. + ## JSONStrings {#jsonstrings} Differs from JSON only in that data fields are output in strings, not in typed JSON values. @@ -694,8 +695,8 @@ Columns that are not present in the block will be filled with default values (yo ## JSONColumnsWithMetadata {#jsoncolumnsmonoblock} -Differs from JSONColumns output format in that it also outputs some metadata and statistics (similar to JSON output format). -This format buffers all data in memory and then outputs them as a single block, so, it can lead to high memory consumption. +Differs from JSONColumns format in that it also contains some metadata and statistics (similar to JSON format). +Output format buffers all data in memory and then outputs them as a single block, so, it can lead to high memory consumption. Example: ```json @@ -737,6 +738,9 @@ Example: } ``` +For JSONColumnsWithMetadata input format, if setting [input_format_json_validate_types_from_metadata](../operations/settings/settings.md#input_format_json_validate_types_from_metadata) is set to 1, +the types from metadata in input data will be compared with the types of the corresponding columns from the table. + ## JSONAsString {#jsonasstring} In this format, a single JSON object is interpreted as a single value. If the input has several JSON objects (comma separated), they are interpreted as separate rows. If the input data is enclosed in square brackets, it is interpreted as an array of JSONs. @@ -1002,6 +1006,21 @@ the types from input data will be compared with the types of the corresponding c [44, "hello", [0,1,2,3]] ``` +## JSONObjectEachRow {#jsonobjecteachrow} + +In this format, all data is represented as a single JSON Object, each row is represented as separate field of this object similar to JSONEachRow format. + +Example: + +```json +{ + "row_1": {"num": 42, "str": "hello", "arr": [0,1]}, + "row_2": {"num": 43, "str": "hello", "arr": [0,1,2]}, + "row_3": {"num": 44, "str": "hello", "arr": [0,1,2,3]} +} +``` + + ### Inserting Data {#json-inserting-data} ``` sql @@ -1125,11 +1144,15 @@ SELECT * FROM json_each_row_nested - [input_format_import_nested_json](../operations/settings/settings.md#input_format_import_nested_json) - map nested JSON data to nested tables (it works for JSONEachRow format). Default value - `false`. - [input_format_json_read_bools_as_numbers](../operations/settings/settings.md#input_format_json_read_bools_as_numbers) - allow to parse bools as numbers in JSON input formats. Default value - `true`. +- [input_format_json_read_numbers_as_strings](../operations/settings/settings.md#input_format_json_read_numbers_as_strings) - allow to parse numbers as strings in JSON input formats. Default value - `false`. - [output_format_json_quote_64bit_integers](../operations/settings/settings.md#output_format_json_quote_64bit_integers) - controls quoting of 64-bit integers in JSON output format. Default value - `true`. +- [output_format_json_quote_64bit_floats](../operations/settings/settings.md#output_format_json_quote_64bit_floats) - controls quoting of 64-bit floats in JSON output format. Default value - `false`. - [output_format_json_quote_denormals](../operations/settings/settings.md#output_format_json_quote_denormals) - enables '+nan', '-nan', '+inf', '-inf' outputs in JSON output format. Default value - `false`. +- [output_format_json_quote_decimals](../operations/settings/settings.md#output_format_json_quote_decimals) - controls quoting of decimals in JSON output format. Default value - `false`. - [output_format_json_escape_forward_slashes](../operations/settings/settings.md#output_format_json_escape_forward_slashes) - controls escaping forward slashes for string outputs in JSON output format. Default value - `true`. - [output_format_json_named_tuples_as_objects](../operations/settings/settings.md#output_format_json_named_tuples_as_objects) - serialize named tuple columns as JSON objects. Default value - `false`. - [output_format_json_array_of_rows](../operations/settings/settings.md#output_format_json_array_of_rows) - output a JSON array of all rows in JSONEachRow(Compact) format. Default value - `false`. +- [output_format_json_validate_utf8](../operations/settings/settings.md#output_format_json_validate_utf8) - enables validation of UTF-8 sequences in JSON output formats (note that it doesn't impact formats JSON/JSONCompact/JSONColumnsWithMetadata, they always validate utf8). Default value - `false`. ## Native {#native} diff --git a/docs/en/interfaces/http.md b/docs/en/interfaces/http.md index c980bc65152..2c8044d38f7 100644 --- a/docs/en/interfaces/http.md +++ b/docs/en/interfaces/http.md @@ -340,7 +340,7 @@ ClickHouse supports specific queries through the HTTP interface. For example, yo $ echo '(4),(5),(6)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20VALUES' --data-binary @- ``` -ClickHouse also supports Predefined HTTP Interface which can help you more easily integrate with third-party tools like [Prometheus exporter](https://github.com/percona-lab/clickhouse_exporter). +ClickHouse also supports Predefined HTTP Interface which can help you more easily integrate with third-party tools like [Prometheus exporter](https://github.com/ClickHouse/clickhouse_exporter). Example: diff --git a/docs/en/interfaces/third-party/integrations.md b/docs/en/interfaces/third-party/integrations.md index de496546cb4..aede128e9a4 100644 --- a/docs/en/interfaces/third-party/integrations.md +++ b/docs/en/interfaces/third-party/integrations.md @@ -103,6 +103,7 @@ ClickHouse, Inc. does **not** maintain the tools and libraries listed below and - [ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client) - [ClickHouse.Net](https://github.com/ilyabreev/ClickHouse.Net) - [ClickHouse.Net.Migrations](https://github.com/ilyabreev/ClickHouse.Net.Migrations) + - [Linq To DB](https://github.com/linq2db/linq2db) - Elixir - [Ecto](https://github.com/elixir-ecto/ecto) - [clickhouse_ecto](https://github.com/appodeal/clickhouse_ecto) diff --git a/docs/en/operations/caches.md b/docs/en/operations/caches.md index 910f57ec56b..3aeae7d1c9d 100644 --- a/docs/en/operations/caches.md +++ b/docs/en/operations/caches.md @@ -20,6 +20,7 @@ Additional cache types: - [Avro format](../interfaces/formats.md#data-format-avro) schemas cache. - [Dictionaries](../sql-reference/dictionaries/index.md) data cache. - Schema inference cache. +- [Filesystem cache](storing-data.md) over S3, Azure, Local and other disks. Indirectly used: diff --git a/docs/en/operations/opentelemetry.md b/docs/en/operations/opentelemetry.md index 8a2e0fbf9ea..db4db18cca5 100644 --- a/docs/en/operations/opentelemetry.md +++ b/docs/en/operations/opentelemetry.md @@ -1,8 +1,8 @@ --- slug: /en/operations/opentelemetry sidebar_position: 62 -sidebar_label: OpenTelemetry Support -title: "[experimental] OpenTelemetry Support" +sidebar_label: Tracing ClickHouse with OpenTelemetry +title: "[experimental] Tracing ClickHouse with OpenTelemetry" --- [OpenTelemetry](https://opentelemetry.io/) is an open standard for collecting traces and metrics from the distributed application. ClickHouse has some support for OpenTelemetry. diff --git a/docs/en/operations/server-configuration-parameters/settings.md b/docs/en/operations/server-configuration-parameters/settings.md index 24e08fe1fcd..b7fe7d49b7b 100644 --- a/docs/en/operations/server-configuration-parameters/settings.md +++ b/docs/en/operations/server-configuration-parameters/settings.md @@ -1452,7 +1452,7 @@ Port for communicating with clients over MySQL protocol. **Possible values** -Positive integer. +Positive integer to specify the port number to listen to or empty value to disable. Example @@ -1466,7 +1466,7 @@ Port for communicating with clients over PostgreSQL protocol. **Possible values** -Positive integer. +Positive integer to specify the port number to listen to or empty value to disable. Example diff --git a/docs/en/operations/settings/constraints-on-settings.md b/docs/en/operations/settings/constraints-on-settings.md index 4bef197b6cb..651b6465f7e 100644 --- a/docs/en/operations/settings/constraints-on-settings.md +++ b/docs/en/operations/settings/constraints-on-settings.md @@ -26,13 +26,33 @@ The constraints are defined as the following: + + lower_boundary + upper_boundary + + ``` If the user tries to violate the constraints an exception is thrown and the setting isn’t changed. -There are supported three types of constraints: `min`, `max`, `readonly`. The `min` and `max` constraints specify upper and lower boundaries for a numeric setting and can be used in combination. The `readonly` constraint specifies that the user cannot change the corresponding setting at all. +There are supported few types of constraints: `min`, `max`, `readonly` (with alias `const`) and `changeable_in_readonly`. The `min` and `max` constraints specify upper and lower boundaries for a numeric setting and can be used in combination. The `readonly` or `const` constraint specifies that the user cannot change the corresponding setting at all. The `changeable_in_readonly` constraint type allows user to change the setting within `min`/`max` range even if `readonly` setting is set to 1, otherwise settings are not allow to be changed in `readonly=1` mode. Note that `changeable_in_readonly` is supported only if `settings_constraints_replace_previous` is enabled: +``` xml + + true + +``` + +If there are multiple profiles active for a user, then constraints are merged. Merge process depends on `settings_constraints_replace_previous`: +- **true** (recommended): constraints for the same setting are replaced during merge, such that the last constraint is used and all previous are ignored including fields that are not set in new constraint. +- **false** (default): constraints for the same setting are merged in a way that every not set type of constraint is taken from previous profile and every set type of constraint is replaced by value from new profile. + +Read-only mode is enabled by `readonly` setting (not to confuse with `readonly` constraint type): +- `readonly=0`: No read-only restrictions. +- `readonly=1`: Only read queries are allowed and settings cannot be changes unless `changeable_in_readonly` is set. +- `readonly=2`: Only read queries are allowed, but settings can be changed, except for `readonly` setting itself. + **Example:** Let `users.xml` includes lines: diff --git a/docs/en/operations/settings/permissions-for-queries.md b/docs/en/operations/settings/permissions-for-queries.md index c183b159423..3ba62b78cfe 100644 --- a/docs/en/operations/settings/permissions-for-queries.md +++ b/docs/en/operations/settings/permissions-for-queries.md @@ -37,8 +37,7 @@ After setting `readonly = 1`, the user can’t change `readonly` and `allow_ddl` When using the `GET` method in the [HTTP interface](../../interfaces/http.md), `readonly = 1` is set automatically. To modify data, use the `POST` method. -Setting `readonly = 1` prohibit the user from changing all the settings. There is a way to prohibit the user -from changing only specific settings, for details see [constraints on settings](../../operations/settings/constraints-on-settings.md). +Setting `readonly = 1` prohibit the user from changing all the settings. There is a way to prohibit the user from changing only specific settings. Also there is a way to allow changing only specific settings under `readonly = 1` restrictions. For details see [constraints on settings](../../operations/settings/constraints-on-settings.md). Default value: 0 diff --git a/docs/en/operations/settings/settings.md b/docs/en/operations/settings/settings.md index b4d44547328..31609fe24be 100644 --- a/docs/en/operations/settings/settings.md +++ b/docs/en/operations/settings/settings.md @@ -1176,8 +1176,9 @@ Enables the quorum writes. - If `insert_quorum < 2`, the quorum writes are disabled. - If `insert_quorum >= 2`, the quorum writes are enabled. +- If `insert_quorum = 'auto'`, use majority number (`number_of_replicas / 2 + 1`) as quorum number. -Default value: 0. +Default value: 0 - disabled. Quorum writes @@ -1259,7 +1260,7 @@ Possible values: Default value: 1. -By default, blocks inserted into replicated tables by the `INSERT` statement are deduplicated (see [Data Replication](../../engines/table-engines/mergetree-family/replication.md)). +By default, blocks inserted into replicated tables by the `INSERT` statement are deduplicated (see [Data Replication](../../engines/table-engines/mergetree-family/replication.md)). For the replicated tables by default the only 100 of the most recent blocks for each partition are deduplicated (see [replicated_deduplication_window](merge-tree-settings.md#replicated-deduplication-window), [replicated_deduplication_window_seconds](merge-tree-settings.md/#replicated-deduplication-window-seconds)). For not replicated tables see [non_replicated_deduplication_window](merge-tree-settings.md/#non-replicated-deduplication-window). @@ -3144,6 +3145,17 @@ Result: └─────┴─────┴───────┘ ``` +## enable_extended_results_for_datetime_functions {#enable-extended-results-for-datetime-functions} + +Enables or disables returning results of type `Date32` with extended range (compared to type `Date`) for functions [toStartOfYear](../../sql-reference/functions/date-time-functions.md#tostartofyear), [toStartOfISOYear](../../sql-reference/functions/date-time-functions.md#tostartofisoyear), [toStartOfQuarter](../../sql-reference/functions/date-time-functions.md#tostartofquarter), [toStartOfMonth](../../sql-reference/functions/date-time-functions.md#tostartofmonth), [toStartOfWeek](../../sql-reference/functions/date-time-functions.md#tostartofweek), [toMonday](../../sql-reference/functions/date-time-functions.md#tomonday) and [toLastDayOfMonth](../../sql-reference/functions/date-time-functions.md#tolastdayofmonth). + +Possible values: + +- 0 — Functions return `Date` for all types of arguments. +- 1 — Functions return `Date32` for `Date32` or `DateTime64` arguments and `Date` otherwise. + +Default value: `0`. + ## optimize_move_to_prewhere {#optimize_move_to_prewhere} Enables or disables automatic [PREWHERE](../../sql-reference/statements/select/prewhere.md) optimization in [SELECT](../../sql-reference/statements/select/index.md) queries. @@ -3421,7 +3433,7 @@ Possible values: - 0 — Disabled. - 1 — Enabled. -Default value: 0. +Default value: 1. ## input_format_with_names_use_header {#input_format_with_names_use_header} @@ -3529,8 +3541,8 @@ desc format(JSONEachRow, '{"x" : 1, "y" : "String", "z" : "0.0.0.0" }') settings Result: ```sql -x UInt8 -y Nullable(String) +x UInt8 +y Nullable(String) z IPv4 ``` @@ -3693,6 +3705,19 @@ Allow parsing bools as numbers in JSON input formats. Enabled by default. +### input_format_json_read_numbers_as_strings {#input_format_json_read_numbers_as_strings} + +Allow parsing numbers as strings in JSON input formats. + +Disabled by default. + +### input_format_json_validate_types_from_metadata {#input_format_json_validate_types_from_metadata} + +For JSON/JSONCompact/JSONColumnsWithMetadata input formats, if this setting is set to 1, +the types from metadata in input data will be compared with the types of the corresponding columns from the table. + +Enabled by default. + ### output_format_json_quote_64bit_integers {#output_format_json_quote_64bit_integers} Controls quoting of 64-bit or bigger [integers](../../sql-reference/data-types/int-uint.md) (like `UInt64` or `Int128`) when they are output in a [JSON](../../interfaces/formats.md#json) format. @@ -3705,6 +3730,12 @@ Possible values: Default value: 1. +### output_format_json_quote_64bit_floats {#output_format_json_quote_64bit_floats} + +Controls quoting of 64-bit [floats](../../sql-reference/data-types/float.md) when they are output in JSON* formats. + +Disabled by default. + ### output_format_json_quote_denormals {#output_format_json_quote_denormals} Enables `+nan`, `-nan`, `+inf`, `-inf` outputs in [JSON](../../interfaces/formats.md#json) output format. @@ -3804,6 +3835,12 @@ When `output_format_json_quote_denormals = 1`, the query returns: } ``` +### output_format_json_quote_decimals {#output_format_json_quote_decimals} + +Controls quoting of decimals in JSON output formats. + +Disabled by default. + ### output_format_json_escape_forward_slashes {#output_format_json_escape_forward_slashes} Controls escaping forward slashes for string outputs in JSON output format. This is intended for compatibility with JavaScript. Don't confuse with backslashes that are always escaped. @@ -3863,6 +3900,12 @@ Result: {"number":"2"} ``` +### output_format_json_validate_utf8 {#output_format_json_validate_utf8} + +Controls validation of UTF-8 sequences in JSON output formats, doesn't impact formats JSON/JSONCompact/JSONColumnsWithMetadata, they always validate UTF-8. + +Disabled by default. + ## TSV format settings {#tsv-format-settings} ### input_format_tsv_empty_as_default {#input_format_tsv_empty_as_default} diff --git a/docs/en/operations/storing-data.md b/docs/en/operations/storing-data.md index fab78366892..43623577e66 100644 --- a/docs/en/operations/storing-data.md +++ b/docs/en/operations/storing-data.md @@ -112,6 +112,155 @@ Example of disk configuration: ``` +## Using local cache {#using-local-cache} + +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. Cache uses `LRU` cache policy. + +Example of configuration for versions later or equal to 22.8: + +``` xml + + + + + s3 + ... + ... s3 configuration ... + + + cache + s3 + /s3_cache/ + 10Gi + + + + +
+ cache +
+
+ +
+``` + +Example of configuration for versions earlier than 22.8: + +``` xml + + + + + s3 + ... + ... s3 configuration ... + 1 + 10737418240 + + + + +
+ s3 +
+
+ +
+``` + +Cache **configuration settings**: + +- `path` - path to the directory with cache. Default: None, this setting is obligatory. + +- `max_size` - maximum size of the cache in bytes or in readable format, e.g. `ki, Mi, Gi, etc`, example `10Gi` (such format works starting from `22.10` version). When the limit is reached, cache files are evicted according to the cache eviction policy. Default: None, this setting is obligatory. + +- `cache_on_write_operations` - allow to turn on `write-through` cache (caching data on any write operations: `INSERT` queries, background merges). Default: `false`. The `write-through` cache can be disabled per query using setting `enable_filesystem_cache_on_write_operations` (data is cached only if both cache config settings and corresponding query setting are enabled). + +- `enable_filesystem_query_cache_limit` - allow to limit the size of cache which is downloaded within each query (depends on user setting `max_query_cache_size`). Default: `false`. + +- `enable_cache_hits_threshold` - a number, which defines how many times some data needs to be read before it will be cached. Default: `0`, e.g. the data is cached at the first attempt to read it. + +- `do_not_evict_index_and_mark_files` - do not evict small frequently used files according to cache policy. Default: `false`. This setting was added in version 22.8. If you used filesystem cache before this version, then it will not work on versions starting from 22.8 if this setting is set to `true`. If you want to use this setting, clear old cache created before version 22.8 before upgrading. + +- `max_file_segment_size` - a maximum size of a single cache file in bytes or in readable format (`ki, Mi, Gi, etc`, example `10Gi`). Default: `104857600` (`100Mi`). + +- `max_elements` - a limit for a number of cache files. Default: `1048576`. + +Cache **query settings**: + +- `enable_filesystem_cache` - allows to disable cache per query even if storage policy was configured with `cache` disk type. Default: `true`. + +- `read_from_filesystem_cache_if_exists_otherwise_bypass_cache` - allows to use cache in query only if it already exists, otherwise query data will not be written to local cache storage. Default: `false`. + +- `enable_filesystem_cache_on_write_operations` - turn on `write-through` cache. This setting works only if setting `cache_on_write_operations` in cache configuration is turned on. + +- `enable_filesystem_cache_log` - turn on logging to `system.filesystem_cache_log` table. Gives a detailed view of cache usage per query. Default: `false`. + +- `max_query_cache_size` - a limit for the cache size, which can be written to local cache storage. Requires enabled `enable_filesystem_query_cache_limit` in cache configuration. Default: `false`. + +- `skip_download_if_exceeds_query_cache` - allows to change the behaviour of setting `max_query_cache_size`. Default: `true`. If this setting is turned on and cache download limit during query was reached, no more cache will be downloaded to cache storage. If this setting is turned off and cache download limit during query was reached, cache will still be written by cost of evicting previously downloaded (within current query) data, e.g. second behaviour allows to preserve `last recentltly used` behaviour while keeping query cache limit. + +** Warning ** +Cache configuration settings and cache query settings correspond to the latest ClickHouse version, for earlier versions something might not be supported. + +Cache **system tables**: + +- `system.filesystem_cache` - system tables which shows current state of cache. + +- `system.filesystem_cache_log` - system table which shows detailed cache usage per query. Requires `enable_filesystem_cache_log` setting to be `true`. + +Cache **commands**: + +- `SYSTEM DROP FILESYSTEM CACHE () (ON CLUSTER)` + +- `SHOW FILESYSTEM CACHES` -- show list of filesystem caches which were configured on the server. (For versions <= `22.8` the command is named `SHOW CACHES`) + +```sql +SHOW FILESYSTEM CACHES +``` + +Result: + +``` text +┌─Caches────┐ +│ s3_cache │ +└───────────┘ +``` + +- `DESCRIBE CACHE ''` - show cache configuration and some general statistics for a specific cache. Cache name can be taken from `SHOW CACHES` command. (For versions <= `22.8` the command is named `DESCRIBE CACHE`) + +```sql +DESCRIBE CACHE 's3_cache' +``` + +``` text +┌────max_size─┬─max_elements─┬─max_file_segment_size─┬─cache_on_write_operations─┬─enable_cache_hits_threshold─┬─current_size─┬─current_elements─┬─path────────┬─do_not_evict_index_and_mark_files─┐ +│ 10000000000 │ 1048576 │ 104857600 │ 1 │ 0 │ 3276 │ 54 │ /s3_cache/ │ 1 │ +└─────────────┴──────────────┴───────────────────────┴───────────────────────────┴─────────────────────────────┴──────────────┴──────────────────┴─────────────┴───────────────────────────────────┘ +``` + +Cache current metrics: + +- `FilesystemCacheSize` + +- `FilesystemCacheElements` + +Cache asynchronous metrics: + +- `FilesystemCacheBytes` + +- `FilesystemCacheFiles` + +Cache profile events: + +- `CachedReadBufferReadFromSourceBytes`, `CachedReadBufferReadFromCacheBytes,` + +- `CachedReadBufferReadFromSourceMicroseconds`, `CachedReadBufferReadFromCacheMicroseconds` + +- `CachedReadBufferCacheWriteBytes`, `CachedReadBufferCacheWriteMicroseconds` + +- `CachedWriteBufferCacheWriteBytes`, `CachedWriteBufferCacheWriteMicroseconds` + ## Storing Data on Web Server {#storing-data-on-webserver} There is a tool `clickhouse-static-files-uploader`, which prepares a data directory for a given table (`SELECT data_paths FROM system.tables WHERE name = 'table_name'`). For each table you need, you get a directory of files. These files can be uploaded to, for example, a web server with static files. After this preparation, you can load this table into any ClickHouse server via `DiskWeb`. diff --git a/docs/en/operations/tips.md b/docs/en/operations/tips.md index 85927cd0e05..facf78c85bf 100644 --- a/docs/en/operations/tips.md +++ b/docs/en/operations/tips.md @@ -74,13 +74,16 @@ Make sure that [`fstrim`](https://en.wikipedia.org/wiki/Trim_(computing)) is ena ## File System {#file-system} -Ext4 is the most reliable option. Set the mount options `noatime`. -XFS should be avoided. It works mostly fine but there are some reports about lower performance. +Ext4 is the most reliable option. Set the mount options `noatime`. XFS works well too. Most other file systems should also work fine. +FAT-32 and exFAT are not supported due to lack of hard links. + Do not use compressed filesystems, because ClickHouse does compression on its own and better. It's not recommended to use encrypted filesystems, because you can use builtin encryption in ClickHouse, which is better. +While ClickHouse can work over NFS, it is not the best idea. + ## Linux Kernel {#linux-kernel} Don’t use an outdated Linux kernel. diff --git a/docs/en/operations/troubleshooting.md b/docs/en/operations/troubleshooting.md index 5a61359a2c0..93bd56087a2 100644 --- a/docs/en/operations/troubleshooting.md +++ b/docs/en/operations/troubleshooting.md @@ -2,10 +2,9 @@ slug: /en/operations/troubleshooting sidebar_position: 46 sidebar_label: Troubleshooting +title: Troubleshooting --- -# Troubleshooting - - [Installation](#troubleshooting-installation-errors) - [Connecting to the server](#troubleshooting-accepts-no-connections) - [Query processing](#troubleshooting-does-not-process-queries) diff --git a/docs/en/sql-reference/aggregate-functions/index.md b/docs/en/sql-reference/aggregate-functions/index.md index 3d6475979b7..56a55c6b7a0 100644 --- a/docs/en/sql-reference/aggregate-functions/index.md +++ b/docs/en/sql-reference/aggregate-functions/index.md @@ -16,7 +16,7 @@ ClickHouse also supports: ## NULL Processing -During aggregation, all `NULL`s are skipped. +During aggregation, all `NULL`s are skipped. If the aggregation has several parameters it will ignore any row in which one or more of the parameters are NULL. **Examples:** @@ -58,4 +58,17 @@ SELECT groupArray(y) FROM t_null_big `groupArray` does not include `NULL` in the resulting array. +You can use [COALESCE](../../sql-reference/functions/functions-for-nulls.md#coalesce) to change NULL into a value that makes sense in your use case. For example: `avg(COALESCE(column, 0))` with use the column value in the aggregation or zero if NULL: +``` sql +SELECT + avg(y), + avg(coalesce(y, 0)) +FROM t_null_big +``` + +``` text +┌─────────────avg(y)─┬─avg(coalesce(y, 0))─┐ +│ 2.3333333333333335 │ 1.4 │ +└────────────────────┴─────────────────────┘ +``` diff --git a/docs/en/sql-reference/data-types/geo.md b/docs/en/sql-reference/data-types/geo.md index 65fd641bec9..48dce40986e 100644 --- a/docs/en/sql-reference/data-types/geo.md +++ b/docs/en/sql-reference/data-types/geo.md @@ -7,13 +7,8 @@ title: "Geo Data Types" ClickHouse supports data types for representing geographical objects — locations, lands, etc. -:::warning -Currently geo data types are an experimental feature. To work with them you must set `allow_experimental_geo_types = 1`. -::: - **See Also** - [Representing simple geographical features](https://en.wikipedia.org/wiki/GeoJSON). -- [allow_experimental_geo_types](../../operations/settings/settings.md#allow-experimental-geo-types) setting. ## Point @@ -24,7 +19,6 @@ Currently geo data types are an experimental feature. To work with them you must Query: ```sql -SET allow_experimental_geo_types = 1; CREATE TABLE geo_point (p Point) ENGINE = Memory(); INSERT INTO geo_point VALUES((10, 10)); SELECT p, toTypeName(p) FROM geo_point; @@ -46,7 +40,6 @@ Result: Query: ```sql -SET allow_experimental_geo_types = 1; CREATE TABLE geo_ring (r Ring) ENGINE = Memory(); INSERT INTO geo_ring VALUES([(0, 0), (10, 0), (10, 10), (0, 10)]); SELECT r, toTypeName(r) FROM geo_ring; @@ -68,7 +61,6 @@ Result: This is a polygon with one hole: ```sql -SET allow_experimental_geo_types = 1; CREATE TABLE geo_polygon (pg Polygon) ENGINE = Memory(); INSERT INTO geo_polygon VALUES([[(20, 20), (50, 20), (50, 50), (20, 50)], [(30, 30), (50, 50), (50, 30)]]); SELECT pg, toTypeName(pg) FROM geo_polygon; @@ -91,7 +83,6 @@ Result: This multipolygon consists of two separate polygons — the first one without holes, and the second with one hole: ```sql -SET allow_experimental_geo_types = 1; CREATE TABLE geo_multipolygon (mpg MultiPolygon) ENGINE = Memory(); INSERT INTO geo_multipolygon VALUES([[[(0, 0), (10, 0), (10, 10), (0, 10)]], [[(20, 20), (50, 20), (50, 50), (20, 50)],[(30, 30), (50, 50), (50, 30)]]]); SELECT mpg, toTypeName(mpg) FROM geo_multipolygon; diff --git a/docs/en/sql-reference/data-types/tuple.md b/docs/en/sql-reference/data-types/tuple.md index 97b26f42603..306be289d67 100644 --- a/docs/en/sql-reference/data-types/tuple.md +++ b/docs/en/sql-reference/data-types/tuple.md @@ -6,7 +6,7 @@ sidebar_label: Tuple(T1, T2, ...) # Tuple(t1, T2, …) -A tuple of elements, each having an individual [type](../../sql-reference/data-types/index.md#data_types). +A tuple of elements, each having an individual [type](../../sql-reference/data-types/index.md#data_types). Tuple must contain at least one element. Tuples are used for temporary column grouping. Columns can be grouped when an IN expression is used in a query, and for specifying certain formal parameters of lambda functions. For more information, see the sections [IN operators](../../sql-reference/operators/in.md) and [Higher order functions](../../sql-reference/functions/index.md#higher-order-functions). @@ -32,6 +32,34 @@ SELECT tuple(1,'a') AS x, toTypeName(x) └─────────┴───────────────────────────┘ ``` +Tuple can contain a single element + +Example: + +``` sql +SELECT tuple('a') AS x; +``` + +``` text +┌─x─────┐ +│ ('a') │ +└───────┘ +``` + +There is a syntax sugar using parentheses `( tuple_element1, tuple_element2 )` to create a tuple of several elements without tuple function. + +Example: + +``` sql +SELECT (1, 'a') AS x, (today(), rand(), 'someString') y, ('a') not_a_tuple; +``` + +``` text +┌─x───────┬─y──────────────────────────────────────┬─not_a_tuple─┐ +│ (1,'a') │ ('2022-09-21',2006973416,'someString') │ a │ +└─────────┴────────────────────────────────────────┴─────────────┘ +``` + ## Working with Data Types When creating a tuple on the fly, ClickHouse automatically detects the type of each argument as the minimum of the types which can store the argument value. If the argument is [NULL](../../sql-reference/syntax.md#null-literal), the type of the tuple element is [Nullable](../../sql-reference/data-types/nullable.md). @@ -76,4 +104,84 @@ Result: └────────────────────┘ ``` +## Comparison operations with Tuple + +The operation of comparing two tuples is performed sequentially element by element from left to right. If the element of the first tuple is greater than the corresponding element of the second tuple, then the first tuple is greater than the second, if the elements are equal, the next element is compared. + +Example: + +```sql +SELECT (1, 'z') > (1, 'a') c1, (2022, 01, 02) > (2023, 04, 02) c2, (1,2,3) = (3,2,1) c3; +``` + +``` text +┌─c1─┬─c2─┬─c3─┐ +│ 1 │ 0 │ 0 │ +└────┴────┴────┘ +``` + +Real world examples: + +```sql +CREATE TABLE test +( + `year` Int16, + `month` Int8, + `day` Int8 +) +ENGINE = Memory AS +SELECT * +FROM values((2022, 12, 31), (2000, 1, 1)); + +SELECT * FROM test; + +┌─year─┬─month─┬─day─┐ +│ 2022 │ 12 │ 31 │ +│ 2000 │ 1 │ 1 │ +└──────┴───────┴─────┘ + +SELECT * +FROM test +WHERE (year, month, day) > (2010, 1, 1); + +┌─year─┬─month─┬─day─┐ +│ 2022 │ 12 │ 31 │ +└──────┴───────┴─────┘ + + +CREATE TABLE test +( + `key` Int64, + `duration` UInt32, + `value` Float64 +) +ENGINE = Memory AS +SELECT * +FROM values((1, 42, 66.5), (1, 42, 70), (2, 1, 10), (2, 2, 0)); + +SELECT * FROM test; + +┌─key─┬─duration─┬─value─┐ +│ 1 │ 42 │ 66.5 │ +│ 1 │ 42 │ 70 │ +│ 2 │ 1 │ 10 │ +│ 2 │ 2 │ 0 │ +└─────┴──────────┴───────┘ + +-- Let's find a value for each key with the biggest duration, if durations are equal, select the biggest value + +SELECT + key, + max(duration), + argMax(value, (duration, value)) +FROM test +GROUP BY key +ORDER BY key ASC; + +┌─key─┬─max(duration)─┬─argMax(value, tuple(duration, value))─┐ +│ 1 │ 42 │ 70 │ +│ 2 │ 2 │ 0 │ +└─────┴───────────────┴───────────────────────────────────────┘ +``` + [Original article](https://clickhouse.com/docs/en/data_types/tuple/) diff --git a/docs/en/sql-reference/formats.mdx b/docs/en/sql-reference/formats.mdx new file mode 100644 index 00000000000..013b182091b --- /dev/null +++ b/docs/en/sql-reference/formats.mdx @@ -0,0 +1,10 @@ +--- +slug: /en/sql-reference/formats +sidebar_position: 50 +sidebar_label: Input and Output Formats +title: Formats for Input and Output Data +--- + +import Content from '@site/docs/en/interfaces/formats.md'; + + diff --git a/docs/en/sql-reference/functions/date-time-functions.md b/docs/en/sql-reference/functions/date-time-functions.md index 3515e903adf..001c7822433 100644 --- a/docs/en/sql-reference/functions/date-time-functions.md +++ b/docs/en/sql-reference/functions/date-time-functions.md @@ -268,13 +268,15 @@ Result: ``` :::note -The return type of `toStartOf*`, `toLastDayOfMonth`, `toMonday` functions described below is `Date` or `DateTime`. -Though these functions can take values of the extended types `Date32` and `DateTime64` as an argument, passing them a time outside the normal range (year 1970 to 2149 for `Date` / 2106 for `DateTime`) will produce wrong results. -In case argument is out of normal range: +The return type of `toStartOf*`, `toLastDayOfMonth`, `toMonday` functions described below is determined by the configuration parameter [enable_extended_results_for_datetime_functions](../../operations/settings/settings#enable-extended-results-for-datetime-functions) which is `0` by default. + +Behavior for +* `enable_extended_results_for_datetime_functions = 0`: Functions `toStartOf*`, `toLastDayOfMonth`, `toMonday` return `Date` or `DateTime`. Though these functions can take values of the extended types `Date32` and `DateTime64` as an argument, passing them a time outside the normal range (year 1970 to 2149 for `Date` / 2106 for `DateTime`) will produce wrong results. In case argument is out of normal range: * If the argument is smaller than 1970, the result will be calculated from the argument `1970-01-01 (00:00:00)` instead. * If the return type is `DateTime` and the argument is larger than `2106-02-07 08:28:15`, the result will be calculated from the argument `2106-02-07 08:28:15` instead. * If the return type is `Date` and the argument is larger than `2149-06-06`, the result will be calculated from the argument `2149-06-06` instead. * If `toLastDayOfMonth` is called with an argument greater then `2149-05-31`, the result will be calculated from the argument `2149-05-31` instead. +* `enable_extended_results_for_datetime_functions = 1`: Functions `toStartOfYear`, `toStartOfISOYear`, `toStartOfQuarter`, `toStartOfMonth`, `toStartOfWeek`, `toLastDayOfMonth`, `toMonday` return `Date` or `DateTime` if their argument is a `Date` or `DateTime`, and they return `Date32` or `DateTime64` if their argument is a `Date32` or `DateTime64`. ::: ## toStartOfYear @@ -303,6 +305,8 @@ Returns the date. Rounds up a date or date with time to the last day of the month. Returns the date. +If `toLastDayOfMonth` is called with an argument of type `Date` greater then 2149-05-31, the result will be calculated from the argument 2149-05-31 instead. + ## toMonday Rounds down a date or date with time to the nearest Monday. @@ -641,6 +645,7 @@ Result: ## date\_diff Returns the difference between two dates or dates with time values. +The difference is calculated using relative units, e.g. the difference between `2022-01-01` and `2021-12-29` is 3 days for day unit (see [toRelativeDayNum](#torelativedaynum)), 1 month for month unit (see [toRelativeMonthNum](#torelativemonthnum)), 1 year for year unit (see [toRelativeYearNum](#torelativeyearnum)). **Syntax** @@ -692,6 +697,25 @@ Result: └────────────────────────────────────────────────────────────────────────────────────────┘ ``` +Query: + +``` sql +SELECT + toDate('2022-01-01') AS e, + toDate('2021-12-29') AS s, + dateDiff('day', s, e) AS day_diff, + dateDiff('month', s, e) AS month__diff, + dateDiff('year', s, e) AS year_diff; +``` + +Result: + +``` text +┌──────────e─┬──────────s─┬─day_diff─┬─month__diff─┬─year_diff─┐ +│ 2022-01-01 │ 2021-12-29 │ 3 │ 1 │ 1 │ +└────────────┴────────────┴──────────┴─────────────┴───────────┘ +``` + ## date\_sub Subtracts the time interval or date interval from the provided date or date with time. @@ -1039,9 +1063,9 @@ SELECT ## timeSlots(StartTime, Duration,\[, Size\]) -For a time interval starting at ‘StartTime’ and continuing for ‘Duration’ seconds, it returns an array of moments in time, consisting of points from this interval rounded down to the ‘Size’ in seconds. ‘Size’ is an optional parameter set to 1800 (30 minutes) by default. -This is necessary, for example, when searching for pageviews in the corresponding session. -Accepts DateTime and DateTime64 as ’StartTime’ argument. For DateTime, ’Duration’ and ’Size’ arguments must be `UInt32`. For ’DateTime64’ they must be `Decimal64`. +For a time interval starting at ‘StartTime’ and continuing for ‘Duration’ seconds, it returns an array of moments in time, consisting of points from this interval rounded down to the ‘Size’ in seconds. ‘Size’ is an optional parameter set to 1800 (30 minutes) by default. +This is necessary, for example, when searching for pageviews in the corresponding session. +Accepts DateTime and DateTime64 as ’StartTime’ argument. For DateTime, ’Duration’ and ’Size’ arguments must be `UInt32`. For ’DateTime64’ they must be `Decimal64`. Returns an array of DateTime/DateTime64 (return type matches the type of ’StartTime’). For DateTime64, the return value's scale can differ from the scale of ’StartTime’ --- the highest scale among all given arguments is taken. Example: @@ -1207,6 +1231,8 @@ Result: Function converts Unix timestamp to a calendar date and a time of a day. When there is only a single argument of [Integer](../../sql-reference/data-types/int-uint.md) type, it acts in the same way as [toDateTime](../../sql-reference/functions/type-conversion-functions.md#todatetime) and return [DateTime](../../sql-reference/data-types/datetime.md) type. +Alias: `fromUnixTimestamp`. + **Example:** Query: diff --git a/docs/en/sql-reference/functions/other-functions.md b/docs/en/sql-reference/functions/other-functions.md index d86eb6b45ae..b80d75e3611 100644 --- a/docs/en/sql-reference/functions/other-functions.md +++ b/docs/en/sql-reference/functions/other-functions.md @@ -1818,10 +1818,35 @@ Result: └──────────────────────────────────────────────────┘ ``` -## modelEvaluate(model_name, …) +## catboostEvaluate(path_to_model, feature_1, feature_2, …, feature_n) -Evaluate external model. -Accepts a model name and model arguments. Returns Float64. +Evaluate external catboost model. [CatBoost](https://catboost.ai) is an open-source gradient boosting library developed by Yandex for machine learing. +Accepts a path to a catboost model and model arguments (features). Returns Float64. + +``` sql +SELECT feat1, ..., feat_n, catboostEvaluate('/path/to/model.bin', feat_1, ..., feat_n) AS prediction +FROM data_table +``` + +**Prerequisites** + +1. Build the catboost evaluation library + +Before evaluating catboost models, the `libcatboostmodel.` library must be made available. See [CatBoost documentation](https://catboost.ai/docs/concepts/c-plus-plus-api_dynamic-c-pluplus-wrapper.html) how to compile it. + +Next, specify the path to `libcatboostmodel.` in the clickhouse configuration: + +``` xml + +... + /path/to/libcatboostmodel.so +... + +``` + +2. Train a catboost model using libcatboost + +See [Training and applying models](https://catboost.ai/docs/features/training.html#training) for how to train catboost models from a training data set. ## throwIf(x\[, message\[, error_code\]\]) diff --git a/docs/en/sql-reference/statements/alter/delete.md b/docs/en/sql-reference/statements/alter/delete.md index 809715b5423..ba5d01d9b4d 100644 --- a/docs/en/sql-reference/statements/alter/delete.md +++ b/docs/en/sql-reference/statements/alter/delete.md @@ -12,8 +12,9 @@ ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr Deletes data matching the specified filtering expression. Implemented as a [mutation](../../../sql-reference/statements/alter/index.md#mutations). -:::note -The `ALTER TABLE` prefix makes this syntax different from most other systems supporting SQL. It is intended to signify that unlike similar queries in OLTP databases this is a heavy operation not designed for frequent use. + +:::note +The `ALTER TABLE` prefix makes this syntax different from most other systems supporting SQL. It is intended to signify that unlike similar queries in OLTP databases this is a heavy operation not designed for frequent use. `ALTER TABLE` is considered a heavyweight operation that requires the underlying data to be merged before it is deleted. For MergeTree tables, consider using the [`DELETE FROM` query](../delete.md), which performs a lightweight delete and can be considerably faster. ::: The `filter_expr` must be of type `UInt8`. The query deletes rows in the table for which this expression takes a non-zero value. diff --git a/docs/en/sql-reference/statements/alter/role.md b/docs/en/sql-reference/statements/alter/role.md index 2bee9fd0dc6..c068d6c4fce 100644 --- a/docs/en/sql-reference/statements/alter/role.md +++ b/docs/en/sql-reference/statements/alter/role.md @@ -13,5 +13,5 @@ Syntax: ``` sql ALTER ROLE [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...] ``` diff --git a/docs/en/sql-reference/statements/alter/settings-profile.md b/docs/en/sql-reference/statements/alter/settings-profile.md index 234bb22ae14..adfe65e3c80 100644 --- a/docs/en/sql-reference/statements/alter/settings-profile.md +++ b/docs/en/sql-reference/statements/alter/settings-profile.md @@ -13,5 +13,5 @@ Syntax: ``` sql ALTER SETTINGS PROFILE [IF EXISTS] TO name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | INHERIT 'profile_name'] [,...] ``` diff --git a/docs/en/sql-reference/statements/create/role.md b/docs/en/sql-reference/statements/create/role.md index 84b02042fe9..6c80204688b 100644 --- a/docs/en/sql-reference/statements/create/role.md +++ b/docs/en/sql-reference/statements/create/role.md @@ -11,7 +11,7 @@ Syntax: ``` sql CREATE ROLE [IF NOT EXISTS | OR REPLACE] name1 [, name2 ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...] ``` ## Managing Roles diff --git a/docs/en/sql-reference/statements/create/settings-profile.md b/docs/en/sql-reference/statements/create/settings-profile.md index 4c7e4c30ea0..8883b22896b 100644 --- a/docs/en/sql-reference/statements/create/settings-profile.md +++ b/docs/en/sql-reference/statements/create/settings-profile.md @@ -12,7 +12,7 @@ Syntax: ``` sql CREATE SETTINGS PROFILE [IF NOT EXISTS | OR REPLACE] TO name1 [ON CLUSTER cluster_name1] [, name2 [ON CLUSTER cluster_name2] ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | INHERIT 'profile_name'] [,...] ``` `ON CLUSTER` clause allows creating settings profiles on a cluster, see [Distributed DDL](../../../sql-reference/distributed-ddl.md). diff --git a/docs/en/sql-reference/statements/create/view.md b/docs/en/sql-reference/statements/create/view.md index da68ca05bbb..14c06ee0336 100644 --- a/docs/en/sql-reference/statements/create/view.md +++ b/docs/en/sql-reference/statements/create/view.md @@ -6,7 +6,7 @@ sidebar_label: VIEW # CREATE VIEW -Creates a new view. Views can be [normal](#normal), [materialized](#materialized), [live](#live-view), and [window](#window-view) (live view and window view are experimental features). +Creates a new view. Views can be [normal](#normal-view), [materialized](#materialized-view), [live](#live-view-experimental), and [window](#window-view-experimental) (live view and window view are experimental features). ## Normal View diff --git a/docs/en/sql-reference/statements/delete.md b/docs/en/sql-reference/statements/delete.md new file mode 100644 index 00000000000..0dc6cc0d09a --- /dev/null +++ b/docs/en/sql-reference/statements/delete.md @@ -0,0 +1,43 @@ +--- +slug: /en/sql-reference/statements/delete +sidebar_position: 36 +sidebar_label: DELETE +--- + +# DELETE Statement + +``` sql +DELETE FROM [db.]table [WHERE expr] +``` + +`DELETE FROM` removes rows from table `[db.]table` that match expression `expr`. The deleted rows are marked as deleted immediately and will be automatically filtered out of all subsequent queries. Cleanup of data happens asynchronously in background. This feature is only available for MergeTree table engine family. + +For example, the following query deletes all rows from the `hits` table where the `Title` column contains the text `hello`: + +```sql +DELETE FROM hits WHERE Title LIKE '%hello%'; +``` + +Lightweight deletes are asynchronous by default. Set `mutations_sync` equal to 1 to wait for one replica to process the statement, and set `mutations_sync` to 2 to wait for all replicas. + +:::note +This feature is experimental and requires you to set `allow_experimental_lightweight_delete` to true: + +```sql +SET allow_experimental_lightweight_delete = true; +``` + +::: + +An [alternative way to delete rows](./alter/delete.md) in ClickHouse is `ALTER TABLE ... DELETE`, which might be more efficient if you do bulk deletes only occasionally and don't need the operation to be applied instantly. In most use cases the new lightweight `DELETE FROM` behavior will be considerably faster. + +:::warning +Even though deletes are becoming more lightweight in ClickHouse, they should still not be used as aggressively as on an OLTP system. Ligthweight deletes are currently efficient for wide parts, but for compact parts they can be a heavyweight operation, and it may be better to use `ALTER TABLE` for some scenarios. +::: + +:::note +`DELETE FROM` requires the `ALTER DELETE` privilege: +```sql +grant ALTER DELETE ON db.table to username; +``` +::: diff --git a/docs/en/sql-reference/statements/detach.md b/docs/en/sql-reference/statements/detach.md index c7089b0714d..aa87b1ef613 100644 --- a/docs/en/sql-reference/statements/detach.md +++ b/docs/en/sql-reference/statements/detach.md @@ -10,7 +10,7 @@ Makes the server "forget" about the existence of a table, a materialized view, o **Syntax** ``` sql -DETACH TABLE|VIEW|DICTIONARY [IF EXISTS] [db.]name [ON CLUSTER cluster] [PERMANENTLY] +DETACH TABLE|VIEW|DICTIONARY [IF EXISTS] [db.]name [ON CLUSTER cluster] [PERMANENTLY] [SYNC] ``` Detaching does not delete the data or metadata of a table, a materialized view or a dictionary. If an entity was not detached `PERMANENTLY`, on the next server launch the server will read the metadata and recall the table/view/dictionary again. If an entity was detached `PERMANENTLY`, there will be no automatic recall. @@ -24,6 +24,8 @@ Note that you can not detach permanently the table which is already detached (te Also you can not [DROP](../../sql-reference/statements/drop#drop-table) the detached table, or [CREATE TABLE](../../sql-reference/statements/create/table.md) with the same name as detached permanently, or replace it with the other table with [RENAME TABLE](../../sql-reference/statements/rename.md) query. +The `SYNC` modifier executes the action without delay. + **Example** Creating a table: diff --git a/docs/en/sql-reference/statements/drop.md b/docs/en/sql-reference/statements/drop.md index 28d379421f1..8a83a8fae1d 100644 --- a/docs/en/sql-reference/statements/drop.md +++ b/docs/en/sql-reference/statements/drop.md @@ -6,7 +6,7 @@ sidebar_label: DROP # DROP Statements -Deletes existing entity. If the `IF EXISTS` clause is specified, these queries do not return an error if the entity does not exist. +Deletes existing entity. If the `IF EXISTS` clause is specified, these queries do not return an error if the entity does not exist. If the `SYNC` modifier is specified, the entity is dropped without delay. ## DROP DATABASE @@ -15,7 +15,7 @@ Deletes all tables inside the `db` database, then deletes the `db` database itse Syntax: ``` sql -DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster] +DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster] [SYNC] ``` ## DROP TABLE @@ -25,7 +25,7 @@ Deletes the table. Syntax: ``` sql -DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster] +DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster] [SYNC] ``` ## DROP DICTIONARY @@ -35,7 +35,7 @@ Deletes the dictionary. Syntax: ``` sql -DROP DICTIONARY [IF EXISTS] [db.]name +DROP DICTIONARY [IF EXISTS] [db.]name [SYNC] ``` ## DROP USER @@ -95,7 +95,7 @@ Deletes a view. Views can be deleted by a `DROP TABLE` command as well but `DROP Syntax: ``` sql -DROP VIEW [IF EXISTS] [db.]name [ON CLUSTER cluster] +DROP VIEW [IF EXISTS] [db.]name [ON CLUSTER cluster] [SYNC] ``` ## DROP FUNCTION diff --git a/docs/en/sql-reference/statements/select/group-by.md b/docs/en/sql-reference/statements/select/group-by.md index b5e194343ca..ac02e9ab5a1 100644 --- a/docs/en/sql-reference/statements/select/group-by.md +++ b/docs/en/sql-reference/statements/select/group-by.md @@ -213,9 +213,10 @@ If the `WITH TOTALS` modifier is specified, another row will be calculated. This This extra row is only produced in `JSON*`, `TabSeparated*`, and `Pretty*` formats, separately from the other rows: -- In `JSON*` formats, this row is output as a separate ‘totals’ field. -- In `TabSeparated*` formats, the row comes after the main result, preceded by an empty row (after the other data). +- In `XML` and `JSON*` formats, this row is output as a separate ‘totals’ field. +- In `TabSeparated*`, `CSV*` and `Vertical` formats, the row comes after the main result, preceded by an empty row (after the other data). - In `Pretty*` formats, the row is output as a separate table after the main result. +- In `Template` format, the row is output according to specified template. - In the other formats it is not available. :::note diff --git a/docs/en/sql-reference/statements/select/index.md b/docs/en/sql-reference/statements/select/index.md index c1692bd9b29..de190aaf982 100644 --- a/docs/en/sql-reference/statements/select/index.md +++ b/docs/en/sql-reference/statements/select/index.md @@ -135,9 +135,9 @@ In all other cases, we do not recommend using the asterisk, since it only gives In addition to results, you can also get minimum and maximum values for the results columns. To do this, set the **extremes** setting to 1. Minimums and maximums are calculated for numeric types, dates, and dates with times. For other columns, the default values are output. -An extra two rows are calculated – the minimums and maximums, respectively. These extra two rows are output in `JSON*`, `TabSeparated*`, and `Pretty*` [formats](../../../interfaces/formats.md), separate from the other rows. They are not output for other formats. +An extra two rows are calculated – the minimums and maximums, respectively. These extra two rows are output in `XML`, `JSON*`, `TabSeparated*`, `CSV*`, `Vertical`, `Template` and `Pretty*` [formats](../../../interfaces/formats.md), separate from the other rows. They are not output for other formats. -In `JSON*` formats, the extreme values are output in a separate ‘extremes’ field. In `TabSeparated*` formats, the row comes after the main result, and after ‘totals’ if present. It is preceded by an empty row (after the other data). In `Pretty*` formats, the row is output as a separate table after the main result, and after `totals` if present. +In `JSON*` and `XML` formats, the extreme values are output in a separate ‘extremes’ field. In `TabSeparated*`, `CSV*` and `Vertical` formats, the row comes after the main result, and after ‘totals’ if present. It is preceded by an empty row (after the other data). In `Pretty*` formats, the row is output as a separate table after the main result, and after `totals` if present. In `Template` format the extreme values are output according to specified template. Extreme values are calculated for rows before `LIMIT`, but after `LIMIT BY`. However, when using `LIMIT offset, size`, the rows before `offset` are included in `extremes`. In stream requests, the result may also include a small number of rows that passed through `LIMIT`. diff --git a/docs/en/sql-reference/statements/show.md b/docs/en/sql-reference/statements/show.md index 00347d9cb5b..87248bb115b 100644 --- a/docs/en/sql-reference/statements/show.md +++ b/docs/en/sql-reference/statements/show.md @@ -362,7 +362,7 @@ SHOW ACCESS Returns a list of clusters. All available clusters are listed in the [system.clusters](../../operations/system-tables/clusters.md) table. -:::note +:::note `SHOW CLUSTER name` query displays the contents of system.clusters table for this cluster. ::: @@ -493,6 +493,20 @@ Result: └──────────────────┴────────┴─────────────┘ ``` +## SHOW FILESYSTEM CACHES + +```sql +SHOW FILESYSTEM CACHES +``` + +Result: + +``` text +┌─Caches────┐ +│ s3_cache │ +└───────────┘ +``` + **See Also** - [system.settings](../../operations/system-tables/settings.md) table diff --git a/docs/en/sql-reference/statements/system.md b/docs/en/sql-reference/statements/system.md index 9b7527caaa9..e9ff4d45c79 100644 --- a/docs/en/sql-reference/statements/system.md +++ b/docs/en/sql-reference/statements/system.md @@ -6,45 +6,6 @@ sidebar_label: SYSTEM # SYSTEM Statements -The list of available `SYSTEM` statements: - -- [RELOAD EMBEDDED DICTIONARIES](#query_language-system-reload-emdedded-dictionaries) -- [RELOAD DICTIONARIES](#query_language-system-reload-dictionaries) -- [RELOAD DICTIONARY](#query_language-system-reload-dictionary) -- [RELOAD MODELS](#query_language-system-reload-models) -- [RELOAD MODEL](#query_language-system-reload-model) -- [RELOAD FUNCTIONS](#query_language-system-reload-functions) -- [RELOAD FUNCTION](#query_language-system-reload-functions) -- [DROP DNS CACHE](#query_language-system-drop-dns-cache) -- [DROP MARK CACHE](#query_language-system-drop-mark-cache) -- [DROP UNCOMPRESSED CACHE](#query_language-system-drop-uncompressed-cache) -- [DROP COMPILED EXPRESSION CACHE](#query_language-system-drop-compiled-expression-cache) -- [DROP REPLICA](#query_language-system-drop-replica) -- [FLUSH LOGS](#query_language-system-flush_logs) -- [RELOAD CONFIG](#query_language-system-reload-config) -- [SHUTDOWN](#query_language-system-shutdown) -- [KILL](#query_language-system-kill) -- [STOP DISTRIBUTED SENDS](#query_language-system-stop-distributed-sends) -- [FLUSH DISTRIBUTED](#query_language-system-flush-distributed) -- [START DISTRIBUTED SENDS](#query_language-system-start-distributed-sends) -- [STOP MERGES](#query_language-system-stop-merges) -- [START MERGES](#query_language-system-start-merges) -- [STOP TTL MERGES](#query_language-stop-ttl-merges) -- [START TTL MERGES](#query_language-start-ttl-merges) -- [STOP MOVES](#query_language-stop-moves) -- [START MOVES](#query_language-start-moves) -- [SYSTEM UNFREEZE](#query_language-system-unfreeze) -- [STOP FETCHES](#query_language-system-stop-fetches) -- [START FETCHES](#query_language-system-start-fetches) -- [STOP REPLICATED SENDS](#query_language-system-start-replicated-sends) -- [START REPLICATED SENDS](#query_language-system-start-replicated-sends) -- [STOP REPLICATION QUEUES](#query_language-system-stop-replication-queues) -- [START REPLICATION QUEUES](#query_language-system-start-replication-queues) -- [SYNC REPLICA](#query_language-system-sync-replica) -- [RESTART REPLICA](#query_language-system-restart-replica) -- [RESTORE REPLICA](#query_language-system-restore-replica) -- [RESTART REPLICAS](#query_language-system-restart-replicas) - ## RELOAD EMBEDDED DICTIONARIES Reload all [Internal dictionaries](../../sql-reference/dictionaries/internal-dicts.md). @@ -69,7 +30,12 @@ SELECT name, status FROM system.dictionaries; ## RELOAD MODELS -Reloads all [CatBoost](../../guides/developer/apply-catboost-model.md) models if the configuration was updated without restarting the server. +:::note +This statement and `SYSTEM RELOAD MODEL` merely unload catboost models from the clickhouse-library-bridge. The function `catboostEvaluate()` +loads a model upon first access if it is not loaded yet. +::: + +Unloads all CatBoost models. **Syntax** @@ -79,12 +45,12 @@ SYSTEM RELOAD MODELS [ON CLUSTER cluster_name] ## RELOAD MODEL -Completely reloads a CatBoost model `model_name` if the configuration was updated without restarting the server. +Unloads a CatBoost model at `model_path`. **Syntax** ```sql -SYSTEM RELOAD MODEL [ON CLUSTER cluster_name] +SYSTEM RELOAD MODEL [ON CLUSTER cluster_name] ``` ## RELOAD FUNCTIONS @@ -193,7 +159,7 @@ Provides possibility to stop background merges for tables in the MergeTree famil SYSTEM STOP MERGES [ON VOLUME | [db.]merge_tree_family_table_name] ``` -:::note +:::note `DETACH / ATTACH` table will start background merges for the table even in case when merges have been stopped for all MergeTree tables before. ::: @@ -337,7 +303,7 @@ One may execute query after: Replica attaches locally found parts and sends info about them to Zookeeper. Parts present on a replica before metadata loss are not re-fetched from other ones if not being outdated (so replica restoration does not mean re-downloading all data over the network). -:::warning +:::warning Parts in all states are moved to `detached/` folder. Parts active before data loss (committed) are attached. ::: @@ -379,3 +345,11 @@ SYSTEM RESTORE REPLICA test ON CLUSTER cluster; ### RESTART REPLICAS Provides possibility to reinitialize Zookeeper sessions state for all `ReplicatedMergeTree` tables, will compare current state with Zookeeper as source of true and add tasks to Zookeeper queue if needed + +### DROP FILESYSTEM CACHE + +Allows to drop filesystem cache. + +```sql +SYSTEM DROP FILESYSTEM CACHE +``` diff --git a/docs/en/sql-reference/table-functions/file.md b/docs/en/sql-reference/table-functions/file.md index a110bfbd15c..f40107aaaca 100644 --- a/docs/en/sql-reference/table-functions/file.md +++ b/docs/en/sql-reference/table-functions/file.md @@ -13,7 +13,7 @@ Creates a table from a file. This table function is similar to [url](../../sql-r **Syntax** ``` sql -file(path, format, structure) +file(path [,format] [,structure]) ``` **Parameters** diff --git a/docs/en/sql-reference/table-functions/s3.md b/docs/en/sql-reference/table-functions/s3.md index 2df7d6e46b3..545037665bb 100644 --- a/docs/en/sql-reference/table-functions/s3.md +++ b/docs/en/sql-reference/table-functions/s3.md @@ -11,7 +11,7 @@ Provides table-like interface to select/insert files in [Amazon S3](https://aws. **Syntax** ``` sql -s3(path, [aws_access_key_id, aws_secret_access_key,] format, structure, [compression]) +s3(path [,aws_access_key_id, aws_secret_access_key] [,format] [,structure] [,compression]) ``` **Arguments** diff --git a/docs/en/sql-reference/table-functions/s3Cluster.md b/docs/en/sql-reference/table-functions/s3Cluster.md index 9d006af9572..b81fc51fd18 100644 --- a/docs/en/sql-reference/table-functions/s3Cluster.md +++ b/docs/en/sql-reference/table-functions/s3Cluster.md @@ -10,7 +10,7 @@ Allows processing files from [Amazon S3](https://aws.amazon.com/s3/) in parallel **Syntax** ``` sql -s3Cluster(cluster_name, source, [access_key_id, secret_access_key,] format, structure) +s3Cluster(cluster_name, source, [,access_key_id, secret_access_key] [,format] [,structure]) ``` **Arguments** diff --git a/docs/en/sql-reference/table-functions/url.md b/docs/en/sql-reference/table-functions/url.md index f1ed7b4dfe4..014dc3ae853 100644 --- a/docs/en/sql-reference/table-functions/url.md +++ b/docs/en/sql-reference/table-functions/url.md @@ -13,7 +13,7 @@ sidebar_label: url **Syntax** ``` sql -url(URL, format, structure) +url(URL [,format] [,structure]) ``` **Parameters** diff --git a/docs/redirects.txt b/docs/redirects.txt index 949b9d48ca8..cea138f7237 100644 --- a/docs/redirects.txt +++ b/docs/redirects.txt @@ -155,7 +155,6 @@ getting_started/index.md getting-started/index.md getting_started/install.md getting-started/install.md getting_started/playground.md getting-started/playground.md getting_started/tutorial.md getting-started/tutorial.md -guides/apply_catboost_model.md guides/apply-catboost-model.md images/column_oriented.gif images/column-oriented.gif images/row_oriented.gif images/row-oriented.gif interfaces/http_interface.md interfaces/http.md diff --git a/docs/ru/engines/table-engines/special/external-data.md b/docs/ru/engines/table-engines/special/external-data.md index 95ae1aa9059..b98039f768a 100644 --- a/docs/ru/engines/table-engines/special/external-data.md +++ b/docs/ru/engines/table-engines/special/external-data.md @@ -22,17 +22,17 @@ ClickHouse позволяет отправить на сервер данные, Таких секций может быть несколько - по числу передаваемых таблиц. -**–external** - маркер начала секции. -**–file** - путь к файлу с дампом таблицы, или -, что обозначает stdin. -Из stdin может быть считана только одна таблица. +- **--external** - маркер начала секции. +- **--file** - путь к файлу с дампом таблицы, или `-`, что обозначает `stdin`. +Из `stdin` может быть считана только одна таблица. Следующие параметры не обязательные: -**–name** - имя таблицы. Если не указано - используется _data. -**–format** - формат данных в файле. Если не указано - используется TabSeparated. +- **--name** - имя таблицы. Если не указано - используется _data. +- **--format** - формат данных в файле. Если не указано - используется TabSeparated. Должен быть указан один из следующих параметров: -**–types** - список типов столбцов через запятую. Например, `UInt64,String`. Столбцы будут названы _1, _2, … -**–structure** - структура таблицы, в форме `UserID UInt64`, `URL String`. Определяет имена и типы столбцов. +- **--types** - список типов столбцов через запятую. Например, `UInt64,String`. Столбцы будут названы _1, _2, … +- **--structure** - структура таблицы, в форме `UserID UInt64`, `URL String`. Определяет имена и типы столбцов. Файлы, указанные в file, будут разобраны форматом, указанным в format, с использованием типов данных, указанных в types или structure. Таблица будет загружена на сервер, и доступна там в качестве временной таблицы с именем name. diff --git a/docs/ru/guides/apply-catboost-model.md b/docs/ru/guides/apply-catboost-model.md deleted file mode 100644 index 68d7042df2d..00000000000 --- a/docs/ru/guides/apply-catboost-model.md +++ /dev/null @@ -1,241 +0,0 @@ ---- -slug: /ru/guides/apply-catboost-model -sidebar_position: 41 -sidebar_label: "Применение модели CatBoost в ClickHouse" ---- - -# Применение модели CatBoost в ClickHouse {#applying-catboost-model-in-clickhouse} - -[CatBoost](https://catboost.ai) — открытая программная библиотека разработанная компанией [Яндекс](https://yandex.ru/company/) для машинного обучения, которая использует схему градиентного бустинга. - -С помощью этой инструкции вы научитесь применять предобученные модели в ClickHouse: в результате вы запустите вывод модели из SQL. - -Чтобы применить модель CatBoost в ClickHouse: - -1. [Создайте таблицу](#create-table). -2. [Вставьте данные в таблицу](#insert-data-to-table). -3. [Интегрируйте CatBoost в ClickHouse](#integrate-catboost-into-clickhouse) (Опциональный шаг). -4. [Запустите вывод модели из SQL](#run-model-inference). - -Подробнее об обучении моделей в CatBoost, см. [Обучение и применение моделей](https://catboost.ai/docs/features/training.html#training). - -Вы можете перегрузить модели CatBoost, если их конфигурация была обновлена, без перезагрузки сервера. Для этого используйте системные запросы [RELOAD MODEL](../sql-reference/statements/system.md#query_language-system-reload-model) и [RELOAD MODELS](../sql-reference/statements/system.md#query_language-system-reload-models). - -## Перед началом работы {#prerequisites} - -Если у вас еще нет [Docker](https://docs.docker.com/install/), установите его. - - :::note "Примечание" - [Docker](https://www.docker.com) – это программная платформа для создания контейнеров, которые изолируют установку CatBoost и ClickHouse от остальной части системы. - ::: -Перед применением модели CatBoost: - -**1.** Скачайте [Docker-образ](https://hub.docker.com/r/yandex/tutorial-catboost-clickhouse) из реестра: - -``` bash -$ docker pull yandex/tutorial-catboost-clickhouse -``` - -Данный Docker-образ содержит все необходимое для запуска CatBoost и ClickHouse: код, среду выполнения, библиотеки, переменные окружения и файлы конфигурации. - -**2.** Проверьте, что Docker-образ успешно скачался: - -``` bash -$ docker image ls -REPOSITORY TAG IMAGE ID CREATED SIZE -yandex/tutorial-catboost-clickhouse latest 622e4d17945b 22 hours ago 1.37GB -``` - -**3.** Запустите Docker-контейнер основанный на данном образе: - -``` bash -$ docker run -it -p 8888:8888 yandex/tutorial-catboost-clickhouse -``` - -## 1. Создайте таблицу {#create-table} - -Чтобы создать таблицу для обучающей выборки: - -**1.** Запустите клиент ClickHouse: - -``` bash -$ clickhouse client -``` - - :::note "Примечание" - Сервер ClickHouse уже запущен внутри Docker-контейнера. - ::: -**2.** Создайте таблицу в ClickHouse с помощью следующей команды: - -``` sql -:) CREATE TABLE amazon_train -( - date Date MATERIALIZED today(), - ACTION UInt8, - RESOURCE UInt32, - MGR_ID UInt32, - ROLE_ROLLUP_1 UInt32, - ROLE_ROLLUP_2 UInt32, - ROLE_DEPTNAME UInt32, - ROLE_TITLE UInt32, - ROLE_FAMILY_DESC UInt32, - ROLE_FAMILY UInt32, - ROLE_CODE UInt32 -) -ENGINE = MergeTree ORDER BY date -``` - -**3.** Выйдите из клиента ClickHouse: - -``` sql -:) exit -``` - -## 2. Вставьте данные в таблицу {#insert-data-to-table} - -Чтобы вставить данные: - -**1.** Выполните следующую команду: - -``` bash -$ clickhouse client --host 127.0.0.1 --query 'INSERT INTO amazon_train FORMAT CSVWithNames' < ~/amazon/train.csv -``` - -**2.** Запустите клиент ClickHouse: - -``` bash -$ clickhouse client -``` - -**3.** Проверьте, что данные успешно загрузились: - -``` sql -:) SELECT count() FROM amazon_train - -SELECT count() -FROM amazon_train - -+-count()-+ -| 65538 | -+---------+ -``` - -## 3. Интегрируйте CatBoost в ClickHouse {#integrate-catboost-into-clickhouse} - - :::note "Примечание" - **Опциональный шаг.** Docker-образ содержит все необходимое для запуска CatBoost и ClickHouse. - ::: -Чтобы интегрировать CatBoost в ClickHouse: - -**1.** Создайте библиотеку для оценки модели. - -Наиболее быстрый способ оценить модель CatBoost — это скомпилировать библиотеку `libcatboostmodel.`. Подробнее о том, как скомпилировать библиотеку, читайте в [документации CatBoost](https://catboost.ai/docs/concepts/c-plus-plus-api_dynamic-c-pluplus-wrapper.html). - -**2.** Создайте в любом месте новую директорию с произвольным названием, например `data` и поместите в нее созданную библиотеку. Docker-образ уже содержит библиотеку `data/libcatboostmodel.so`. - -**3.** Создайте в любом месте новую директорию для конфигурации модели с произвольным названием, например `models`. - -**4.** Создайте файл конфигурации модели с произвольным названием, например `models/amazon_model.xml`. - -**5.** Опишите конфигурацию модели: - -``` xml - - - - catboost - - amazon - - /home/catboost/tutorial/catboost_model.bin - - 0 - - -``` - -**6.** Добавьте в конфигурацию ClickHouse путь к CatBoost и конфигурации модели: - -``` xml - -/home/catboost/data/libcatboostmodel.so -/home/catboost/models/*_model.xml -``` - :::note "Примечание" - Вы можете позднее изменить путь к конфигурации модели CatBoost без перезагрузки сервера. - ::: -## 4. Запустите вывод модели из SQL {#run-model-inference} - -Для тестирования модели запустите клиент ClickHouse `$ clickhouse client`. - -Проверьте, что модель работает: - -``` sql -:) SELECT - modelEvaluate('amazon', - RESOURCE, - MGR_ID, - ROLE_ROLLUP_1, - ROLE_ROLLUP_2, - ROLE_DEPTNAME, - ROLE_TITLE, - ROLE_FAMILY_DESC, - ROLE_FAMILY, - ROLE_CODE) > 0 AS prediction, - ACTION AS target -FROM amazon_train -LIMIT 10 -``` - - :::note "Примечание" - Функция [modelEvaluate](../sql-reference/functions/other-functions.md#function-modelevaluate) возвращает кортежи (tuple) с исходными прогнозами по классам для моделей с несколькими классами. - ::: -Спрогнозируйте вероятность: - -``` sql -:) SELECT - modelEvaluate('amazon', - RESOURCE, - MGR_ID, - ROLE_ROLLUP_1, - ROLE_ROLLUP_2, - ROLE_DEPTNAME, - ROLE_TITLE, - ROLE_FAMILY_DESC, - ROLE_FAMILY, - ROLE_CODE) AS prediction, - 1. / (1 + exp(-prediction)) AS probability, - ACTION AS target -FROM amazon_train -LIMIT 10 -``` - - :::note "Примечание" - Подробнее про функцию [exp()](../sql-reference/functions/math-functions.md). - ::: -Посчитайте логистическую функцию потерь (LogLoss) на всей выборке: - -``` sql -:) SELECT -avg(tg * log(prob) + (1 - tg) * log(1 - prob)) AS logloss -FROM -( - SELECT - modelEvaluate('amazon', - RESOURCE, - MGR_ID, - ROLE_ROLLUP_1, - ROLE_ROLLUP_2, - ROLE_DEPTNAME, - ROLE_TITLE, - ROLE_FAMILY_DESC, - ROLE_FAMILY, - ROLE_CODE) AS prediction, - 1. / (1. + exp(-prediction)) AS prob, - ACTION AS tg - FROM amazon_train -) -``` - - :::note "Примечание" - Подробнее про функции [avg()](../sql-reference/aggregate-functions/reference/avg.md#agg_function-avg), [log()](../sql-reference/functions/math-functions.md). - ::: \ No newline at end of file diff --git a/docs/ru/guides/index.md b/docs/ru/guides/index.md index 0b5938dfc09..882f71b5700 100644 --- a/docs/ru/guides/index.md +++ b/docs/ru/guides/index.md @@ -7,5 +7,3 @@ sidebar_label: "Руководства" # Руководства {#rukovodstva} Подробные пошаговые инструкции, которые помогут вам решать различные задачи с помощью ClickHouse. - -- [Применение модели CatBoost в ClickHouse](apply-catboost-model.md) diff --git a/docs/ru/operations/settings/settings.md b/docs/ru/operations/settings/settings.md index 5ddc684ce2a..0d4f0c63210 100644 --- a/docs/ru/operations/settings/settings.md +++ b/docs/ru/operations/settings/settings.md @@ -3799,6 +3799,17 @@ Exception: Total regexp lengths too large. Значение по умолчанию: `1`. +## enable_extended_results_for_datetime_functions {#enable-extended-results-for-datetime-functions} + +Включает или отключает возвращение результатов типа `Date32` с расширенным диапазоном (по сравнению с типом `Date`) для функций [toStartOfYear](../../sql-reference/functions/date-time-functions.md#tostartofyear), [toStartOfISOYear](../../sql-reference/functions/date-time-functions.md#tostartofisoyear), [toStartOfQuarter](../../sql-reference/functions/date-time-functions.md#tostartofquarter), [toStartOfMonth](../../sql-reference/functions/date-time-functions.md#tostartofmonth), [toStartOfWeek](../../sql-reference/functions/date-time-functions.md#tostartofweek), [toMonday](../../sql-reference/functions/date-time-functions.md#tomonday) и [toLastDayOfMonth](../../sql-reference/functions/date-time-functions.md#tolastdayofmonth). + +Возможные значения: + +- 0 — Функции возвращают результаты типа `Date` для всех типов аргументов. +- 1 — Функции возвращают результаты типа `Date32` для аргументов типа `Date32` или `DateTime64` и возвращают `Date` в других случаях. + +Значение по умолчанию: `0`. + **Пример** Запрос: diff --git a/docs/ru/sql-reference/functions/date-time-functions.md b/docs/ru/sql-reference/functions/date-time-functions.md index 1c623cd1dab..27689426cbe 100644 --- a/docs/ru/sql-reference/functions/date-time-functions.md +++ b/docs/ru/sql-reference/functions/date-time-functions.md @@ -268,24 +268,18 @@ SELECT toUnixTimestamp('2017-11-05 08:07:47', 'Asia/Tokyo') AS unix_timestamp; ``` :::note -Тип возвращаемого описанными далее функциями `toStartOf*`, `toMonday` значения - `Date` или `DateTime`. -Хотя эти функции могут принимать значения типа `Date32` или `DateTime64` в качестве аргумента, при обработке аргумента вне нормального диапазона значений (`1970` - `2148` для `Date` и `1970-01-01 00:00:00`-`2106-02-07 08:28:15` для `DateTime`) будет получен некорректный результат. -Возвращаемые значения для значений вне нормального диапазона: -* `1970-01-01 (00:00:00)` будет возвращён для моментов времени до 1970 года, -* `2106-02-07 08:28:15` будет взят в качестве аргумента, если полученный аргумент превосходит данное значение и возвращаемый тип - `DateTime`, -* `2149-06-06` будет взят в качестве аргумента, если полученный аргумент превосходит данное значение и возвращаемый тип - `Date`, -* `2149-05-31` будет результатом функции `toLastDayOfMonth` при обработке аргумента больше `2149-05-31`. +Тип возвращаемого значения описанными далее функциями `toStartOf*`, `toLastDayOfMonth`, `toMonday` определяется конфигурационным параметром [enable_extended_results_for_datetime_functions](../../operations/settings/settings#enable-extended-results-for-datetime-functions) имеющим по умолчанию значение `0`. + +Поведение для +* `enable_extended_results_for_datetime_functions = 0`: Функции `toStartOf*`, `toLastDayOfMonth`, `toMonday` возвращают `Date` или `DateTime`. Хотя эти функции могут принимать значения типа `Date32` или `DateTime64` в качестве аргумента, при обработке аргумента вне нормального диапазона значений (`1970` - `2148` для `Date` и `1970-01-01 00:00:00`-`2106-02-07 08:28:15` для `DateTime`) будет получен некорректный результат. +В случае если значение аргумента вне нормального диапазона: + * `1970-01-01 (00:00:00)` будет возвращён для моментов времени до 1970 года, + * `2106-02-07 08:28:15` будет взят в качестве аргумента, если полученный аргумент превосходит данное значение и возвращаемый тип - `DateTime`, + * `2149-06-06` будет взят в качестве аргумента, если полученный аргумент превосходит данное значение и возвращаемый тип - `Date`, + * `2149-05-31` будет результатом функции `toLastDayOfMonth` при обработке аргумента больше `2149-05-31`. +* `enable_extended_results_for_datetime_functions = 1`: Функции `toStartOfYear`, `toStartOfISOYear`, `toStartOfQuarter`, `toStartOfMonth`, `toStartOfWeek`, `toLastDayOfMonth`, `toMonday` возвращают `Date` или `DateTime` если их аргумент `Date` или `DateTime` и они возвращают `Date32` или `DateTime64` если их аргумент `Date32` или `DateTime64`. ::: -:::note -Тип возвращаемого описанными далее функциями `toStartOf*`, `toLastDayOfMonth`, `toMonday` значения - `Date` или `DateTime`. -Хотя эти функции могут принимать значения типа `Date32` или `DateTime64` в качестве аргумента, при обработке аргумента вне нормального диапазона значений (`1970` - `2148` для `Date` и `1970-01-01 00:00:00`-`2106-02-07 08:28:15` для `DateTime`) будет получен некорректный результат. -Возвращаемые значения для значений вне нормального диапазона: -* `1970-01-01 (00:00:00)` будет возвращён для моментов времени до 1970 года, -* `2106-02-07 08:28:15` будет взят в качестве аргумента, если полученный аргумент превосходит данное значение и возвращаемый тип - `DateTime`, -* `2149-06-06` будет взят в качестве аргумента, если полученный аргумент превосходит данное значение и возвращаемый тип - `Date`. - ::: -* ## toStartOfYear {#tostartofyear} Округляет дату или дату-с-временем вниз до первого дня года. @@ -324,6 +318,8 @@ SELECT toStartOfISOYear(toDate('2017-01-01')) AS ISOYear20170101; Округляет дату или дату-с-временем до последнего числа месяца. Возвращается дата. +Если `toLastDayOfMonth` вызывается с аргументом типа `Date` большим чем 2149-05-31, то результат будет вычислен от аргумента 2149-05-31. + ## toMonday {#tomonday} Округляет дату или дату-с-временем вниз до ближайшего понедельника. @@ -977,7 +973,7 @@ SELECT now('Europe/Moscow'); ## timeSlots(StartTime, Duration,\[, Size\]) {#timeslotsstarttime-duration-size} Для интервала, начинающегося в `StartTime` и длящегося `Duration` секунд, возвращает массив моментов времени, кратных `Size`. Параметр `Size` указывать необязательно, по умолчанию он равен 1800 секундам (30 минутам) - необязательный параметр. Данная функция может использоваться, например, для анализа количества просмотров страницы за соответствующую сессию. -Аргумент `StartTime` может иметь тип `DateTime` или `DateTime64`. В случае, если используется `DateTime`, аргументы `Duration` и `Size` должны иметь тип `UInt32`; Для DateTime64 они должны быть типа `Decimal64`. +Аргумент `StartTime` может иметь тип `DateTime` или `DateTime64`. В случае, если используется `DateTime`, аргументы `Duration` и `Size` должны иметь тип `UInt32`; Для DateTime64 они должны быть типа `Decimal64`. Возвращает массив DateTime/DateTime64 (тип будет совпадать с типом параметра ’StartTime’). Для DateTime64 масштаб(scale) возвращаемой величины может отличаться от масштаба фргумента ’StartTime’ --- результат будет иметь наибольший масштаб среди всех данных аргументов. Пример использования: diff --git a/docs/ru/sql-reference/functions/other-functions.md b/docs/ru/sql-reference/functions/other-functions.md index 5e89a4f1236..5c8584cd2a0 100644 --- a/docs/ru/sql-reference/functions/other-functions.md +++ b/docs/ru/sql-reference/functions/other-functions.md @@ -1722,12 +1722,6 @@ SELECT joinGet(db_test.id_val,'val',toUInt32(number)) from numbers(4) SETTINGS j └──────────────────────────────────────────────────┘ ``` -## modelEvaluate(model_name, …) {#function-modelevaluate} - -Оценивает внешнюю модель. - -Принимает на вход имя и аргументы модели. Возвращает Float64. - ## throwIf(x\[, message\[, error_code\]\]) {#throwifx-custom-message} Бросает исключение, если аргумент не равен нулю. diff --git a/docs/ru/sql-reference/statements/alter/role.md b/docs/ru/sql-reference/statements/alter/role.md index a86ff780b8d..4e84260fd40 100644 --- a/docs/ru/sql-reference/statements/alter/role.md +++ b/docs/ru/sql-reference/statements/alter/role.md @@ -13,6 +13,6 @@ sidebar_label: ROLE ``` sql ALTER ROLE [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...] ``` diff --git a/docs/ru/sql-reference/statements/alter/settings-profile.md b/docs/ru/sql-reference/statements/alter/settings-profile.md index ec1cd1f72e6..8166f17597c 100644 --- a/docs/ru/sql-reference/statements/alter/settings-profile.md +++ b/docs/ru/sql-reference/statements/alter/settings-profile.md @@ -13,6 +13,6 @@ sidebar_label: SETTINGS PROFILE ``` sql ALTER SETTINGS PROFILE [IF EXISTS] TO name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | INHERIT 'profile_name'] [,...] ``` diff --git a/docs/ru/sql-reference/statements/create/role.md b/docs/ru/sql-reference/statements/create/role.md index 9e06ad1914e..4a93de8a74c 100644 --- a/docs/ru/sql-reference/statements/create/role.md +++ b/docs/ru/sql-reference/statements/create/role.md @@ -12,7 +12,7 @@ sidebar_label: "Роль" ```sql CREATE ROLE [IF NOT EXISTS | OR REPLACE] name1 [, name2 ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...] ``` ## Управление ролями {#managing-roles} diff --git a/docs/ru/sql-reference/statements/create/settings-profile.md b/docs/ru/sql-reference/statements/create/settings-profile.md index d85b2aadeda..9aa77e4c241 100644 --- a/docs/ru/sql-reference/statements/create/settings-profile.md +++ b/docs/ru/sql-reference/statements/create/settings-profile.md @@ -13,7 +13,7 @@ sidebar_label: "Профиль настроек" ``` sql CREATE SETTINGS PROFILE [IF NOT EXISTS | OR REPLACE] TO name1 [ON CLUSTER cluster_name1] [, name2 [ON CLUSTER cluster_name2] ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | INHERIT 'profile_name'] [,...] ``` Секция `ON CLUSTER` позволяет создавать профили на кластере, см. [Распределенные DDL запросы](../../../sql-reference/distributed-ddl.md). diff --git a/docs/ru/sql-reference/statements/system.md b/docs/ru/sql-reference/statements/system.md index c1dc03a63d1..a7dec7abe27 100644 --- a/docs/ru/sql-reference/statements/system.md +++ b/docs/ru/sql-reference/statements/system.md @@ -6,43 +6,6 @@ sidebar_label: SYSTEM # Запросы SYSTEM {#query-language-system} -- [RELOAD EMBEDDED DICTIONARIES](#query_language-system-reload-emdedded-dictionaries) -- [RELOAD DICTIONARIES](#query_language-system-reload-dictionaries) -- [RELOAD DICTIONARY](#query_language-system-reload-dictionary) -- [RELOAD MODELS](#query_language-system-reload-models) -- [RELOAD MODEL](#query_language-system-reload-model) -- [RELOAD FUNCTIONS](#query_language-system-reload-functions) -- [RELOAD FUNCTION](#query_language-system-reload-functions) -- [DROP DNS CACHE](#query_language-system-drop-dns-cache) -- [DROP MARK CACHE](#query_language-system-drop-mark-cache) -- [DROP UNCOMPRESSED CACHE](#query_language-system-drop-uncompressed-cache) -- [DROP COMPILED EXPRESSION CACHE](#query_language-system-drop-compiled-expression-cache) -- [DROP REPLICA](#query_language-system-drop-replica) -- [FLUSH LOGS](#query_language-system-flush_logs) -- [RELOAD CONFIG](#query_language-system-reload-config) -- [SHUTDOWN](#query_language-system-shutdown) -- [KILL](#query_language-system-kill) -- [STOP DISTRIBUTED SENDS](#query_language-system-stop-distributed-sends) -- [FLUSH DISTRIBUTED](#query_language-system-flush-distributed) -- [START DISTRIBUTED SENDS](#query_language-system-start-distributed-sends) -- [STOP MERGES](#query_language-system-stop-merges) -- [START MERGES](#query_language-system-start-merges) -- [STOP TTL MERGES](#query_language-stop-ttl-merges) -- [START TTL MERGES](#query_language-start-ttl-merges) -- [STOP MOVES](#query_language-stop-moves) -- [START MOVES](#query_language-start-moves) -- [SYSTEM UNFREEZE](#query_language-system-unfreeze) -- [STOP FETCHES](#query_language-system-stop-fetches) -- [START FETCHES](#query_language-system-start-fetches) -- [STOP REPLICATED SENDS](#query_language-system-start-replicated-sends) -- [START REPLICATED SENDS](#query_language-system-start-replicated-sends) -- [STOP REPLICATION QUEUES](#query_language-system-stop-replication-queues) -- [START REPLICATION QUEUES](#query_language-system-start-replication-queues) -- [SYNC REPLICA](#query_language-system-sync-replica) -- [RESTART REPLICA](#query_language-system-restart-replica) -- [RESTORE REPLICA](#query_language-system-restore-replica) -- [RESTART REPLICAS](#query_language-system-restart-replicas) - ## RELOAD EMBEDDED DICTIONARIES] {#query_language-system-reload-emdedded-dictionaries} Перегружает все [Встроенные словари](../dictionaries/internal-dicts.md). По умолчанию встроенные словари выключены. @@ -66,7 +29,12 @@ SELECT name, status FROM system.dictionaries; ## RELOAD MODELS {#query_language-system-reload-models} -Перегружает все модели [CatBoost](../../guides/apply-catboost-model.md#applying-catboost-model-in-clickhouse), если их конфигурация была обновлена, без перезагрузки сервера. +:::note +Это утверждение и `SYSTEM RELOAD MODEL` просто выгружают модели catboost из clickhouse-library-bridge. Функция `catboostEvaluate()` +загружает модель при первом обращении, если она еще не загружена. +::: + +Разгрузите все модели CatBoost. **Синтаксис** @@ -76,12 +44,12 @@ SYSTEM RELOAD MODELS ## RELOAD MODEL {#query_language-system-reload-model} -Полностью перегружает модель [CatBoost](../../guides/apply-catboost-model.md#applying-catboost-model-in-clickhouse) `model_name`, если ее конфигурация была обновлена, без перезагрузки сервера. +Выгружает модель CatBoost по адресу `модель_путь`. **Синтаксис** ```sql -SYSTEM RELOAD MODEL +SYSTEM RELOAD MODEL ``` ## RELOAD FUNCTIONS {#query_language-system-reload-functions} diff --git a/docs/ru/sql-reference/table-functions/file.md b/docs/ru/sql-reference/table-functions/file.md index 1f262c9403a..df35a1c4ac0 100644 --- a/docs/ru/sql-reference/table-functions/file.md +++ b/docs/ru/sql-reference/table-functions/file.md @@ -13,7 +13,7 @@ sidebar_label: file **Синтаксис** ``` sql -file(path, format, structure) +file(path [,format] [,structure]) ``` **Параметры** diff --git a/docs/ru/sql-reference/table-functions/s3.md b/docs/ru/sql-reference/table-functions/s3.md index ae0419a4b84..14c8204fd1d 100644 --- a/docs/ru/sql-reference/table-functions/s3.md +++ b/docs/ru/sql-reference/table-functions/s3.md @@ -11,7 +11,7 @@ sidebar_label: s3 **Синтаксис** ``` sql -s3(path, [aws_access_key_id, aws_secret_access_key,] format, structure, [compression]) +s3(path [,aws_access_key_id, aws_secret_access_key] [,format] [,structure] [,compression]) ``` **Aргументы** diff --git a/docs/ru/sql-reference/table-functions/s3Cluster.md b/docs/ru/sql-reference/table-functions/s3Cluster.md index e6b317253c0..1c12913fabe 100644 --- a/docs/ru/sql-reference/table-functions/s3Cluster.md +++ b/docs/ru/sql-reference/table-functions/s3Cluster.md @@ -11,7 +11,7 @@ sidebar_label: s3Cluster **Синтаксис** ``` sql -s3Cluster(cluster_name, source, [access_key_id, secret_access_key,] format, structure) +s3Cluster(cluster_name, source, [,access_key_id, secret_access_key] [,format] [,structure]) ``` **Аргументы** diff --git a/docs/ru/sql-reference/table-functions/url.md b/docs/ru/sql-reference/table-functions/url.md index d4fb11b0de7..e5d9faeec00 100644 --- a/docs/ru/sql-reference/table-functions/url.md +++ b/docs/ru/sql-reference/table-functions/url.md @@ -13,7 +13,7 @@ sidebar_label: url **Синтаксис** ``` sql -url(URL, format, structure) +url(URL [,format] [,structure]) ``` **Параметры** diff --git a/docs/zh/development/tests.md b/docs/zh/development/tests.md index e6d5cf66de9..6f1118e5e63 100644 --- a/docs/zh/development/tests.md +++ b/docs/zh/development/tests.md @@ -1,5 +1,5 @@ --- -slug: /en/development/tests +slug: /zh/development/tests sidebar_position: 70 sidebar_label: Testing title: ClickHouse Testing diff --git a/docs/zh/guides/apply-catboost-model.md b/docs/zh/guides/apply-catboost-model.md deleted file mode 100644 index 861e5372875..00000000000 --- a/docs/zh/guides/apply-catboost-model.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -slug: /zh/guides/apply-catboost-model -sidebar_position: 41 -sidebar_label: "\u5E94\u7528CatBoost\u6A21\u578B" ---- - -# 在ClickHouse中应用Catboost模型 {#applying-catboost-model-in-clickhouse} - -[CatBoost](https://catboost.ai) 是一个由[Yandex](https://yandex.com/company/)开发的开源免费机器学习库。 - - -通过本篇文档,您将学会如何用SQL语句调用已经存放在Clickhouse中的预训练模型来预测数据。 - - -为了在ClickHouse中应用CatBoost模型,需要进行如下步骤: - -1. [创建数据表](#create-table). -2. [将数据插入到表中](#insert-data-to-table). -3. [将CatBoost集成到ClickHouse中](#integrate-catboost-into-clickhouse) (可跳过)。 -4. [从SQL运行模型推断](#run-model-inference). - -有关训练CatBoost模型的详细信息,请参阅 [训练和模型应用](https://catboost.ai/docs/features/training.html#training). - -您可以通过[RELOAD MODEL](https://clickhouse.com/docs/en/sql-reference/statements/system/#query_language-system-reload-model)与[RELOAD MODELS](https://clickhouse.com/docs/en/sql-reference/statements/system/#query_language-system-reload-models)语句来重载CatBoost模型。 - -## 先决条件 {#prerequisites} - -请先安装 [Docker](https://docs.docker.com/install/)。 - -!!! note "注" - [Docker](https://www.docker.com) 是一个软件平台,用户可以用Docker来创建独立于已有系统并集成了CatBoost和ClickHouse的容器。 - -在应用CatBoost模型之前: - -**1.** 从容器仓库拉取示例docker镜像 (https://hub.docker.com/r/yandex/tutorial-catboost-clickhouse) : - -``` bash -$ docker pull yandex/tutorial-catboost-clickhouse -``` - -此示例Docker镜像包含运行CatBoost和ClickHouse所需的所有内容:代码、运行时、库、环境变量和配置文件。 - -**2.** 确保已成功拉取Docker镜像: - -``` bash -$ docker image ls -REPOSITORY TAG IMAGE ID CREATED SIZE -yandex/tutorial-catboost-clickhouse latest 622e4d17945b 22 hours ago 1.37GB -``` - -**3.** 基于此镜像启动一个Docker容器: - -``` bash -$ docker run -it -p 8888:8888 yandex/tutorial-catboost-clickhouse -``` - -## 1. 创建数据表 {#create-table} - -为训练样本创建ClickHouse表: - -**1.** 在交互模式下启动ClickHouse控制台客户端: - -``` bash -$ clickhouse client -``` - -!!! note "注" - ClickHouse服务器已经在Docker容器内运行。 - -**2.** 使用以下命令创建表: - -``` sql -:) CREATE TABLE amazon_train -( - date Date MATERIALIZED today(), - ACTION UInt8, - RESOURCE UInt32, - MGR_ID UInt32, - ROLE_ROLLUP_1 UInt32, - ROLE_ROLLUP_2 UInt32, - ROLE_DEPTNAME UInt32, - ROLE_TITLE UInt32, - ROLE_FAMILY_DESC UInt32, - ROLE_FAMILY UInt32, - ROLE_CODE UInt32 -) -ENGINE = MergeTree ORDER BY date -``` - -**3.** 从ClickHouse控制台客户端退出: - -``` sql -:) exit -``` - -## 2. 将数据插入到表中 {#insert-data-to-table} - -插入数据: - -**1.** 运行以下命令: - -``` bash -$ clickhouse client --host 127.0.0.1 --query 'INSERT INTO amazon_train FORMAT CSVWithNames' < ~/amazon/train.csv -``` - -**2.** 在交互模式下启动ClickHouse控制台客户端: - -``` bash -$ clickhouse client -``` - -**3.** 确保数据已上传: - -``` sql -:) SELECT count() FROM amazon_train - -SELECT count() -FROM amazon_train - -+-count()-+ -| 65538 | -+-------+ -``` - -## 3. 将CatBoost集成到ClickHouse中 {#integrate-catboost-into-clickhouse} - -!!! note "注" - **可跳过。** 示例Docker映像已经包含了运行CatBoost和ClickHouse所需的所有内容。 - -为了将CatBoost集成进ClickHouse,需要进行如下步骤: - -**1.** 构建评估库。 - -评估CatBoost模型的最快方法是编译 `libcatboostmodel.` 库文件. - -有关如何构建库文件的详细信息,请参阅 [CatBoost文件](https://catboost.ai/docs/concepts/c-plus-plus-api_dynamic-c-pluplus-wrapper.html). - -**2.** 创建一个新目录(位置与名称可随意指定), 如 `data` 并将创建的库文件放入其中。 示例Docker镜像已经包含了库 `data/libcatboostmodel.so`. - -**3.** 创建一个新目录来放配置模型, 如 `models`. - -**4.** 创建一个模型配置文件,如 `models/amazon_model.xml`. - -**5.** 修改模型配置: - -``` xml - - - - catboost - - amazon - - /home/catboost/tutorial/catboost_model.bin - - 0 - - -``` - -**6.** 将CatBoost库文件的路径和模型配置添加到ClickHouse配置: - -``` xml - -/home/catboost/data/libcatboostmodel.so -/home/catboost/models/*_model.xml -``` - -## 4. 使用SQL调用预测模型 {#run-model-inference} - -为了测试模型是否正常,可以使用ClickHouse客户端 `$ clickhouse client`. - -让我们确保模型能正常工作: - -``` sql -:) SELECT - modelEvaluate('amazon', - RESOURCE, - MGR_ID, - ROLE_ROLLUP_1, - ROLE_ROLLUP_2, - ROLE_DEPTNAME, - ROLE_TITLE, - ROLE_FAMILY_DESC, - ROLE_FAMILY, - ROLE_CODE) > 0 AS prediction, - ACTION AS target -FROM amazon_train -LIMIT 10 -``` - -!!! note "注" - 函数 [modelEvaluate](../sql-reference/functions/other-functions.md#function-modelevaluate) 会对多类别模型返回一个元组,其中包含每一类别的原始预测值。 - -执行预测: - -``` sql -:) SELECT - modelEvaluate('amazon', - RESOURCE, - MGR_ID, - ROLE_ROLLUP_1, - ROLE_ROLLUP_2, - ROLE_DEPTNAME, - ROLE_TITLE, - ROLE_FAMILY_DESC, - ROLE_FAMILY, - ROLE_CODE) AS prediction, - 1. / (1 + exp(-prediction)) AS probability, - ACTION AS target -FROM amazon_train -LIMIT 10 -``` - -!!! note "注" - 查看函数说明 [exp()](../sql-reference/functions/math-functions.md) 。 - -让我们计算样本的LogLoss: - -``` sql -:) SELECT -avg(tg * log(prob) + (1 - tg) * log(1 - prob)) AS logloss -FROM -( - SELECT - modelEvaluate('amazon', - RESOURCE, - MGR_ID, - ROLE_ROLLUP_1, - ROLE_ROLLUP_2, - ROLE_DEPTNAME, - ROLE_TITLE, - ROLE_FAMILY_DESC, - ROLE_FAMILY, - ROLE_CODE) AS prediction, - 1. / (1. + exp(-prediction)) AS prob, - ACTION AS tg - FROM amazon_train -) -``` - -!!! note "注" - 查看函数说明 [avg()](../sql-reference/aggregate-functions/reference/avg.md#agg_function-avg) 和 [log()](../sql-reference/functions/math-functions.md) 。 - -[原始文章](https://clickhouse.com/docs/en/guides/apply_catboost_model/) diff --git a/docs/zh/guides/index.md b/docs/zh/guides/index.md index 5e535ea5736..00c4ae4def1 100644 --- a/docs/zh/guides/index.md +++ b/docs/zh/guides/index.md @@ -9,6 +9,5 @@ sidebar_label: ClickHouse指南 列出了如何使用 Clickhouse 解决各种任务的详细说明: - [关于简单集群设置的教程](../getting-started/tutorial.md) -- [在ClickHouse中应用CatBoost模型](apply-catboost-model.md) [原始文章](https://clickhouse.com/docs/en/guides/) diff --git a/docs/zh/sql-reference/functions/other-functions.md b/docs/zh/sql-reference/functions/other-functions.md index fde55ec884f..a475420ba64 100644 --- a/docs/zh/sql-reference/functions/other-functions.md +++ b/docs/zh/sql-reference/functions/other-functions.md @@ -625,11 +625,6 @@ ORDER BY k ASC 使用指定的连接键从Join类型引擎的表中获取数据。 -## modelEvaluate(model_name, …) {#function-modelevaluate} - -使用外部模型计算。 -接受模型的名称以及模型的参数。返回Float64类型的值。 - ## throwIf(x) {#throwifx} 如果参数不为零则抛出异常。 diff --git a/docs/zh/sql-reference/statements/alter.md b/docs/zh/sql-reference/statements/alter.md index 2e143d3b654..23edfd633db 100644 --- a/docs/zh/sql-reference/statements/alter.md +++ b/docs/zh/sql-reference/statements/alter.md @@ -500,7 +500,7 @@ ALTER USER [IF EXISTS] name [ON CLUSTER cluster_name] [IDENTIFIED [WITH {PLAINTEXT_PASSWORD|SHA256_PASSWORD|DOUBLE_SHA1_PASSWORD}] BY {'password'|'hash'}] [[ADD|DROP] HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE] [DEFAULT ROLE role [,...] | ALL | ALL EXCEPT role [,...] ] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...] ``` ### 说明 {#alter-user-dscr} @@ -540,7 +540,7 @@ ALTER USER user DEFAULT ROLE ALL EXCEPT role1, role2 ``` sql ALTER ROLE [IF EXISTS] name [ON CLUSTER cluster_name] [RENAME TO new_name] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...] ``` ## 修改row policy {#alter-row-policy-statement} @@ -584,7 +584,7 @@ ALTER QUOTA [IF EXISTS] name [ON CLUSTER cluster_name] ``` sql ALTER SETTINGS PROFILE [IF EXISTS] name [ON CLUSTER cluster_name] [RENAME TO new_name] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | INHERIT 'profile_name'] [,...] ``` [Original article](https://clickhouse.com/docs/en/query_language/alter/) diff --git a/docs/zh/sql-reference/statements/alter/role.md b/docs/zh/sql-reference/statements/alter/role.md index e364571359f..3647f94e46e 100644 --- a/docs/zh/sql-reference/statements/alter/role.md +++ b/docs/zh/sql-reference/statements/alter/role.md @@ -13,5 +13,5 @@ sidebar_label: 角色 ``` sql ALTER ROLE [IF EXISTS] name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | PROFILE 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | PROFILE 'profile_name'] [,...] ``` diff --git a/docs/zh/sql-reference/statements/alter/settings-profile.md b/docs/zh/sql-reference/statements/alter/settings-profile.md index e4365b25c1a..e21f18f920b 100644 --- a/docs/zh/sql-reference/statements/alter/settings-profile.md +++ b/docs/zh/sql-reference/statements/alter/settings-profile.md @@ -13,5 +13,5 @@ sidebar_label: 配置文件设置 ``` sql ALTER SETTINGS PROFILE [IF EXISTS] TO name1 [ON CLUSTER cluster_name1] [RENAME TO new_name1] [, name2 [ON CLUSTER cluster_name2] [RENAME TO new_name2] ...] - [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY|WRITABLE] | INHERIT 'profile_name'] [,...] + [SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [CONST|READONLY|WRITABLE|CHANGEABLE_IN_READONLY] | INHERIT 'profile_name'] [,...] ``` diff --git a/docs/zh/sql-reference/statements/system.md b/docs/zh/sql-reference/statements/system.md index d833887a9c6..3df00cf8854 100644 --- a/docs/zh/sql-reference/statements/system.md +++ b/docs/zh/sql-reference/statements/system.md @@ -6,38 +6,6 @@ sidebar_label: SYSTEM # SYSTEM Queries {#query-language-system} -- [RELOAD EMBEDDED DICTIONARIES](#query_language-system-reload-emdedded-dictionaries) -- [RELOAD DICTIONARIES](#query_language-system-reload-dictionaries) -- [RELOAD DICTIONARY](#query_language-system-reload-dictionary) -- [DROP DNS CACHE](#query_language-system-drop-dns-cache) -- [DROP MARK CACHE](#query_language-system-drop-mark-cache) -- [DROP UNCOMPRESSED CACHE](#query_language-system-drop-uncompressed-cache) -- [DROP COMPILED EXPRESSION CACHE](#query_language-system-drop-compiled-expression-cache) -- [DROP REPLICA](#query_language-system-drop-replica) -- [FLUSH LOGS](#query_language-system-flush_logs) -- [RELOAD CONFIG](#query_language-system-reload-config) -- [SHUTDOWN](#query_language-system-shutdown) -- [KILL](#query_language-system-kill) -- [STOP DISTRIBUTED SENDS](#query_language-system-stop-distributed-sends) -- [FLUSH DISTRIBUTED](#query_language-system-flush-distributed) -- [START DISTRIBUTED SENDS](#query_language-system-start-distributed-sends) -- [STOP MERGES](#query_language-system-stop-merges) -- [START MERGES](#query_language-system-start-merges) -- [STOP TTL MERGES](#query_language-stop-ttl-merges) -- [START TTL MERGES](#query_language-start-ttl-merges) -- [STOP MOVES](#query_language-stop-moves) -- [START MOVES](#query_language-start-moves) -- [SYSTEM UNFREEZE](#query_language-system-unfreeze) -- [STOP FETCHES](#query_language-system-stop-fetches) -- [START FETCHES](#query_language-system-start-fetches) -- [STOP REPLICATED SENDS](#query_language-system-start-replicated-sends) -- [START REPLICATED SENDS](#query_language-system-start-replicated-sends) -- [STOP REPLICATION QUEUES](#query_language-system-stop-replication-queues) -- [START REPLICATION QUEUES](#query_language-system-start-replication-queues) -- [SYNC REPLICA](#query_language-system-sync-replica) -- [RESTART REPLICA](#query_language-system-restart-replica) -- [RESTART REPLICAS](#query_language-system-restart-replicas) - ## RELOAD EMBEDDED DICTIONARIES\] {#query_language-system-reload-emdedded-dictionaries} 重新加载所有[内置字典](../../sql-reference/dictionaries/internal-dicts.md)。默认情况下内置字典是禁用的。 diff --git a/docs/zh/whats-new/changelog/2017.md b/docs/zh/whats-new/changelog/2017.md deleted file mode 100644 index 762a7f107e3..00000000000 --- a/docs/zh/whats-new/changelog/2017.md +++ /dev/null @@ -1,264 +0,0 @@ ---- -slug: /zh/whats-new/changelog/2017 ---- -### ClickHouse 版本 1.1.54327, 2017-12-21 {#clickhouse-release-1-1-54327-2017-12-21} - -此版本包含先前版本 1.1.54318 的错误修复: - -- 修复了可能导致数据丢失的复制中可能出现的竞争条件的错误. 此问题影响1.1.54310和1.1.54318版本. 如果将这些版本的任意一个与 Replicated 表一起使用,则强烈建议进行更新. 此问题显示在日志中的警告消息中,例如 `Part ... from own log does not exist.` 即使您没有在日志中看到这些消息,该问题也是相关的. - -### ClickHouse 版本 1.1.54318, 2017-11-30 {#clickhouse-release-1-1-54318-2017-11-30} - -此版本包含先前版本 1.1.54310 的错误修复: - -- 修复了在 SummingMergeTree 引擎中合并期间不正确的行删除. -- 修复了未复制的 MergeTree 引擎中的内存泄漏. -- 修复了在 MergeTree 引擎中频繁插入导致性能下降的问题. -- 修复了导致复制队列停止运行的问题. -- 修复了服务器日志的轮换和归档. - -### ClickHouse 版本 1.1.54310, 2017-11-01 {#clickhouse-release-1-1-54310-2017-11-01} - -#### 新特征: {#new-features} - -- MergeTree 系列表引擎的自定义分区键. -- [Kafka](https://clickhouse.com/docs/en/operations/table_engines/kafka/) 表引擎. -- 增加了对加载[CatBoost](https://catboost.yandex/)模型的支持, 并将它们应用到存储在ClickHouse中的数据. -- 添加了对 UTC 非整数偏移时区的支持 -- 添加了对具有时间间隔的算术运算的支持. -- Date 和 DateTime 类型的值范围扩展到 2105 年. -- 添加了 `CREATE MATERIALIZED VIEW x TO y` 查询(指定用于存储物化视图数据的现有表). -- 添加了不带参数的`ATTACH TABLE` 查询. -- SummingMergeTree 表中名称以 -Map 结尾的嵌套列的处理逻辑被提取到 sumMap 聚合函数中. 您现在可以明确指定此类列. -- IP 树字典的最大大小增加到 128M 条目. -- 添加了 getSizeOfEnumType 函数. -- 添加了 sumWithOverflow 聚合函数. -- 添加了对 Cap'n Proto 输入格式的支持. -- 您现在可以在使用 zstd 算法时自定义压缩级别. - -#### 向后不兼容的变化: {#backward-incompatible-changes} - -- 不允许使用内存以外的引擎创建临时表. -- 不允许使用 View 或 MaterializedView 引擎显式创建表. -- 在表创建期间,新的检查验证采样键表达式是否包含在主键中. - -#### Bug 修复: {#bug-fixes} - -- 修复了同步插入分布式表时的挂断问题. -- 修复了复制表中部件的非原子添加和删除. -- 插入物化视图的数据不会进行不必要的重复数据删除. -- 对本地副本滞后且远程副本不可用的分布式表执行查询不再导致错误. -- 用户不再需要访问 `default` 数据库的权限来创建临时表. -- 修复了指定不带参数的 Array 类型时崩溃的问题. -- 修复了包含服务器日志的磁盘卷已满时的挂断问题. -- 修复了 Unix 纪元第一周 toRelativeWeekNum 函数中的溢出问题. - -#### Build 改进: {#build-improvements} - -- 更新了多个第三方库(尤其是 Poco)并转换为 git 子模块. - -### ClickHouse 版本 1.1.54304, 2017-10-19 {#clickhouse-release-1-1-54304-2017-10-19} - -#### 新特征: {#new-features-1} - -- 本机协议中的 TLS 支持(要启用,请在 `config.xml` 中设置 `tcp_ssl_port`). - -#### Bug 修复: {#bug-fixes-1} - -- 复制表的`ALTER` 现在尝试尽快开始运行. -- 修复了使用设置 `preferred_block_size_bytes=0.` 读取数据时崩溃的问题. -- 修复了按下 `Page Down` 时 `clickhouse-client` 崩溃的问题. -- 使用 `GLOBAL IN` 和 `UNION ALL` 正确解释某些复杂的查询. -- `FREEZE PARTITION` 现在总是以原子方式工作. -- 空 POST 请求现在返回代码为 411 的响应. -- 修正了像 `CAST(1 AS Nullable(UInt8)).` 这样的表达式的解释错误. -- 修正了从 `MergeTree` 表中读取 `Array(Nullable(String))` 列时的错误. -- 修复了在解析诸如 `SELECT dummy AS dummy, dummy AS b` 之类的查询时崩溃的问题. -- 用户使用无效的 `users.xml` 正确更新. -- 可执行字典返回非零响应代码时的正确处理. - -### ClickHouse 版本 1.1.54292, 2017-09-20 {#clickhouse-release-1-1-54292-2017-09-20} - -#### 新特征: {#new-features-2} - -- 添加了用于处理坐标平面上的坐标的 `pointInPolygon` 函数. -- 添加了用于计算数组总和的 `sumMap` 聚合函数, 类似于 `SummingMergeTree` . -- 添加了 `trunc` 功能. 改进了舍入函数(`round`、`floor`、`ceil`、`roundToExp2`)的性能并更正了它们工作方式的逻辑. 更改了分数和负数的 `roundToExp2` 函数的逻辑. -- ClickHouse 可执行文件现在较少依赖于 libc 版本. 同一个 ClickHouse 可执行文件可以在各种 Linux 系统上运行. 使用编译查询时仍然存在依赖性(使用设置 `compile = 1` , 默认情况下不使用). -- 减少动态编译查询所需的时间. - -#### Bug 修复: {#bug-fixes-2} - -- 修复了有时会产生 `part ... intersects previous part` 消息和削弱副本一致性的错误. -- 修复了关闭期间 ZooKeeper 不可用导致服务器锁定的错误. -- 恢复副本时删除了过多的日志记录. -- 修复了 UNION ALL 实现中的错误. -- 修复了如果块中的第一列具有 Array 类型时在 concat 函数中发生的错误. -- 进度现在在 system.merges 表中可以正确显示. - -### ClickHouse 版本 1.1.54289, 2017-09-13 {#clickhouse-release-1-1-54289-2017-09-13} - -#### 新特征: {#new-features-3} - -- 用于服务器管理的 `SYSTEM` 查询: `SYSTEM RELOAD DICTIONARY`, `SYSTEM RELOAD DICTIONARIES`, `SYSTEM DROP DNS CACHE`, `SYSTEM SHUTDOWN`, `SYSTEM KILL`. -- 添加了用于处理数组的函数: `concat`, `arraySlice`, `arrayPushBack`, `arrayPushFront`, `arrayPopBack`, `arrayPopFront`. -- 为 ZooKeeper 配置添加了 `root` 和 `identity` 参数. 这将允许您隔离同一 ZooKeeper 集群上的各个用户. -- 添加了聚合函数 `groupBitAnd` 、 `groupBitOr` 和 `groupBitXor` (为了兼容性,它们也可以在名称 `BIT_AND` 、`BIT_OR`和`BIT_XOR` 下使用). -- 可以通过在文件系统中指定套接字来从 MySQL 加载外部字典. -- 可以通过 SSL 从 MySQL 加载外部字典 (`ssl_cert`, `ssl_key`, `ssl_ca` 参数). -- 添加了 `max_network_bandwidth_for_user` 设置以限制每个用户查询的总体带宽使用. -- 支持临时表的 `DROP TABLE`. -- 支持从 `CSV` 和 `JSONEachRow` 格式读取 Unix 时间戳格式的 `DateTime` 值. -- 现在默认排除分布式查询中的滞后副本(默认阈值为 5 分钟). -- 在 ALTER 期间使用 FIFO 锁定:对于连续运行的查询,ALTER 查询不会无限期阻塞. -- 在配置文件中设置 `umask` 的选项. -- 使用 `DISTINCT` 提高查询的性能. - -#### Bug 修复: {#bug-fixes-3} - -- 改进了在 ZooKeeper 中删除旧节点的过程. 以前, 如果插入非常频繁, 旧节点有时不会被删除, 从而导致服务器关闭缓慢等. -- 修复了为 ZooKeeper 连接选择主机时的随机化问题. -- 如果副本是本地主机, 则修复了在分布式查询中排除滞后副本的问题. -- 修复了在 `嵌套` 结构中的元素上运行 `ALTER MODIFY` 后, `ReplicatedMergeTree` 表中的数据部分可能被破坏的错误. -- 修复了可能导致 SELECT 查询 `hang` 的错误. -- 分布式 DDL 查询的改进. -- 修复了查询 `CREATE TABLE ... AS `. -- 解决了对 Buffer 表的 `ALTER ... CLEAR COLUMN IN PARTITION` 查询中的死锁. -- 修复了使用 `JSONEachRow` 和 `TSKV` 格式时 `Enum` 的无效默认值 (0 而不是最小值). -- 解决了使用带有 `可执行` 源的字典时出现僵尸进程的问题. -- 修复了 HEAD 查询的段错误. - -#### 改进了开发和组装ClickHouse的工作流: {#improved-workflow-for-developing-and-assembling-clickhouse} - -- 您可以使用 `pbuilder` 来构建 ClickHouse. -- 你可以使用 `libc++` 代替 `libstdc++` 在 Linux 上构建. -- 添加了使用静态代码分析工具的说明: `Coverage`, `clang-tidy`, `cppcheck`. - -#### 升级时请注意: {#please-note-when-upgrading} - -- 现在有更高的 MergeTree 设置默认值 `max_bytes_to_merge_at_max_space_in_pool` (要合并的数据部分的最大总大小, 以字节为单位): 它已从 100 GiB 增加到 150 GiB. 这可能会导致在服务器升级后运行大型合并, 从而导致磁盘子系统负载增加. 如果服务器上的可用空间小于正在运行的合并总量的两倍, 这将导致所有其他合并停止运行, 包括小数据部分的合并. 因此, INSERT 查询将失败并显示消息"合并的处理速度明显慢于插入." , 使用 `SELECT * FROM system.merges` 查询来监控情况. 您还可以在 `system.metrics` 表或 Graphite 中检查 `DiskSpaceReservedForMerge` 指标. 您不需要做任何事情来解决这个问题, 因为一旦大型合并完成, 问题就会自行解决. 如果您发现这不可接受, 您可以恢复 `max_bytes_to_merge_at_max_space_in_pool` 设置的先前值. 为此, 请转到 config.xml 中的 `` 部分, 设置 ``` ``107374182400 ``` 并重新启动服务器. - -### ClickHouse 版本 1.1.54284, 2017-08-29 {#clickhouse-release-1-1-54284-2017-08-29} - -- 这是先前 1.1.54282 版本的错误修复版本. 它修复了 ZooKeeper 中部分目录中的泄漏. - -### ClickHouse 版本 1.1.54282, 2017-08-23 {#clickhouse-release-1-1-54282-2017-08-23} - -此版本包含先前版本 1.1.54276 的错误修复: - -- 修复了插入分布式表时的 `DB::Exception: Assertion violation: !_path.empty()`. -- 如果输入数据以 ';' 开头, 则在以 RowBinary 格式插入时固定解析. -- 某些聚合函数 (例如 `groupArray()` ) 的运行时编译期间的错误. - -### ClickHouse 版本 1.1.54276, 2017-08-16 {#clickhouse-release-1-1-54276-2017-08-16} - -#### 新特征: {#new-features-4} - -- SELECT 查询添加了一个可选的 WITH 部分. 示例查询:`WITH 1+1 AS a SELECT a, a*a` . -- NSERT 可以在分布式表中同步执行:只有在所有数据都保存在所有分片上后才返回 OK. 这是通过设置 `insert_distributed_sync=1` 激活的. -- 添加了用于处理 16 字节标识符的 UUID 数据类型. -- 添加了 CHAR、FLOAT 和其他类型的别名以与 Tableau 兼容. -- 新增 toYYYYMM, toYYYYMMDD, toYYYYMMDDhhmmss 时间转数字功能. -- 您可以使用 IP 地址 (与主机名一起) 来识别集群 DDL 查询的服务器. -- 在函数 `substring(str, pos, len)` 中添加了对非常量参数和负偏移量的支持. -- 为 `groupArray(max_size)(column)` 聚合函数增加了max_size参数, 并优化了其性能. - -#### Main Changes: {#main-changes} - -- 安全改进:所有服务器文件都使用 0640 权限创建(可以通过 `` 配置参数更改). -- 改进了语法无效查询的错误消息. -- 合并大段 MergeTree 数据时显着减少内存消耗并提高性能. -- 显着提高了 ReplacingMergeTree 引擎的数据合并性能. -- 通过组合多个源插入提高了从分布式表进行异步插入的性能. 要启用此功能, 请使用设置 `distributed_directory_monitor_batch_inserts=1` . - -#### Backward Incompatible Changes: {#backward-incompatible-changes-1} - -- 更改了数组 `groupArray(array_column)` 函数聚合状态的二进制格式. - -#### Complete List of Changes: {#complete-list-of-changes} - -- 添加了 `output_format_json_quote_denormals` 设置, 可以以 JSON 格式输出 nan 和 inf 值. -- 从分布式表读取时优化流分配. -- 如果值不变, 可以在只读模式下配置设置. -- 加了检索 MergeTree 引擎的非整数粒度的功能, 以满足对 `preferred_block_size_bytes` 设置中指定的块大小的限制. 目的是在处理来自大列的表的查询时减少RAM的消耗并增加缓存局部性. -- 有效地使用包含像 `toStartOfHour(x)` 这样的表达式的索引来处理像 `toStartOfHour(x) op сonstexpr` 这样的条件. -- 添加了 MergeTree 引擎的新设置(config.xml 中的 merge_tree 部分): - - `replicad_deduplication_window_seconds` 设置允许在复制表中删除重复插入的秒数. - - `cleanup_delay_period` 设置启动清理以删除过时数据的频率. - - `Replicationd_can_become_leader` 可以防止副本成为领导者(并分配合并). -- 加速清理以从 ZooKeeper 中删除过时的数据. -- 集群 DDL 查询的多项改进和修复. 特别有趣的是新设置 `distributed_ddl_task_timeout`, 它限制了等待集群中服务器响应的时间. 如果 ddl 请求没有在所有主机上执行,响应将包含超时错误并且请求将以异步模式执行. -- 改进了服务器日志中堆栈跟踪的显示. -- 为压缩方法添加了 "none" 值. -- 您可以在 config.xml 中使用多个dictionaries_config 部分. -- 可以通过文件系统中的套接字连接到 MySQL. -- `system.parts` 表有一个新列, 其中包含有关标记大小的信息(以字节为单位). - -#### Bug 修复: {#bug-fixes-4} - -- 使用 Merge 表的分布式表现在可以正确用于带有 `_table` 字段条件的 SELECT 查询. -- 修复了检查数据部分时 ReplicatedMergeTree 中罕见的竞争条件. -- 修复了启动服务器时 `leader election` 可能会冻结的问题. -- 使用数据源的本地副本时,将忽略 `max_replica_delay_for_distributed_queries` 设置. 这已被修复. -- 修复了尝试清理不存在的列时 `ALTER TABLE CLEAR COLUMN IN PARTITION` 的错误行为. -- 修复了 multiIf 函数中使用空数组或字符串时的异常. -- 修复了反序列化本机格式时过多的内存分配. -- 修复了 Trie 词典的错误自动更新. -- 修复了在使用 SAMPLE 时从合并表中使用 GROUP BY 子句运行查询时的异常. -- 修复了 `distributed_aggregation_memory_efficient=1` 时 GROUP BY 的崩溃. -- 现在可以在 IN 和 JOIN 右侧指定 `database.table`. -- 太多线程用于并行聚合. 这已被修复. -- 修复了 `if` 函数如何与 FixedString 参数一起工作. -- 对于权重为 0 的分片, SELECT 在分布式表中工作不正确. 这已得到修复. -- 运行 `CREATE VIEW IF EXISTS 不再导致崩溃` . -- 修复了设置 `input_format_skip_unknown_fields=1` 且存在负数时的错误行为. -- 修复了如果字典中有一些无效数据, `dictGetHierarchy()` 函数中的无限循环. -- 修复了使用 IN 或 JOIN 子句和合并表中的子查询运行分布式查询时的 `Syntax error: unexpected (...)` 错误. -- 修复了对字典表中 SELECT 查询的错误解释. -- 修复了在超过 20 亿元素的 IN 和 JOIN 子句中使用数组时的 "Cannot mremap" 错误. -- 修复了以 MySQL 为源的字典的故障转移. - -#### 改进了开发和组装ClickHouse的工作流: {#improved-workflow-for-developing-and-assembling-clickhouse-1} - -- 可以在 Arcadia 中组装 Builds. -- 可以使用 gcc 7 编译 ClickHouse. -- 使用 ccache+distcc 的并行构建现在更快了. - -### ClickHouse 版本 1.1.54245, 2017-07-04 {#clickhouse-release-1-1-54245-2017-07-04} - -#### 新特征: {#new-features-5} - -- 分布式 DDL(例如, `REATE TABLE ON CLUSTER`). -- 复制查询 `ALTER TABLE CLEAR COLUMN IN PARTITION.` . -- 字典表引擎 (以表的形式访问字典数据). -- 字典数据库引擎 (这种类型的数据库自动为所有连接的外部字典提供字典表). -- 您可以通过向源发送请求来检查字典的更新. -- 合格的列名. -- 使用双引号引用标识符. -- HTTP 接口中的会话. -- 复制表的 OPTIMIZE 查询不仅可以在领导者上运行. - -#### 向后不兼容的变化: {#backward-incompatible-changes-2} - -- 删除了 SET GLOBAL. - -#### 次要更改: {#minor-changes} - -- 目前在触发警报后,日志会打印完整的堆栈跟踪. -- 放宽了启动时损坏/额外数据部分数量的验证(误报太多). - -#### Bug 修复: {#bug-fixes-5} - -- 修复了插入分布式表时的错误连接"卡住"问题. -- GLOBAL IN 现在适用于来自查看分布式表的合并表的查询. -- 在 Google Compute Engine 虚拟机上检测到的内核数不正确. 这已被修复. -- 缓存外部字典的可执行源的工作方式发生了变化. -- 修正了包含空字符的字符串的比较. -- 修复了 Float32 主键字段与常量的比较. -- 以前,对字段大小的错误估计可能会导致分配过大. -- 修复了使用 ALTER 查询添加到表中的 Nullable 列时发生的崩溃. -- 修复了当行数小于 LIMIT 时按 Nullable 列排序时崩溃的问题. -- 修复了仅由常量值组成的 ORDER BY 子查询. -- 以前,复制表在 DROP TABLE 失败后可能保持无效状态. -- 结果为空的标量子查询的别名不再丢失. -- 现在,如果 .so 文件损坏,使用编译的查询不会因错误而失败. diff --git a/docs/zh/whats-new/changelog/2018.md b/docs/zh/whats-new/changelog/2018.md deleted file mode 100644 index 8b0c305af3d..00000000000 --- a/docs/zh/whats-new/changelog/2018.md +++ /dev/null @@ -1,1059 +0,0 @@ ---- -slug: /zh/whats-new/changelog/2018 ---- -## ClickHouse 版本 18.16 {#clickhouse-release-18-16} - -### ClickHouse 版本 18.16.1, 2018-12-21 {#clickhouse-release-18-16-1-2018-12-21} - -#### Bug 修复: {#bug-fixes} - -- 修复了导致使用 ODBC 源更新字典出现问题的错误. [#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) -- 聚合函数的 JIT 编译现在适用于 LowCardinality 列. [#3838](https://github.com/ClickHouse/ClickHouse/issues/3838) - -#### 改进: {#improvements} - -- 添加了 `low_cardinality_allow_in_native_format` 设置 (默认启用). 禁用时, LowCardinality 列将转换为用于 SELECT 查询的普通列, 而用于 INSERT 查询的普通列将被转换. [#3879](https://github.com/ClickHouse/ClickHouse/pull/3879) - -#### Build 改进: {#build-improvements} - -- 修复了在 macOS 和 ARM 上的构建. - -### ClickHouse 版本 18.16.0, 2018-12-14 {#clickhouse-release-18-16-0-2018-12-14} - -#### 新特征: {#new-features} - -- 以半结构化输入格式 (`JSONEachRow` 、 `TSKV` ) 加载数据时, 会评估 `DEFAULT` 表达式的缺失字段. 该功能通过 `insert_sample_with_metadata` 设置启用. [#3555](https://github.com/ClickHouse/ClickHouse/pull/3555) -- `ALTER TABLE` 查询现在具有 `MODIFY ORDER BY` 操作, 用于在添加或删除表列时更改排序键. 这对于 `MergeTree` 系列中的表很有用, 这些表在基于此排序键合并时执行附加任务, 例如 `SummingMergeTree`、`AggregatingMergeTree` 等. [#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) [#3755](https://github.com/ClickHouse/ClickHouse/pull/3755) -- 对于`MergeTree` 系列中的表, 现在您可以指定不同的排序键 (`ORDER BY`) 和索引 (`PRIMARY KEY`) . 排序键可以比索引长. [#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) -- 添加了 `hdfs` 表功能和 `HDFS` 表引擎, 用于导入和导出数据到HDFS. [chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/3617) -- 添加了使用 base64 的函数: `base64Encode`, `base64Decode`, `tryBase64Decode`. [Alexander Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3350) -- 现在你可以使用一个参数来配置`uniqCombined`聚合函数的精度(选择HyperLogLog单元格的数量). [#3406](https://github.com/ClickHouse/ClickHouse/pull/3406) -- 添加了 `system.contributors` 表, 其中包含在 ClickHouse 中提交的每个人的姓名. [#3452](https://github.com/ClickHouse/ClickHouse/pull/3452) -- 添加了省略 `ALTER TABLE ... FREEZE` 查询的分区的功能,以便一次备份所有分区. [#3514](https://github.com/ClickHouse/ClickHouse/pull/3514) -- 添加了不需要指定返回值类型的 `dictGet` 和 `dictGetOrDefault` 函数. 类型是根据字典描述自动确定的. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3564) -- 现在您可以为表描述中的列指定注释并使用 `ALTER` 更改它. [#3377](https://github.com/ClickHouse/ClickHouse/pull/3377) -- 支持使用简单键读取 `Join` 类型的表. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3728) -- 现在您可以在创建 `Join` 类型表时指定选项 `join_use_nulls`、`max_rows_in_join`、`max_bytes_in_join` 和 `join_overflow_mode`. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3728) -- 加了 `joinGet` 函数, 允许您像使用字典一样使用 `Join` 类型的表. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3728) -- 将 `partition_key`、`sorting_key`、`primary_key` 和 `sampling_key` 列添加到 `system.tables` 表中, 以提供有关表键的信息. [#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) -- 向 `system.columns` 表添加了 `is_in_partition_key`、`is_in_sorting_key` 、`is_in_primary_key` 和 `is_in_sampling_key` 列. [#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) -- 将 `min_time` 和 `max_time` 列添加到 `system.parts` 表中. 当分区键是由 `DateTime`列组成的表达式时,将填充这些列. [Emmanuel Donin de Rosière](https://github.com/ClickHouse/ClickHouse/pull/3800) - -#### Bug 修复: {#bug-fixes-1} - -- `LowCardinality` 数据类型的修复和性能改进. `GROUP BY` 使用 `LowCardinality(Nullable(...))`. 获取 `extremes` 的值. 处理高阶函数. `LEFT ARRAY JOIN`. 分布式 `GROUP BY`. 返回 `Array` 的函数. 执行 `ORDER BY`. 写入 `Distributed` 表(nicelulu). 向后兼容来自实现 `Native` 协议的旧客户端的 `INSERT` 查询. 支持 `JOIN` 的 `LowCardinality`. 在单个流中工作时提高了性能. [#3823](https://github.com/ClickHouse/ClickHouse/pull/3823) [#3803](https://github.com/ClickHouse/ClickHouse/pull/3803) [#3799](https://github.com/ClickHouse/ClickHouse/pull/3799) [#3769](https://github.com/ClickHouse/ClickHouse/pull/3769) [#3744](https://github.com/ClickHouse/ClickHouse/pull/3744) [#3681](https://github.com/ClickHouse/ClickHouse/pull/3681) [#3651](https://github.com/ClickHouse/ClickHouse/pull/3651) [#3649](https://github.com/ClickHouse/ClickHouse/pull/3649) [#3641](https://github.com/ClickHouse/ClickHouse/pull/3641) [#3632](https://github.com/ClickHouse/ClickHouse/pull/3632) [#3568](https://github.com/ClickHouse/ClickHouse/pull/3568) [#3523](https://github.com/ClickHouse/ClickHouse/pull/3523) [#3518](https://github.com/ClickHouse/ClickHouse/pull/3518) -- 修复了 `select_sequential_consistency` 选项的工作方式. 以前, 启用此设置后, 有时会在开始写入新分区后返回不完整的结果. [#2863](https://github.com/ClickHouse/ClickHouse/pull/2863) -- 执行 DDL `ON CLUSTER` 查询和 `ALTER UPDATE/DELETE` 时正确指定数据库. [#3772](https://github.com/ClickHouse/ClickHouse/pull/3772) [#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) -- 为 VIEW 内的子查询正确指定了数据库. [#3521](https://github.com/ClickHouse/ClickHouse/pull/3521) -- 修复了 `PREWHERE` 中的 `FINAL` 错误, 用于 `VersionedCollapsingMergeTree` . [7167bfd7](https://github.com/ClickHouse/ClickHouse/commit/7167bfd7b365538f7a91c4307ad77e552ab4e8c1) -- 现在您可以使用 `KILL QUERY` 取消尚未启动的查询, 因为它们正在等待表被锁定. [#3517](https://github.com/ClickHouse/ClickHouse/pull/3517) -- 如果时钟在午夜后移, 则更正了日期和时间计算(这发生在伊朗, 1981 年至 1983 年发生在莫斯科). 以前, 这导致时间比必要的提前一天重置, 并且还导致文本格式的日期和时间格式不正确. [#3819](https://github.com/ClickHouse/ClickHouse/pull/3819) -- 修复了某些情况下 `VIEW` 和省略数据库的子查询的错误. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3521) -- 修复了由于未锁定内部 `MATERIALIZED VIEW` 而同时从 `MATERIALIZED VIEW` 中读取并删除 `MATERIALIZED VIEW` 时的竞争条件. [#3404](https://github.com/ClickHouse/ClickHouse/pull/3404) [#3694](https://github.com/ClickHouse/ClickHouse/pull/3694) -- 修复了错误`Lock handler cannot be nullptr`. [#3689](https://github.com/ClickHouse/ClickHouse/pull/3689) -- 修复了启用 `compile_expressions` 选项时的查询处理(默认情况下启用). 不再展开像 `now` 函数这样的非确定性常量表达式. [#3457](https://github.com/ClickHouse/ClickHouse/pull/3457) -- 修复了在 `toDecimal32/64/128` 函数中指定非常量比例参数时崩溃的问题s. -- 修复了尝试将包含 `Values` 格式的 `NULL` 元素的数组插入没有 `Nullable` 的 `Array` 类型的列时的错误(如果 `input_format_values_interpret_expressions` = 1). [#3487](https://github.com/ClickHouse/ClickHouse/pull/3487) [#3503](https://github.com/ClickHouse/ClickHouse/pull/3503) -- 如果 ZooKeeper 不可用, 则修复了在 `DDLWorker` 中连续错误记录的问题. [8f50c620](https://github.com/ClickHouse/ClickHouse/commit/8f50c620334988b28018213ec0092fe6423847e2) -- 修复了来自 `Date` 和 `DateTime` 类型参数的 `quantile*` 函数的返回类型. [#3580](https://github.com/ClickHouse/ClickHouse/pull/3580) -- 修复了 `WITH` 子句 如果它指定一个没有表达式的简单别名. [#3570](https://github.com/ClickHouse/ClickHouse/pull/3570) -- 修复了启用 `enable_optimize_predicate_expression` 时使用命名子查询和限定列名的查询的处理. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3588) -- 修复了使用物化视图时 `尝试附加到 nullptr 线程组` 的错误. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3623) -- 修复了将某些不正确的参数传递给 `arrayReverse` 函数时发生的崩溃. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) -- 修复了 `extractURLParameter` 函数中的缓冲区溢出问题. 改进性能. 添加了对包含零字节的字符串的正确处理. [141e9799](https://github.com/ClickHouse/ClickHouse/commit/141e9799e49201d84ea8e951d1bed4fb6d3dacb5) -- 修复了 `lowerUTF8` 和 `upperUTF8` 函数中的缓冲区溢出. 删除了通过 `FixedString` 类型参数执行这些函数的能力. [#3662](https://github.com/ClickHouse/ClickHouse/pull/3662) -- 修复了删除 `MergeTree` 表时罕见的竞争条件. [#3680](https://github.com/ClickHouse/ClickHouse/pull/3680) -- 修复了从 `Buffer` 表读取并同时在目标表上执行 `ALTER` 或 `DROP` 时的竞争条件. [#3719](https://github.com/ClickHouse/ClickHouse/pull/3719) -- 修复了超出 `max_temporary_non_const_columns` 限制时的段错误. [#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) - -#### 改进: {#improvements-1} - -- 服务器不会将处理后的配置文件写入`/etc/clickhouse-server/`目录. 相反, 它将它们保存在 `path` 内的 `preprocessed_configs` 目录中. 这意味着 `/etc/clickhouse-server/` 目录对 `clickhouse` 用户没有写权限, 提高了安全性. [#2443](https://github.com/ClickHouse/ClickHouse/pull/2443) -- `min_merge_bytes_to_use_direct_io` 选项默认设置为 10 GiB. 形成 MergeTree 系列中大部分表的合并将在 `O_DIRECT` 模式下执行,以防止过多的页面缓存逐出. [#3504](https://github.com/ClickHouse/ClickHouse/pull/3504) -- 当表数量非常多时,加速服务器启动. [#3398](https://github.com/ClickHouse/ClickHouse/pull/3398) -- 为副本之间的连接添加了连接池和 HTTP `Keep-Alive`. [#3594](https://github.com/ClickHouse/ClickHouse/pull/3594) -- 如果查询语法无效, `HTTP` 接口返回 `400 Bad Request` 代码(之前返回500). [31bc680a](https://github.com/ClickHouse/ClickHouse/commit/31bc680ac5f4bb1d0360a8ba4696fa84bb47d6ab) -- `join_default_strictness` 选项默认设置为 `ALL` 以实现兼容性. [120e2cbe](https://github.com/ClickHouse/ClickHouse/commit/120e2cbe2ff4fbad626c28042d9b28781c805afe) -- 对于无效或复杂的正则表达式,从 `re2` 库中删除了对 `stderr` 的日志记录. [#3723](https://github.com/ClickHouse/ClickHouse/pull/3723) -- 为 `Kafka` 表引擎添加: 在开始从 Kafka 读取之前检查订阅; 表的 kafka_max_block_size 设置. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3396) -- `cityHash64`、`farmHash64`、`metroHash64`、`sipHash64`、`halfMD5`、`murmurHash2_32`、`murmurHash2_64`、`murmurHash3_32` 和`murmurHash3_64` 函数现在可用于任意数量的参数和参数元组的形式. [#3451](https://github.com/ClickHouse/ClickHouse/pull/3451) [#3519](https://github.com/ClickHouse/ClickHouse/pull/3519) -- `arrayReverse` 函数现在适用于任何类型的数组. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) -- 添加了一个可选参数:`timeSlots` 函数的插槽大小. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3724) -- 对于 `FULL` 和 `RIGHT JOIN`,`max_block_size` 设置用于来自右表的非连接数据流. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3699) -- 在 `clickhouse-benchmark` 和 `clickhouse-performance-test` 中添加了 `--secure` 命令行参数以启用 TLS. [#3688](https://github.com/ClickHouse/ClickHouse/pull/3688) [#3690](https://github.com/ClickHouse/ClickHouse/pull/3690) -- `Buffer` 类型表的结构与目标表的结构不匹配时的类型转换. [Vitaly Baranov](https://github.com/ClickHouse/ClickHouse/pull/3603) -- 添加了 `tcp_keep_alive_timeout` 选项以在指定时间间隔内不活动后启用保持活动数据包. [#3441](https://github.com/ClickHouse/ClickHouse/pull/3441) -- 如果`system.parts` 表包含单列, 则删除了不必要的对分区键值的引用. [#3652](https://github.com/ClickHouse/ClickHouse/pull/3652) -- 模函数适用于 `Date` 和 `DateTime` 数据类型. [#3385](https://github.com/ClickHouse/ClickHouse/pull/3385) -- 添加了`POWER`、`LN`、`LCASE`、`UCASE`、`REPLACE`、`LOCATE`、`SUBSTR` 和`MID` 函数的同义词. [#3774](https://github.com/ClickHouse/ClickHouse/pull/3774) [#3763](https://github.com/ClickHouse/ClickHouse/pull/3763) Some function names are case-insensitive for compatibility with the SQL standard. Added syntactic sugar `SUBSTRING(expr FROM start FOR length)` for compatibility with SQL. [#3804](https://github.com/ClickHouse/ClickHouse/pull/3804) -- 添加了对与 `clickhouse-server` 可执行代码对应的 `mlock` 内存页面的功能,以防止其被强制内存不足. 默认情况下禁用此功能. [#3553](https://github.com/ClickHouse/ClickHouse/pull/3553) -- 从`O_DIRECT` 读取时提高了性能(启用了`min_bytes_to_use_direct_io` 选项). [#3405](https://github.com/ClickHouse/ClickHouse/pull/3405) -- 改进了用于常量键参数和非常量默认参数的 `dictGet...OrDefault` 函数的性能. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3563) -- `firstSignificantSubdomain` 函数现在可以处理域 `gov`、`mil` 和 `edu`. [Igor Hatarist](https://github.com/ClickHouse/ClickHouse/pull/3601) Improved performance. [#3628](https://github.com/ClickHouse/ClickHouse/pull/3628) -- 能够通过在 `/etc/default/clickhouse` 中定义 `CLICKHOUSE_PROGRAM_ENV` 使用 `SYS-V init.d` 脚本来指定用于启动 `clickhouse-server` 的自定义环境变量. - [Pavlo Bashynskyi](https://github.com/ClickHouse/ClickHouse/pull/3612) -- clickhouse-server 初始化脚本的正确返回码. [#3516](https://github.com/ClickHouse/ClickHouse/pull/3516) -- `system.metrics` 表现在有 `VersionInteger` 指标, `system.build_options` 添加了行 `VERSION_INTEGER`, 其中包含 ClickHouse 版本的数字形式, 例如 `18016000`. [#3644](https://github.com/ClickHouse/ClickHouse/pull/3644) -- 删除了将 `Date` 类型与数字进行比较的功能,以避免诸如 `date = 2018-12-17` 之类的潜在错误, 其中错误地省略了日期周围的引号. [#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) -- 修复了像 `rowNumberInAllBlocks` 这样的有状态函数的行为。 由于在查询分析期间启动,他们以前输出的结果大一个数字. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3729) -- 如果无法删除 `force_restore_data` 文件, 则会显示错误消息. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3794) - -#### Build 改进: {#build-improvements-1} - -- 更新了 `jemalloc` 库, 修复了潜在的内存泄漏. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3557) -- 默认情况下启用使用 `jemalloc` 进行分析以便调试构建. [2cc82f5c](https://github.com/ClickHouse/ClickHouse/commit/2cc82f5cbe266421cd4c1165286c2c47e5ffcb15) -- 添加了仅在系统上安装了 `Docker` 时运行集成测试的能力. [#3650](https://github.com/ClickHouse/ClickHouse/pull/3650) -- 在 SELECT 查询中添加了模糊表达式测试. [#3442](https://github.com/ClickHouse/ClickHouse/pull/3442) -- 添加了针对提交的压力测试, 它以并行和随机顺序执行功能测试以检测更多竞争条件. [#3438](https://github.com/ClickHouse/ClickHouse/pull/3438) -- 改进了在 Docker 镜像中启动 clickhouse-server 的方法. [Elghazal Ahmed](https://github.com/ClickHouse/ClickHouse/pull/3663) -- 对于 Docker 映像, 添加了对使用 `/docker-entrypoint-initdb.d` 目录中的文件初始化数据库的支持. [Konstantin Lebedev](https://github.com/ClickHouse/ClickHouse/pull/3695) -- 修复了 ARM 上的构建. [#3709](https://github.com/ClickHouse/ClickHouse/pull/3709) - -#### 向后不兼容的更新: {#backward-incompatible-changes} - -- 删除了将 `Date` 类型与数字进行比较的能力. 而不是 `toDate('2018-12-18') = 17883`, 你必须使用显式类型转换 `= toDate(17883)`. [#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) - -## ClickHouse 版本 18.14 {#clickhouse-release-18-14} - -### ClickHouse 版本 18.14.19, 2018-12-19 {#clickhouse-release-18-14-19-2018-12-19} - -#### Bug 修复: {#bug-fixes-2} - -- 修复了导致使用 ODBC 源更新字典出现问题的错误. [#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) -- 执行 DDL `ON CLUSTER` 查询时正确指定数据库. [#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) -- 修复了超出 `max_temporary_non_const_columns` 限制时的段错误. [#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) - -#### Build 改进: {#build-improvements-2} - -- 修复了 ARM 上的构建. - -### ClickHouse 版本 18.14.18, 2018-12-04 {#clickhouse-release-18-14-18-2018-12-04} - -#### Bug 修复: {#bug-fixes-3} - -- 修复了 `dictGet...` 函数对于 `range` 类型的字典的错误,如果其中一个参数是常量而另一个不是. [#3751](https://github.com/ClickHouse/ClickHouse/pull/3751) -- 修复了导致消息 `netlink: '...': attribute type 1 has an invalid length` 打印在 Linux 内核日志中的错误, 这种错误只发生在足够新的 Linux 内核版本上. [#3749](https://github.com/ClickHouse/ClickHouse/pull/3749) -- 修复了函数 `empty` 中 `FixedString` 类型参数的段错误. [Daniel, Dao Quang Minh](https://github.com/ClickHouse/ClickHouse/pull/3703) -- 修复了在使用大值 `max_query_size` 设置时过多的内存分配(一次性预分配了 `max_query_size` 字节的内存块). [#3720](https://github.com/ClickHouse/ClickHouse/pull/3720) - -#### Build 更新: {#build-changes} - -- 使用 OS 包中版本 7 的 LLVM/Clang 库修复构建 (这些库用于运行时查询编译). [#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) - -### ClickHouse 版本 18.14.17, 2018-11-30 {#clickhouse-release-18-14-17-2018-11-30} - -#### Bug 修复: {#bug-fixes-4} - -- 修复了 ODBC 桥进程未随主服务器进程终止的情况. [#3642](https://github.com/ClickHouse/ClickHouse/pull/3642) -- 修复了同步插入到`Distributed` 表中的问题, 其中的列列表与远程表的列列表不同. [#3673](https://github.com/ClickHouse/ClickHouse/pull/3673) -- 修复了在删除 MergeTree 表时可能导致崩溃的罕见竞争条件. [#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) -- 修复了查询线程创建失败并出现 `资源暂时不可用` 错误时的查询死锁. [#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) -- 修复了当使用 `CREATE AS table` 语法并且在 `AS table` 之前指定 `ENGINE` 子句时对 `ENGINE` 子句的解析 (错误导致忽略指定的引擎). [#3692](https://github.com/ClickHouse/ClickHouse/pull/3692) - -### ClickHouse 版本 18.14.15, 2018-11-21 {#clickhouse-release-18-14-15-2018-11-21} - -#### Bug 修复: {#bug-fixes-5} - -- 反序列化 `Array(String)` 类型的列时高估了内存块的大小, 导致 `Memory limit exceeded` 错误. 该问题出现在版本 18.12.13. [#3589](https://github.com/ClickHouse/ClickHouse/issues/3589) - -### ClickHouse 版本 18.14.14, 2018-11-20 {#clickhouse-release-18-14-14-2018-11-20} - -#### Bug 修复: {#bug-fixes-6} - -- 修复了集群配置为安全时的 `ON CLUSTER` 查询 (标志 `` ). [#3599](https://github.com/ClickHouse/ClickHouse/pull/3599) - -#### Build Changes: {#build-changes-1} - -- 修复的问题(来自系统的 llvm-7, macos). [#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) - -### ClickHouse 版本 18.14.13, 2018-11-08 {#clickhouse-release-18-14-13-2018-11-08} - -#### Bug 修复: {#bug-fixes-7} - -- 修复了 `MergingSorted 流中的块结构不匹配` 错误. [#3162](https://github.com/ClickHouse/ClickHouse/issues/3162) -- 修复了 `ON CLUSTER` 查询, 以防在集群配置中打开安全连接 (`` 标志). [#3465](https://github.com/ClickHouse/ClickHouse/pull/3465) -- 修复了使用 `SAMPLE`、`PREWHERE` 和 alias 列的查询中的错误. [#3543](https://github.com/ClickHouse/ClickHouse/pull/3543) -- 修复了启用 `min_bytes_to_use_direct_io` 设置时罕见的 `unknown compression method` 错误. [3544](https://github.com/ClickHouse/ClickHouse/pull/3544) - -#### 性能改进: {#performance-improvements} - -- 修复了在 AMD EPYC 处理器上执行时使用 UInt16 或 Date 类型列的 `GROUP BY` 查询的性能回归. [Igor Lapko](https://github.com/ClickHouse/ClickHouse/pull/3512) -- 修复了处理长字符串的查询的性能回归. [#3530](https://github.com/ClickHouse/ClickHouse/pull/3530) - -#### Build 改进: {#build-improvements-3} - -- 简化 Arcadia 构建的改进. [#3475](https://github.com/ClickHouse/ClickHouse/pull/3475), [#3535](https://github.com/ClickHouse/ClickHouse/pull/3535) - -### ClickHouse 版本 18.14.12, 2018-11-02 {#clickhouse-release-18-14-12-2018-11-02} - -#### Bug 修复: {#bug-fixes-8} - -- 修复了加入两个未命名子查询时崩溃的问题. [#3505](https://github.com/ClickHouse/ClickHouse/pull/3505) -- 修复了在查询外部数据库时生成不正确的查询 (带有空的 `WHERE` 子句). [hotid](https://github.com/ClickHouse/ClickHouse/pull/3477) -- 修复了在 ODBC 字典中使用错误超时值的问题. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3511) - -### ClickHouse 版本 18.14.11, 2018-10-29 {#clickhouse-release-18-14-11-2018-10-29} - -#### Bug 修复: {#bug-fixes-9} - -- 修复了错误 `Block structure mismatch in UNION stream: different number of columns`. [#2156](https://github.com/ClickHouse/ClickHouse/issues/2156) -- 修复了在包含嵌套结构内的数组的表中合并数据时出现的错误. [#3397](https://github.com/ClickHouse/ClickHouse/pull/3397) -- 修复了如果禁用 `merge_tree_uniform_read_distribution` 设置 (默认启用) 时查询结果不正确的问题. [#3429](https://github.com/ClickHouse/ClickHouse/pull/3429) -- 修复了以本机格式插入分布式表的错误. [#3411](https://github.com/ClickHouse/ClickHouse/issues/3411) - -### ClickHouse 版本 18.14.10, 2018-10-23 {#clickhouse-release-18-14-10-2018-10-23} - -- `compile_expressions` 设置 (表达式的 JIT 编译) 默认是禁用的. [#3410](https://github.com/ClickHouse/ClickHouse/pull/3410) -- `enable_optimize_predicate_expression` 设置默认是禁用的. - -### ClickHouse 版本 18.14.9, 2018-10-16 {#clickhouse-release-18-14-9-2018-10-16} - -#### 新特征: {#new-features-1} - -- `GROUP BY` 的 `WITH CUBE` 修饰符 (也可以使用替代语法 `GROUP BY CUBE(...)`). [#3172](https://github.com/ClickHouse/ClickHouse/pull/3172) -- 添加了 `formatDateTime` 函数. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2770) -- 增加了`JDBC`表引擎和`jdbc`表功能 (需要安装clickhouse-jdbc-bridge) . [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) -- 添加了用于处理 ISO 周数的函数:`toISOWeek`、`toISOYear`、`toStartOfISOYear` 和 `toDayOfYear`. [#3146](https://github.com/ClickHouse/ClickHouse/pull/3146) -- 现在您可以为 `MySQL` 和 `ODBC` 表使用 `Nullable` 列. [#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) -- 嵌套数据结构可以作为 `JSONEachRow` 格式的嵌套对象读取. 添加了 `input_format_import_nested_json` 设置. [Veloman Yunkan](https://github.com/ClickHouse/ClickHouse/pull/3144) -- 插入数据时,许多`MATERIALIZED VIEW` 都可以进行并行处理. 请参阅`parallel_view_processing` 设置. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3208) -- 添加了 `SYSTEM FLUSH LOGS` 查询 (强制日志刷新到系统表,例如 `query_log`) [#3321](https://github.com/ClickHouse/ClickHouse/pull/3321) -- 现在你可以在声明 `Replicated` 表时使用预定义的 `database` 和 `table` 宏. [#3251](https://github.com/ClickHouse/ClickHouse/pull/3251) -- 添加了以工程符号 (表示十的幂) 读取 `Decimal` 类型值的能力. [#3153](https://github.com/ClickHouse/ClickHouse/pull/3153) - -#### 实验特征: {#experimental-features} - -- `LowCardinality` 数据类型的 GROUP BY 子句优化. [#3138](https://github.com/ClickHouse/ClickHouse/pull/3138) -- `LowCardinality` 数据类型表达式的优化计算. [#3200](https://github.com/ClickHouse/ClickHouse/pull/3200) - -#### 改进: {#improvements-2} - -- 使用 `ORDER BY` 和 `LIMIT` 显着减少了查询的内存消耗. 查看 `max_bytes_before_remerge_sort` 设置. [#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) -- 如果没有`JOIN` (`LEFT`,`INNER`,...), 则假定`INNER JOIN`. [#3147](https://github.com/ClickHouse/ClickHouse/pull/3147) -- 合格的星号在使用 `JOIN` 的查询中正常工作. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3202) -- `ODBC` 表引擎正确选择引用远程数据库的 SQL 方言中的标识符的方法. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) -- `compile_expressions` 设置 (表达式的 JIT 编译) 默认启用. -- 修复了同时 DROP DATABASE/TABLE IF EXISTS 和 CREATE DATABASE/TABLE IF NOT EXISTS 的行为. 以前, `CREATE DATABASE ... IF NOT EXISTS` 查询可能会返回错误消息"File ... already exists", 而`CREATE TABLE ... IF NOT EXISTS` 和 `DROP TABLE IF EXISTS` 查询可能会返回 `Table ...现在正在创建或附加`. [#3101](https://github.com/ClickHouse/ClickHouse/pull/3101) -- 当从 MySQL 或 ODBC 表查询时, 带有常量右半部分的 LIKE 和 IN 表达式被传递到远程服务器. [#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) -- 从 MySQL 和 ODBC 表查询时, 与 WHERE 子句中的常量表达式的比较将传递到远程服务器. 以前,只通过与常量的比较. [#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) -- 正确计算终端中 `Pretty` 格式的行宽,包括带有象形文字的字符串. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3257). -- 可以为 `ALTER UPDATE` 查询指定 `ON CLUSTER`. -- 提高了读取 `JSONEachRow` 格式数据的性能. [#3332](https://github.com/ClickHouse/ClickHouse/pull/3332) -- 为兼容性添加了`LENGTH` 和`CHARACTER_LENGTH` 函数的同义词. `CONCAT` 函数不再区分大小写. [#3306](https://github.com/ClickHouse/ClickHouse/pull/3306) -- 添加了`DateTime` 类型的`TIMESTAMP` 同义词. [#3390](https://github.com/ClickHouse/ClickHouse/pull/3390) -- 服务器日志中始终为 query_id 保留空间, 即使日志行与查询无关. 这使得使用第三方工具解析服务器文本日志变得更容易. -- 当查询超过整数 GB 的下一个级别时, 会记录查询的内存消耗. [#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) -- 为使用 Native 协议的客户端库错误发送的列数少于服务器预期的 INSERT 查询的情况添加了兼容模式. 这种情况在使用 clickhouse-cpp 库时是可能的. 之前这种场景导致服务器崩溃. [#3171](https://github.com/ClickHouse/ClickHouse/pull/3171) -- 在`clickhouse-copier` 中用户定义的WHERE 表达式中, 您现在可以使用`partition_key` 别名(用于按源表分区进行额外过滤). 如果分区方案在复制过程中发生变化, 但只是轻微变化, 这将很有用. [#3166](https://github.com/ClickHouse/ClickHouse/pull/3166) -- `Kafka` 引擎的工作流已移至后台线程池, 以便在高负载时自动降低数据读取速度. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). -- 支持以 `Cap'n'Proto format` 读取结构的 `Tuple` 和 `Nested` 值,例如 `struct`. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3216) -- `firstSignificantSubdomain` 函数的顶级域列表现在包括域 `biz`. [decaseal](https://github.com/ClickHouse/ClickHouse/pull/3219) -- 在外部字典的配置中, `null_value` 被解释为默认数据类型的值. [#3330](https://github.com/ClickHouse/ClickHouse/pull/3330) -- 支持 `Decimal` 的 `intDiv` 和 `intDivOrZero` 函数. [b48402e8](https://github.com/ClickHouse/ClickHouse/commit/b48402e8712e2b9b151e0eef8193811d433a1264) -- 支持`Date`、`DateTime`、`UUID`和 `Decimal`类型作为`sumMap`聚合函数的键. [#3281](https://github.com/ClickHouse/ClickHouse/pull/3281) -- 支持外部字典中的 `Decimal` 数据类型. [#3324](https://github.com/ClickHouse/ClickHouse/pull/3324) -- 支持 `SummingMergeTree` 表中的 `Decimal` 数据类型. [#3348](https://github.com/ClickHouse/ClickHouse/pull/3348) -- 在 `if` 中添加了针对 `UUID` 的专业化. [#3366](https://github.com/ClickHouse/ClickHouse/pull/3366) -- 从 `MergeTree 表` 读取时减少了 `open` 和 `close` 系统调用的数量. [#3283](https://github.com/ClickHouse/ClickHouse/pull/3283) -- `TRUNCATE TABLE` 查询可以在任何副本上执行 (查询被传递给领导副本). [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3375) - -#### Bug 修复: {#bug-fixes-10} - -- 修复了`range_hashed` 词典的`Dictionary` 表问题。 此错误发生在 18.12.17 版本中. [#1702](https://github.com/ClickHouse/ClickHouse/pull/1702) -- 修复了加载`range_hashed` 字典时的错误 (消息`Unsupported type Nullable (...)`). 此错误发生在 18.12.17 版本中. [#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) -- 修复了`pointInPolygon`函数中由于大量顶点彼此靠近的多边形计算不准确而导致的错误. [#3331](https://github.com/ClickHouse/ClickHouse/pull/3331) [#3341](https://github.com/ClickHouse/ClickHouse/pull/3341) -- 如果合并数据部分后, 结果部分的校验和与另一个副本中相同合并的结果不同, 则删除合并的结果并从另一个副本下载数据部分(这是正确的行为). 但是下载数据部分后, 由于该部分已经存在的错误, 无法将其添加到工作集中(因为数据部分在合并后有一些延迟被删除). 这导致循环尝试下载相同的数据. [#3194](https://github.com/ClickHouse/ClickHouse/pull/3194) -- 修复了查询总内存消耗的错误计算 (由于计算错误,`max_memory_usage_for_all_queries` 设置工作不正确,`MemoryTracking` 指标的值不正确). 此错误发生在 18.12.13 版本中. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3344) -- 修复了 `CREATE TABLE ... ON CLUSTER ... AS SELECT ...` 的功能.此错误发生在 18.12.13 版本. [#3247](https://github.com/ClickHouse/ClickHouse/pull/3247) -- 修复了如果 `JOIN` 仅在远程服务器上执行, 则在启动查询的服务器上为 `JOIN` 准备不必要的数据结构. [#3340](https://github.com/ClickHouse/ClickHouse/pull/3340) -- 修复了 `Kafka` 引擎中的错误:开始读取数据时出现异常后死锁, 完成后锁定. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). -- 对于 `Kafka` 表, 未传递可选的 `schema` 参数 (`Cap'n'Proto` 格式的模式). [Vojtech Splichal](https://github.com/ClickHouse/ClickHouse/pull/3150) -- 如果 ZooKeeper 服务器的集合具有接受连接但随后立即关闭它而不是响应握手的服务器, 则 ClickHouse 选择连接另一台服务器. 以前, 这会产生错误 `无法读取所有数据. 读取的字节数:0.预期的字节数:4`. 并且服务器无法启动. [8218cf3a](https://github.com/ClickHouse/ClickHouse/commit/8218cf3a5f39a43401953769d6d12a0bb8d29da9) -- 如果 ZooKeeper 服务器的集合包含 DNS 查询返回错误的服务器, 这些服务器将被忽略. [17b8e209](https://github.com/ClickHouse/ClickHouse/commit/17b8e209221061325ad7ba0539f03c6e65f87f29) -- `VALUES` 格式插入数据时, 修复了 `Date` 和 `DateTime` 之间的类型转换 (如果 `input_format_values_interpret_expressions = 1`). 之前在Unix Epoch时间的天数数值和Unix时间戳之间进行了转换, 导致了意想不到的结果. [#3229](https://github.com/ClickHouse/ClickHouse/pull/3229) -- 更正了 `Decimal` 和整数之间的类型转换. [#3211](https://github.com/ClickHouse/ClickHouse/pull/3211) -- 修复了 `enable_optimize_predicate_expression` 设置中的错误. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3231) -- 修复了 CSV 格式的浮点数解析错误, 如果使用非默认的 CSV 分隔符, 例如 `;`. [#3155](https://github.com/ClickHouse/ClickHouse/pull/3155) -- 修复了 `arrayCumSumNonNegative` 函数 (如果累加器小于零,它不会累加负值). [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/3163) -- 修复了使用 `PREWHERE` 时 `Merge` 表如何在 `Distributed` 表之上工作. [#3165](https://github.com/ClickHouse/ClickHouse/pull/3165) -- ALTER UPDATE` 查询中的错误修复. -- 修复了 18.12 版本中出现的 `odbc` 表函数中的错误. [#3197](https://github.com/ClickHouse/ClickHouse/pull/3197) -- 修复了使用 `StateArray` 组合器的聚合函数的操作. [#3188](https://github.com/ClickHouse/ClickHouse/pull/3188) -- 修复了将 `Decimal` 值除以零时的崩溃. [69dd6609](https://github.com/ClickHouse/ClickHouse/commit/69dd6609193beb4e7acd3e6ad216eca0ccfb8179) -- 修复了使用 `Decimal` 和整数参数的操作类型的输出. [#3224](https://github.com/ClickHouse/ClickHouse/pull/3224) -- 修复了在 `Decimal128` 上的 `GROUP BY` 期间的段错误. [3359ba06](https://github.com/ClickHouse/ClickHouse/commit/3359ba06c39fcd05bfdb87d6c64154819621e13a) -- `log_query_threads` 设置 (关于查询执行的每个线程的日志信息) 现在只有在 `log_queries` 选项 (关于查询的日志信息) 设置为 1 时才生效. 由于`log_query_threads` 选项默认启用, 即使查询日志被禁用, 有关线程的信息也会被记录. [#3241](https://github.com/ClickHouse/ClickHouse/pull/3241) -- 修复了分位数聚合函数分布式操作的错误 (错误信息`Not found column quantile...`). [292a8855](https://github.com/ClickHouse/ClickHouse/commit/292a885533b8e3b41ce8993867069d14cbd5a664) -- 修复了同时在 18.12.17 版本服务器和旧服务器的集群上工作时的兼容性问题. 对于具有固定长度和非固定长度的 GROUP BY 键的分布式查询, 如果有大量数据要聚合, 则返回的数据并不总是完全聚合 (两个不同的行包含相同的聚合键). [#3254](https://github.com/ClickHouse/ClickHouse/pull/3254) -- 如果查询仅包含测试中声明的部分替换,则修复了对 `clickhouse-performance-test` 中替换的处理. [#3263](https://github.com/ClickHouse/ClickHouse/pull/3263) -- 修复了将 `FINAL` 与 `PREWHERE` 结合使用时的错误. [#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) -- 修复了在 `ALTER` 期间添加的列上使用 `PREWHERE` 时的错误. [#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) -- 添加了对`DEFAULT` 和`MATERIALIZED` 表达式是否缺少`arrayJoin` 的检查. 以前, `arrayJoin` 在插入数据时会导致错误. [#3337](https://github.com/ClickHouse/ClickHouse/pull/3337) -- 在`PREWHERE` 子句中添加了对缺少`arrayJoin` 的检查. 以前, 这会导致在执行查询时出现诸如 `Size ...不匹配` 或 `未知压缩方法` 之类的消息. [#3357](https://github.com/ClickHouse/ClickHouse/pull/3357) -- 修复了在用相应的 IN 表达式替换来自相等评估的 AND 链的优化后在极少数情况下可能发生的段错误. [liuyimin-bytedance](https://github.com/ClickHouse/ClickHouse/pull/3339) -- 对`clickhouse-benchmark` 的小修正: 以前, 客户端信息没有发送到服务器; 现在在关闭和限制迭代次数时更准确地计算执行的查询数. [#3351](https://github.com/ClickHouse/ClickHouse/pull/3351) [#3352](https://github.com/ClickHouse/ClickHouse/pull/3352) - -#### 向后不兼容的更新: {#backward-incompatible-changes-1} - -- 删除了 `allow_experimental_decimal_type` 选项. `Decimal` 数据类型可用于默认使用. [#3329](https://github.com/ClickHouse/ClickHouse/pull/3329) - -## ClickHouse 版本 18.12 {#clickhouse-release-18-12} - -### ClickHouse 版本 18.12.17, 2018-09-16 {#clickhouse-release-18-12-17-2018-09-16} - -#### 新特征: {#new-features-2} - -- 为 `clickhouse` 源实现了 `invalidate_query` (指定查询以检查是否需要更新外部字典的能力). [#3126](https://github.com/ClickHouse/ClickHouse/pull/3126) -- 添加了使用`UInt*`、`Int*` 和`DateTime` 数据类型 (连同`Date` 类型) 作为定义范围边界的`range_hashed` 外部字典键的功能. 现在可以使用 `NULL` 来指定一个开放范围. [Vasily Nemkov](https://github.com/ClickHouse/ClickHouse/pull/3123) -- `Decimal` 类型现在支持 `var*` 和 `stddev*` 聚合函数. [#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) -- `Decimal` 类型现在支持数学函数(`exp`、`sin` 等). [#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) -- `system.part_log` 表现在有 `partition_id` 列. [#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) - -#### Bug 修复: {#bug-fixes-11} - -- `Merge` 现在可以在 `Distributed` 表上正常工作. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3159) -- 修复了导致无法在 `Ubuntu Precise` 和旧版本上运行 ClickHouse 的不兼容性 (对 `glibc` 版本的不必要依赖). 18.12.13 版本出现不兼容. [#3130](https://github.com/ClickHouse/ClickHouse/pull/3130) -- 修复了 `enable_optimize_predicate_expression` 设置中的错误. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) -- 修复了在 18.12.13 之前的版本上使用副本集群并同时在具有较新版本的服务器上创建表的新副本时出现的向后兼容性小问题 (显示在消息 `无法克隆副本, 因为......更新为新的 ClickHouse 版本`, 这是合乎逻辑的, 但不应该发生). [#3122](https://github.com/ClickHouse/ClickHouse/pull/3122) - -#### 向后不兼容的更新: {#backward-incompatible-changes-2} - -- `enable_optimize_predicate_expression` 选项默认启用 (相当乐观). 如果出现与搜索列名相关的查询分析错误, 请将 `enable_optimize_predicate_expression` 设置为0. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) - -### ClickHouse 版本 18.12.14, 2018-09-13 {#clickhouse-release-18-12-14-2018-09-13} - -#### 新特征: {#new-features-3} - -- 添加了对 `ALTER UPDATE` 查询的支持. [#3035](https://github.com/ClickHouse/ClickHouse/pull/3035) -- 添加了 `allow_ddl` 选项, 用于限制用户对 DDL 查询的访问. [#3104](https://github.com/ClickHouse/ClickHouse/pull/3104) -- 为`MergeTree`引擎添加了`min_merge_bytes_to_use_direct_io`选项,它允许您设置合并总大小的阈值(当超过阈值时,数据部分文件将使用O_DIRECT处理). [#3117](https://github.com/ClickHouse/ClickHouse/pull/3117) -- `system.merges` 系统表现在包含 `partition_id` 列. [#3099](https://github.com/ClickHouse/ClickHouse/pull/3099) - -#### 改进 {#improvements-3} - -- 如果数据部分在变异期间保持不变,则副本不会下载它. [#3103](https://github.com/ClickHouse/ClickHouse/pull/3103) -- 使用 `clickhouse-client` 时,设置名称可自动完成. [#3106](https://github.com/ClickHouse/ClickHouse/pull/3106) - -#### Bug 修复: {#bug-fixes-12} - -- 添加了对插入时作为`Nested` 类型字段元素的数组大小的检查. [#3118](https://github.com/ClickHouse/ClickHouse/pull/3118) -- 修复了使用 `ODBC` 源和 `hashed` 存储更新外部词典的错误. 此错误发生在 18.12.13 版本中. -- 修复了从具有 `IN` 条件的查询创建临时表时崩溃的问题. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3098) -- 修复了可以包含 `NULL` 元素的数组的聚合函数中的错误. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3097) - -### ClickHouse 版本 18.12.13, 2018-09-10 {#clickhouse-release-18-12-13-2018-09-10} - -#### 新特征: {#new-features-4} - -- 添加了`DECIMAL(digits, scale)`数据类型(`Decimal32(scale)`、`Decimal64(scale)`、`Decimal128(scale)`). 要启用它, 请使用设置 `allow_experimental_decimal_type`. [#2846](https://github.com/ClickHouse/ClickHouse/pull/2846) [#2970](https://github.com/ClickHouse/ClickHouse/pull/2970) [#3008](https://github.com/ClickHouse/ClickHouse/pull/3008) [#3047](https://github.com/ClickHouse/ClickHouse/pull/3047) -- 用于`GROUP BY` 的新`WITH ROLLUP` 修饰符 (替代语法:`GROUP BY ROLLUP(...)`). [#2948](https://github.com/ClickHouse/ClickHouse/pull/2948) -- 在使用 JOIN 的查询中,星号扩展为所有表中的列列表, 符合 SQL 标准. 您可以通过在用户配置级别将 `asterisk_left_columns_only` 设置为 1 来恢复旧行为. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2787) -- 添加了对带有表函数的 JOIN 的支持. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) -- 通过在 clickhouse-client 中按 Tab 自动完成. [Sergey Shcherbin](https://github.com/ClickHouse/ClickHouse/pull/2447) -- clickhouse-client 中的 Ctrl+C 清除输入的查询. [#2877](https://github.com/ClickHouse/ClickHouse/pull/2877) -- 添加了`join_default_strictness` 设置 (值:`"`、`'any'`、`'all'`). 这允许您不为`JOIN` 指定`ANY` 或`ALL`. [#2982](https://github.com/ClickHouse/ClickHouse/pull/2982) -- 与查询处理相关的服务器日志的每一行都显示了查询 ID. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) -- 现在您可以在 clickhouse-client 中获取查询执行日志 (使用 `send_logs_level` 设置). 通过分布式查询处理, 日志从所有服务器级联. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) -- `system.query_log` 和 `system.processes`(`SHOW PROCESSLIST`) 表现在包含有关运行查询时所有更改设置的信息(`Settings`数据的嵌套结构). 添加了`log_query_settings` 设置. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) -- `system.query_log` 和 `system.processes` 表现在显示有关参与查询执行的线程数的信息 (请参阅 `thread_numbers` 列). [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) -- 添加了 `ProfileEvents` 计数器, 用于测量网络读写和磁盘读写所花费的时间、网络错误次数以及网络带宽受限时所花费的等待时间. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) -- 添加了包含来自 rusage 的系统指标的 `ProfileEvents` 计数器 (您可以使用它们来获取有关用户空间和内核中 CPU 使用率、页面错误和上下文切换的信息), 以及 taskstats 指标 (使用这些来获取有关 I /O 等待时间, CPU 等待时间, 以及读取和记录的数据量, 有无页缓存). [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) -- `ProfileEvents` 计数器适用于全局和每个查询, 以及每个查询执行线程, 它允许您按查询详细分析资源消耗. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) -- 添加了 `system.query_thread_log` 表, 其中包含有关每个查询执行线程的信息. 添加了`log_query_threads` 设置. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) -- `system.metrics` 和 `system.events` 表现在有内置文档. [#3016](https://github.com/ClickHouse/ClickHouse/pull/3016) -- 添加了`arrayEnumerateDense`函数. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2975) -- 添加了 `arrayCumSumNonNegative` 和 `arrayDifference` 函数. [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/2942) -- 添加了`retention`聚合函数. [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2887) -- 现在您可以使用加号运算符添加 (合并) 聚合函数的状态, 并将聚合函数的状态乘以非负常数. [#3062](https://github.com/ClickHouse/ClickHouse/pull/3062) [#3034](https://github.com/ClickHouse/ClickHouse/pull/3034) -- MergeTree 系列中的表现在具有虚拟列 `_partition_id`. [#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) - -#### 实验功能: {#experimental-features-1} - -- 添加了 `LowCardinality(T)` 数据类型. 此数据类型会自动创建值的本地字典, 并允许在不解压字典的情况下进行数据处理. [#2830](https://github.com/ClickHouse/ClickHouse/pull/2830) -- 添加了 JIT 编译函数的缓存和编译前使用次数的计数器. 要 JIT 编译表达式, 请启用 `compile_expressions` 设置. [#2990](https://github.com/ClickHouse/ClickHouse/pull/2990) [#3077](https://github.com/ClickHouse/ClickHouse/pull/3077) - -#### 改进: {#improvements-4} - -- 修复了有废弃副本时复制日志无限累积的问题. 为延迟较长的副本添加了有效的恢复模式. -- 当其中一个是字符串而其他是固定长度时,具有多个聚合字段的`GROUP BY` 的性能得到改善. -- 使用 `PREWHERE` 和在 `PREWHERE` 中隐式传输表达式时提高了性能. -- 改进了文本格式的解析性能 (`CSV`, `TSV`). [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2977) [#2980](https://github.com/ClickHouse/ClickHouse/pull/2980) -- 改进了读取二进制格式的字符串和数组的性能. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2955) -- 当单个服务器上有大量表时,提高性能并减少对 `system.tables` 和 `system.columns` 的查询的内存消耗. [#2953](https://github.com/ClickHouse/ClickHouse/pull/2953) -- 修复了大量查询导致错误时的性能问题 (`_dl_addr`函数在`perf top`中可见,但服务器没有使用太多CPU). [#2938](https://github.com/ClickHouse/ClickHouse/pull/2938) -- 条件被投射到视图中 (当启用`enable_optimize_predicate_expression` 时). [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) -- 对 `UUID` 数据类型功能的改进. [#3074](https://github.com/ClickHouse/ClickHouse/pull/3074) [#2985](https://github.com/ClickHouse/ClickHouse/pull/2985) -- The-Alchemist 词典支持 `UUID` 数据类型. [#2822](https://github.com/ClickHouse/ClickHouse/pull/2822) -- `visitParamExtractRaw` 函数可以正确处理嵌套结构. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2974) -- 启用 `input_format_skip_unknown_fields` 设置时, 会正确跳过 `JSONEachRow` 格式的对象字段. [BlahGeek](https://github.com/ClickHouse/ClickHouse/pull/2958) -- 对于带有条件的 `CASE` 表达式, 您现在可以省略 `ELSE`, 它等价于 `ELSE NULL`. [#2920](https://github.com/ClickHouse/ClickHouse/pull/2920) -- 现在可以在使用 ZooKeeper 时配置操作超时. [urykhy](https://github.com/ClickHouse/ClickHouse/pull/2971) -- 您可以将 `LIMIT n, m` 的偏移量指定为 `LIMIT n OFFSET m`. [#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) -- 您可以使用 `SELECT TOP n` 语法作为 `LIMIT` 的替代. [#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) -- 增加了写入系统表的队列大小, 因此不会经常发生`SystemLog parameter queue is full`错误. -- `windowFunnel` 聚合函数现在支持满足多个条件的事件. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2801) -- 重复列可用于 `JOIN` 的 `USING` 子句中. [#3006](https://github.com/ClickHouse/ClickHouse/pull/3006) -- Pretty` 格式现在对按宽度对齐的列有限制. 使用 `output_format_pretty_max_column_pad_width` 设置. 如果一个值更宽, 它仍然会完整显示, 但表格中的其他单元格不会太宽. [#3003](https://github.com/ClickHouse/ClickHouse/pull/3003) -- `odbc` 表函数现在允许您指定数据库/模式名称. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2885) -- 添加了使用在 `clickhouse-client` 配置文件中指定的用户名的功能. [Vladimir Kozbin](https://github.com/ClickHouse/ClickHouse/pull/2909) -- `ZooKeeperExceptions` 计数器被分成三个计数器:`ZooKeeperUserExceptions`、`ZooKeeperHardwareExceptions` 和 `ZooKeeperOtherExceptions`. -- `ALTER DELETE` 查询适用于物化视图. -- 为 `ReplicatedMergeTree` 表定期运行清理线程时添加了随机化, 以避免在有大量 `ReplicatedMergeTree` 表时出现周期性负载峰值. -- 支持 `ATTACH TABLE ... ON CLUSTER` 查询. [#3025](https://github.com/ClickHouse/ClickHouse/pull/3025) - -#### Bug 修复: {#bug-fixes-13} - -- 修复了 `Dictionary` 表的问题 (抛出 `Size of offsets does not match size of column` 或 `Unknown compression method` 异常). 这个bug出现在18.10.3版本. [#2913](https://github.com/ClickHouse/ClickHouse/issues/2913) -- 修复了合并 `CollapsingMergeTree` 表时, 如果其中一个数据部分为空 (如果所有数据都被删除,这些部分是在合并或`ALTER DELETE`期间形成的), 并且使用 `vertical` 算法进行合并. [#3049](https://github.com/ClickHouse/ClickHouse/pull/3049) -- 修复了在 `DROP` 或 `TRUNCATE` 期间为 `Memory` 表同时执行 `SELECT` 的竞争条件, 这可能导致服务器崩溃. 这个bug出现在1.1.54388版本. [#3038](https://github.com/ClickHouse/ClickHouse/pull/3038) -- 修复了在返回 `Session is expired` 错误时插入 `Replicated` 表时数据丢失的可能性 (数据丢失可以通过 `ReplicatedDataLoss` 指标检测). 此错误发生在 1.1.54378 版本中. [#2939](https://github.com/ClickHouse/ClickHouse/pull/2939) [#2949](https://github.com/ClickHouse/ClickHouse/pull/2949) [#2964](https://github.com/ClickHouse/ClickHouse/pull/2964) -- 修复了`JOIN ... ON` 期间的段错误. [#3000](https://github.com/ClickHouse/ClickHouse/pull/3000) -- 修复了当`WHERE`表达式完全由一个限定的列名组成时搜索列名的错误,例如`WHERE table.column`. [#2994](https://github.com/ClickHouse/ClickHouse/pull/2994) -- 修复了如果从远程服务器请求包含带有子查询的 IN 表达式的单个列,则在执行分布式查询时发生的 `Not found column` 错误. [#3087](https://github.com/ClickHouse/ClickHouse/pull/3087) -- 修正了 `UNION流中的块结构不匹配: 列数不同` 错误, 如果一个分片是本地的, 而另一个不是, 分布式查询发生, 并优化移动到 `PREWHERE` 被触发. [#2226](https://github.com/ClickHouse/ClickHouse/pull/2226) [#3037](https://github.com/ClickHouse/ClickHouse/pull/3037) [#3055](https://github.com/ClickHouse/ClickHouse/pull/3055) [#3065](https://github.com/ClickHouse/ClickHouse/pull/3065) [#3073](https://github.com/ClickHouse/ClickHouse/pull/3073) [#3090](https://github.com/ClickHouse/ClickHouse/pull/3090) [#3093](https://github.com/ClickHouse/ClickHouse/pull/3093) -- 修复了某些非凸多边形情况下的 `pointInPolygon` 函数. [#2910](https://github.com/ClickHouse/ClickHouse/pull/2910) -- 修复了将 `nan` 与整数进行比较时的错误结果. [#3024](https://github.com/ClickHouse/ClickHouse/pull/3024) -- 修复了在极少数情况下可能导致段错误的 `zlib-ng` 库中的错误. [#2854](https://github.com/ClickHouse/ClickHouse/pull/2854) -- 修复了在插入到具有 `AggregateFunction` 列的表时, 如果聚合函数的状态不简单 (单独分配内存) , 并且如果单个插入请求导致多个小块时的内存泄漏. [#3084](https://github.com/ClickHouse/ClickHouse/pull/3084) -- 修复了同时创建和删除同一个 `Buffer` 或 `MergeTree` 表时的竞争条件. -- 修复了比较由某些非平凡类型 (例如元组) 组成的元组时出现段错误的可能性. [#2989](https://github.com/ClickHouse/ClickHouse/pull/2989) -- 修复了运行某些 `ON CLUSTER` 查询时出现段错误的可能性. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2960) -- 修复了 `arrayDistinct` 函数中 `Nullable` 数组元素的错误. [#2845](https://github.com/ClickHouse/ClickHouse/pull/2845) [#2937](https://github.com/ClickHouse/ClickHouse/pull/2937) -- `enable_optimize_predicate_expression` 选项现在可以正确支持带有 `SELECT *` 的情况. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2929) -- 修复了重新初始化 ZooKeeper 会话时的段错误. [#2917](https://github.com/ClickHouse/ClickHouse/pull/2917) -- 修复了使用 ZooKeeper 时潜在的阻塞问题. -- 修复了在 `SummingMergeTree` 中添加嵌套数据结构的错误代码. -- 为聚合函数的状态分配内存时, 正确地考虑了对齐, 这使得在实现聚合函数的状态时使用需要对齐的操作成为可能. [chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/2808) - -#### 安全修复: {#security-fix} - -- 安全使用 ODBC 数据源. 与 ODBC 驱动程序的交互使用单独的 `clickhouse-odbc-bridge` 过程. 第三方 ODBC 驱动程序中的错误不再导致服务器稳定性或漏洞问题. [#2828](https://github.com/ClickHouse/ClickHouse/pull/2828) [#2879](https://github.com/ClickHouse/ClickHouse/pull/2879) [#2886](https://github.com/ClickHouse/ClickHouse/pull/2886) [#2893](https://github.com/ClickHouse/ClickHouse/pull/2893) [#2921](https://github.com/ClickHouse/ClickHouse/pull/2921) -- 修复了 `catBoostPool` 表函数中文件路径的错误验证. [#2894](https://github.com/ClickHouse/ClickHouse/pull/2894) -- 系统表的内容 (`tables`、`databases`、`parts`、`columns`、`parts_columns`、`merges`、`mutations`、`replicas` 和 `replication_queue`) 根据用户配置进行过滤访问数据库(`allow_databases`). [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2856) - -#### 向后不兼容的更新: {#backward-incompatible-changes-3} - -- 在使用 JOIN 的查询中, 星号扩展为所有表中的列列表, 符合 SQL 标准. 您可以通过在用户配置级别将 `asterisk_left_columns_only` 设置为 1 来恢复旧行为. - -#### Build 更新: {#build-changes-2} - -- 大多数集成测试现在可以通过提交运行. -- 代码样式检查也可以通过提交运行. -- 在 CentOS7/Fedora 上构建时正确选择了 `memcpy` 实现. [Etienne Champetier](https://github.com/ClickHouse/ClickHouse/pull/2912) -- When using clang to build, some warnings from `-Weverything` have been added, in addition to the regular `-Wall-Wextra -Werror`. [#2957](https://github.com/ClickHouse/ClickHouse/pull/2957) -- 调试构建使用 `jemalloc` 调试选项. -- 与 ZooKeeper 交互的库的接口被声明为抽象的. [#2950](https://github.com/ClickHouse/ClickHouse/pull/2950) - -## ClickHouse 版本 18.10 {#clickhouse-release-18-10} - -### ClickHouse 版本 18.10.3, 2018-08-13 {#clickhouse-release-18-10-3-2018-08-13} - -#### 新特征: {#new-features-5} - -- HTTPS 可用于复制. [#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) -- 除了现有的 `murmurHash2_32` 之外, 还添加了函数 `murmurHash2_64`、`murmurHash3_32`、`murmurHash3_64` 和 `murmurHash3_128`. [#2791](https://github.com/ClickHouse/ClickHouse/pull/2791) -- 支持 ClickHouse ODBC 驱动程序中的 Nullable 类型 (`ODBCDriver2` 输出格式). [#2834](https://github.com/ClickHouse/ClickHouse/pull/2834) -- 支持键列中的 `UUID`. - -#### 改进: {#improvements-5} - -- 从配置文件中删除集群时,无需重新启动服务器即可删除集群. [#2777](https://github.com/ClickHouse/ClickHouse/pull/2777) -- 从配置文件中删除外部字典时,无需重新启动服务器即可删除它们. [#2779](https://github.com/ClickHouse/ClickHouse/pull/2779) -- 为 `Kafka` 表引擎添加了 `SETTINGS` 支持. [Alexander Marshalov](https://github.com/ClickHouse/ClickHouse/pull/2781) -- `UUID` 数据类型的改进 (尚未完成). [#2618](https://github.com/ClickHouse/ClickHouse/pull/2618) -- 支持在 `SummingMergeTree`、`CollapsingMergeTree` 和 `VersionedCollapsingMergeTree` 引擎中合并后的空部分. [#2815](https://github.com/ClickHouse/ClickHouse/pull/2815) -- 已完成突变的旧记录被删除 (`ALTER DELETE`). [#2784](https://github.com/ClickHouse/ClickHouse/pull/2784) -- 添加了 `system.merge_tree_settings` 表. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/2841) -- `system.tables` 表现在有依赖列: `dependencies_database` 和 `dependencies_table`. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2851) -- 添加了 `max_partition_size_to_drop` 配置选项. [#2782](https://github.com/ClickHouse/ClickHouse/pull/2782) -- 添加了 `output_format_json_escape_forward_slashes` 选项. [Alexander Bocharov](https://github.com/ClickHouse/ClickHouse/pull/2812) -- 添加了 `max_fetch_partition_retries_count` 设置. [#2831](https://github.com/ClickHouse/ClickHouse/pull/2831) -- 添加了 `prefer_localhost_replica` 设置, 用于禁用本地副本的首选项并在没有进程间交互的情况下转到本地副本. [#2832](https://github.com/ClickHouse/ClickHouse/pull/2832) -- 在对空的 `Float32` 或 `Float64` 集合进行聚合的情况下, `quantileExact` 聚合函数返回 `nan` . [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2855) - -#### Bug 修复: {#bug-fixes-14} - -- 删除了 ODBC 连接字符串参数的不必要转义, 这使得无法建立连接. 此错误发生在 18.6.0 版本中. -- 修复了处理复制队列中 `REPLACE PARTITION` 命令的逻辑. 如果同一个分区有两个 `REPLACE` 命令, 不正确的逻辑可能会导致其中一个留在复制队列中而不会被执行. [#2814](https://github.com/ClickHouse/ClickHouse/pull/2814) -- 修复了所有数据部分为空时的合并错误 (如果所有数据都被删除, 则由合并或 `ALTER DELETE` 形成的部分). 这个bug出现在18.1.0版本. [#2930](https://github.com/ClickHouse/ClickHouse/pull/2930) -- 修复了并发 `Set` 或 `Join` 的错误. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2823) -- 修正了 `UNION流中的块结构不匹配: 列数不同` 错误, 如果一个 `SELECT` 查询包含重复的列名, 在子查询 `UNION ALL` 查询中发生的错误. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2094) -- 修复了连接 MySQL 服务器时发生异常时的内存泄漏. -- 修复了查询错误时不正确的 clickhouse-client 响应代码. -- 修复了包含 DISTINCT 的物化视图的错误行为. [#2795](https://github.com/ClickHouse/ClickHouse/issues/2795) - -#### 向后不兼容的更新: {#backward-incompatible-changes-4} - -- 删除了对分布式表的 CHECK TABLE 查询的支持. - -#### Build 更新: {#build-changes-3} - -- 分配器已被替换: 现在使用 `jemalloc` 代替 `tcmalloc`. 在某些情况下, 这将速度提高到 20%. 但是, 有些查询速度降低了 20%. 部分场景内存消耗降低约10%, 稳定性提升. 在竞争激烈的负载下, 用户空间和系统中的 CPU 使用率仅略有增加. [#2773](https://github.com/ClickHouse/ClickHouse/pull/2773) -- 使用子模块中的 libressl. [#1983](https://github.com/ClickHouse/ClickHouse/pull/1983) [#2807](https://github.com/ClickHouse/ClickHouse/pull/2807) -- 从子模块使用 unixodbc. [#2789](https://github.com/ClickHouse/ClickHouse/pull/2789) -- 使用子模块中的 mariadb-connector-c. [#2785](https://github.com/ClickHouse/ClickHouse/pull/2785) -- 将依赖于测试数据可用性的功能测试文件添加到存储库中 (暂时没有测试数据本身). - -## ClickHouse 版本 18.6 {#clickhouse-release-18-6} - -### ClickHouse 版本 18.6.0, 2018-08-02 {#clickhouse-release-18-6-0-2018-08-02} - -#### 新特征: {#new-features-6} - -- 添加了对 JOIN ON 语法的 ON 表达式的支持: - `JOIN ON Expr([table.]column ...) = Expr([table.]column, ...) [AND Expr([table.]column, ...) = Expr([table.]column, ...) ...]` - 表达式必须是由 AND 运算符连接的等式链. 等式的每一边都可以是一个表的列上的任意表达式. 支持对右表使用完全限定的列名 (`table.name`、`database.table.name`、`table_alias.name`、`subquery_alias.name`). [#2742](https://github.com/ClickHouse/ClickHouse/pull/2742) -- 可以启用 HTTPS 进行复制. [#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) - -#### 改进: {#improvements-6} - -- 服务器将其版本的补丁组件传递给客户端. 关于补丁版本组件的数据在 `system.processes` 和 `query_log` 中. [#2646](https://github.com/ClickHouse/ClickHouse/pull/2646) - -## ClickHouse 版本 18.5 {#clickhouse-release-18-5} - -### ClickHouse 版本 18.5.1, 2018-07-31 {#clickhouse-release-18-5-1-2018-07-31} - -#### 新特征: {#new-features-7} - -- 添加了哈希函数 `murmurHash2_32`. [#2756](https://github.com/ClickHouse/ClickHouse/pull/2756). - -#### 改进: {#improvements-7} - -- 现在您可以使用 `from_env` [#2741](https://github.com/ClickHouse/ClickHouse/pull/2741) 属性从环境变量设置配置文件中的值. -- 添加了不区分大小写的 `coalesce`、`ifNull` 和 `nullIf 函数` [#2752](https://github.com/ClickHouse/ClickHouse/pull/2752). - -#### Bug 修复: {#bug-fixes-15} - -- 修复了启动副本时可能出现的错误 [#2759](https://github.com/ClickHouse/ClickHouse/pull/2759). - -## ClickHouse 版本 18.4 {#clickhouse-release-18-4} - -### ClickHouse 版本 18.4.0, 2018-07-28 {#clickhouse-release-18-4-0-2018-07-28} - -#### 新特征: {#new-features-8} - -- 添加系统表: `formats`、`data_type_families`、`aggregate_function_combinators`、`table_functions`、`table_engines`、`collations` [#2721](https://github.com/ClickHouse/ClickHouse/pull/2721). -- 添加了使用表函数而不是表作为 `remote` 或`cluster table function` 的参数的功能 [#2708](https://github.com/ClickHouse/ClickHouse/pull/2708). -- 支持复制协议中的 `HTTP Basic` 身份验证 [#2727](https://github.com/ClickHouse/ClickHouse/pull/2727). -- `has` 函数现在允许在 `Enum` 值数组中搜索数值 [Maxim Khrisanfov](https://github.com/ClickHouse/ClickHouse/pull/2699). -- 支持在从 `Kafka` 读取时添加任意消息分隔符 [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2701). - -#### 改进: {#improvements-8} - -- `ALTER TABLE t DELETE WHERE` 查询不会重写不受 WHERE 条件影响的数据部分 [#2694](https://github.com/ClickHouse/ClickHouse/pull/2694). -- `ReplicatedMergeTree` 表的 `use_minimalistic_checksums_in_zookeeper` 选项默认启用. 此设置是在 1.1.54378, 2018-04-16 版本中添加的. 不能再安装早于 1.1.54378 的版本. -- 支持运行指定 `ON CLUSTER` 的 `KILL` 和 `OPTIMIZE` 查询 [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2689). - -#### Bug 修复: {#bug-fixes-16} - -- 修复了错误 `Column ... is not under a aggregate function and not in GROUP BY` 用于使用 IN 表达式进行聚合. 这个bug出现在18.1.0版本 ([bbdd780b](https://github.com/ClickHouse/ClickHouse/commit/bbdd780be0be06a0f336775941cdd536878dd2c2)) -- 修复了 `windowFunnel aggregate function` 中的一个错误 [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2735). -- 修复了 `anyHeavy` 聚合函数中的错误 ([a2101df2](https://github.com/ClickHouse/ClickHouse/commit/a2101df25a6a0fba99aa71f8793d762af2b801ee)) -- 修复了使用 `countArray()` 聚合函数时服务器崩溃的问题. - -#### 向后不兼容的更新: {#backward-incompatible-changes-5} - -- `Kafka` 引擎的参数已从 `Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format[, kafka_schema, kafka_num_consumers])` 更改为 `Kafka(kafka_broker_list, kafka_topic_list, kafka_topic_list, kafka_fka_name_schema_fka_format, kafka_fka_name_schema_group_format[, kafka_schema, kafka_num_consumers])` 如果您的表使用`kafka_schema` 或`kafka_num_consumers` 参数, 则必须手动编辑元数据文件`path/metadata/database/table.sql` 并添加具有`''` 值的`kafka_row_delimiter` 参数. - -## ClickHouse 版本 18.1 {#clickhouse-release-18-1} - -### ClickHouse 版本 18.1.0, 2018-07-23 {#clickhouse-release-18-1-0-2018-07-23} - -#### 新特征: {#new-features-9} - -- 支持对非复制 MergeTree 表的 `ALTER TABLE t DELETE WHERE` 查询 ([#2634](https://github.com/ClickHouse/ClickHouse/pull/2634)). -- 支持 `uniq*` 聚合函数系列的任意类型 ([#2010](https://github.com/ClickHouse/ClickHouse/issues/2010)). -- 支持比较运算符中的任意类型 ([#2026](https://github.com/ClickHouse/ClickHouse/issues/2026)). -- `users.xml` 文件允许设置格式为 `10.0.0.1/255.255.255.0` 的子网掩码. 这对于在中间为 0 的 IPv6 网络使用掩码是必要的 ([#2637](https://github.com/ClickHouse/ClickHouse/pull/2637)). -- 添加了 `arrayDistinct` 函数 ([#2670](https://github.com/ClickHouse/ClickHouse/pull/2670)). -- SummingMergeTree 引擎现在可以处理 AggregateFunction 类型的列 ([Constantin S. Pan](https://github.com/ClickHouse/ClickHouse/pull/2566)). - -#### 改进: {#improvements-9} - -- 更改了发布版本的编号方案. 现在第一部分包含发布年份 (莫斯科时区, 公元2000年), 第二部分包含主要更改的编号(大多数版本增加), 第三部分是补丁版本. 除非在变更日志中另有说明.否则版本仍然向后兼容. -- 更快地将浮点数转换为字符串. ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2664)). -- 如果在插入期间由于解析错误而跳过了某些行 (这在启用 `input_allow_errors_num` 和 `input_allow_errors_ratio` 设置的情况下是可能的), 跳过的行数现在会写入服务器日志([Leonardo Cecchi](https://github.com/ClickHouse/ClickHouse/pull/2669)). - -#### Bug 修复: {#bug-fixes-17} - -- 修复了临时表的 TRUNCATE 命令. ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2624)). -- 修复了 ZooKeeper 客户端库中读取响应时出现网络错误时发生的罕见死锁 ([c315200](https://github.com/ClickHouse/ClickHouse/commit/c315200e64b87e44bdf740707fc857d1fdf7e947)). -- 修复了 CAST 到 Nullable 类型期间的错误([#1322](https://github.com/ClickHouse/ClickHouse/issues/1322)). -- 修复了区间边界重合时 `maxIntersection()` 函数的错误结果 ([Michael Furmur](https://github.com/ClickHouse/ClickHouse/pull/2657)). -- 修复了函数参数中 OR 表达式链的错误转换 ([chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/2663)). -- 修复了在另一个子查询中包含 `IN(子查询)` 表达式的查询的性能下降 ([#2571](https://github.com/ClickHouse/ClickHouse/issues/2571)). -- 修复了使用非大写字母的 `CAST` 函数的分布式查询中不同版本服务器之间的不兼容问题 ([fe8c4d6](https://github.com/ClickHouse/ClickHouse/commit/fe8c4d64e434cacd4ceef34faa9005129f2190a5)). -- 添加了对外部 DBMS 的查询标识符的缺失引用 ([#2635](https://github.com/ClickHouse/ClickHouse/issues/2635)). - -#### 向后不兼容的更新: {#backward-incompatible-changes-6} - -- 将包含数字零的字符串转换为 DateTime 不起作用. 示例: `SELECT toDateTime('0')`. 这也是 `DateTime DEFAULT '0'` 在表中不起作用的原因, 以及在字典中 `0` 的原因. 解决方案: 用`0000-00-00 00:00:00`替换`0`. - -## ClickHouse 版本 1.1 {#clickhouse-release-1-1} - -### ClickHouse 版本 1.1.54394, 2018-07-12 {#clickhouse-release-1-1-54394-2018-07-12} - -#### 新特征: {#new-features-10} - -- 添加了 `histogram` 聚合函数 ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2521)). -- 现在可以使用 `OPTIMIZE TABLE ... FINAL` 而无需为 `ReplicatedMergeTree` 指定分区 ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2600)). - -#### Bug 修复: {#bug-fixes-18} - -- 修复了发送和下载复制数据时套接字读写超时 (一秒) 非常小的问题, 这使得如果网络或磁盘上有负载, 则无法下载较大的部分 (导致循环尝试 下载部分). 此错误发生在 1.1.54388 版本中. -- 修复了在表中插入重复数据块时在 ZooKeeper 中使用 chroot 时的问题. -- `has` 函数现在可以正确处理具有 Nullable 元素的数组 ([#2115](https://github.com/ClickHouse/ClickHouse/issues/2115)). -- `system.tables` 表在分布式查询中使用时可以正常工作. `metadata_modification_time` 和 `engine_full` 列现在是非虚拟的. 修复了仅从表中查询这些列时发生的错误. -- 修复了插入空数据块后空 `TinyLog` 表的工作方式 ([#2563](https://github.com/ClickHouse/ClickHouse/issues/2563)). -- 如果 ZooKeeper 中节点的值为 NULL, 则 `system.zookeeper` 表有效. - -### ClickHouse 版本 1.1.54390, 2018-07-06 {#clickhouse-release-1-1-54390-2018-07-06} - -#### 新特征: {#new-features-11} - -- 查询可以以 `multipart/form-data` 格式发送(在 `query` 字段中), 如果外部数据也被发送用于查询处理 ([Olga Hvostikova](https://github.com/ClickHouse/ClickHouse/pull/2490)). -- 添加了在以 CSV 格式读取数据时启用或禁用处理单引号或双引号的功能. 您可以在 `format_csv_allow_single_quotes` 和 `format_csv_allow_double_quotes` 设置中进行配置 ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2574)). -- 现在可以使用 `OPTIMIZE TABLE ... FINAL` 而不指定 `MergeTree` 的非复制变体的分区 ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2599)). - -#### 改进: {#improvements-10} - -- 当可以使用表索引时,通过使用 IN 运算符提高性能、减少内存消耗和正确的内存消耗跟踪 ([#2584](https://github.com/ClickHouse/ClickHouse/pull/2584)). -- 添加数据部分时删除了校验和的冗余检查. 这在有大量副本时很重要, 因为在这些情况下, 检查总数等于 N^2. -- 为 `arrayEnumerateUniq` 函数添加了对 `Array(Tuple(...))` 参数的支持 ([#2573](https://github.com/ClickHouse/ClickHouse/pull/2573)). -- 为 `runningDifference` 函数添加了 `Nullable` 支持 ([#2594](https://github.com/ClickHouse/ClickHouse/pull/2594)). -- 提高了表达式数量非常多时的查询分析性能 ([#2572](https://github.com/ClickHouse/ClickHouse/pull/2572)). -- 更快地选择要合并到 `ReplicatedMergeTree` 表中的数据部分. ZooKeeper 会话的更快恢复 ([#2597](https://github.com/ClickHouse/ClickHouse/pull/2597)). -- `MergeTree` 表的 `format_version.txt` 文件如果丢失则重新创建, 如果在复制没有文件的目录结构后启动 ClickHouse, 这是有意义的 ([Ciprian Hacman](https://github.com/ClickHouse/ClickHouse/pull/2593)). - -#### Bug 修复: {#bug-fixes-19} - -- 修复了使用 ZooKeeper 时无法在重新启动服务器之前恢复会话和表的只读状态的错误. -- 修复了使用 ZooKeeper 时可能导致会话中断时旧节点不会被删除的错误. -- 修复了 Float 参数的 `quantileTDigest` 函数中的错误 (这个错误是在 1.1.54388 版本中引入的) ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2553)). -- 如果主键列位于相同大小的有符号和无符号整数之间的类型转换函数内, 则修复了 MergeTree 表的索引中的错误 ([#2603](https://github.com/ClickHouse/ClickHouse/pull/2603)). -- 如果使用了宏但它们不在配置文件中, 则修复了段错误 ([#2570](https://github.com/ClickHouse/ClickHouse/pull/2570)). -- 修复重新连接客户端时切换到默认数据库的问题 ([#2583](https://github.com/ClickHouse/ClickHouse/pull/2583)). -- 修复了禁用 `use_index_for_in_with_subqueries` 设置时发生的错误. - -#### 安全修复: {#security-fix-1} - -- 连接到 MySQL 时不再可能发送文件 (`LOAD DATA LOCAL INFILE`). - -### ClickHouse 版本 1.1.54388, 2018-06-28 {#clickhouse-release-1-1-54388-2018-06-28} - -#### 新特征: {#new-features-12} - -- 支持对复制表的 `ALTER TABLE t DELETE WHERE` 查询. 添加了 `system.mutations` 表以跟踪此类查询的进度. -- 支持对 \*MergeTree 表的 `ALTER TABLE t [REPLACE|ATTACH] PARTITION` 查询. -- 支持`TRUNCATE TABLE`查询 ([Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2260)). -- 几个新的复制表的 `SYSTEM` 查询 (`RESTART REPLICAS`, `SYNC REPLICA`, `[STOP|START] [MERGES|FETCHES|SENDS REPLICATED|REPLICATION QUEUES]`). -- 增加了使用 MySQL 引擎写表的能力和对应的表函数 ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2294)). -- 添加了 `url()` 表函数和 `URL` 表引擎 ([Alexander Sapin](https://github.com/ClickHouse/ClickHouse/pull/2501)). -- 添加了 `windowFunnel` 聚合函数 ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2352)). -- 字符串的新 `startsWith` 和 `endsWith` 函数 ([Vadim Plakhtinsky](https://github.com/ClickHouse/ClickHouse/pull/2429)). -- `numbers()` 表函数现在允许您指定偏移量 ([Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2535)). -- `clickhouse-client` 的密码可以交互输入. -- 服务器日志现在可以发送到系统日志 ([Alexander Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2459)). -- 支持使用共享库源登录词典 ([Alexander Sapin](https://github.com/ClickHouse/ClickHouse/pull/2472)). -- 支持自定义 CSV 分隔符 ([Ivan Zhukov](https://github.com/ClickHouse/ClickHouse/pull/2263)). -- 添加了 `date_time_input_format` 设置. 如果将此设置切换为 `best_effort`, 则会以多种格式读取 DateTime 值. -- 添加了用于数据混淆的 `clickhouse-obfuscator` 实用程序. 使用示例: 发布性能测试中使用的数据. - -#### 实验功能: {#experimental-features-2} - -- 添加了仅在需要的地方计算 `and` 参数的功能 ([Anastasia Tsarkova](https://github.com/ClickHouse/ClickHouse/pull/2272)). -- 一些表达式现在可以 JIT 编译为本机代码 ([pyos](https://github.com/ClickHouse/ClickHouse/pull/2277)). - -#### Bug 修复: {#bug-fixes-20} - -- 使用 `DISTINCT` 和 `ORDER BY` 查询不再出现重复. -- 使用`ARRAY JOIN` 和 `arrayFilter` 的查询不再返回不正确的结果. -- 修复了从嵌套结构中读取数组列时的错误 ([#2066](https://github.com/ClickHouse/ClickHouse/issues/2066)). -- 修复了使用 HAVING 子句 (如 `HAVING tuple IN (...)`) 分析查询时的错误. -- 修复了使用递归别名分析查询时的错误. -- 修复了从 ReplacingMergeTree 读取时的错误,在 PREWHERE 中使用过滤所有行的条件 ([#2525](https://github.com/ClickHouse/ClickHouse/issues/2525)). -- 在 HTTP 界面中使用会话时未应用用户配置文件设置. -- 修复了如何从 clickhouse-local 中的命令行参数应用设置. -- ZooKeeper 客户端库现在使用从服务器收到的会话超时. -- 修复了 ZooKeeper 客户端库中客户端等待服务器响应时间超过超时时间的错误. -- 修复了分区键列条件查询的部分修剪 ([#2342](https://github.com/ClickHouse/ClickHouse/issues/2342)). -- 现在可以在 `CLEAR COLUMN IN PARTITION` 之后进行合并 ([#2315](https://github.com/ClickHouse/ClickHouse/issues/2315)). -- 修复了 ODBC 表函数中的类型映射 ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2268)). -- 已修复带和不带时区的 `DateTime` 的类型比较 ([Alexander Bocharov](https://github.com/ClickHouse/ClickHouse/pull/2400)). -- 修复了 `CAST` 运算符的语法解析和格式设置. -- 固定插入到分布式表引擎的物化视图中 ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2411)). -- 修复了将数据从 `Kafka` 引擎写入物化视图时的竞争条件 ([Yangkuan Liu](https://github.com/ClickHouse/ClickHouse/pull/2448)). -- 修复了 remote() 表函数中的 SSRF. -- 修复了多行模式下 `clickhouse-client` 的退出行为 ([#2510](https://github.com/ClickHouse/ClickHouse/issues/2510)). - -#### 改进: {#improvements-11} - -- 复制表中的后台任务现在在线程池中执行,而不是在单独的线程中执行 ([Silviu Caragea](https://github.com/ClickHouse/ClickHouse/pull/1722)). -- 提高LZ4压缩性能. -- 对具有大量 JOIN 和子查询的查询进行更快的分析. -- 当网络错误过多时,DNS 缓存现在会自动更新. -- 如果由于其中一个物化视图有太多的部件而无法插入表,则不会再插入表. -- 更正了事件计数器 `Query`、`SelectQuery` 和 `InsertQuery` 中的差异. -- 如果元组类型匹配,则允许使用诸如 `tuple IN (SELECT tuple)` 之类的表达式. -- 即使您尚未配置 ZooKeeper,具有复制表的服务器也可以启动. -- 在计算可用 CPU 内核数时,现在考虑了 cgroup 的限制 ([Atri Sharma](https://github.com/ClickHouse/ClickHouse/pull/2325)). -- 在 systemd 配置文件中为配置目录添加了 chown ([Mikhail Shiryaev](https://github.com/ClickHouse/ClickHouse/pull/2421)). - -#### Build 更新: {#build-changes-4} - -- gcc8 编译器可用于构建. -- 添加了从子模块构建 llvm 的功能. -- ibrdkafka 库版本已更新至 v0.11.4. -- 添加了使用系统 libcpuid 库的功能. 库版本已更新至 0.4.0. -- 使用矢量类库修复了构建 ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2274)). -- Cmake 现在默认为 ninja 生成文件 (就像使用 `-G Ninja` 时一样). -- 添加了使用 libtinfo 库代替 libtermcap 的功能 ([Georgy Kondratiev](https://github.com/ClickHouse/ClickHouse/pull/2519)). -- 修复了 Fedora Rawhide 中的头文件冲突 ([#2520](https://github.com/ClickHouse/ClickHouse/issues/2520)). - -#### 向后不兼容的更新: {#backward-incompatible-changes-7} - -- 删除了 `Vertical` 和 `Pretty*` 格式的转义并删除了 `VerticalRaw` 格式. -- 如果在分布式查询中同时使用版本 1.1.54388(或更高版本)和旧版本的服务器,并且查询具有不带 `AS` 关键字的 `cast(x, 'Type')` 表达式并且没有大写的 `cast` 一词, 将抛出异常, 并显示类似 `Not found column cast(0, 'UInt8') in block` 的消息. 解决方案: 更新整个集群上的服务器. - -### ClickHouse 版本 1.1.54385, 2018-06-01 {#clickhouse-release-1-1-54385-2018-06-01} - -#### Bug 修复: {#bug-fixes-21} - -- 修复了某些情况下导致 ZooKeeper 操作阻塞的错误. - -### ClickHouse 版本 1.1.54383, 2018-05-22 {#clickhouse-release-1-1-54383-2018-05-22} - -#### Bug 修复: {#bug-fixes-22} - -- 修复了一个表有很多副本时复制队列变慢的问题. - -### ClickHouse Rel版本ease 1.1.54381, 2018-05-14 {#clickhouse-release-1-1-54381-2018-05-14} - -#### Bug 修复: {#bug-fixes-23} - -- 修复了当 ClickHouse 与 ZooKeeper 服务器失去连接时 ZooKeeper 中的节点泄漏. - -### ClickHouse 版本 1.1.54380, 2018-04-21 {#clickhouse-release-1-1-54380-2018-04-21} - -#### 新特征: {#new-features-13} - -- 添加了表函数 `file(path, format, structure)`. 从 `/dev/urandom` 读取字节的示例: ``` ln -s /dev/urandom /var/lib/clickhouse/user_files/random``clickhouse-client -q "SELECT * FROM file('random', ' RowBinary', 'd UInt8') LIMIT 10" ```. - -#### 改进: {#improvements-12} - -- 子查询可以包含在 `()` 括号中以提高查询的可读性. 例如: `(SELECT 1) UNION ALL (SELECT 1)`. -- 来自 `system.processes` 表的简单 `SELECT` 查询不包括在 `max_concurrent_queries` 限制中. - -#### Bug 修复: {#bug-fixes-24} - -- 修复了从 `物质化视图` 中选择时 `IN` 运算符的错误行为. -- 修复了在 `partition_key_column IN (...)` 等表达式中按分区索引不正确的过滤. -- 修复了如果在表上执行了 `REANAME`,则无法在非领导副本上执行 `OPTIMIZE` 查询. -- 修复了在非领导副本上执行 `OPTIMIZE` 或 `ALTER` 查询时的授权错误. -- 修复了 `KILL QUERY` 的冻结问题. -- 修复了 ZooKeeper 客户端库中的一个错误,如果在 ZooKeeper 配置中使用非空的 `chroot` 前缀,该错误会导致监视丢失、分布式 DDL 队列冻结以及复制队列变慢. - -#### 向后不兼容的更新: {#backward-incompatible-changes-8} - -- 删除了对像 `(a, b) IN (SELECT (a, b))` 这样的表达式的支持 (你可以使用等价的表达式 `(a, b) IN (SELECT a, b)`). 在以前的版本中, 这些表达式会导致未确定的 `WHERE` 过滤或导致错误. - -### ClickHouse 版本 1.1.54378, 2018-04-16 {#clickhouse-release-1-1-54378-2018-04-16} - -#### 新特征: {#new-features-14} - -- 无需重新启动服务器即可更改日志级别. -- 添加了 `SHOW CREATE DATABASE` 查询. -- `query_id` 可以传递给 `clickhouse-client` (elBroom). -- 新设置:`max_network_bandwidth_for_all_users`. -- 为 `MATERIALIZED VIEW` 添加了对 `ALTER TABLE ... PARTITION ...` 的支持. -- 在系统表中添加了有关未压缩形式的数据部分大小的信息. -- 分布式表的服务器到服务器加密支持( `` 中的副本配置中的 `1`). -- `ReplicatedMergeTree` 系列的表级别配置以最小化 Zookeeper 中存储的数据量: `use_minimalistic_checksums_in_zookeeper = 1` -- `clickhouse-client` 提示的配置. 默认情况下, 服务器名称现在会输出到提示中. 服务器的显示名称可以更改. 它还在 `X-ClickHouse-Display-Name` HTTP 标头中发送 (Kirill Shvakov). -- 可以为 `Kafka` 引擎指定多个逗号分隔的 `topics` (Tobias Adamson) -- 当查询被 `KILL QUERY` 或 `replace_running_query` 停止时,客户端会收到 `Query was cancelled` 异常而不是不完整的结果. - -#### 改进: {#improvements-13} - -- `ALTER TABLE ... DROP/DETACH PARTITION` 查询在复制队列的前面运行. -- `SELECT ... FINAL` 和 `OPTIMIZE ... FINAL` 可以在表只有一个数据部分时使用. -- 如果手动删除了 `query_log` 表,则会即时重新创建它 (Kirill Shvakov). -- `lengthUTF8` 函数运行速度更快 (zhang2014). -- 当分片数量非常多时,提高了在 `分布式` 表 (`insert_distributed_sync = 1`) 中同步插入的性能. -- 服务器接受来自客户端的 `send_timeout` 和 `receive_timeout` 设置,并在连接到客户端时应用它们 (它们以相反的顺序应用:服务器套接字的 `send_timeout` 设置为从客户端接收到的 `receive_timeout` 值, 反之亦然). -- 用于异步插入 `Distributed` 表的更强大的崩溃恢复. -- `countEqual` 函数的返回类型从 `UInt32` 更改为 `UInt64` (谢磊). - -#### Bug 修复: {#bug-fixes-25} - -- 修复了表达式左侧为 `Nullable` 时 `IN` 的错误. -- 当某些元组组件在表索引中时,现在使用带有 `IN` 的元组时会返回正确的结果. -- `max_execution_time` 限制现在可以在分布式查询中正常工作. -- 修复了计算 `system.columns` 表中复合列大小时的错误. -- 修复了创建临时表 `CREATE TEMPORARY TABLE IF NOT EXISTS` 时的错误. -- 修复了 `StorageKafka` 中的错误 (##2075) -- 固定服务器因某些聚合函数的无效参数而崩溃. -- 修复了阻止`DETACH DATABASE` 查询停止 `ReplicatedMergeTree` 表的后台任务的错误. -- 插入聚合物化视图时,不太可能发生 `Too many parts` 状态 (##2084). -- 如果替换必须跟在同一级别的另一个替换之后,则更正了配置中替换的递归处理. -- 在创建使用带有 `UNION ALL` 的查询的 `VIEW` 时更正了元数据文件中的语法. -- `SummingMergeTree` 现在可以正确地使用复合键对嵌套数据结构求和. -- 修复了在为 `ReplicatedMergeTree` 表选择领导者时出现竞争条件的可能性. - -#### Build 更新: {#build-changes-5} - -- 构建支持 `ninja` 而不是 `make`,并且默认使用 `ninja` 来构建版本. -- 重命名包:`clickhouse-common-static`中的`clickhouse-server-base`; `clickhouse-server` 中的 `clickhouse-server-common`; `clickhouse-common-static-dbg` 中的 `clickhouse-common-dbg`. 要安装, 请使用 `clickhouse-server clickhouse-client` . 具有旧名称的包仍将加载到存储库中以实现向后兼容性. - -#### 向后不兼容的更新: {#backward-incompatible-changes-9} - -- 如果在左侧指定了数组, 则删除了 IN 表达式的特殊解释. 以前, 表达式 `arr IN (set)` 被解释为"at least one `arr` 元素属于 `set`". 要在新版本中获得相同的行为, 请编写 `arrayExists(x -> x IN (set), arr)`. -- 禁用套接字选项`SO_REUSEPORT` 的错误使用,该选项默认在 Poco 库中被错误启用. 请注意, 在 Linux 上,不再有任何理由同时指定地址 `::` 和 `0.0.0.0` 用于侦听 – 仅使用 `::`, 它允许侦听通过 IPv4 和 IPv6 的连接(默认情况下) 内核配置设置). 您还可以通过在配置中指定 `1` 来恢复以前版本的行为. - -### ClickHouse 版本 1.1.54370, 2018-03-16 {#clickhouse-release-1-1-54370-2018-03-16} - -#### 新特征: {#new-features-15} - -- 添加了 `system.macros` 表和更改配置文件时宏的自动更新. -- 添加了 `SYSTEM RELOAD CONFIG` 查询. -- 新增`maxIntersections(left_col, right_col)`聚合函数, 返回最大同时相交区间数`[left; 对]`. `maxIntersectionsPosition(left, right)` 函数返回 "maximum" 间隔的开始. ([Michael Furmur](https://github.com/ClickHouse/ClickHouse/pull/2012)). - -#### 改进: {#improvements-14} - -- 在 `Replicated` 表中插入数据时, 对 `ZooKeeper` 的请求较少(并且大多数用户级错误已从 `ZooKeeper` 日志中消失). -- 添加了为数据集创建别名的功能. 示例: `WITH (1, 2, 3) AS set SELECT number IN set FROM system.numbers LIMIT 10`. - -#### Bug 修复: {#bug-fixes-26} - -- 修复了从 `Distributed` 表的合并表读取时的 `Illegal PREWHERE` 错误. -- 添加了允许您在仅支持 IPv4 的 Docker 容器中启动 clickhouse-server 的修复程序. -- 修复了从系统 `system.parts_columns` 表读取时的竞争条件. -- 在同步插入到 `Distributed` 表期间删除了双缓冲,这可能会导致连接超时. -- 修复了在开始 `SELECT` 查询之前导致等待不可用副本过长的错误. -- 修复了 `system.parts` 表中不正确的日期. -- 修复了如果在 `ZooKeeper` 集群的配置中 `chroot` 不为空, 则无法在 `Replicated` 表中插入数据的错误. -- 修复了空 `ORDER BY` 表的垂直合并算法. -- 恢复了在对远程表的查询中使用字典的能力, 即使这些字典不存在于请求者服务器上. 此功能在 1.1.54362 版中丢失. -- 当 `IN` 的右侧应该使用远程 `default.table` 时, 恢复了诸如 `SELECT * FROM remote('server2', default.table) WHERE col IN (SELECT col2 FROM default.table)` 之类的查询行为而不是本地的. 此行为在 1.1.54358 版本中被破坏. -- 删除了 `Not found column ... in block` 的无关错误级日志记录. - -### ClickHouse 版本 1.1.54362, 2018-03-11 {#clickhouse-release-1-1-54362-2018-03-11} - -#### 新特征: {#new-features-16} - -- 带 `GROUP BY` 的空集 (例如 `SELECT count(*) FROM table WHERE 0`) 的聚合现在返回一个结果, 其中一行带有聚合函数的空值, 符合 SQL 标准. 要恢复旧行为 (返回空结果), 请将 `empty_result_for_aggregation_by_empty_set` 设置为 1. -- 为 `UNION ALL` 添加了类型转换. `UNION ALL` 中的 `SELECT` 位置允许不同的别名, 符合SQL标准. -- `LIMIT BY` 子句支持任意表达式. 以前, 只能使用由`SELECT`产生的列. -- 当将 `IN` 应用于主键列中的表达式元组时, 将使用 `MergeTree` 表的索引. 示例: `WHERE (UserID, EventDate) IN ((123, '2000-01-01'), ...)` (Anastasiya Tsarkova). -- 添加了用于在集群之间复制和重新分片数据的 `clickhouse-copier` 工具(测试版). -- 加了一致性哈希函数: `yandexConsistentHash`、`jumpConsistentHash`、`sumburConsistentHash`. 它们可以用作分片键, 以减少后续重新分片期间的网络流量. -- 添加函数: `arrayAny`, `arrayAll`, `hasAny`, `hasAll`, `arrayIntersect`, `arrayResize`. -- 添加了 `arrayCumSum` 函数 (Javi Santana). -- 添加了 `parseDateTimeBestEffort`、`parseDateTimeBestEffortOrZero` 和 `parseDateTimeBestEffortOrNull` 函数以从包含各种可能格式的文本的字符串中读取 DateTime. -- 更新期间可以从外部字典中部分重新加载数据 (仅加载指定字段的值大于先前下载的记录) (Arsen Hakobyan). -- 添加了 `cluster` 表功能. 示例: `cluster(cluster_name, db, table)`。 `remote` 表函数可以接受集群名称作为第一个参数, 如果它被指定为标识符. -- `remote` 和 `cluster` 表函数可用于 `INSERT` 查询. -- 将 `create_table_query` 和 `engine_full` 虚拟列添加到 `system.tables`表. `metadata_modification_time` 列是虚拟的. -- 将 `data_path` 和 `metadata_path` 列添加到 `system.tables` 和 `system.databases` 表, 并将 `path` 列添加到 `system.parts` 和 `system.parts_columns` 表. -- 在 `system.part_log` 表中添加了有关合并的附加信息. -- `system.query_log` 表可以使用任意分区键 (Kirill Shvakov). -- `SHOW TABLES` 查询现在也显示临时表. 添加临时表和 `is_temporary` 列到 `system.tables` (zhang2014). -- 添加了`DROP TEMPORARY TABLE`和`EXISTS TEMPORARY TABLE`查询 (zhang2014). -- 支持临时表的 `SHOW CREATE TABLE` (zhang2014). -- 为内部进程使用的设置添加了`system_profile`配置参数. -- 支持加载 `object_id` 作为 `MongoDB` 字典中的属性 (Pavel Litvinenko). -- 使用 `MongoDB` 源加载外部字典的数据时, 将 `null` 作为默认值读取 (Pavel Litvinenko). -- 从没有单引号的 Unix 时间戳中读取 `Values` 格式的 `DateTime` 值. -- 在某些副本缺少请求的表的情况下, `remote` 表函数支持故障转移. -- 当您运行 `clickhouse-server` 时,可以在命令行中覆盖配置设置. 示例: `clickhouse-server -- --logger.level=information`. -- 从 `FixedString` 参数实现了 `empty` 函数: 如果字符串完全由空字节组成, 该函数返回 1 (zhang2014). -- 添加了`listen_try`配置参数, 用于在不退出的情况下至少侦听一个侦听地址, 如果某些地址无法侦听 (对于禁用对 IPv4 或 IPv6 支持的系统很有用). -- 添加了 `VersionedCollapsingMergeTree` 表引擎. -- 支持`library` 字典源的行和任意数字类型. -- `MergeTree` 表可以在没有主键的情况下使用 (你需要指定 `ORDER BY tuple()`). -- 如果参数不是 `NULL` , 则 `Nullable` 类型可以 `CAST` 到非 `Nullable` 类型. -- 可以为 `VIEW` 执行 `RENAME TABLE` . -- 添加了 `throwIf` 函数. -- 添加了 `odbc_default_field_size` 选项, 它允许您扩展从 ODBC 源加载的值的最大大小 (默认为 1024). -- `system.processes` 表和 `SHOW PROCESSLIST` 现在有 `is_cancelled` 和 `peak_memory_usage` 列. - -#### 改进: {#improvements-15} - -- 结果的限制和配额不再应用于 `INSERT SELECT` 查询或 `SELECT` 子查询的中间数据. -- 在服务器启动时检查 `Replicated` 表的状态时, 更少的 `force_restore_data` 错误触发器. -- 添加了 `allow_distributed_ddl` 选项. -- `MergeTree` 表键的表达式中不允许使用不确定性函数. -- 从 `config.d` 目录替换的文件按字母顺序加载. -- 在将空数组作为元素之一的常量多维数组的情况下, 改进了 `arrayElement` 函数的性能. 示例: `[[1], []][x]`. -- 当使用具有非常大的替换 (例如, 非常大的 IP 网络列表) 的配置文件时, 服务器现在启动速度更快. -- 运行查询时, 表值函数运行一次. 以前, `remote` 和 `mysql` 表值函数执行相同的查询两次以从远程服务器检索表结构. -- 使用了 `MkDocs` 文档生成器. -- 当您尝试删除其他列的 `DEFAULT` / `MATERIALIZED` 表达式所依赖的表列时, 抛出异常 (zhang2014). -- 添加了将文本格式中的空行解析为 `Float` 数据类型的数字 0 的功能. 此功能以前可用, 但在版本 1.1.54342 中丢失. -- `Enum` 值可用于 `min`、`max`、`sum` 和其他一些函数. 在这些情况下, 它使用相应的数值. 此功能以前可用, 但在 1.1.54337 版本中丢失. -- 添加了 `max_expanded_ast_elements` 以限制递归扩展别名后 AST 的大小. - -#### Bug 修复: {#bug-fixes-27} - -- 修复了错误地从子查询中删除不必要的列, 或未从包含 `UNION ALL` 的子查询中删除的情况. -- 修复了 `ReplaceMergeTree` 表的合并错误. -- 修复了 `Distributed` 表中的同步插入 (`insert_distributed_sync = 1`). -- 修复了子查询中重复列的 `FULL` 和 `RIGHT JOIN` 的某些用途的段错误. -- 修复了`replace_running_query`和`KILL QUERY`的某些用途的段错误. -- 修复了 `system.dictionaries` 表中 `source` 和 `last_exception` 列的顺序. -- 修复了 `DROP DATABASE` 查询未删除带有元数据的文件时的错误. -- 修复了 `Dictionary` 数据库的 `DROP DATABASE` 查询. -- 修复了基数大于 1 亿项的 `uniqHLL12` 和 `uniqCombined` 函数的低精度问题 (Alex Bocharov). -- 修复了在需要同时计算 INSERT 查询中的默认显式表达式时隐式默认值的计算 (zhang2014). -- 修复了对 `MergeTree` 表的查询无法完成的罕见情况 (chenxing-xc). -- 修复了在所有分片都是本地的情况下对 `Distributed` 表运行 `CHECK` 查询时发生的崩溃 (chenxing.xc). -- 修复了使用正则表达式的函数的轻微性能回归. -- 修复了从复杂表达式创建多维数组时的性能回归. -- 修复了可能导致额外的 `FORMAT` 部分出现在带有元数据的 `.sql` 文件中的错误. -- 修复了一个错误,该错误导致在尝试删除查看明确指定的表的 `MATERIALIZED VIEW` 时应用 `max_table_size_to_drop` 限制. -- 修复了与旧客户端不兼容的问题 (旧客户端有时会使用 `DateTime('timezone')` 类型发送数据, 他们不理解). -- 修复了当这些列的条件移至 `PREWHERE` 时读取使用 `ALTER` 添加但对于旧分区为空的结构的 `Nested` 列元素时的错误. -- 修复了在查询到 `Merge` 表时通过虚拟 `_table` 列过滤表时的错误. -- 修复了在 `Distributed` 表中使用 `ALIAS` 列时的错误. -- 修复了一个错误, 该错误使动态编译无法用于带有来自 `quantile` 系列的聚合函数的查询. -- 修复了查询执行管道中的争用条件, 这种情况在使用具有大量表的 `Merge` 表以及使用 `GLOBAL` 子查询时在非常罕见的情况下发生. -- 修复了在使用来自多个参数的聚合函数时将不同大小的数组传递给 `arrayReduce` 函数时发生的崩溃. -- 禁止在 `MATERIALIZED VIEW` 中使用带有 `UNION ALL` 的查询. -- 修复了服务器启动时 `part_log` 系统表初始化过程中的错误 (默认情况下, `part_log`是禁用的). - -#### 向后不兼容的更新: {#backward-incompatible-changes-10} - -- 删除了 `distributed_ddl_allow_replicated_alter` 选项. 默认情况下启用此行为. -- 删除了 `strict_insert_defaults` 设置. 如果您正在使用此功能, 请写信至 `clickhouse-feedback@yandex-team.com`. -- 移除了 `UnsortedMergeTree` 引擎. - -### ClickHouse 版本 1.1.54343, 2018-02-05 {#clickhouse-release-1-1-54343-2018-02-05} - -- 添加了在分布式 DDL 查询和分布式表构造函数中定义集群名称的宏支持: `CREATE TABLE distr ON CLUSTER '{cluster}' (...) ENGINE = Distributed('{cluster}', 'db', 'table')`. -- 现在像 `SELECT ... FROM table WHERE expr IN (subquery)` 这样的查询是使用 `table` 索引处理的. -- 在插入到复制表时改进了重复处理, 因此它们不再减慢复制队列的执行速度. - -### ClickHouse 版本 1.1.54342, 2018-01-22 {#clickhouse-release-1-1-54342-2018-01-22} - -此版本包含先前版本 1.1.54337 的错误修复: - -- 修复了 1.1.54337 中的回归: 如果默认用户具有只读访问权限, 则服务器拒绝启动并显示消息 `Cannot create database in readonly mode`. -- 修复了 1.1.54337 中的一个回归: 在具有 systemd 的系统上, 无论配置如何, 日志始终写入 syslog; 监视器脚本仍然使用 init.d. -- 修复了 1.1.54337 中的回归: Docker 镜像中的默认配置错误. -- 修复了 Graphite MergeTree 的非确定性行为 (您可以在日志消息中看到它 `合并后的数据与另一个副本上的数据不是字节相同` ). -- 修复了对复制表进行 OPTIMIZE 查询后可能导致合并不一致的错误 (您可能会在日志消息中看到它 `Part ... intersects the previous part` ). -- 当目标表中存在 MATERIALIZED 列时, 缓冲区表现在可以正常工作 (by zhang2014). -- 修复了 NULL 实现中的一个错误. - -### ClickHouse 版本 1.1.54337, 2018-01-18 {#clickhouse-release-1-1-54337-2018-01-18} - -#### 新特征: {#new-features-17} - -- 添加了对表中多维数组和元组 (`Tuple` 数据类型) 的存储的支持. -- 支持用于 `DESCRIBE` 和 `INSERT` 查询的表函数. 在 `DESCRIBE` 中添加了对子查询的支持. 示例:`DESC TABLE remote('host', default.hits)`; `DESC 表(选择 1)`; `插入表功能远程('host',default.hits)`. 除了 `INSERT INTO` , 还支持 `INSERT INTO TABLE`. -- 改进了对时区的支持. `DateTime` 数据类型可以使用用于解析和格式化文本格式的时区进行注释. 示例: `DateTime('Asia/Istanbul')`. 当在函数中为 DateTime 参数指定时区时, 返回类型将跟踪时区, 并且值将按预期显示. -- 添加了函数`toTimeZone`、`timeDiff`、`toQuarter`、`toRelativeQuarterNum`. `toRelativeHour`/`Minute`/`Second` 函数可以将 `Date` 类型的值作为参数. `now` 函数名区分大小写. -- 添加了 `toStartOfFifteenMinutes` 函数 (Kirill Shvakov). -- 添加了用于格式化查询的 `clickhouse format` 工具. -- 添加了 `format_schema_path` 配置参数 (Marek Vavruşa). 它用于以 `Cap'n Proto` 格式指定模式. 架构文件只能位于指定目录中. -- 添加了对配置替换 (`incl` 和 `conf.d`) 的支持, 用于配置外部词典和模型 (Pavel Yakunin). -- 添加了一个包含 `system.settings` 表文档的列 (Kirill Shvakov). -- 添加了 `system.parts_columns` 表, 其中包含有关 `MergeTree` 表的每个数据部分中的列大小的信息. -- 添加了 `system.models` 表, 其中包含有关已加载的 `CatBoost` 机器学习模型的信息. -- 增加了 `mysql` 和 `odbc` 表功能以及相应的 `MySQL` 和 `ODBC` 表引擎, 用于访问远程数据库. 此功能处于测试阶段. -- 添加了为 `groupArray` 聚合函数传递 `AggregateFunction` 类型参数的可能性 (这样你就可以创建一些聚合函数的状态数组). -- 删除了对聚合函数组合器的各种组合的限制. 例如, 您可以使用 `avgForEachIf` 和 `avgIfForEach` 聚合函数, 它们具有不同的行为. -- `-ForEach` 聚合函数组合器针对多参数聚合函数的情况进行了扩展. -- 添加了对 `Nullable` 参数的聚合函数的支持, 即使在函数返回非 `Nullable` 结果的情况下 (由 Silviu Caragea 添加). 示例: `groupArray`、`groupUniqArray`、`topK`. -- 为 `clickhouse-client` 添加了 `max_client_network_bandwidth` (Kirill Shvakov). -- 允许具有 `readonly = 2` 设置的用户使用 TEMPORARY 表 (CREATE, DROP, INSERT…) (Kirill Shvakov). -- 添加了对 `Kafka` 引擎使用多个消费者的支持. `Kafka` 的扩展配置选项 (Marek Vavruša). -- 添加了 `intExp3` 和 `intExp4` 函数. -- 添加了 `sumKahan` 聚合函数. -- 添加到 \* Number\* OrNull 函数, 其中 \* Number\* 是数字类型. -- 添加了对 `INSERT SELECT` 查询的 `WITH` 子句的支持 (author: zhang2014). -- 添加设置: `http_connection_timeout`、`http_send_timeout`、`http_receive_timeout`. 特别是, 这些设置用于下载数据部分以进行复制. 如果网络过载, 更改这些设置可以实现更快的故障转移. -- 为类型为 `Null` 的表添加了对 `ALTER` 的支持 (Anastasiya Tsarkova). -- `reinterpretAsString` 函数针对所有连续存储在内存中的数据类型进行了扩展. -- 为 `clickhouse-local` 工具添加了 `--silent` 选项. 它禁止在 stderr 中打印查询执行信息. -- 添加了对从文本中读取 `Date` 类型值的支持, 该格式使用一位数而不是两位数指定月份和/或月份中的某天 (Amos Bird). - -#### 性能优化: {#performance-optimizations} - -- 改进了来自字符串参数的聚合函数 `min`、`max`、`any`、`anyLast`、`anyHeavy`、`argMin`、`argMax` 的性能. -- 改进了函数 `isInfinite`、`isFinite`、`isNaN`、`roundToExp2` 的性能. -- 改进了以文本格式解析和格式化 `Date` 和 `DateTime` 类型值的性能. -- 提高解析浮点数的性能和精度. -- 在左右部分具有不包含在 `USING` 中的名称相同的列的情况下, 降低了 `JOIN` 的内存使用量. -- 通过降低计算稳定性, 改进了聚合函数 `varSamp`、`varPop`、`stddevSamp`、`stddevPop`、`covarSamp`、`covarPop`、`corr` 的性能. 旧函数可在名称 `varSampStable`、`varPopStable`、`stddevSampStable`、`stddevPopStable`、`covarSampStable`、`covarPopStable`、`corrStable` 下使用. - -#### Bug 修复: {#bug-fixes-28} - -- 在运行 `DROP` 或 `DETACH PARTITION` 查询后修复了重复数据删除. 在以前的版本中, 删除分区并再次插入相同的数据不起作用, 因为插入的块被认为是重复的. -- 修复了一个错误, 该错误可能导致对带有 `POPULATE` 的 `CREATE MATERIALIZED VIEW` 查询的 `WHERE` 子句的错误解释. -- 修复了在 `zookeeper_servers` 配置中使用 `root_path` 参数的错误. -- 修复了将 `Date` 参数传递给 `toStartOfDay` 的意外结果. -- 修复了 `addMonths` 和 `subtractMonths` 函数以及 `INTERVAL n MONTH` 在结果为上一年的情况下的算术. -- 为 `DISTINCT`、`JOIN` 和 `uniq` 聚合函数和外部词典 (Evgeniy Ivanov) 添加了对 `UUID` 数据类型的缺失支持. 对 `UUID` 的支持仍然不完整. -- 在行总和为零的情况下修复了 `SummingMergeTree` 行为. -- 对`Kafka` 引擎的各种修复 (Marek Vavruša). -- 修复了 `Join` 表引擎的错误行为 (Amos Bird). -- 修复了 FreeBSD 和 OS X 下不正确的分配器行为. -- `extractAll` 函数现在支持空匹配. -- 修复了阻止使用 `libressl` 而不是 `openssl` 的错误. -- 修复了来自临时表的 `CREATE TABLE AS SELECT` 查询. -- 修复了更新复制队列的非原子性. 这可能会导致副本不同步, 直到服务器重新启动. -- 修复了 `gcd`、`lcm` 和 `modulo` (`%` 运算符) 中可能出现的溢出 (Maks Skorokhod). -- `-preprocessed` 文件现在在更改 `umask` 后创建 (`umask` 可以在配置中更改). -- 修复了使用自定义分区键时部件背景检查 (`MergeTreePartChecker`) 的错误. -- 修复了文本格式元组 ( `Tuple` 数据类型的值) 的解析. -- 改进了有关传递给 `multiIf`、`array` 和一些其他函数的不兼容类型的错误消息. -- 重新设计了对 `Nullable` 类型的支持. 修复了可能导致服务器崩溃的错误. 修复了几乎所有与 `NULL` 支持相关的其他错误: INSERT SELECT 中的类型转换不正确、HAVING 和 PREWHERE 中对 Nullable 的支持不足、`join_use_nulls` 模式、可空类型作为 `OR` 运算符的参数等. -- 修复了与数据类型的内部语义相关的各种错误. 示例: 在 `SummingMergeTree` 中对 `Enum` 类型字段进行不必要的求和; `Pretty` 格式的 `Enum` 类型的对齐等. -- 更严格地检查允许的复合列组合. -- 修复了为 `FixedString` 数据类型指定一个非常大的参数时的溢出问题. -- 修复了一般情况下 `topK` 聚合函数中的错误. -- 使用 `-Array` 组合器在聚合函数的n元变体的参数中添加了对数组大小相等性的缺失检查. -- 修复了 `clickhouse-client` 的 `--pager` 中的错误 (author: ks1322). -- 修复了 `exp10` 函数的精度. -- 修复了`visitParamExtract` 函数的行为, 以便更好地遵守文档. -- 修复了指定错误数据类型时崩溃的问题. -- 修复了所有列都是常量的情况下 `DISTINCT` 的行为. -- 修复了在使用带有复杂常量表达式的 `tupleElement` 函数作为元组元素索引的情况下的查询格式. -- 修复了 `range_hashed` 字典的 `Dictionary` 表中的错误. -- 修复了导致 `FULL` 和 `RIGHT JOIN` 结果中行数过多的错误 (Amos Bird). -- 修复了在配置重新加载期间在 `config.d` 目录中创建和删除临时文件时服务器崩溃的问题. -- 修复了 `SYSTEM DROP DNS CACHE` 查询: 缓存已刷新但集群节点的地址未更新. -- 修复了对视图下的表执行 `DETACH TABLE` 后 `MATERIALIZED VIEW` 的行为 (Marek Vavruša). - -#### Build 改进: {#build-improvements-4} - -- `pbuilder` 工具用于构建. 构建过程几乎完全独立于构建宿主环境. -- 单个构建用于不同的操作系统版本. 软件包和二进制文件已与各种 Linux 系统兼容. -- 添加了 `clickhouse-test` 包. 它可用于运行功能测试. -- 源 tarball 现在可以发布到存储库. 它可用于在不使用 GitHub 的情况下重现构建. -- 添加了与 Travis CI 的有限集成. 由于 Travis 中构建时间的限制, 仅测试调试构建并运行有限的测试子集. -- 在默认版本中添加了对 `Cap'n'Proto` 的支持. -- 将文档来源的格式从 `Restricted Text` 更改为 `Markdown`. -- 添加了对 `systemd` (Vladimir Smirnov) 的支持. 由于与某些操作系统映像不兼容, 它默认被禁用, 可以手动启用. -- 对于动态代码生成, `clang` 和 `lld` 被嵌入到 `clickhouse` 二进制文件中. 它们也可以作为 `clickhouse clang` 和 `clickhouse lld` 调用. -- 从代码中删除了 GNU 扩展的使用. 启用了`-Wextra` 选项。 当使用 `clang` 构建时, 默认是 `libc++` 而不是 `libstdc++`. -- 提取了 `clickhouse_parsers` 和 `clickhouse_common_io` 库以加速各种工具的构建. - -#### 向后不兼容的更新: {#backward-incompatible-changes-11} - -- 包含 `Nullable` 列的 `Log` 类型表中标记的格式以向后不兼容的方式进行了更改. 如果你有这些表, 你应该在启动新的服务器版本之前将它们转换为 `TinyLog` 类型. 为此, 请在 `metadata` 目录中相应的 `.sql` 文件中将 `ENGINE = Log` 替换为 `ENGINE = TinyLog`. 如果你的表没有 `Nullable` 列或者你的表的类型不是 `Log`, 那么你不需要做任何事情. -- 删除了 `experimental_allow_extended_storage_definition_syntax` 设置. 现在默认启用此功能. -- `runningIncome` 函数被重命名为 `runningDifferenceStartingWithFirstvalue` 以避免混淆. -- 当在没有表的 FROM 之后直接指定 ARRAY JOIN 时, 删除了 `FROM ARRAY JOIN arr` 语法 (Amos Bird). -- 删除了仅用于演示目的的 `BlockTabSeparated` 格式. -- 更改了聚合函数 `varSamp`、`varPop`、`stddevSamp`、`stddevPop`、`covarSamp`、`covarPop`、`corr` 的状态格式. 如果您已将这些聚合函数的状态存储在表中 (使用 `AggregateFunction` 数据类型或具有相应状态的物化视图), 请写信至 clickhouse-feedback@yandex-team.com. -- 在以前的服务器版本中, 有一个未公开的功能: 如果聚合函数依赖于参数, 您仍然可以在 AggregateFunction 数据类型中不带参数地指定它. 示例: `AggregateFunction(quantiles, UInt64)` 而不是 `AggregateFunction(quantiles(0.5, 0.9), UInt64)` . 此功能已丢失. 虽然它没有记录, 但我们计划在未来的版本中再次支持它. -- 枚举数据类型不能用于最小/最大聚合函数. 此能力将在下一个版本中恢复. - -#### 升级时请注意: {#please-note-when-upgrading} - -- 在集群上进行滚动更新时, 当一些副本运行旧版本的 ClickHouse 和一些运行新版本时, 复制会暂时停止, 并且日志中出现消息 `unknown parameter 'shard'` . 更新集群的所有副本后, 复制将继续. -- 如果在集群服务器上运行不同版本的 ClickHouse, 使用以下函数的分布式查询可能会得到不正确的结果: `varSamp`、`varPop`、`stddevSamp`、`stddevPop`、`covarSamp`、`covarPop` , `corr`. 您应该更新所有集群节点. - -## [Changelog for 2017](../../whats-new/changelog/2017.md#clickhouse-release-1-1-54327-2017-12-21) {#changelog-for-2017} diff --git a/docs/zh/whats-new/changelog/2019.md b/docs/zh/whats-new/changelog/2019.md deleted file mode 100644 index 72c908c9e0e..00000000000 --- a/docs/zh/whats-new/changelog/2019.md +++ /dev/null @@ -1,1855 +0,0 @@ ---- -slug: /zh/whats-new/changelog/2019 ---- -## ClickHouse 版本 19.17 {#clickhouse-release-v19-17} - -### ClickHouse 版本 19.17.6.36, 2019-12-27 {#clickhouse-release-v19-17-6-36-2019-12-27} - -#### Bug 修复 {#bug-fix} - -- 修复了解压缩中潜在的缓冲区溢出. 恶意用户可以传递可能导致缓冲区读取的伪造压缩数据. 这个问题是由 Yandex 信息安全团队的 Eldar Zaitov 发现的. [#8404](https://github.com/ClickHouse/ClickHouse/pull/8404) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了当服务器无法使用字符串数据类型的值 (需要 UTF-8 验证) 以 JSON 或 XML 格式发送或写入数据或使用 Brotli 算法或某些方式压缩结果数据时可能出现的服务器崩溃 ( `std::terminate` ) 其他罕见情况. [#8384](https://github.com/ClickHouse/ClickHouse/pull/8384) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了来自 clickhouse `VIEW` 源的词典, 现在阅读此类词典不会导致错误 `There is no query`. [#8351](https://github.com/ClickHouse/ClickHouse/pull/8351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复了检查 users.xml 中指定的 host_regexp 是否允许客户端主机的问题. [#8241](https://github.com/ClickHouse/ClickHouse/pull/8241), [#8342](https://github.com/ClickHouse/ClickHouse/pull/8342) ([Vitaly Baranov](https://github.com/vitlibar)) -- 分布式表的 `RENAME TABLE` 现在会在发送到分片之前重命名包含插入数据的文件夹. 这解决了连续重命名 `tableA->tableB`、`tableC->tableA` 的问题. [#8306](https://github.com/ClickHouse/ClickHouse/pull/8306) ([tavplubix](https://github.com/tavplubix)) -- 由 DDL 查询创建的 `range_hashed` 外部字典现在允许任意数字类型的范围. [#8275](https://github.com/ClickHouse/ClickHouse/pull/8275) ([alesapin](https://github.com/alesapin)) -- 修复了 `INSERT INTO table SELECT ... FROM mysql(...)` 表函数. [#8234](https://github.com/ClickHouse/ClickHouse/pull/8234) ([tavplubix](https://github.com/tavplubix)) -- 复了插入不存在的文件时在 `INSERT INTO TABLE FUNCTION file()` 中的段错误. 现在在这种情况下将创建文件, 然后将处理插入. [#8177](https://github.com/ClickHouse/ClickHouse/pull/8177) ([Olga Khvostikova](https://github.com/stavrolia)) -- 修复了聚合位图和标量位图相交时的位图和错误. [#8082](https://github.com/ClickHouse/ClickHouse/pull/8082) ([Yue Huang](https://github.com/moon03432)) -- 修复了在没有 `TABLE` 或 `DICTIONARY` 限定符的情况下使用 `EXISTS` 查询时的段错误,就像 `EXISTS`. [#8213](https://github.com/ClickHouse/ClickHouse/pull/8213) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了函数 `rand` 和 `randConstant` 在参数可为空的情况下的返回类型. 现在函数总是返回 `UInt32` 而不是 `Nullable(UInt32)`. [#8204](https://github.com/ClickHouse/ClickHouse/pull/8204) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复了 `DROP DICTIONARY IF EXISTS db.dict`, 现在如果 `db` 不存在则不会抛出异常. [#8185](https://github.com/ClickHouse/ClickHouse/pull/8185) ([Vitaly Baranov](https://github.com/vitlibar)) -- 如果由于服务器崩溃而没有完全删除表, 服务器将尝试恢复并加载它. [#8176](https://github.com/ClickHouse/ClickHouse/pull/8176) ([tavplubix](https://github.com/tavplubix)) -- 如果有两个以上的分片本地表,则修复了分布式表的简单计数查询. [#8164](https://github.com/ClickHouse/ClickHouse/pull/8164) ([小路](https://github.com/nicelulu)) -- 修复了导致 DB::BlockStreamProfileInfo::calculateRowsBeforeLimit() 中数据竞争的错误. [#8143](https://github.com/ClickHouse/ClickHouse/pull/8143) ([Alexander Kazakov](https://github.com/Akazz)) -- 修复了在合并指定部分后立即执行的 `ALTER table MOVE part`, 这可能导致移动指定部分合并到的部分. 现在它正确地移动了指定的部分. [#8104](https://github.com/ClickHouse/ClickHouse/pull/8104) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 现在可以将字典的表达式指定为字符串. 这对于从非 ClickHouse 源中提取数据时计算属性很有用, 因为它允许对这些表达式使用非 ClickHouse 语法. [#8098](https://github.com/ClickHouse/ClickHouse/pull/8098) ([alesapin](https://github.com/alesapin)) -- 修复了 `clickhouse-copier` 中由于 ZXid 溢出而导致的非常罕见的竞争. [#8088](https://github.com/ClickHouse/ClickHouse/pull/8088) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) -- 修复了查询失败后 (例如由于"Too many simultaneous queries") 不会读取外部表信息的错误, 并且下一个请求会将此信息解释为下一个查询的开始, 从而导致 `Unknown packet from client`. [#8084](https://github.com/ClickHouse/ClickHouse/pull/8084) ([Azat Khuzhin](https://github.com/azat)) -- 避免在"Unknown packet X from server"之后取消引用. [#8071](https://github.com/ClickHouse/ClickHouse/pull/8071) ([Azat Khuzhin](https://github.com/azat)) -- 恢复对所有 ICU 语言环境的支持, 添加为常量表达式应用排序规则的功能, 并将语言名称添加到 system.collations 表. [#8051](https://github.com/ClickHouse/ClickHouse/pull/8051) ([alesapin](https://github.com/alesapin)) -- 从 `StorageFile` 和 `StorageHDFS` 读取的流数量现在受到限制, 以避免超过内存限制. [#7981](https://github.com/ClickHouse/ClickHouse/pull/7981) ([alesapin](https://github.com/alesapin)) -- 修复了没有键的 `*MergeTree` 表的 `CHECK TABLE` 查询. [#7979](https://github.com/ClickHouse/ClickHouse/pull/7979) ([alesapin](https://github.com/alesapin)) -- 如果没有突变, 则从零件名称中删除了突变编号. 此删除改进了与旧版本的兼容性. [#8250](https://github.com/ClickHouse/ClickHouse/pull/8250) ([alesapin](https://github.com/alesapin)) -- 修复部分附属部分由于 data_version 大于表突变版本而跳过突变的 bug. [#7812](https://github.com/ClickHouse/ClickHouse/pull/7812) ([Zhichang Yu](https://github.com/yuzhichang)) -- 允许在将零件移动到另一台设备后使用零件的冗余副本启动服务器. [#7810](https://github.com/ClickHouse/ClickHouse/pull/7810) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 修复使用聚合函数列时可能出现的 `Sizes of columns does not match` 错误. [#7790](https://github.com/ClickHouse/ClickHouse/pull/7790) ([Boris Granveaud](https://github.com/bgranvea)) -- 现在, 如果将 WITH TIES 与 LIMIT BY 一起使用, 则会抛出异常. 现在可以将 TOP 与 LIMIT BY 一起使用. [#7637](https://github.com/ClickHouse/ClickHouse/pull/7637) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -- 修复字典重新加载, 如果它有 `invalidate_query`, 它会停止更新并且在之前的更新尝试中出现一些异常. [#8029](https://github.com/ClickHouse/ClickHouse/pull/8029) ([alesapin](https://github.com/alesapin)) - -### ClickHouse 版本 19.17.4.11, 2019-11-22 {#clickhouse-release-v19-17-4-11-2019-11-22} - -#### 向后不兼容的更新 {#backward-incompatible-change} - -- 使用列而不是 AST 来存储标量子查询结果以获得更好的性能. 设置 `enable_scalar_subquery_optimization` 是在 19.17 中添加的, 默认情况下启用. 在从以前的版本升级到 19.17.2 或 19.17.3 期间, 它会导致类似 [this](https://github.com/ClickHouse/ClickHouse/issues/7851) 的错误. 此设置在 19.17.4 中默认禁用, 以便从 19.16 和更旧版本升级而不会出错. [#7392](https://github.com/ClickHouse/ClickHouse/pull/7392) ([Amos Bird](https://github.com/amosbird)) - -#### 新特征 {#new-feature} - -- 添加使用 DDL 查询创建字典的功能. [#7360](https://github.com/ClickHouse/ClickHouse/pull/7360) ([alesapin](https://github.com/alesapin)) -- 使 `bloom_filter` 类型的索引支持 `LowCardinality` 和 `Nullable`. [#7363](https://github.com/ClickHouse/ClickHouse/issues/7363) [#7561](https://github.com/ClickHouse/ClickHouse/pull/7561) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 添加函数 `isValidJSON` 以检查传递的字符串是否是有效的 json. [#5910](https://github.com/ClickHouse/ClickHouse/issues/5910) [#7293](https://github.com/ClickHouse/ClickHouse/pull/7293) ([Vdimir](https://github.com/Vdimir)) -- 实现 `arrayCompact` 函数. [#7328](https://github.com/ClickHouse/ClickHouse/pull/7328) ([Memo](https://github.com/Joeywzr)) -- 为十进制数创建函数 `hex` . 它的工作原理类似于 `hex(reinterpretAsString())`, 但不会删除最后的零字节. [#7355](https://github.com/ClickHouse/ClickHouse/pull/7355) ([Mikhail Korotov](https://github.com/millb)) -- 添加 `arrayFill` 和 `arrayReverseFill` 函数, 将元素替换为数组前/后的其他元素. [#7380](https://github.com/ClickHouse/ClickHouse/pull/7380) ([hcz](https://github.com/hczhcz)) -- 添加 `CRC32IEEE()` / `CRC64()` 支持. [#7480](https://github.com/ClickHouse/ClickHouse/pull/7480) ([Azat Khuzhin](https://github.com/azat)) -- 实现类似于 in 的 `char` 函数. [mysql](https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_char) [#7486](https://github.com/ClickHouse/ClickHouse/pull/7486) ([sundyli](https://github.com/sundy-li)) -- 添加 `bitmapTransform` 函数. 它将位图中的一组值转换为另一个值数组, 结果是一个新的位图. [#7598](https://github.com/ClickHouse/ClickHouse/pull/7598) ([Zhichang Yu](https://github.com/yuzhichang)) -- 实现了`javaHashUTF16LE()`函数. [#7651](https://github.com/ClickHouse/ClickHouse/pull/7651) ([achimbab](https://github.com/achimbab)) -- 为分布式引擎添加 `_shard_num` 虚拟列. [#7624](https://github.com/ClickHouse/ClickHouse/pull/7624) ([Azat Khuzhin](https://github.com/azat)) - -#### 实验功能 {#experimental-feature} - -- 支持 `MergeTree` 中的处理器 (新的查询执行管道). [#7181](https://github.com/ClickHouse/ClickHouse/pull/7181) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) - -#### Bug 修复 {#bug-fix-1} - -- 修复 `Values` 中不正确的浮点解析. [#7817](https://github.com/ClickHouse/ClickHouse/issues/7817) [#7870](https://github.com/ClickHouse/ClickHouse/pull/7870) ([tavplubix](https://github.com/tavplubix)) -- 修复启用 trace_log 时可能发生的罕见死锁. [#7838](https://github.com/ClickHouse/ClickHouse/pull/7838) ([filimonov](https://github.com/filimonov)) -- 生成 Kafka 表时防止消息重复, 其中有任何 MV 从中选择. [#7265](https://github.com/ClickHouse/ClickHouse/pull/7265) ([Ivan](https://github.com/abyss7)) -- 支持 `IN` 中的 `Array(LowCardinality(Nullable(String)))`. 解决 [#7364](https://github.com/ClickHouse/ClickHouse/issues/7364) [#7366](https://github.com/ClickHouse/ClickHouse/pull/7366) ([achimbab](https://github.com/achimbab)) -- 在 `SQL BIGINT` 中添加对 `SQL TINYINT` 的处理, 并在 ODBC Bridge 中修复对 `SQL_FLOAT` 数据源类型的处理. [#7491](https://github.com/ClickHouse/ClickHouse/pull/7491) ([Denis Glazachev](https://github.com/traceon)) -- 修复空十进制列上的聚合( `avg` 和分位数). [#7431](https://github.com/ClickHouse/ClickHouse/pull/7431) ([Andrey Konyaev](https://github.com/akonyaev90)) -- 将 `INSERT` 修复为 Distributed with `MATERIALIZED` 列. [#7377](https://github.com/ClickHouse/ClickHouse/pull/7377) ([Azat Khuzhin](https://github.com/azat)) -- 如果分区的某些部分已经在目标磁盘或卷上, 则使 `MOVE PARTITION` 工作. [#7434](https://github.com/ClickHouse/ClickHouse/pull/7434) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 修复了在多磁盘配置中 `ReplicatedMergeTree` 中的突变期间无法创建硬链接的错误. [#7558](https://github.com/ClickHouse/ClickHouse/pull/7558) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 修复了当整个部分保持不变并且在另一个磁盘上找到最佳空间时 MergeTree 上发生突变的错误. [#7602](https://github.com/ClickHouse/ClickHouse/pull/7602) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 修复了未从磁盘配置中读取 `keep_free_space_ratio` 的错误. [#7645](https://github.com/ClickHouse/ClickHouse/pull/7645) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 修复表中仅包含 `Tuple` 列或具有复杂路径的列的错误. 修复 [7541](https://github.com/ClickHouse/ClickHouse/issues/7541). [#7545](https://github.com/ClickHouse/ClickHouse/pull/7545) ([alesapin](https://github.com/alesapin)) -- 在 max_memory_usage 限制中不考虑 Buffer 引擎的内存. [#7552](https://github.com/ClickHouse/ClickHouse/pull/7552) ([Azat Khuzhin](https://github.com/azat)) -- 修复由 `tuple()` 排序的 `MergeTree` 表中的最终标记使用. 在极少数情况下, 它可能会在选择时导致 `Can't adjust last granule` 错误. [#7639](https://github.com/ClickHouse/ClickHouse/pull/7639) ([Anton Popov](https://github.com/CurtizJ)) -- 修复具有需要上下文的操作 (例如 json 的函数) 的谓词的突变中的错误, 这可能导致崩溃或奇怪的异常. [#7664](https://github.com/ClickHouse/ClickHouse/pull/7664) ([alesapin](https://github.com/alesapin)) -- 修复在 `data/` 和 `shadow/` 目录中转义的数据库和表名的不匹配. [#7575](https://github.com/ClickHouse/ClickHouse/pull/7575) ([Alexander Burmak](https://github.com/Alex-Burmak)) -- 支持 RIGHT\|FULL JOIN 中的重复键, 例如 `ON t.x = u.x AND t.x = u.y`. 在这种情况下修复崩溃. [#7586](https://github.com/ClickHouse/ClickHouse/pull/7586) ([Artem Zuikov](https://github.com/4ertus2)) -- 使用 RIGHT 或 FULL JOIN 连接表达式时, 修复 `Not found column in block` . [#7641](https://github.com/ClickHouse/ClickHouse/pull/7641) ([Artem Zuikov](https://github.com/4ertus2)) -- 再次尝试以 `PrettySpace` format 格式修复无限循环. [#7591](https://github.com/ClickHouse/ClickHouse/pull/7591) ([Olga Khvostikova](https://github.com/stavrolia)) -- 当所有参数都是相同大小的 `FixedString` 时, 修复 `concat` 函数中的错误. [#7635](https://github.com/ClickHouse/ClickHouse/pull/7635) ([alesapin](https://github.com/alesapin)) -- 修复了在定义 S3、URL 和 HDFS 存储时使用 1 个参数的异常. [#7618](https://github.com/ClickHouse/ClickHouse/pull/7618) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 修复带有查询的视图的 InterpreterSelectQuery 的范围. [#7601](https://github.com/ClickHouse/ClickHouse/pull/7601) ([Azat Khuzhin](https://github.com/azat)) - -#### 改进 {#improvement} - -- `Nullable` 列识别和 NULL 值由 ODBC 桥正确处理. [#7402](https://github.com/ClickHouse/ClickHouse/pull/7402) ([Vasily Nemkov](https://github.com/Enmk)) -- 以原子方式写入分布式发送的当前批次. [#7600](https://github.com/ClickHouse/ClickHouse/pull/7600) ([Azat Khuzhin](https://github.com/azat)) -- 如果我们无法在查询中检测到列名的表, 则抛出异常. [#7358](https://github.com/ClickHouse/ClickHouse/pull/7358) ([Artem Zuikov](https://github.com/4ertus2)) -- 将 `merge_max_block_size` 设置添加到 `MergeTreeSettings`. [#7412](https://github.com/ClickHouse/ClickHouse/pull/7412) ([Artem Zuikov](https://github.com/4ertus2)) -- 带有 `HAVING` 和不带 `GROUP BY` 的查询假定按常量分组. 所以, `SELECT 1 HAVING 1` 现在返回一个结果. [#7496](https://github.com/ClickHouse/ClickHouse/pull/7496) ([Amos Bird](https://github.com/amosbird)) -- 支持将 `(X,)` 解析为类似于python的元组. [#7501](https://github.com/ClickHouse/ClickHouse/pull/7501), [#7562](https://github.com/ClickHouse/ClickHouse/pull/7562) ([Amos Bird](https://github.com/amosbird)) -- 使 `range` 函数行为几乎像 Pythonic 一样. [#7518](https://github.com/ClickHouse/ClickHouse/pull/7518) ([sundyli](https://github.com/sundy-li)) -- 将 `constraints` 列添加到表 `system.settings`. [#7553](https://github.com/ClickHouse/ClickHouse/pull/7553) ([Vitaly Baranov](https://github.com/vitlibar)) -- 更好的 tcp 处理程序的 Null 格式,以便可以通过 clickhouse-client 使用 `select ignore() from table format Null` 进行性能测量. [#7606](https://github.com/ClickHouse/ClickHouse/pull/7606) ([Amos Bird](https://github.com/amosbird)) -- 像 `CREATE TABLE ... AS (SELECT (1, 2))` 这样的查询被正确解析. [#7542](https://github.com/ClickHouse/ClickHouse/pull/7542) ([hcz](https://github.com/hczhcz)) - -#### 性能改进 {#performance-improvement} - -- 改进了对短字符串键的聚合性能. [#6243](https://github.com/ClickHouse/ClickHouse/pull/6243) ([Alexander Kuzmenkov](https://github.com/akuzm), [Amos Bird](https://github.com/amosbird)) -- 在折叠常量谓词后运行另一遍语法/表达式分析以获得潜在的优化. [#7497](https://github.com/ClickHouse/ClickHouse/pull/7497) ([Amos Bird](https://github.com/amosbird)) -- 使用存储元信息来评估琐碎的 `SELECT count() FROM table;`. [#7510](https://github.com/ClickHouse/ClickHouse/pull/7510) ([Amos Bird](https://github.com/amosbird), [alexey-milovidov](https://github.com/alexey-milovidov)) -- 矢量化处理 `arrayReduce` 类似于聚合器 `addBatch`. [#7608](https://github.com/ClickHouse/ClickHouse/pull/7608) ([Amos Bird](https://github.com/amosbird)) -- `Kafka` 消费性能的小幅改进. [#7475](https://github.com/ClickHouse/ClickHouse/pull/7475) ([Ivan](https://github.com/abyss7)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement} - -- 添加对 CPU 架构 AARCH64 的交叉编译支持. 重构打包脚本. [#7370](https://github.com/ClickHouse/ClickHouse/pull/7370) [#7539](https://github.com/ClickHouse/ClickHouse/pull/7539) ([Ivan](https://github.com/abyss7)) -- 构建软件包时, 将 darwin-x86_64 和 linux-aarch64 工具链解压到已安装的 Docker 卷中. [#7534](https://github.com/ClickHouse/ClickHouse/pull/7534) ([Ivan](https://github.com/abyss7)) -- 更新二进制打包器的 Docker 镜像. [#7474](https://github.com/ClickHouse/ClickHouse/pull/7474) ([Ivan](https://github.com/abyss7)) -- 修复了 MacOS Catalina 上的编译错误. [#7585](https://github.com/ClickHouse/ClickHouse/pull/7585) ([Ernest Poletaev](https://github.com/ernestp)) -- 查询分析逻辑中的一些重构: 将复杂的类拆分成几个简单的类. [#7454](https://github.com/ClickHouse/ClickHouse/pull/7454) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复没有子模块的构建. [#7295](https://github.com/ClickHouse/ClickHouse/pull/7295) ([proller](https://github.com/proller)) -- CMake 文件中更好的 `add_globs`. [#7418](https://github.com/ClickHouse/ClickHouse/pull/7418) ([Amos Bird](https://github.com/amosbird)) -- 删除 `unwind` 目标中的硬编码路径. [#7460](https://github.com/ClickHouse/ClickHouse/pull/7460) ([Konstantin Podshumok](https://github.com/podshumok)) -- 允许使用没有 ssl 的 mysql 格式. [#7524](https://github.com/ClickHouse/ClickHouse/pull/7524) ([proller](https://github.com/proller)) - -#### 其他 {#other} - -- 为 ClickHouse SQL 方言添加了 ANTLR4 语法. [#7595](https://github.com/ClickHouse/ClickHouse/issues/7595) [#7596](https://github.com/ClickHouse/ClickHouse/pull/7596) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -## ClickHouse 版本 19.16 {#clickhouse-release-v19-16} - -#### ClickHouse 版本 19.16.14.65, 2020-03-25 {#clickhouse-release-v19-16-14-65-2020-03-25} - -- 修复了多个参数 (超过 10 个) 的三元逻辑 OP 的批量计算中的错误. [#8718](https://github.com/ClickHouse/ClickHouse/pull/8718) ([Alexander Kazakov](https://github.com/Akazz)) This bugfix was backported to version 19.16 by a special request from Altinity. - -#### ClickHouse 版本 19.16.14.65, 2020-03-05 {#clickhouse-release-v19-16-14-65-2020-03-05} - -- 修复分布式子查询与旧 CH 版本不兼容的问题. 修复 [#7851](https://github.com/ClickHouse/ClickHouse/issues/7851) [(tabplubix)](https://github.com/tavplubix) -- 执行 `CREATE` 查询时, 在存储引擎参数中折叠常量表达式. 用当前数据库替换空数据库名称. 修复 [#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [#3492](https://github.com/ClickHouse/ClickHouse/issues/3492). 还修复了 `ClickHouseDictionarySource` 中本地地址的检查. [#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) [(tabplubix)](https://github.com/tavplubix) -- 现在 `*MergeTree` 表引擎族中的后台合并更准确地保留存储策略卷顺序. [#8549](https://github.com/ClickHouse/ClickHouse/pull/8549) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 在读取后缀之后但提交之前发生异常时, 在极少数情况下防止在 `Kafka` 中丢失数据. 修复 [#9378](https://github.com/ClickHouse/ClickHouse/issues/9378). 相关的: [#7175](https://github.com/ClickHouse/ClickHouse/issues/7175) [#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) [(filimonov)](https://github.com/filimonov) -- 修复在尝试使用/删除使用错误参数创建的 `Kafka` 表时导致服务器终止的错误. 修复 [#9494](https://github.com/ClickHouse/ClickHouse/issues/9494). Incorporates [#9507](https://github.com/ClickHouse/ClickHouse/issues/9507). [#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) [(filimonov)](https://github.com/filimonov) -- 允许将 `MaterializedView` 与 `Kafka` 表上方的子查询一起使用. [#8197](https://github.com/ClickHouse/ClickHouse/pull/8197) ([filimonov](https://github.com/filimonov)) - -#### 新特征 {#new-feature-1} - -- 添加 `deduplicate_blocks_in_dependent_materialized_views` 选项以控制幂等插入到具有物化视图的表中的行为. 应 Altinity 的特殊要求, 此新功能已添加到错误修复版本中. [#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) [(urykhy)](https://github.com/urykhy) - -### ClickHouse 版本 19.16.2.2, 2019-10-30 {#clickhouse-release-v19-16-2-2-2019-10-30} - -#### 向后不兼容的更新 {#backward-incompatible-change-1} - -- 为 count/countIf 添加缺失的 arity 验证. [#7095](https://github.com/ClickHouse/ClickHouse/issues/7095), [#7298](https://github.com/ClickHouse/ClickHouse/pull/7298) ([Vdimir](https://github.com/Vdimir)) -- 删除旧的 `asterisk_left_columns_only` 设置 (默认情况下禁用). [#7335](https://github.com/ClickHouse/ClickHouse/pull/7335) ([Artem Zuikov](https://github.com/4ertus2)) -- 模板数据格式的格式字符串现在在文件中指定. [#7118](https://github.com/ClickHouse/ClickHouse/pull/7118) ([tavplubix](https://github.com/tavplubix)) - -#### 新特征 {#new-feature-2} - -- 引入 uniqCombined64() 计算大于 UINT_MAX 的基数. [#7213](https://github.com/ClickHouse/ClickHouse/pull/7213), [#7222](https://github.com/ClickHouse/ClickHouse/pull/7222) ([Azat Khuzhin](https://github.com/azat)) -- 支持数组列上的布隆过滤器索引. [#6984](https://github.com/ClickHouse/ClickHouse/pull/6984) ([achimbab](https://github.com/achimbab)) -- 添加一个函数 `getMacro(name)`, 它从服务器配置中返回带有相应 `` 值的字符串. [#7240](https://github.com/ClickHouse/ClickHouse/pull/7240) - ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 为基于 HTTP 源的字典设置两个配置选项: `credentials` 和 `http-headers`. [#7092](https://github.com/ClickHouse/ClickHouse/pull/7092) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 添加一个新的 ProfileEvent `Merge` 来计算启动的后台合并的数量. [#7093](https://github.com/ClickHouse/ClickHouse/pull/7093) ([Mikhail Korotov](https://github.com/millb)) -- 添加返回完全限定域名的 fullHostName 函数. [#7263](https://github.com/ClickHouse/ClickHouse/issues/7263) [#7291](https://github.com/ClickHouse/ClickHouse/pull/7291) ([sundyli](https://github.com/sundy-li)) -- 添加函数 `arraySplit` 和 `arrayReverseSplit`, 它们通过 `cut off` 条件拆分数组. 它们在时间序列处理中很有用. [#7294](https://github.com/ClickHouse/ClickHouse/pull/7294) ([hcz](https://github.com/hczhcz)) -- 添加返回 multiMatch 系列函数中所有匹配索引数组的新函数. [#7299](https://github.com/ClickHouse/ClickHouse/pull/7299) ([Danila Kutenin](https://github.com/danlark1)) -- 添加一个新的数据库引擎 `Lazy`, 该引擎针对存储大量小型 -Log 表进行了优化. [#7171](https://github.com/ClickHouse/ClickHouse/pull/7171) ([Nikita Vasilev](https://github.com/nikvas0)) -- 为位图列添加聚合函数 groupBitmapAnd、-Or、-Xor. [#7109](https://github.com/ClickHouse/ClickHouse/pull/7109) ([Zhichang Yu](https://github.com/yuzhichang)) -- 添加聚合函数组合子 -OrNull 和 -OrDefault,当没有聚合时返回空值或默认值. [#7331](https://github.com/ClickHouse/ClickHouse/pull/7331) ([hcz](https://github.com/hczhcz)) -- 引入支持自定义转义和分隔符规则的 CustomSeparated 数据格式. [#7118](https://github.com/ClickHouse/ClickHouse/pull/7118) ([tavplubix](https://github.com/tavplubix)) -- 支持Redis作为外部字典的来源. [#4361](https://github.com/ClickHouse/ClickHouse/pull/4361) [#6962](https://github.com/ClickHouse/ClickHouse/pull/6962) ([comunodi](https://github.com/comunodi), [Anton Popov](https://github.com/CurtizJ)) - -#### Bug 修复 {#bug-fix-2} - -- 修复错误的查询结果, 如果它有 `WHERE IN (SELECT ...)` 部分并且使用了 `optimize_read_in_order`. [#7371](https://github.com/ClickHouse/ClickHouse/pull/7371) ([Anton - Popov](https://github.com/CurtizJ)) -- 禁用 MariaDB 身份验证插件, 该插件依赖于项目外的文件. [#7140](https://github.com/ClickHouse/ClickHouse/pull/7140) ([Yuriy Baranov](https://github.com/yurriy)) -- 修复异常 `Cannot convert column ... because it is constant but values of constants are different in source and result` , 这在函数 `now()`、`today()`、`yesterday()`、 `randConstant()` 时, 这种情况很少发生. [#7156](https://github.com/ClickHouse/ClickHouse/pull/7156) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复了使用 HTTP 保持活动超时而不是 TCP 保持活动超时的问题. [#7351](https://github.com/ClickHouse/ClickHouse/pull/7351) ([Vasily Nemkov](https://github.com/Enmk)) -- 修复了 groupBitmapOr 中的分段错误. (issue [#7109](https://github.com/ClickHouse/ClickHouse/issues/7109)). [#7289](https://github.com/ClickHouse/ClickHouse/pull/7289) ([Zhichang Yu](https://github.com/yuzhichang)) -- 对于物化视图,在写入所有数据后调用 Kafka 的提交. [#7175](https://github.com/ClickHouse/ClickHouse/pull/7175) ([Ivan](https://github.com/abyss7)) -- 修复了 `system.part_log` 表中错误的 `duration_ms` 值. 差了十倍. [#7172](https://github.com/ClickHouse/ClickHouse/pull/7172) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 解决 LIVE VIEW 表崩溃并重新启用所有 LIVE VIEW 测试的快速修复. [#7201](https://github.com/ClickHouse/ClickHouse/pull/7201) ([vzakaznikov](https://github.com/vzakaznikov)) -- 在 MergeTree 部分的最小/最大索引中正确序列化 NULL 值. [#7234](https://github.com/ClickHouse/ClickHouse/pull/7234) ([Alexander Kuzmenkov](https://github.com/akuzm)) -- 当表创建为 `CREATE TABLE AS` 时, 不要将虚拟列放入 .sql 元数据. [#7183](https://github.com/ClickHouse/ClickHouse/pull/7183) ([Ivan](https://github.com/abyss7)) -- 修复 `ATTACH PART` 查询中的分段错误. [#7185](https://github.com/ClickHouse/ClickHouse/pull/7185) ([alesapin](https://github.com/alesapin)) -- 修复空 IN 子查询和空 INNER/RIGHT JOIN 优化给出的某些查询的错误结果. [#7284](https://github.com/ClickHouse/ClickHouse/pull/7284) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复 LIVE VIEW getHeader() 方法中的 AddressSanitizer 错误. [#7271](https://github.com/ClickHouse/ClickHouse/pull/7271) ([vzakaznikov](https://github.com/vzakaznikov)) - -#### 改进 {#improvement-1} - -- 在 queue_wait_max_ms 等待发生的情况下添加一条消息. [#7390](https://github.com/ClickHouse/ClickHouse/pull/7390) ([Azat Khuzhin](https://github.com/azat)) -- 在表级设置 `s3_min_upload_part_size` . [#7059](https://github.com/ClickHouse/ClickHouse/pull/7059) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 在 StorageFactory 中检查 TTL. [#7304](https://github.com/ClickHouse/ClickHouse/pull/7304) ([sundyli](https://github.com/sundy-li)) -- 在部分合并连接中挤压左侧块 (优化). [#7122](https://github.com/ClickHouse/ClickHouse/pull/7122) ([Artem Zuikov](https://github.com/4ertus2)) -- 不允许在复制表引擎的突变中使用非确定性函数, 因为这会导致副本之间的不一致. [#7247](https://github.com/ClickHouse/ClickHouse/pull/7247) ([Alexander Kazakov](https://github.com/Akazz)) -- 在将异常堆栈跟踪转换为字符串时禁用内存跟踪器. 可以防止服务器上的 `Memory limit exceeded` 类型的错误信息丢失, 导致客户端 `Attempt to read after eof` 异常. [#7264](https://github.com/ClickHouse/ClickHouse/pull/7264) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 各种格式改进. 解决 [#6033](https://github.com/ClickHouse/ClickHouse/issues/6033), [#2633](https://github.com/ClickHouse/ClickHouse/issues/2633), [#6611](https://github.com/ClickHouse/ClickHouse/issues/6611), [#6742](https://github.com/ClickHouse/ClickHouse/issues/6742) [#7215](https://github.com/ClickHouse/ClickHouse/pull/7215) ([tavplubix](https://github.com/tavplubix)) -- ClickHouse 会忽略 IN 运算符右侧无法转换为左侧类型的值. 使其适用于复合类型——数组和元组. [#7283](https://github.com/ClickHouse/ClickHouse/pull/7283) ([Alexander Kuzmenkov](https://github.com/akuzm)) -- 支持 ASOF JOIN 缺失的不等式. 可以在 ON 语法中为 ASOF 列加入 less-or-equal 变体和严格的更大和更少变体. [#7282](https://github.com/ClickHouse/ClickHouse/pull/7282) ([Artem Zuikov](https://github.com/4ertus2)) -- 优化部分合并连接. [#7070](https://github.com/ClickHouse/ClickHouse/pull/7070) ([Artem Zuikov](https://github.com/4ertus2)) -- 不要在 uniqCombined 函数中使用超过 98K 的内存. [#7236](https://github.com/ClickHouse/ClickHouse/pull/7236), [#7270](https://github.com/ClickHouse/ClickHouse/pull/7270) ([Azat Khuzhin](https://github.com/azat)) -- 在 PartialMergeJoin 中刷新磁盘上右侧连接表的部分 (如果没有足够的内存). 需要时加载数据. [#7186](https://github.com/ClickHouse/ClickHouse/pull/7186) ([Artem Zuikov](https://github.com/4ertus2)) - -#### 性能改进 {#performance-improvement-1} - -- 通过避免数据重复来加速使用 const 参数的 joinGet. [#7359](https://github.com/ClickHouse/ClickHouse/pull/7359) ([Amos Bird](https://github.com/amosbird)) -- 如果子查询为空, 则提前返回. [#7007](https://github.com/ClickHouse/ClickHouse/pull/7007) ([小路](https://github.com/nicelulu)) -- 优化 Values 中 SQL 表达式的解析. [#6781](https://github.com/ClickHouse/ClickHouse/pull/6781) ([tavplubix](https://github.com/tavplubix)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-1} - -- 禁用一些用于交叉编译到 Mac OS 的贡献. [#7101](https://github.com/ClickHouse/ClickHouse/pull/7101) ([Ivan](https://github.com/abyss7)) -- 为 clickhouse_common_io 添加缺少的 PocoXML 链接. [#7200](https://github.com/ClickHouse/ClickHouse/pull/7200) ([Azat Khuzhin](https://github.com/azat)) -- 在 clickhouse-test 中接受多个测试过滤器参数. [#7226](https://github.com/ClickHouse/ClickHouse/pull/7226) ([Alexander Kuzmenkov](https://github.com/akuzm)) -- 为 ARM 启用 musl 和 jemalloc. [#7300](https://github.com/ClickHouse/ClickHouse/pull/7300) ([Amos Bird](https://github.com/amosbird)) -- 将 `--client-option` 参数添加到 `clickhouse-test` 以将附加参数传递给客户端. [#7277](https://github.com/ClickHouse/ClickHouse/pull/7277) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 在 rpm 包升级时保留现有配置. [#7103](https://github.com/ClickHouse/ClickHouse/pull/7103) ([filimonov](https://github.com/filimonov)) -- 修复 PVS 检测到的错误. [#7153](https://github.com/ClickHouse/ClickHouse/pull/7153) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复 Darwin 的构建. [#7149](https://github.com/ClickHouse/ClickHouse/pull/7149) ([Ivan](https://github.com/abyss7)) -- glibc 2.29 兼容性. [#7142](https://github.com/ClickHouse/ClickHouse/pull/7142) ([Amos Bird](https://github.com/amosbird)) -- 确保 dh_clean 不接触潜在的源文件. [#7205](https://github.com/ClickHouse/ClickHouse/pull/7205) ([Amos Bird](https://github.com/amosbird)) -- 从 altinity rpm 更新时尝试避免冲突 - 它在 clickhouse-server-common 中单独打包了配置文件. [#7073](https://github.com/ClickHouse/ClickHouse/pull/7073) ([filimonov](https://github.com/filimonov)) -- 优化一些头文件以加快重建速度. [#7212](https://github.com/ClickHouse/ClickHouse/pull/7212), [#7231](https://github.com/ClickHouse/ClickHouse/pull/7231) ([Alexander - Kuzmenkov](https://github.com/akuzm)) -- 添加日期和日期时间的性能测试. [#7332](https://github.com/ClickHouse/ClickHouse/pull/7332) ([Vasily Nemkov](https://github.com/Enmk)) -- 修复一些包含非确定性突变的测试. [#7132](https://github.com/ClickHouse/ClickHouse/pull/7132) ([Alexander Kazakov](https://github.com/Akazz)) -- 将带有 MemorySanitizer 的构建添加到 CI. [#7066](https://github.com/ClickHouse/ClickHouse/pull/7066) ([Alexander Kuzmenkov](https://github.com/akuzm)) -- 避免在 MetricsTransmitter 中使用未初始化的值. [#7158](https://github.com/ClickHouse/ClickHouse/pull/7158) ([Azat Khuzhin](https://github.com/azat)) -- 修复 MemorySanitizer 发现的 Fields 中的一些问题. [#7135](https://github.com/ClickHouse/ClickHouse/pull/7135), [#7179](https://github.com/ClickHouse/ClickHouse/pull/7179) ([Alexander Kuzmenkov](https://github.com/akuzm)), [#7376](https://github.com/ClickHouse/ClickHouse/pull/7376) ([Amos Bird](https://github.com/amosbird)) -- 修复 murmurhash32 中未定义的行为. [#7388](https://github.com/ClickHouse/ClickHouse/pull/7388) ([Amos Bird](https://github.com/amosbird)) -- 修复 StoragesInfoStream 中未定义的行为. [#7384](https://github.com/ClickHouse/ClickHouse/pull/7384) ([tavplubix](https://github.com/tavplubix)) -- 修复了外部数据库引擎 (MySQL、ODBC、JDBC) 的常量表达式折叠. 在以前的版本中, 它不适用于多个常量表达式, 也不适用于 Date、DateTime 和 UUID. 这修复了 [#7245](https://github.com/ClickHouse/ClickHouse/issues/7245) [#7252](https://github.com/ClickHouse/ClickHouse/pull/7252) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在访问 no_users_thread 变量时修复实时视图中的 ThreadSanitizer 数据竞争错误. [#7353](https://github.com/ClickHouse/ClickHouse/pull/7353) ([vzakaznikov](https://github.com/vzakaznikov)) -- 摆脱 libcommon 中的 malloc 符号. [#7134](https://github.com/ClickHouse/ClickHouse/pull/7134), [#7065](https://github.com/ClickHouse/ClickHouse/pull/7065) ([Amos - Bird](https://github.com/amosbird)) -- 添加全局标志 ENABLE_LIBRARIES 以禁用所有库. [#7063](https://github.com/ClickHouse/ClickHouse/pull/7063) ([proller](https://github.com/proller)) - -#### 代码清理 {#code-cleanup} - -- 通用化配置存储库以准备 DDL for Dictionaries. [#7155](https://github.com/ClickHouse/ClickHouse/pull/7155) ([alesapin](https://github.com/alesapin)) -- 没有任何语义的字典 DDL 解析器. [#7209](https://github.com/ClickHouse/ClickHouse/pull/7209) ([alesapin](https://github.com/alesapin)) -- 将 ParserCreateQuery 拆分为不同的较小解析器. [#7253](https://github.com/ClickHouse/ClickHouse/pull/7253) ([alesapin](https://github.com/alesapin)) -- 外部字典附近的小重构和重命名. [#7111](https://github.com/ClickHouse/ClickHouse/pull/7111) ([alesapin](https://github.com/alesapin)) -- 重构一些代码, 为基于角色的访问控制做准备. [#7235](https://github.com/ClickHouse/ClickHouse/pull/7235) ([Vitaly Baranov](https://github.com/vitlibar)) -- DatabaseOrdinary 代码的一些改进. [#7086](https://github.com/ClickHouse/ClickHouse/pull/7086) ([Nikita Vasilev](https://github.com/nikvas0)) -- 不要在哈希表的 find() 和 emplace() 方法中使用迭代器. [#7026](https://github.com/ClickHouse/ClickHouse/pull/7026) ([Alexander Kuzmenkov](https://github.com/akuzm)) -- 修复 getMultipleValuesFromConfig 以防参数 root 不为空. [#7374](https://github.com/ClickHouse/ClickHouse/pull/7374) ([Mikhail Korotov](https://github.com/millb)) -- 删除一些复制粘贴 (TemporaryFile 和 TemporaryFileStream). [#7166](https://github.com/ClickHouse/ClickHouse/pull/7166) ([Artem Zuikov](https://github.com/4ertus2)) -- 提高了一点代码可读性 (`MergeTreeData::getActiveContainingPart`). [#7361](https://github.com/ClickHouse/ClickHouse/pull/7361) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 如果 `ThreadPool::schedule(...)` 抛出异常, 则等待所有使用本地对象的计划作业. 将 `ThreadPool::schedule(...)` 重命名为 `ThreadPool::scheduleOrThrowOnError(...)` 并修复注释以明确它可能会抛出. [#7350](https://github.com/ClickHouse/ClickHouse/pull/7350) ([tavplubix](https://github.com/tavplubix)) - -## ClickHouse 版本 19.15 {#clickhouse-release-19-15} - -### ClickHouse 版本 19.15.4.10, 2019-10-31 {#clickhouse-release-19-15-4-10-2019-10-31} - -#### Bug 修复 {#bug-fix-3} - -- 添加了 SQL BIGINT 中 SQL TINYINT 的处理, 并修复了 ODBC Bridge 中 SQL_FLOAT 数据源类型的处理. [#7491](https://github.com/ClickHouse/ClickHouse/pull/7491) ([Denis Glazachev](https://github.com/traceon)) -- 允许在 MOVE PARTITION 中的目标磁盘或卷上有一些部分. [#7434](https://github.com/ClickHouse/ClickHouse/pull/7434) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 通过 ODBC 桥修复可空列中的 NULL 值. [#7402](https://github.com/ClickHouse/ClickHouse/pull/7402) ([Vasily Nemkov](https://github.com/Enmk)) -- 修复了 INSERT 到具有 MATERIALIZED 列的分布式非本地节点. [#7377](https://github.com/ClickHouse/ClickHouse/pull/7377) ([Azat Khuzhin](https://github.com/azat)) -- 固定函数 getMultipleValuesFromConfig. [#7374](https://github.com/ClickHouse/ClickHouse/pull/7374) ([Mikhail Korotov](https://github.com/millb)) -- 修复了使用 HTTP 保持活动超时而不是 TCP 保持活动超时的问题. [#7351](https://github.com/ClickHouse/ClickHouse/pull/7351) ([Vasily Nemkov](https://github.com/Enmk)) -- 等待所有作业在异常情况下完成 (修复罕见的段错误). [#7350](https://github.com/ClickHouse/ClickHouse/pull/7350) ([tavplubix](https://github.com/tavplubix)) -- 插入 Kafka 表时不要推送到 MV. [#7265](https://github.com/ClickHouse/ClickHouse/pull/7265) ([Ivan](https://github.com/abyss7)) -- 禁用异常堆栈的内存跟踪器. [#7264](https://github.com/ClickHouse/ClickHouse/pull/7264) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复了转换外部数据库查询中的错误代码. [#7252](https://github.com/ClickHouse/ClickHouse/pull/7252) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 避免在 MetricsTransmitter 中使用未初始化的值. [#7158](https://github.com/ClickHouse/ClickHouse/pull/7158) ([Azat Khuzhin](https://github.com/azat)) -- 添加了带有用于测试的宏的示例配置. ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.15.3.6, 2019-10-09 {#clickhouse-release-19-15-3-6-2019-10-09} - -#### Bug 修复 {#bug-fix-4} - -- 修复了散列字典中的 bad_variant. ([alesapin](https://github.com/alesapin)) -- 修复了 ATTACH PART 查询中分段错误的错误. ([alesapin](https://github.com/alesapin)) -- 修复了`MergeTreeData` 中的时间计算. ([Vladimir Chebotarev](https://github.com/excitoon)) -- 在编写完成后显式提交给Kafka. [#7175](https://github.com/ClickHouse/ClickHouse/pull/7175) ([Ivan](https://github.com/abyss7)) -- 在 MergeTree 部分的最小/最大索引中正确序列化 NULL 值. [#7234](https://github.com/ClickHouse/ClickHouse/pull/7234) ([Alexander Kuzmenkov](https://github.com/akuzm)) - -### ClickHouse 版本 19.15.2.2, 2019-10-01 {#clickhouse-release-19-15-2-2-2019-10-01} - -#### 新特征 {#new-feature-3} - -- 分层存储: 支持使用 MergeTree 引擎为表使用多个存储卷. 可以在 SSD 上存储新数据并自动将旧数据移动到 HDD. ([example](https://clickhouse.github.io/clickhouse-presentations/meetup30/new_features/#12)). [#4918](https://github.com/ClickHouse/ClickHouse/pull/4918) ([Igr](https://github.com/ObjatieGroba)) [#6489](https://github.com/ClickHouse/ClickHouse/pull/6489) ([alesapin](https://github.com/alesapin)) -- 添加表函数 `input`, 用于在 `INSERT SELECT` 查询中读取传入数据. [#5450](https://github.com/ClickHouse/ClickHouse/pull/5450) ([palasonic1](https://github.com/palasonic1)) [#6832](https://github.com/ClickHouse/ClickHouse/pull/6832) ([Anton Popov](https://github.com/CurtizJ)) -- 添加一个 `sparse_hashed` 字典布局, 它在功能上等同于 `hashed` 布局, 但内存效率更高. 它以较慢的值检索为代价使用大约两倍的内存. [#6894](https://github.com/ClickHouse/ClickHouse/pull/6894) ([Azat Khuzhin](https://github.com/azat)) -- 实现定义用户列表以访问字典的能力. 仅使用当前连接的数据库. [#6907](https://github.com/ClickHouse/ClickHouse/pull/6907) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 向`SHOW`查询添加`LIMIT`选项. [#6944](https://github.com/ClickHouse/ClickHouse/pull/6944) ([Philipp Malkovsky](https://github.com/malkfilipp)) -- 添加 `bitmapSubsetLimit(bitmap, range_start, limit)` 函数, 返回集合中不小于 `range_start` 的最小 `limit` 值的子集. [#6957](https://github.com/ClickHouse/ClickHouse/pull/6957) ([Zhichang Yu](https://github.com/yuzhichang)) -- 添加 `bitmapMin` 和 `bitmapMax` 函数. [#6970](https://github.com/ClickHouse/ClickHouse/pull/6970) ([Zhichang Yu](https://github.com/yuzhichang)) -- 添加与 [issue-6648](https://github.com/ClickHouse/ClickHouse/issues/6648) [#6999](https://github.com/ClickHouse/ClickHouse/pull/6999) 相关的函数 `repeat`.([flynn](https://github.com/ucasFL)) - -#### 实验功能 {#experimental-feature-1} - -- 实现 (在内存中) 不改变当前管道的 Merge Join 变体. 结果按合并键部分排序. 设置 `partial_merge_join = 1` 以使用此功能. Merge Join 仍在开发中. [#6940](https://github.com/ClickHouse/ClickHouse/pull/6940) ([Artem Zuikov](https://github.com/4ertus2)) -- 添加 `S3` 引擎和表格功能。. 它仍在开发中 (尚无身份验证支持). [#5596](https://github.com/ClickHouse/ClickHouse/pull/5596) ([Vladimir Chebotarev](https://github.com/excitoon)) - -#### 改进 {#improvement-2} - -- 从 Kafka 读取的每条消息都是以原子方式插入的. 这解决了 Kafka 引擎的几乎所有已知问题. [#6950](https://github.com/ClickHouse/ClickHouse/pull/6950) ([Ivan](https://github.com/abyss7)) -- 分布式查询故障转移的改进. 缩短恢复时间, 现在它也是可配置的, 可以在 `system.clusters` 中看到. [#6399](https://github.com/ClickHouse/ClickHouse/pull/6399) ([Vasily Nemkov](https://github.com/Enmk)) -- 直接在 `IN` 部分支持枚举的数值. #6766 [#6941](https://github.com/ClickHouse/ClickHouse/pull/6941) ([dimarub2000](https://github.com/dimarub2000)) -- 支持 (可选, 默认禁用) 重定向 URL 存储. [#6914](https://github.com/ClickHouse/ClickHouse/pull/6914) ([maqroll](https://github.com/maqroll)) -- 添加旧版本客户端连接到服务器时的信息消息. [#6893](https://github.com/ClickHouse/ClickHouse/pull/6893) ([Philipp Malkovsky](https://github.com/malkfilipp)) -- 删除分布式表中发送数据的最大退避睡眠时间限制. [#6895](https://github.com/ClickHouse/ClickHouse/pull/6895) ([Azat Khuzhin](https://github.com/azat)) -- 添加将带有累积值的配置文件事件 (计数器) 发送到石墨的功能. 它可以在服务器 `config.xml` 中的 `` 下启用. [#6969](https://github.com/ClickHouse/ClickHouse/pull/6969) ([Azat Khuzhin](https://github.com/azat)) -- 在通过 HTTP 以本机格式将数据插入类型为 `LowCardinality(T)` 的列中时, 自动将类型 `T` 添加到 `LowCardinality(T)` . [#6891](https://github.com/ClickHouse/ClickHouse/pull/6891) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 添加使用函数 `hex` 而不使用 `reinterpretAsString` 为 `Float32` 和 `Float64` 的能力. [#7024](https://github.com/ClickHouse/ClickHouse/pull/7024) ([Mikhail Korotov](https://github.com/millb)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-2} - -- 将 gdb-index 添加到带有调试信息的 clickhouse 二进制文件中. 它将加快 `gdb` 的启动时间. [#6947](https://github.com/ClickHouse/ClickHouse/pull/6947) ([alesapin](https://github.com/alesapin)) -- 使用使用 `pigz` 的补丁dpkg-deb加速deb打包. [#6960](https://github.com/ClickHouse/ClickHouse/pull/6960) ([alesapin](https://github.com/alesapin)) -- 设置 `enable_fuzzing = 1` 以启用所有项目代码的 libfuzzer 检测. [#7042](https://github.com/ClickHouse/ClickHouse/pull/7042) ([kyprizel](https://github.com/kyprizel)) -- 在 CI 中添加 split build 冒烟测试. [#7061](https://github.com/ClickHouse/ClickHouse/pull/7061) ([alesapin](https://github.com/alesapin)) -- 将带有 MemorySanitizer 的构建添加到 CI. [#7066](https://github.com/ClickHouse/ClickHouse/pull/7066) ([Alexander Kuzmenkov](https://github.com/akuzm)) -- 用 `sparsehash-c11` 替换 `libsparsehash`. [#6965](https://github.com/ClickHouse/ClickHouse/pull/6965) ([Azat Khuzhin](https://github.com/azat)) - -#### Bug 修复 {#bug-fix-5} - -- 修复了大型表上复杂键的索引分析性能下降. 这修复了 #6924. [#7075](https://github.com/ClickHouse/ClickHouse/pull/7075) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复从 Kafka 空主题中选择时导致段错误的逻辑错误. [#6909](https://github.com/ClickHouse/ClickHouse/pull/6909) ([Ivan](https://github.com/abyss7)) -- 修复 `MySQLBlockInputStream.cpp` 中过早关闭 MySQL 连接. [#6882](https://github.com/ClickHouse/ClickHouse/pull/6882) ([Clément Rodriguez](https://github.com/clemrodriguez)) -- 返回对非常旧的 Linux 内核的支持 (修复 [#6841](https://github.com/ClickHouse/ClickHouse/issues/6841)) [#6853](https://github.com/ClickHouse/ClickHouse/pull/6853) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在输入流中出现空块的情况下,修复 `insert select` 查询中可能丢失的数据. #6834 #6862 [#6911](https://github.com/ClickHouse/ClickHouse/pull/6911) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复参数中带有空数组的函数 `АrrayEnumerateUniqRanked`. [#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([proller](https://github.com/proller)) -- 使用数组连接和全局子查询修复复杂查询. [#6934](https://github.com/ClickHouse/ClickHouse/pull/6934) ([Ivan](https://github.com/abyss7)) -- 使用多个 JOIN 修复 ORDER BY 和 GROUP BY 中的 `Unknown identifier` 错误. [#7022](https://github.com/ClickHouse/ClickHouse/pull/7022) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了在执行带有 `LowCardinality` 参数的函数时发出的 `MSan` 警告. [#7062](https://github.com/ClickHouse/ClickHouse/pull/7062) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) - -#### 向后不兼容的更新 {#backward-incompatible-change-2} - -- 更改了位图\* 聚合函数状态的序列化格式以提高性能. 无法读取之前版本中位图\* 的序列化状态. [#6908](https://github.com/ClickHouse/ClickHouse/pull/6908) ([Zhichang Yu](https://github.com/yuzhichang)) - -## ClickHouse 版本 19.14 {#clickhouse-release-19-14} - -### ClickHouse 版本 19.14.7.15, 2019-10-02 {#clickhouse-release-19-14-7-15-2019-10-02} - -#### Bug 修复 {#bug-fix-6} - -- 此版本还包含 19.11.12.69 的所有错误修复. -- 修复了 19.14 和更早版本之间分布式查询的兼容性. 这修复了 [#7068](https://github.com/ClickHouse/ClickHouse/issues/7068). [#7069](https://github.com/ClickHouse/ClickHouse/pull/7069) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.14.6.12, 2019-09-19 {#clickhouse-release-19-14-6-12-2019-09-19} - -#### Bug 修复 {#bug-fix-7} - -- 修复函数 `АrrayEnumerateUniqRanked` 在参数中带有空数组. [#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([proller](https://github.com/proller)) -- 使用带有别名的 `ARRAY JOIN` 和 `GLOBAL IN subquery` 修复了查询中的子查询名称. 如果指定了外部表名, 则使用子查询别名. [#6934](https://github.com/ClickHouse/ClickHouse/pull/6934) ([Ivan](https://github.com/abyss7)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-3} - -- 修复 [flapping](https://clickhouse-test-reports.s3.yandex.net/6944/aab95fd5175a513413c7395a73a82044bdafb906/functional_stateless_tests_(debug).html) 测试 `00715_fetch_merged_or_mutated_part_zookeeper` 00715_mut_fetch_merged 的脚本需要重新写入 shellpart_或重新写入它的 shell 脚本申请. [#6977](https://github.com/ClickHouse/ClickHouse/pull/6977) ([Alexander Kazakov](https://github.com/Akazz)) -- 修复了函数 `groupUniqArray` 中的 UBSan 和 MemSan 失败,并带有 emtpy 数组参数. 这是由于没有调用零单元格值的构造函数, 将空的 `PaddPODArray` 放入哈希表零单元格中引起的. [#6937](https://github.com/ClickHouse/ClickHouse/pull/6937) ([Amos Bird](https://github.com/amosbird)) - -### ClickHouse 版本 19.14.3.3, 2019-09-10 {#clickhouse-release-19-14-3-3-2019-09-10} - -#### 新特征 {#new-feature-4} - -- `ORDER BY` 的 `WITH FILL` 修饰符. (continuation of [#5069](https://github.com/ClickHouse/ClickHouse/issues/5069)) [#6610](https://github.com/ClickHouse/ClickHouse/pull/6610) ([Anton Popov](https://github.com/CurtizJ)) -- `LIMIT` 的 `WITH TIES` 修饰符. (continuation of [#5069](https://github.com/ClickHouse/ClickHouse/issues/5069)) [#6610](https://github.com/ClickHouse/ClickHouse/pull/6610) ([Anton Popov](https://github.com/CurtizJ)) -- 将未加引号的 `NULL` 文字解析为 NULL (如果设置 `format_csv_unquoted_null_literal_as_null=1`). 如果此字段的数据类型不可为空, 则使用默认值初始化空字段 (如果设置 `input_format_null_as_default=1`). [#5990](https://github.com/ClickHouse/ClickHouse/issues/5990) [#6055](https://github.com/ClickHouse/ClickHouse/pull/6055) ([tavplubix](https://github.com/tavplubix)) -- 支持在表函数 `file` 和 `hdfs` 的路径中使用通配符. 如果路径包含通配符, 则该表将是只读的. 用法示例: `select * from hdfs('hdfs://hdfs1:9000/some_dir/another_dir/*/file{0..9}{0..9}')` 和 `select * from file('some_dir /{some_file,another_file,yet_another}.tsv', 'TSV', 'value UInt32')`. [#6092](https://github.com/ClickHouse/ClickHouse/pull/6092) ([Olga Khvostikova](https://github.com/stavrolia)) -- 新的 `system.metric_log` 表, 它存储具有指定时间间隔的 `system.events` 和 `system.metrics` 的值. [#6363](https://github.com/ClickHouse/ClickHouse/issues/6363) [#6467](https://github.com/ClickHouse/ClickHouse/pull/6467) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [#6530](https://github.com/ClickHouse/ClickHouse/pull/6530) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 允许将 ClickHouse 文本日志写入 `system.text_log` 表. [#6037](https://github.com/ClickHouse/ClickHouse/issues/6037) [#6103](https://github.com/ClickHouse/ClickHouse/pull/6103) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [#6164](https://github.com/ClickHouse/ClickHouse/pull/6164) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在堆栈跟踪中显示私有符号 (这是通过解析 ELF 文件的符号表完成的). 如果存在调试信息, 则在堆栈跟踪中添加有关文件和行号的信息. 使用程序中存在的索引符号加速符号名称查找. 添加了用于自省的新 SQL 函数: `demangle` 和 `addressToLine`. 将函数 `symbolizeAddress` 重命名为 `addressToSymbol` 以保持一致性. 出于性能原因, 函数`addressToSymbol` 将返回损坏的名称, 您必须应用`demangle`. 添加了默认关闭的设置 `allow_introspection_functions`. [#6201](https://github.com/ClickHouse/ClickHouse/pull/6201) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 表函数 `values` (名称不区分大小写). 它允许从 [#5984](https://github.com/ClickHouse/ClickHouse/issues/5984) 中提出的 `VALUES` 列表中读取. 示例: `SELECT * FROM VALUES('a UInt64, s String', (1, 'one'), (2, 'two'), (3, 'three'))`. [#6217](https://github.com/ClickHouse/ClickHouse/issues/6217). [#6209](https://github.com/ClickHouse/ClickHouse/pull/6209) ([dimarub2000](https://github.com/dimarub2000)) -- 添加了更改存储设置的功能. 语法: `ALTER TABLE
MODIFY SETTING = `. [#6366](https://github.com/ClickHouse/ClickHouse/pull/6366) [#6669](https://github.com/ClickHouse/ClickHouse/pull/6669) [#6685](https://github.com/ClickHouse/ClickHouse/pull/6685) ([alesapin](https://github.com/alesapin)) -- 支持拆卸分离部件. 语法: `ALTER TABLE DROP DETACHED PART ''`. [#6158](https://github.com/ClickHouse/ClickHouse/pull/6158) ([tavplubix](https://github.com/tavplubix)) -- 表约束. 允许向表定义添加约束, 这将在插入时检查. [#5273](https://github.com/ClickHouse/ClickHouse/pull/5273) ([Gleb Novikov](https://github.com/NanoBjorn)) [#6652](https://github.com/ClickHouse/ClickHouse/pull/6652) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 支持级联物化视图. [#6324](https://github.com/ClickHouse/ClickHouse/pull/6324) ([Amos Bird](https://github.com/amosbird)) -- 默认情况下打开查询分析器以每秒对每个查询执行线程进行一次采样. [#6283](https://github.com/ClickHouse/ClickHouse/pull/6283) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 输入格式 `ORC`. [#6454](https://github.com/ClickHouse/ClickHouse/pull/6454) [#6703](https://github.com/ClickHouse/ClickHouse/pull/6703) ([akonyaev90](https://github.com/akonyaev90)) -- 添加了两个新函数: `sigmoid` 和 `tanh` (对机器学习应用程序很有用). [#6254](https://github.com/ClickHouse/ClickHouse/pull/6254) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 函数 `hasToken(haystack, token)`, `hasTokenCaseInsensitive(haystack, token)` 来检查给定的令牌是否在 haystack 中. 令牌是两个非字母数字 ASCII 字符 (或 haystack 的边界) 之间的最大长度子串. 令牌必须是一个常量字符串. 由 tokenbf_v1 索引专业化支持. [#6596](https://github.com/ClickHouse/ClickHouse/pull/6596), [#6662](https://github.com/ClickHouse/ClickHouse/pull/6662) ([Vasily Nemkov](https://github.com/Enmk)) -- 新函数 `neighbor(value, offset[, default_value])`. 允许在数据块中的列中达到上一个/下一个值. [#5925](https://github.com/ClickHouse/ClickHouse/pull/5925) ([Alex Krash](https://github.com/alex-krash)) [6685365ab8c5b74f9650492c88a012596eb1b0c6](https://github.com/ClickHouse/ClickHouse/commit/6685365ab8c5b74f9650492c88a012596eb1b0c6) [341e2e4587a18065c2da1ca888c73389f48ce36c](https://github.com/ClickHouse/ClickHouse/commit/341e2e4587a18065c2da1ca888c73389f48ce36c) [Alexey Milovidov](https://github.com/alexey-milovidov) -- 创建了一个函数 `currentUser()`, 返回授权用户的登录信息. 添加别名 `user()` 以兼容 MySQL. [#6470](https://github.com/ClickHouse/ClickHouse/pull/6470) ([Alex Krash](https://github.com/alex-krash)) -- [#5885](https://github.com/ClickHouse/ClickHouse/issues/5885) 中提出的新聚合函数 `quantilesExactInclusive` 和`quantilesExactExclusive`. [#6477](https://github.com/ClickHouse/ClickHouse/pull/6477) ([dimarub2000](https://github.com/dimarub2000)) -- 函数 `bitmapRange(bitmap, range_begin, range_end)` 返回具有指定范围的新集合 (不包括`range_end`). [#6314](https://github.com/ClickHouse/ClickHouse/pull/6314) ([Zhichang Yu](https://github.com/yuzhichang)) -- 函数 `geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)` 它创建覆盖提供区域的 geohash-boxes 的精确长字符串数组. [#6127](https://github.com/ClickHouse/ClickHouse/pull/6127) ([Vasily Nemkov](https://github.com/Enmk)) -- 使用 `Kafka` 表实现对 INSERT 查询的支持. [#6012](https://github.com/ClickHouse/ClickHouse/pull/6012) ([Ivan](https://github.com/abyss7)) -- 向 Kafka 引擎添加了对 `_partition` 和 `_timestamp` 虚拟列的支持. [#6400](https://github.com/ClickHouse/ClickHouse/pull/6400) ([Ivan](https://github.com/abyss7)) -- 可以从`query_log`、服务器日志、使用基于正则表达式的规则的进程列表中删除敏感数据. [#5710](https://github.com/ClickHouse/ClickHouse/pull/5710) ([filimonov](https://github.com/filimonov)) - -#### 实验功能 {#experimental-feature-2} - -- 输入和输出数据格式 `Template` . 它允许为输入和输出指定自定义格式字符串. [#4354](https://github.com/ClickHouse/ClickHouse/issues/4354) [#6727](https://github.com/ClickHouse/ClickHouse/pull/6727) ([tavplubix](https://github.com/tavplubix)) -- 最初在 [#2898](https://github.com/ClickHouse/ClickHouse/pull/2898) 中提出的 `LIVE VIEW` 表的实现, 在 [#3925](https://github.com/ClickHouse) 中准备 /ClickHouse/issues/3925),然后在 [#5541](https://github.com/ClickHouse/ClickHouse/issues/5541) 中更新. 详细说明见[#5541](https://github.com/ClickHouse/ClickHouse/issues/5541). [#5541](https://github.com/ClickHouse/ClickHouse/issues/5541) ([vzakaznikov](https://github.com/vzakaznikov)) [#6425](https://github.com/ ClickHouse/ClickHouse/pull/6425) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [#6656](https://github.com/ClickHouse/ClickHouse/pull/6656) ([vzakaznikov] (https://github.com/vzakaznikov)) 请注意,下一个版本可能会删除 `LIVE VIEW` 功能. - -#### Bug 修复 {#bug-fix-8} - -- 此版本还包含 19.13 和 19.11 的所有错误修复. -- 修复表有跳过索引和垂直合并时的分段错误. [#6723](https://github.com/ClickHouse/ClickHouse/pull/6723) ([alesapin](https://github.com/alesapin)) -- 使用非平凡的列默认值修复每列 TTL. 以前在强制 TTL 合并与 `OPTIMIZE ... FINAL` 查询的情况下, 过期值被替换为类型默认值而不是用户指定的列默认值. [#6796](https://github.com/ClickHouse/ClickHouse/pull/6796) ([Anton Popov](https://github.com/CurtizJ)) -- 修复正常服务器重启时Kafka消息重复问题. [#6597](https://github.com/ClickHouse/ClickHouse/pull/6597) ([Ivan](https://github.com/abyss7)) -- 修复了读取 Kafka 消息时的无限循环. 根本不要暂停/恢复消费者订阅 - 否则在某些情况下它可能会无限期暂停. [#6354](https://github.com/ClickHouse/ClickHouse/pull/6354) ([Ivan](https://github.com/abyss7)) -- 修复 `bitmapContains` 函数中 `Key expression contains comparison between inconvertible types` 异常. [#6136](https://github.com/ClickHouse/ClickHouse/issues/6136) [#6146](https://github.com/ClickHouse/ClickHouse/issues/6146) [#6156](https://github.com/ClickHouse/ClickHouse/pull/6156) ([dimarub2000](https://github.com/dimarub2000)) -- 使用启用的 `optimize_skip_unused_shards` 和丢失的分片键修复段错误. [#6384](https://github.com/ClickHouse/ClickHouse/pull/6384) ([Anton Popov](https://github.com/CurtizJ)) -- 修复了可能导致内存损坏的突变中的错误代码. 修复了由于从 `system.parts` 或 `system.parts_columns` 并发 `DROP TABLE` 和 `SELECT` 而可能发生的读取地址 `0x14c0` 的段错误. 修复了准备突变查询时的竞争条件. 修复复制表的 `OPTIMIZE` 和 ALTER 等并发修改操作导致的死锁. [#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在 MySQL 界面中删除了额外的详细日志记录. [#6389](https://github.com/ClickHouse/ClickHouse/pull/6389) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 返回从配置文件中的 `true` 和 `false` 解析布尔设置的能力. [#6278](https://github.com/ClickHouse/ClickHouse/pull/6278) ([alesapin](https://github.com/alesapin)) -- 修复了 `Nullable(Decimal128)` 上 `quantile` 和 `median` 函数中的崩溃. [#6378](https://github.com/ClickHouse/ClickHouse/pull/6378) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了主键上包含转换为 Float 类型的带有 `WHERE` 条件的 `SELECT` 查询可能返回的不完整结果. 它是由 `toFloat` 函数中的单调性检查不正确引起的. [#6248](https://github.com/ClickHouse/ClickHouse/issues/6248) [#6374](https://github.com/ClickHouse/ClickHouse/pull/6374) ([dimarub2000](https://github.com/dimarub2000)) -- 检查 `max_expanded_ast_elements` 设置是否有突变. 在 `TRUNCATE TABLE` 之后清除突变. [#6205](https://github.com/ClickHouse/ClickHouse/pull/6205) ([Winter Zhang](https://github.com/zhang2014)) -- 与`join_use_nulls` 一起使用时,修复键列的JOIN 结果. 附加空值而不是列默认值. [#6249](https://github.com/ClickHouse/ClickHouse/pull/6249) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复具有垂直合并和更改的跳过索引. 修复 `Bad size of marks file` 异常. [#6594](https://github.com/ClickHouse/ClickHouse/issues/6594) [#6713](https://github.com/ClickHouse/ClickHouse/pull/6713) ([alesapin](https://github.com/alesapin)) -- 当合并/更改的部分之一为空(0 行)时, 修复 `ALTER MODIFY COLUMN` 和垂直合并中的罕见崩溃. [#6746](https://github.com/ClickHouse/ClickHouse/issues/6746) [#6780](https://github.com/ClickHouse/ClickHouse/pull/6780) ([alesapin](https://github.com/alesapin)) -- 修复了在 `AggregateFunctionFactory` 中转换 `LowCardinality` 类型的错误. 这修复了 [#6257](https://github.com/ClickHouse/ClickHouse/issues/6257). [#6281](https://github.com/ClickHouse/ClickHouse/pull/6281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复 `topK` 和 `topK Weighted` 聚合函数中的错误行为和可能的段错误. [#6404](https://github.com/ClickHouse/ClickHouse/pull/6404) ([Anton Popov](https://github.com/CurtizJ)) -- 修复了围绕 `getIdentifier` 函数的不安全代码. [#6401](https://github.com/ClickHouse/ClickHouse/issues/6401) [#6409](https://github.com/ClickHouse/ClickHouse/pull/6409) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 MySQL 有线协议中的错误(在连接到 ClickHouse 表单 MySQL 客户端时使用). 由 `PacketPayloadWriteBuffer` 中的堆缓冲区溢出引起. [#6212](https://github.com/ClickHouse/ClickHouse/pull/6212) ([Yuriy Baranov](https://github.com/yurriy)) -- 修复了 `bitmapSubsetInRange` 函数中的内存泄漏. [#6819](https://github.com/ClickHouse/ClickHouse/pull/6819) ([Zhichang Yu](https://github.com/yuzhichang)) -- 修复粒度更改后执行变异时的罕见错误. [#6816](https://github.com/ClickHouse/ClickHouse/pull/6816) ([alesapin](https://github.com/alesapin)) -- 默认允许所有字段的 protobuf 消息. [#6132](https://github.com/ClickHouse/ClickHouse/pull/6132) ([Vitaly Baranov](https://github.com/vitlibar)) -- 当我们在第二个参数上发送一个 `NULL` 参数时,解决了一个带有 `nullIf` 函数的错误. [#6446](https://github.com/ClickHouse/ClickHouse/pull/6446) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 修复带有字符串字段的复杂键缓存字典中内存分配/释放错误的罕见错误, 这会导致无限内存消耗(看起来像内存泄漏). 当字符串大小是从 8 开始的 2 的幂(8、16、32 等)时会重现错误. [#6447](https://github.com/ClickHouse/ClickHouse/pull/6447) ([alesapin](https://github.com/alesapin)) -- 修复了小序列上的 Gorilla 编码导致异常 `Cannot write after end of buffer`. [#6398](https://github.com/ClickHouse/ClickHouse/issues/6398) [#6444](https://github.com/ClickHouse/ClickHouse/pull/6444) ([Vasily Nemkov](https://github.com/Enmk)) -- 允许在启用了 `join_use_nulls` 的 JOIN 中使用不可为空的类型. [#6705](https://github.com/ClickHouse/ClickHouse/pull/6705) ([Artem Zuikov](https://github.com/4ertus2)) -- 在 `clickhouse-client` 中禁用查询中的 `Poco::AbstractConfiguration` 替换. [#6706](https://github.com/ClickHouse/ClickHouse/pull/6706) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 避免 `REPLACE PARTITION` 中的死锁. [#6677](https://github.com/ClickHouse/ClickHouse/pull/6677) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 对常量参数使用 `arrayReduce` 可能会导致段错误. [#6242](https://github.com/ClickHouse/ClickHouse/issues/6242) [#6326](https://github.com/ClickHouse/ClickHouse/pull/6326) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复在 `DROP PARTITION` 之后恢复副本时可能出现的不一致部分. [#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([tavplubix](https://github.com/tavplubix)) -- 修复了 `JSONExtractRaw` 函数挂起的问题. [#6195](https://github.com/ClickHouse/ClickHouse/issues/6195) [#6198](https://github.com/ClickHouse/ClickHouse/pull/6198) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使用自适应粒度修复不正确的跳过索引序列化和聚合的错误. [#6594](https://github.com/ClickHouse/ClickHouse/issues/6594). [#6748](https://github.com/ClickHouse/ClickHouse/pull/6748) ([alesapin](https://github.com/alesapin)) -- 使用两级聚合修复 `GROUP BY` 的 `WITH ROLLUP` 和 `WITH CUBE` 修饰符. [#6225](https://github.com/ClickHouse/ClickHouse/pull/6225) ([Anton Popov](https://github.com/CurtizJ)) -- 修复以自适应粒度写入二级索引标记的错误. [#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alesapin](https://github.com/alesapin)) -- 修复服务器启动时的初始化顺序. 由于 `StorageMergeTree::background_task_handle` 是在 `startup()` 中初始化的, 所以 `MergeTreeBlockOutputStream::write()` 可能会在初始化之前尝试使用它. 只需检查它是否已初始化. [#6080](https://github.com/ClickHouse/ClickHouse/pull/6080) ([Ivan](https://github.com/abyss7)) -- 清除上一个因错误而完成的读操作的数据缓冲区. [#6026](https://github.com/ClickHouse/ClickHouse/pull/6026) ([Nikolay](https://github.com/bopohaa)) -- 修复为 Replicated\*MergeTree 表创建新副本时启用自适应粒度的错误. [#6394](https://github.com/ClickHouse/ClickHouse/issues/6394) [#6452](https://github.com/ClickHouse/ClickHouse/pull/6452) ([alesapin](https://github.com/alesapin)) -- 修复了在访问未初始化的 `ThreadStatus` 结构时出现异常时在 `libunwind` 中发生异常的情况下服务器启动期间可能发生的崩溃. [#6456](https://github.com/ClickHouse/ClickHouse/pull/6456) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -- 修复 `yandexConsistentHash` 函数中的崩溃. 通过模糊测试发现. [#6304](https://github.com/ClickHouse/ClickHouse/issues/6304) [#6305](https://github.com/ClickHouse/ClickHouse/pull/6305) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了服务器过载和全局线程池接近满时挂起查询的可能性. 这在具有大量分片(数百个)的集群上发生的可能性更高, 因为分布式查询为每个连接分配一个线程到每个分片. 例如, 如果 330 个分片的集群正在处理 30 个并发分布式查询, 则此问题可能会重现. 此问题影响从 19.2 开始的所有版本. [#6301](https://github.com/ClickHouse/ClickHouse/pull/6301) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了`arrayEnumerateUniqRanked` 函数的逻辑. [#6423](https://github.com/ClickHouse/ClickHouse/pull/6423) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修正解码符号表时的段错误. [#6603](https://github.com/ClickHouse/ClickHouse/pull/6603) ([Amos Bird](https://github.com/amosbird)) -- 修复了将 `LowCardinality(Nullable)` 转换为 not-Nullable 列中的不相关异常, 以防它不包含 Nulls (例如, 在像 `SELECT CAST(CAST('Hello' AS LowCardinality(Nullable(String)))] AS String 这样的查询中 )`. [#6094](https://github.com/ClickHouse/ClickHouse/issues/6094) [#6119](https://github.com/ClickHouse/ClickHouse/pull/6119) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 删除了 `system.settings` 表中额外的描述引用. [#6696](https://github.com/ClickHouse/ClickHouse/issues/6696) [#6699](https://github.com/ClickHouse/ClickHouse/pull/6699) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 避免在复制表的 `TRUNCATE` 中可能出现死锁. [#6695](https://github.com/ClickHouse/ClickHouse/pull/6695) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修正了按键排序的顺序读取. [#6189](https://github.com/ClickHouse/ClickHouse/pull/6189) ([Anton Popov](https://github.com/CurtizJ)) -- 修复带有 `enable_mixed_granularity_parts=1` 的表的 `ALTER TABLE ... UPDATE` 查询. [#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) -- 修复 [#4405](https://github.com/ClickHouse/ClickHouse/pull/4405) 打开的错误 (自 19.4.0 起). 当我们不查询任何列 (`SELECT 1`) 时, 通过 MergeTree 表在对分布式表的查询中重现. [#6236](https://github.com/ClickHouse/ClickHouse/pull/6236) ([alesapin](https://github.com/alesapin)) -- 修复了有符号类型到无符号类型的整数除法中的溢出. 该行为与 C 或 C++ 语言 (整数提升规则) 中的行为完全相同, 这可能令人惊讶. 请注意, 将大有符号数除以大无符号数或反之亦然时仍然可能发生溢出 (但这种情况不太常见). 所有服务器版本都存在该问题. [#6214](https://github.com/ClickHouse/ClickHouse/issues/6214) [#6233](https://github.com/ClickHouse/ClickHouse/pull/6233) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 当设置了 `max_execution_speed` 或 `max_execution_speed_bytes` 时, 限制用于节流的最大休眠时间. 修复了 `Estimated query execution time (inf seconds) is too long` 等错误错误. [#5547](https://github.com/ClickHouse/ClickHouse/issues/5547) [#6232](https://github.com/ClickHouse/ClickHouse/pull/6232) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了在`MaterializedView`中使用`MATERIALIZED`列和别名的问题. [#448](https://github.com/ClickHouse/ClickHouse/issues/448) [#3484](https://github.com/ClickHouse/ClickHouse/issues/3484) [#3450](https://github.com/ClickHouse/ClickHouse/issues/3450) [#2878](https://github.com/ClickHouse/ClickHouse/issues/2878) [#2285](https://github.com/ClickHouse/ClickHouse/issues/2285) [#3796](https://github.com/ClickHouse/ClickHouse/pull/3796) ([Amos Bird](https://github.com/amosbird)) [#6316](https://github.com/ClickHouse/ClickHouse/pull/6316) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复未实现为处理器的输入流的 `FormatFactory` 行为. [#6495](https://github.com/ClickHouse/ClickHouse/pull/6495) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修正了错字. [#6631](https://github.com/ClickHouse/ClickHouse/pull/6631) ([Alex Ryndin](https://github.com/alexryndin)) -- 错误消息中的错字 ( is -\> are ). [#6839](https://github.com/ClickHouse/ClickHouse/pull/6839) ([Denis Zhuravlev](https://github.com/den-crane)) -- 如果类型包含逗号, 则从字符串解析列列表时已修复错误 (此问题与 `File`、`URL`、`HDFS` 存储相关) [#6217](https://github.com/ClickHouse/ClickHouse/issues/6217). [#6209](https://github.com/ClickHouse/ClickHouse/pull/6209) ([dimarub2000](https://github.com/dimarub2000)) - -#### 安全修复 {#security-fix} - -- 此版本还包含 19.13 和 19.11 的所有错误安全修复. -- 修复了由于 SQL 解析器中的堆栈溢出, 伪造查询导致服务器崩溃的可能性. 修复了合并和分布式表、物化视图和涉及子查询的行级安全条件中堆栈溢出的可能性. [#6433](https://github.com/ClickHouse/ClickHouse/pull/6433) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 改进 {#improvement-3} - -- 正确实现 `AND/OR` 的三元逻辑. [#6048](https://github.com/ClickHouse/ClickHouse/pull/6048) ([Alexander Kazakov](https://github.com/Akazz)) -- 现在, 在从没有 TTL 信息或过时的 TTL 信息的旧部分进行 `OPTIMIZE ... FINAL` 查询后, 将删除具有过期 TTL 的值和行, 例如, 在 `ALTER ... MODIFY TTL` 查询之后. 添加了查询 `SYSTEM STOP/START TTL MERGES` 以禁止/允许使用 TTL 分配合并并过滤所有合并中的过期值. [#6274](https://github.com/ClickHouse/ClickHouse/pull/6274) ([Anton Popov](https://github.com/CurtizJ)) -- 可以使用 `CLICKHOUSE_HISTORY_FILE` env 为客户端更改 ClickHouse 历史文件的位置. [#6840](https://github.com/ClickHouse/ClickHouse/pull/6840) ([filimonov](https://github.com/filimonov)) -- 从 `InterpreterSelectQuery` 中删除 `dry_run` 标志. … [#6375](https://github.com/ClickHouse/ClickHouse/pull/6375) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 支持带有 `ON` 部分的 `ASOF JOIN`. [#6211](https://github.com/ClickHouse/ClickHouse/pull/6211) ([Artem Zuikov](https://github.com/4ertus2)) -- 更好地支持用于突变和复制的跳过索引. 支持 `MATERIALIZE/CLEAR INDEX ... IN PARTITION` 查询. `UPDATE x = x` 重新计算所有使用列 `x` 的索引. [#5053](https://github.com/ClickHouse/ClickHouse/pull/5053) ([Nikita Vasilev](https://github.com/nikvas0)) -- 无论 `allow_experimental_live_view` 设置如何, 都允许使用 `ATTACH` 实时视图 (例如,在服务器启动时). [#6754](https://github.com/ClickHouse/ClickHouse/pull/6754) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 对于查询分析器收集的堆栈跟踪, 不包括查询分析器本身生成的堆栈帧. [#6250](https://github.com/ClickHouse/ClickHouse/pull/6250) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 现在表函数`values`、`file`、`url`、`hdfs` 支持ALIAS 列. [#6255](https://github.com/ClickHouse/ClickHouse/pull/6255) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 如果 `config.d` 文件没有对应的根元素作为配置文件, 则抛出异常. [#6123](https://github.com/ClickHouse/ClickHouse/pull/6123) ([dimarub2000](https://github.com/dimarub2000)) -- 在 `no space left on device` 的异常消息中打印额外信息. [#6182](https://github.com/ClickHouse/ClickHouse/issues/6182), [#6252](https://github.com/ClickHouse/ClickHouse/issues/6252) [#6352](https://github.com/ClickHouse/ClickHouse/pull/6352) ([tavplubix](https://github.com/tavplubix)) -- 在确定读取查询要覆盖的 `Distributed` 表的分片时 (对于 `optimize_skip_unused_shards` =1), ClickHouse 现在检查来自 select 语句的 `prewhere` 和 `where` 子句的条件. [#6521](https://github.com/ClickHouse/ClickHouse/pull/6521) ([Alexander Kazakov](https://github.com/Akazz)) -- 为没有 AVX2 但有 SSE 4.2 和 PCLMUL 指令集的机器启用`SIMDJSON`. [#6285](https://github.com/ClickHouse/ClickHouse/issues/6285) [#6320](https://github.com/ClickHouse/ClickHouse/pull/6320) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- ClickHouse 可以在没有 `O_DIRECT` 支持的文件系统上工作(例如 ZFS 和 BtrFS),无需额外调整. [#4449](https://github.com/ClickHouse/ClickHouse/issues/4449) [#6730](https://github.com/ClickHouse/ClickHouse/pull/6730) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 支持最终子查询的下推谓词. [#6120](https://github.com/ClickHouse/ClickHouse/pull/6120) ([TCeason](https://github.com/TCeason)) [#6162](https://github.com/ClickHouse/ClickHouse/pull/6162) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 更好的`JOIN ON`键提取. [#6131](https://github.com/ClickHouse/ClickHouse/pull/6131) ([Artem Zuikov](https://github.com/4ertus2)) -- 更新了 `SIMDJSON`. [#6285](https://github.com/ClickHouse/ClickHouse/issues/6285). [#6306](https://github.com/ClickHouse/ClickHouse/pull/6306) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 优化 `SELECT count()` 查询最小列的选择. [#6344](https://github.com/ClickHouse/ClickHouse/pull/6344) ([Amos Bird](https://github.com/amosbird)) -- 在 `windowFunnel()` 中添加了 `strict` 参数. 当设置了 `strict` 时, `windowFunnel()` 只对唯一值应用条件. [#6548](https://github.com/ClickHouse/ClickHouse/pull/6548) ([achimbab](https://github.com/achimbab)) -- `mysqlxx::Pool` 更安全的接口. [#6150](https://github.com/ClickHouse/ClickHouse/pull/6150) ([avasiliev](https://github.com/avasiliev)) -- 使用 `--help` 选项执行时的选项行大小现在对应于终端大小. [#6590](https://github.com/ClickHouse/ClickHouse/pull/6590) ([dimarub2000](https://github.com/dimarub2000)) -- 禁用无键聚合的 `read in order` 优化. [#6599](https://github.com/ClickHouse/ClickHouse/pull/6599) ([Anton Popov](https://github.com/CurtizJ)) -- `INCORRECT_DATA` 和 `TYPE_MISMATCH` 错误代码的 HTTP 状态代码从默认的 `500 Internal Server Error` 更改为 `400 Bad Request`. [#6271](https://github.com/ClickHouse/ClickHouse/pull/6271) ([Alexander Rodin](https://github.com/a-rodin)) -- 将 Join 对象从 `ExpressionAction` 移动到 `AnalyzedJoin`. `ExpressionAnalyzer` 和 `ExpressionAction` 不再了解 `Join` 类. 它的逻辑被`AnalyzedJoin` iface隐藏了. [#6801](https://github.com/ClickHouse/ClickHouse/pull/6801) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了当分片之一是本地主机但查询是通过网络连接发送时分布式查询可能出现的死锁. [#6759](https://github.com/ClickHouse/ClickHouse/pull/6759) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 更改了多个表 `RENAME` 的语义以避免可能的死锁. [#6757](https://github.com/ClickHouse/ClickHouse/issues/6757). [#6756](https://github.com/ClickHouse/ClickHouse/pull/6756) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 重写 MySQL 兼容性服务器以防止在内存中加载完整的数据包负载. 每个连接的内存消耗减少到大约 `2 * DBMS_DEFAULT_BUFFER_SIZE` (读/写缓冲区). [#5811](https://github.com/ClickHouse/ClickHouse/pull/5811) ([Yuriy Baranov](https://github.com/yurriy)) -- 将 AST 别名解释逻辑移出不必了解查询语义的解析器. [#6108](https://github.com/ClickHouse/ClickHouse/pull/6108) ([Artem Zuikov](https://github.com/4ertus2)) -- NamesAndTypesList` 稍微更安全的解析. [#6408](https://github.com/ClickHouse/ClickHouse/issues/6408). [#6410](https://github.com/ClickHouse/ClickHouse/pull/6410) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- `clickhouse-copier`: 允许在查询中使用带有 `partition_key` 别名的配置中的 `where_condition` 来检查分区是否存在 (之前它仅用于读取数据查询). [#6577](https://github.com/ClickHouse/ClickHouse/pull/6577) ([proller](https://github.com/proller)) -- 在 `throwIf` 中添加了可选的消息参数. ([#5772](https://github.com/ClickHouse/ClickHouse/issues/5772)) [#6329](https://github.com/ClickHouse/ClickHouse/pull/6329) ([Vdimir](https://github.com/Vdimir)) -- 发送插入数据时出现的服务器异常现在也在客户端处理. [#5891](https://github.com/ClickHouse/ClickHouse/issues/5891) [#6711](https://github.com/ClickHouse/ClickHouse/pull/6711) ([dimarub2000](https://github.com/dimarub2000)) -- 添加了一个指标 `DistributedFilesToInsert` , 显示文件系统中被分布式表选择发送到远程服务器的文件总数. 该数字是所有分片的总和. [#6600](https://github.com/ClickHouse/ClickHouse/pull/6600) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 将大部分 JOIN 准备逻辑从 `ExpressionAction/ExpressionAnalyzer` 移动到 `AnalyzedJoin`. [#6785](https://github.com/ClickHouse/ClickHouse/pull/6785) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复 TSan [warning](https://clickhouse-test-reports.s3.yandex.net/6399/c1c1d1daa98e199e620766f1bd06a5921050a00d/functional_stateful_tests_(thread).html) `lock-order-inversion`. [#6740](https://github.com/ClickHouse/ClickHouse/pull/6740) ([Vasily Nemkov](https://github.com/Enmk)) -- 关于缺乏 Linux 功能的更好的信息消息. 使用 `fatal` 级别记录致命错误, 这将使其更容易在 `system.text_log` 中找到. [#6441](https://github.com/ClickHouse/ClickHouse/pull/6441) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 当启用将临时数据转储到磁盘以限制 `GROUP BY`、`ORDER BY`期间的内存使用时, 它没有检查可用磁盘空间. 修复添加一个新的设置 `min_free_disk_space`, 当可用磁盘空间小于阈值时, 查询将停止并抛出 `ErrorCodes::NOT_ENOUGH_SPACE`. [#6678](https://github.com/ClickHouse/ClickHouse/pull/6678) ([Weiqing Xu](https://github.com/weiqxu)) [#6691](https://github.com/ClickHouse/ClickHouse/pull/6691) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 通过线程删除递归 rwlock. 这是没有意义的,因为线程在查询之间被重用. `SELECT` 查询可能会在一个线程中获取锁, 从另一个线程持有锁并从第一个线程退出. 同时, 第一个线程可以被 `DROP` 查询重用。 这将导致错误的 `Attempt to acquire exclusive lock recursively` 消息. [#6771](https://github.com/ClickHouse/ClickHouse/pull/6771) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 拆分 `Expression Analyzer.appendLine()`. 在 `ExpressionAnalyzer` 中为 `Merge Join` 准备一个位置. [#6524](https://github.com/ClickHouse/ClickHouse/pull/6524) ([Artem Zuikov](https://github.com/4ertus2)) -- 向 MySQL 兼容服务器添加了 `mysql_native_password` 身份验证插件. [#6194](https://github.com/ClickHouse/ClickHouse/pull/6194) ([Yuriy Baranov](https://github.com/yurriy)) -- 更少的 `clock_gettime` 调用; 修复了 `Allocator` 中调试/发布之间的 ABI 兼容性 (无关紧要的问题). [#6197](https://github.com/ClickHouse/ClickHouse/pull/6197) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 将 `collectUsedColumns` 从 `ExpressionAnalyzer` 移至 `Syntax Analyzer`. `Syntax Analyzer` 现在生成 `required_source_columns`. [#6416](https://github.com/ClickHouse/ClickHouse/pull/6416) ([Artem Zuikov](https://github.com/4ertus2)) -- 添加设置 `joined_subquery_requires_alias` 以要求 `FROM` 中存在多个表的子选择和表函数的别名 (比如使用JOIN的查询). [#6733](https://github.com/ClickHouse/ClickHouse/pull/6733) ([Artem Zuikov](https://github.com/4ertus2)) -- 从 `ExpressionAnalyzer` 中提取 `GetAggregatesVisitor` 类. [#6458](https://github.com/ClickHouse/ClickHouse/pull/6458) ([Artem Zuikov](https://github.com/4ertus2)) -- `system.query_log`: 将 `type` 列的数据类型更改为 `Enum`. [#6265](https://github.com/ClickHouse/ClickHouse/pull/6265) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -- `sha256_password` 认证插件的静态链接. [#6512](https://github.com/ClickHouse/ClickHouse/pull/6512) ([Yuriy Baranov](https://github.com/yurriy)) -- 避免设置 `compile` 工作的额外依赖. 在以前的版本中, 用户可能会收到诸如 `cannot open crti.o`、`unable to find library -lc` 等错误. [#6309](https://github.com/ClickHouse/ClickHouse/pull/6309) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 对可能来自恶意副本的输入进行更多验证. [#6303](https://github.com/ClickHouse/ClickHouse/pull/6303) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 现在 `clickhouse-obfuscator` 文件在 `clickhouse-client` 包中可用. 在以前的版本中, 它可用作 `clickhouse obfuscator` (带空格). [#5816](https://github.com/ClickHouse/ClickHouse/issues/5816) [#6609](https://github.com/ClickHouse/ClickHouse/pull/6609) ([dimarub2000](https://github.com/dimarub2000)) -- 当我们有至少两个以不同顺序读取至少两个表的查询和另一个对其中一个表执行 DDL 操作的查询时, 修复了死锁. 修复了另一个非常罕见的僵局. [#6764](https://github.com/ClickHouse/ClickHouse/pull/6764) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 向 `system.processes` 和 `system.query_log` 添加了 `os_thread_ids` 列以获得更好的调试可能性. [#6763](https://github.com/ClickHouse/ClickHouse/pull/6763) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 当 `sha256_password` 用作默认身份验证插件时发生的PHP mysqlnd扩展错误的解决方法 (在[#6031](https://github.com/ClickHouse/ClickHouse/issues/6031)中描述). [#6113](https://github.com/ClickHouse/ClickHouse/pull/6113) ([Yuriy Baranov](https://github.com/yurriy)) -- 使用已更改的可空性列删除不需要的位置. [#6693](https://github.com/ClickHouse/ClickHouse/pull/6693) ([Artem Zuikov](https://github.com/4ertus2)) -- 将 `queue_max_wait_ms` 的默认值设置为零, 因为当前值(五秒) 没有意义. 在极少数情况下, 此设置有任何用处. 添加了设置 `replace_running_query_max_wait_ms`、`kafka_max_wait_ms` 和 `connection_pool_max_wait_ms` 以消除歧义. [#6692](https://github.com/ClickHouse/ClickHouse/pull/6692) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 从 `ExpressionAnalyzer` 中提取 `SelectQueryExpressionAnalyzer`. 保留最后一个用于非选择查询. [#6499](https://github.com/ClickHouse/ClickHouse/pull/6499) ([Artem Zuikov](https://github.com/4ertus2)) -- 删除了重复的输入和输出格式. [#6239](https://github.com/ClickHouse/ClickHouse/pull/6239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 允许用户在连接时覆盖 `poll_interval` 和 `idle_connection_timeout` 设置. [#6230](https://github.com/ClickHouse/ClickHouse/pull/6230) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- `MergeTree` 现在有一个附加选项 `ttl_only_drop_parts` (默认情况下禁用) 以避免部分修剪部分, 以便在部分中的所有行都过期时完全删除. [#6191](https://github.com/ClickHouse/ClickHouse/pull/6191) ([Sergi Vladykin](https://github.com/svladykin)) -- 类型检查集合索引函数. 如果函数类型错误, 则抛出异常. 这修复了 UBSan 的模糊测试. [#6511](https://github.com/ClickHouse/ClickHouse/pull/6511) ([Nikita Vasilev](https://github.com/nikvas0)) - -#### 性能改进 {#performance-improvement-2} - -- 使用 `ORDER BY expressions` 子句优化查询, 其中 `expressions` 具有与 `MergeTree` 表中的排序键重合的前缀. 此优化由 `optimize_read_in_order` 设置控制. [#6054](https://github.com/ClickHouse/ClickHouse/pull/6054) [#6629](https://github.com/ClickHouse/ClickHouse/pull/6629) ([Anton Popov](https://github.com/CurtizJ)) -- 允许在零件装载和拆卸期间使用多个螺纹. [#6372](https://github.com/ClickHouse/ClickHouse/issues/6372) [#6074](https://github.com/ClickHouse/ClickHouse/issues/6074) [#6438](https://github.com/ClickHouse/ClickHouse/pull/6438) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 实现了更新聚合函数状态的批处理变体. 它可能会带来性能优势. [#6435](https://github.com/ClickHouse/ClickHouse/pull/6435) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 对函数 `exp`、`log`、`sigmoid`、`tanh`使用 `FastOps` 库. FastOps 是 Michael Parakhin(Yandex CTO)的一个快速向量数学库. `exp` 和 `log` 函数的性能提高了 6 倍以上. `Float32` 参数中的函数 `exp` 和 `log` 将返回 `Float32`(在以前的版本中,它们总是返回 `Float64`). 现在 `exp(nan)` 可能返回 `inf`. `exp` 和 `log` 函数的结果可能不是最接近真实答案的机器可表示数字. [#6254](https://github.com/ClickHouse/ClickHouse/pull/6254) ([alexey-milovidov](https://github.com/alexey-milovidov)) 使用 Danila Kutenin 变体使 fastops 工作 [ #6317](https://github.com/ClickHouse/ClickHouse/pull/6317) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 禁用 `UInt8/16` 的连续键优化. [#6298](https://github.com/ClickHouse/ClickHouse/pull/6298) [#6701](https://github.com/ClickHouse/ClickHouse/pull/6701) ([akuzm](https://github.com/akuzm)) -- 通过摆脱 `ParsedJson::Iterator` 中的动态分配, 提高了 `simdjson` 库的性能. [#6479](https://github.com/ClickHouse/ClickHouse/pull/6479) ([Vitaly Baranov](https://github.com/vitlibar)) -- 使用 `mmap()` 分配内存时的故障前页面. [#6667](https://github.com/ClickHouse/ClickHouse/pull/6667) ([akuzm](https://github.com/akuzm)) -- 修复 `Decimal` 比较中的性能错误. [#6380](https://github.com/ClickHouse/ClickHouse/pull/6380) ([Artem Zuikov](https://github.com/4ertus2)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-4} - -- 删除编译器 (运行时模板实例化), 因为我们已经赢得了它的性能. [#6646](https://github.com/ClickHouse/ClickHouse/pull/6646) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了性能测试, 以更孤立的方式显示 gcc-9 中的性能下降. [#6302](https://github.com/ClickHouse/ClickHouse/pull/6302) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了表函数`numbers_mt`, 它是`numbers`的多线程版本. 使用哈希函数更新性能测试. [#6554](https://github.com/ClickHouse/ClickHouse/pull/6554) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- `clickhouse-benchmark` 中的比较模式. [#6220](https://github.com/ClickHouse/ClickHouse/issues/6220) [#6343](https://github.com/ClickHouse/ClickHouse/pull/6343) ([dimarub2000](https://github.com/dimarub2000)) -- 尽最大努力打印堆栈跟踪. 还添加了 `SIGPROF` 作为调试信号以打印正在运行的线程的堆栈跟踪. [#6529](https://github.com/ClickHouse/ClickHouse/pull/6529) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 每个函数都在自己的文件中, 第 10 部分. [#6321](https://github.com/ClickHouse/ClickHouse/pull/6321) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 删除加倍的 const `TABLE_IS_READ_ONLY`. [#6566](https://github.com/ClickHouse/ClickHouse/pull/6566) ([filimonov](https://github.com/filimonov)) -- `StringHashMap` PR [#5417](https://github.com/ClickHouse/ClickHouse/issues/5417) 的格式更改. [#6700](https://github.com/ClickHouse/ClickHouse/pull/6700) ([akuzm](https://github.com/akuzm)) -- 在`ExpressionAnalyzer` 中创建连接的更好子查询. [#6824](https://github.com/ClickHouse/ClickHouse/pull/6824) ([Artem Zuikov](https://github.com/4ertus2)) -- 删除冗余条件 (由 PVS Studio 发现). [#6775](https://github.com/ClickHouse/ClickHouse/pull/6775) ([akuzm](https://github.com/akuzm)) -- 分离`ReverseIndex`的哈希表接口. [#6672](https://github.com/ClickHouse/ClickHouse/pull/6672) ([akuzm](https://github.com/akuzm)) -- 重构设置. [#6689](https://github.com/ClickHouse/ClickHouse/pull/6689) ([alesapin](https://github.com/alesapin)) -- 为 `set` 索引函数添加注释. [#6319](https://github.com/ClickHouse/ClickHouse/pull/6319) ([Nikita Vasilev](https://github.com/nikvas0)) -- 在 Linux 上的调试版本中提高 OOM 分数. [#6152](https://github.com/ClickHouse/ClickHouse/pull/6152) ([akuzm](https://github.com/akuzm)) -- HDFS HA 现在可用于调试版本. [#6650](https://github.com/ClickHouse/ClickHouse/pull/6650) ([Weiqing Xu](https://github.com/weiqxu)) -- 向 `transform_query_for_external_database` 添加了一个测试. [#6388](https://github.com/ClickHouse/ClickHouse/pull/6388) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 为 Kafka 表添加多个物化视图的测试. [#6509](https://github.com/ClickHouse/ClickHouse/pull/6509) ([Ivan](https://github.com/abyss7)) -- 制定更好的构建方案. [#6500](https://github.com/ClickHouse/ClickHouse/pull/6500) ([Ivan](https://github.com/abyss7)) -- 修复了 `test_external_dictionaries` 集成, 以防它在非 root 用户下执行. [#6507](https://github.com/ClickHouse/ClickHouse/pull/6507) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 当写入数据包的总大小超过`DBMS_DEFAULT_BUFFER_SIZE`时, 该错误会重现. [#6204](https://github.com/ClickHouse/ClickHouse/pull/6204) ([Yuriy Baranov](https://github.com/yurriy)) -- 添加了对 `RENAME` 表竞争条件的测试. [#6752](https://github.com/ClickHouse/ClickHouse/pull/6752) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 避免 `KILL QUERY` 中设置的数据竞争. [#6753](https://github.com/ClickHouse/ClickHouse/pull/6753) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加集成测试以通过缓存字典处理错误. [#6755](https://github.com/ClickHouse/ClickHouse/pull/6755) ([Vitaly Baranov](https://github.com/vitlibar)) -- 在 Mac OS 上禁用解析 ELF 对象文件, 因为它没有意义. [#6578](https://github.com/ClickHouse/ClickHouse/pull/6578) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 尝试使变更日志生成器更好. [#6327](https://github.com/ClickHouse/ClickHouse/pull/6327) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 将 `-Wshadow` 开关添加到 GCC. [#6325](https://github.com/ClickHouse/ClickHouse/pull/6325) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) -- 删除了对 `mimalloc` 支持的过时代码. [#6715](https://github.com/ClickHouse/ClickHouse/pull/6715) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- `zlib-ng` 确定 x86 功能并将此信息保存到全局变量. 这是在 defalteInit 调用中完成的, 它可以由不同的线程同时进行. 为避免多线程写入, 请在库启动时执行. [#6141](https://github.com/ClickHouse/ClickHouse/pull/6141) ([akuzm](https://github.com/akuzm)) -- 对在 [#5192](https://github.com/ClickHouse/ClickHouse/issues/5192) 中修复的连接中的错误进行回归测试. [#6147](https://github.com/ClickHouse/ClickHouse/pull/6147) ([Bakhtiyor Ruziev](https://github.com/theruziev)) -- 修复了 MSan 报告. [#6144](https://github.com/ClickHouse/ClickHouse/pull/6144) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复抖动 TTL 测试. [#6782](https://github.com/ClickHouse/ClickHouse/pull/6782) ([Anton Popov](https://github.com/CurtizJ)) -- 修复了 `MergeTreeDataPart::is_frozen` 字段中的错误数据竞争. [#6583](https://github.com/ClickHouse/ClickHouse/pull/6583) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了模糊测试中的超时. 在以前的版本中, 它设法在查询 `SELECT * FROM numbers_mt(gccMurmurHash(''))` 中找到错误挂断. [#6582](https://github.com/ClickHouse/ClickHouse/pull/6582) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 向列的 `static_cast` 添加调试检查. [#6581](https://github.com/ClickHouse/ClickHouse/pull/6581) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在官方 RPM 包中支持 Oracle Linux. [#6356](https://github.com/ClickHouse/ClickHouse/issues/6356) [#6585](https://github.com/ClickHouse/ClickHouse/pull/6585) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 将 json perftests 从 `once` 更改为 `loop` 类型. [#6536](https://github.com/ClickHouse/ClickHouse/pull/6536) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- `odbc-bridge.cpp` 定义了 `main()`, 因此它不应包含在 `clickhouse-lib` 中. [#6538](https://github.com/ClickHouse/ClickHouse/pull/6538) ([Orivej Desh](https://github.com/orivej)) -- 测试 `FULL|RIGHT JOIN` 中的崩溃, 右表的键为空. [#6362](https://github.com/ClickHouse/ClickHouse/pull/6362) ([Artem Zuikov](https://github.com/4ertus2)) -- 添加了对别名扩展限制的测试以防万一. [#6442](https://github.com/ClickHouse/ClickHouse/pull/6442) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在适当的地方从 `boost::filesystem` 切换到 `std::filesystem`. [#6253](https://github.com/ClickHouse/ClickHouse/pull/6253) [#6385](https://github.com/ClickHouse/ClickHouse/pull/6385) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 向网站添加了 RPM 包. [#6251](https://github.com/ClickHouse/ClickHouse/pull/6251) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在 `IN` 部分添加修复 `Unknown identifier` 异常的测试. [#6708](https://github.com/ClickHouse/ClickHouse/pull/6708) ([Artem Zuikov](https://github.com/4ertus2)) -- 简化`shared_ptr_helper`, 因为人们难以理解它. [#6675](https://github.com/ClickHouse/ClickHouse/pull/6675) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了针对固定 Gorilla 和 DoubleDelta 编解码器的性能测试. [#6179](https://github.com/ClickHouse/ClickHouse/pull/6179) ([Vasily Nemkov](https://github.com/Enmk)) -- 将集成测试 `test_dictionaries` 拆分为 4 个单独的测试. [#6776](https://github.com/ClickHouse/ClickHouse/pull/6776) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复 `PipelineExecutor` 中的 PVS-Studio 警告. [#6777](https://github.com/ClickHouse/ClickHouse/pull/6777) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 允许在 ASan 中使用 `library` 字典源. [#6482](https://github.com/ClickHouse/ClickHouse/pull/6482) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了从 PR 列表生成变更日志的选项. [#6350](https://github.com/ClickHouse/ClickHouse/pull/6350) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 读取时锁定`TinyLog`存储. [#6226](https://github.com/ClickHouse/ClickHouse/pull/6226) ([akuzm](https://github.com/akuzm)) -- 检查 CI 中损坏的符号链接. [#6634](https://github.com/ClickHouse/ClickHouse/pull/6634) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 增加 `stack overflow` 测试的超时时间,因为在调试构建中可能需要很长时间. [#6637](https://github.com/ClickHouse/ClickHouse/pull/6637) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了对双空格的检查. [#6643](https://github.com/ClickHouse/ClickHouse/pull/6643) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复使用消毒剂构建时的 `new/delete` 内存跟踪. 跟踪不清楚. 它只防止测试中的内存限制异常. [#6450](https://github.com/ClickHouse/ClickHouse/pull/6450) ([Artem Zuikov](https://github.com/4ertus2)) -- 在链接时启用对未定义符号的检查. [#6453](https://github.com/ClickHouse/ClickHouse/pull/6453) ([Ivan](https://github.com/abyss7)) -- 避免每天重建 `hyperscan` . [#6307](https://github.com/ClickHouse/ClickHouse/pull/6307) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 `ProtobufWriter` 中的 UBSan 报告. [#6163](https://github.com/ClickHouse/ClickHouse/pull/6163) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 不允许将查询分析器与消毒剂一起使用, 因为它不兼容. [#6769](https://github.com/ClickHouse/ClickHouse/pull/6769) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加测试以在计时器失败后重新加载字典. [#6114](https://github.com/ClickHouse/ClickHouse/pull/6114) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复 `PipelineExecutor::prepareProcessor` 参数类型的不一致. [#6494](https://github.com/ClickHouse/ClickHouse/pull/6494) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 添加了对错误 URI 的测试. [#6493](https://github.com/ClickHouse/ClickHouse/pull/6493) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 向 `CAST` 函数添加了更多检查. 这应该在模糊测试中获得有关分段错误的更多信息. [#6346](https://github.com/ClickHouse/ClickHouse/pull/6346) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 为在本地构建镜像的 `docker/builder` 容器添加了 `gcc-9` 支持. [#6333](https://github.com/ClickHouse/ClickHouse/pull/6333) ([Gleb Novikov](https://github.com/NanoBjorn)) -- 使用 `Low Cardinality(String)` 测试主键. [#5044](https://github.com/ClickHouse/ClickHouse/issues/5044) [#6219](https://github.com/ClickHouse/ClickHouse/pull/6219) ([dimarub2000](https://github.com/dimarub2000)) -- 修复了受缓慢堆栈跟踪打印影响的测试. [#6315](https://github.com/ClickHouse/ClickHouse/pull/6315) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在 [#6029](https://github.com/ClickHouse/ClickHouse/pull/6029) 中修复的`groupUniqArray` 中添加崩溃测试用例. [#4402](https://github.com/ClickHouse/ClickHouse/issues/4402) [#6129](https://github.com/ClickHouse/ClickHouse/pull/6129) ([akuzm](https://github.com/akuzm)) -- 修复指数变异测试. [#6645](https://github.com/ClickHouse/ClickHouse/pull/6645) ([Nikita Vasilev](https://github.com/nikvas0)) -- 在性能测试中, 不要读取我们没有运行的查询的查询日志. [#6427](https://github.com/ClickHouse/ClickHouse/pull/6427) ([akuzm](https://github.com/akuzm)) -- 现在可以使用任何低基数类型创建物化视图, 而不管有关可疑低基数类型的设置. [#6428](https://github.com/ClickHouse/ClickHouse/pull/6428) ([Olga Khvostikova](https://github.com/stavrolia)) -- 更新了 `send_logs_level` 设置的测试. [#6207](https://github.com/ClickHouse/ClickHouse/pull/6207) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复 gcc-8.2 下的构建. [#6196](https://github.com/ClickHouse/ClickHouse/pull/6196) ([Max Akhmedov](https://github.com/zlobober)) -- 使用内部 libc++ 修复构建. [#6724](https://github.com/ClickHouse/ClickHouse/pull/6724) ([Ivan](https://github.com/abyss7)) -- 使用 `rdkafka` 库修复共享构建. [#6101](https://github.com/ClickHouse/ClickHouse/pull/6101) ([Ivan](https://github.com/abyss7)) -- Mac OS 版本的修复 (不完整). [#6390](https://github.com/ClickHouse/ClickHouse/pull/6390) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#6429](https://github.com/ClickHouse/ClickHouse/pull/6429) ([alex-zaitsev](https://github.com/alex-zaitsev)) -- 修复 `splitted` 构建. [#6618](https://github.com/ClickHouse/ClickHouse/pull/6618) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 其他构建修复: [#6186](https://github.com/ClickHouse/ClickHouse/pull/6186) ([Amos Bird](https://github.com/amosbird)) [#6486](https://github.com/ClickHouse/ClickHouse/pull/6486) [#6348](https://github.com/ClickHouse/ClickHouse/pull/6348) ([vxider](https://github.com/Vxider)) [#6744](https://github.com/ClickHouse/ClickHouse/pull/6744) ([Ivan](https://github.com/abyss7)) [#6016](https://github.com/ClickHouse/ClickHouse/pull/6016) [#6421](https://github.com/ClickHouse/ClickHouse/pull/6421) [#6491](https://github.com/ClickHouse/ClickHouse/pull/6491) ([proller](https://github.com/proller)) - -#### 向后不兼容的更新 {#backward-incompatible-change-3} - -- 删除了很少使用的表函数 `catBoostPool` 和存储 `CatBoostPool`. 如果您使用过此表格功能, 请写邮件至 `clickhouse-feedback@yandex-team.com`. 请注意, CatBoost 集成仍然存在并将得到支持. [#6279](https://github.com/ClickHouse/ClickHouse/pull/6279) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 默认情况下禁用 `ANY RIGHT JOIN` 和 `ANY FULL JOIN`. 设置 `any_join_distinct_right_table_keys` 设置以启用它们. [#5126](https://github.com/ClickHouse/ClickHouse/issues/5126) [#6351](https://github.com/ClickHouse/ClickHouse/pull/6351) ([Artem Zuikov](https://github.com/4ertus2)) - -## ClickHouse 版本 19.13 {#clickhouse-release-19-13} - -### ClickHouse 版本 19.13.6.51, 2019-10-02 {#clickhouse-release-19-13-6-51-2019-10-02} - -#### Bug 修复 {#bug-fix-9} - -- 此版本还包含 19.11.12.69 的所有错误修复. - -### ClickHouse 版本 19.13.5.44, 2019-09-20 {#clickhouse-release-19-13-5-44-2019-09-20} - -#### Bug 修复 {#bug-fix-10} - -- 此版本还包含 19.14.6.12 的所有错误修复. -- 修复了在 Zookeeper 不可访问时对复制表执行 `DROP` 查询时可能出现的表不一致状态. [#6045](https://github.com/ClickHouse/ClickHouse/issues/6045) [#6413](https://github.com/ClickHouse/ClickHouse/pull/6413) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -- 修复 StorageMerge 中的数据竞争. [#6717](https://github.com/ClickHouse/ClickHouse/pull/6717) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复查询分析器中引入的错误, 该错误导致来自套接字的无休止的接收. [#6386](https://github.com/ClickHouse/ClickHouse/pull/6386) ([alesapin](https://github.com/alesapin)) -- 修复在布尔值上执行 `JSONExtractRaw` 函数时 CPU 使用率过高的问题. [#6208](https://github.com/ClickHouse/ClickHouse/pull/6208) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复了推送到物化视图时的回归. [#6415](https://github.com/ClickHouse/ClickHouse/pull/6415) ([Ivan](https://github.com/abyss7)) -- 表函数 `url` 存在允许攻击者在请求中注入任意 HTTP 头的漏洞. 此问题由 [Nikita Tikhomirov](https://github.com/NSTikhomirov) 发现. [#6466](https://github.com/ClickHouse/ClickHouse/pull/6466) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 Set index 中无用的 `AST` 检查. [#6510](https://github.com/ClickHouse/ClickHouse/issues/6510) [#6651](https://github.com/ClickHouse/ClickHouse/pull/6651) ([Nikita Vasilev](https://github.com/nikvas0)) -- 修复了对嵌入在查询中的 `AggregateFunction` 值的解析. [#6575](https://github.com/ClickHouse/ClickHouse/issues/6575) [#6773](https://github.com/ClickHouse/ClickHouse/pull/6773) ([Zhichang Yu](https://github.com/yuzhichang)) -- 修复了`trim` 函数族的错误行为. [#6647](https://github.com/ClickHouse/ClickHouse/pull/6647) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.13.4.32, 2019-09-10 {#clickhouse-release-19-13-4-32-2019-09-10} - -#### Bug 修复 {#bug-fix-11} - -- 此版本还包含 19.11.9.52 和 19.11.10.54 的所有错误安全修复. -- 修复了 `system.parts` 表和 `ALTER` 查询中的数据争用. [#6245](https://github.com/ClickHouse/ClickHouse/issues/6245) [#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了在从带有样本和 prewhere 的空分布式表中读取时发生的流中不匹配的标头. [#6167](https://github.com/ClickHouse/ClickHouse/issues/6167) ([Lixiang Qian](https://github.com/fancyqlx)) [#6823](https://github.com/ClickHouse/ClickHouse/pull/6823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复了在带有元组的子查询中使用 `IN` 子句时崩溃的问题. [#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([tavplubix](https://github.com/tavplubix)) -- 修复 `GLOBAL JOIN ON` 部分中列名相同的情况. [#6181](https://github.com/ClickHouse/ClickHouse/pull/6181) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复将类型转换为不支持它的 `Decimal` 时的崩溃。 改为抛出异常. [#6297](https://github.com/ClickHouse/ClickHouse/pull/6297) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了 `extractAll()` 函数中的崩溃问题. [#6644](https://github.com/ClickHouse/ClickHouse/pull/6644) ([Artem Zuikov](https://github.com/4ertus2)) -- `MySQL`、`ODBC`、`JDBC` 表函数的查询转换现在可以正常用于带有多个 `AND` 表达式的 `SELECT WHERE` 查询. [#6381](https://github.com/ClickHouse/ClickHouse/issues/6381) [#6676](https://github.com/ClickHouse/ClickHouse/pull/6676) ([dimarub2000](https://github.com/dimarub2000)) -- 为 MySQL 8 集成添加了先前的声明检查. [#6569](https://github.com/ClickHouse/ClickHouse/pull/6569) ([Rafael David Tinoco](https://github.com/rafaeldtinoco)) - -#### 安全修复 {#security-fix-1} - -- 修复解压阶段编解码器的两个漏洞 (恶意用户可以编造压缩数据导致解压缓冲区溢出). [#6670](https://github.com/ClickHouse/ClickHouse/pull/6670) ([Artem Zuikov](https://github.com/4ertus2)) - -### ClickHouse 版本 19.13.3.26, 2019-08-22 {#clickhouse-release-19-13-3-26-2019-08-22} - -#### Bug 修复 {#bug-fix-12} - -- 修复带有 `enable_mixed_granularity_parts=1` 的表的 `ALTER TABLE ... UPDATE` 查询. [#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) -- 用带有元组的子查询的 IN 子句时修复 NPE. [#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([tavplubix](https://github.com/tavplubix)) -- 修复了一个问题, 如果一个陈旧的副本变得活跃, 它可能仍然有被 DROP PARTITION 删除的数据部分. [#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([tavplubix](https://github.com/tavplubix)) -- 解决了解析 CSV 的问题. [#6426](https://github.com/ClickHouse/ClickHouse/issues/6426) [#6559](https://github.com/ClickHouse/ClickHouse/pull/6559) ([tavplubix](https://github.com/tavplubix)) -- 修复了 system.parts 表和 ALTER 查询中的数据竞争. 这修复了 [#6245](https://github.com/ClickHouse/ClickHouse/issues/6245). [#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了可能导致内存损坏的突变中的错误代码. 修复了由于从 `system.parts` 或 `system.parts_columns` 并发 `DROP TABLE` 和 `SELECT` 而可能发生的读取地址 `0x14c0` 的段错误. 修复了准备突变查询时的竞争条件. 修复复制表的 `OPTIMIZE` 和 ALTER 等并发修改操作导致的死锁. [#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了在跳过索引的表上进行`ALTER DELETE`查询后可能丢失的数据. [#6224](https://github.com/ClickHouse/ClickHouse/issues/6224) [#6282](https://github.com/ClickHouse/ClickHouse/pull/6282) ([Nikita Vasilev](https://github.com/nikvas0)) - -#### 安全修复 {#security-fix-2} - -- 如果攻击者拥有对 ZooKeeper 的写访问权限, 并且能够从运行 ClickHouse 的网络中运行可用的自定义服务器, 则它可以创建自定义构建的恶意服务器, 该服务器将充当 ClickHouse 副本并将其注册到 ZooKeeper 中. 当另一个副本从恶意副本中获取数据部分时, 它可以强制 clickhouse-server 写入文件系统上的任意路径. 由 Yandex 信息安全团队 Eldar Zaitov 发现. [#6247](https://github.com/ClickHouse/ClickHouse/pull/6247) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.13.2.19, 2019-08-14 {#clickhouse-release-19-13-2-19-2019-08-14} - -#### 新特征 {#new-feature-5} - -- 查询级别的采样分析器. [Example](https://gist.github.com/alexey-milovidov/92758583dd41c24c360fdb8d6a4da194). [#4247](https://github.com/ClickHouse/ClickHouse/issues/4247) ([laplab](https://github.com/laplab)) [#6124](https://github.com/ClickHouse/ClickHouse/pull/6124) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#6250](https://github.com/ClickHouse/ClickHouse/pull/6250) [#6283](https://github.com/ClickHouse/ClickHouse/pull/6283) [#6386](https://github.com/ClickHouse/ClickHouse/pull/6386) -- 允许使用 `COLUMNS('regexp')` 表达式指定一个列列表, 它的工作方式类似于更复杂的 `*` 星号变体. [#5951](https://github.com/ClickHouse/ClickHouse/pull/5951) ([mfridental](https://github.com/mfridental)), ([alexey-milovidov](https://github.com/alexey-milovidov)) -- `CREATE TABLE AS table_function()` 现在可以了. [#6057](https://github.com/ClickHouse/ClickHouse/pull/6057) ([dimarub2000](https://github.com/dimarub2000)) -- 于随机梯度下降的 Adam 优化器默认用于 `stochasticLinearRegression()` 和 `stochasticLogisticRegression()` 聚合函数, 因为它在几乎没有任何调整的情况下显示出良好的质量. [#6000](https://github.com/ClickHouse/ClickHouse/pull/6000) ([Quid37](https://github.com/Quid37)) -- 添加了使用自定义周数的功能. [#5212](https://github.com/ClickHouse/ClickHouse/pull/5212) ([Andy Yang](https://github.com/andyyzh)) -- RENAME` 查询现在适用于所有存储. [#5953](https://github.com/ClickHouse/ClickHouse/pull/5953) ([Ivan](https://github.com/abyss7)) -- 现在, 无论服务器设置中指定的日志级别如何, 客户端都可以通过设置 `send_logs_level` 从服务器接收任何所需级别的日志. [#5964](https://github.com/ClickHouse/ClickHouse/pull/5964) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) - -#### 向后不兼容的更新 {#backward-incompatible-change-4} - -- 默认情况下启用设置 `input_format_defaults_for_omited_fields`。 分布式表中的插入需要此设置在集群上相同 (您需要在滚动更新之前设置它). 它可以为 `JSONEachRow` 和 `CSV*` 格式的省略字段计算复杂的默认表达式. 它应该是预期的行为, 但可能导致可以忽略不计的性能差异. [#6043](https://github.com/ClickHouse/ClickHouse/pull/6043) ([Artem Zuikov](https://github.com/4ertus2)), [#5625](https://github.com/ClickHouse/ClickHouse/pull/5625) ([akuzm](https://github.com/akuzm)) - -#### 实验功能 {#experimental-features} - -- 新的查询处理管道. 使用 `experimental_use_processors=1` 选项来启用它. 用于自己的麻烦. [#4914](https://github.com/ClickHouse/ClickHouse/pull/4914) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) - -#### Bug 修复 {#bug-fix-13} - -- Kafka 集成已在此版本中修复. -- 修复了大 `DoubleDelta` 值的 `Int64` 的 `DoubleDelta` 编码, 改进了 `Int32` 随机数据的 `DoubleDelta` 编码. [#5998](https://github.com/ClickHouse/ClickHouse/pull/5998) ([Vasily Nemkov](https://github.com/Enmk)) -- 如果设置 `merge_tree_uniform_read_distribution` 设置为 0, 则修复了对 `max_rows_to_read` 的高估. [#6019](https://github.com/ClickHouse/ClickHouse/pull/6019) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 改进 {#improvement-4} - -- 如果 `config.d` 文件没有对应的根元素作为配置文件, 则抛出异常. [#6123](https://github.com/ClickHouse/ClickHouse/pull/6123) ([dimarub2000](https://github.com/dimarub2000)) - -#### 性能改进 {#performance-improvement-3} - -- 优化 `count()`. 现在它使用最小的列 (如果可能). [#6028](https://github.com/ClickHouse/ClickHouse/pull/6028) ([Amos Bird](https://github.com/amosbird)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-5} - -- 报告性能测试中的内存使用情况. [#5899](https://github.com/ClickHouse/ClickHouse/pull/5899) ([akuzm](https://github.com/akuzm)) -- 使用外部 `libcxx` 修复构建. [#6010](https://github.com/ClickHouse/ClickHouse/pull/6010) ([Ivan](https://github.com/abyss7)) -- 使用 `rdkafka` 库修复共享构建. [#6101](https://github.com/ClickHouse/ClickHouse/pull/6101) ([Ivan](https://github.com/abyss7)) - -## ClickHouse 版本 19.11 {#clickhouse-release-19-11} - -### ClickHouse 版本 19.11.13.74, 2019-11-01 {#clickhouse-release-19-11-13-74-2019-11-01} - -#### Bug 修复 {#bug-fix-14} - -- 修复了 `ALTER MODIFY COLUMN` 和垂直合并中的罕见崩溃,当合并/更改的部分之一为空时 (0 行). [#6780](https://github.com/ClickHouse/ClickHouse/pull/6780) ([alesapin](https://github.com/alesapin)) -- 手动更新`SIMDJSON`. 这修复了使用虚假 json 诊断消息可能导致 stderr 文件泛滥的问题. [#7548](https://github.com/ClickHouse/ClickHouse/pull/7548) ([Alexander Kazakov](https://github.com/Akazz)) -- 修复了用于突变的 `mrk` 文件扩展名的错误. ([alesapin](https://github.com/alesapin)) - -### ClickHouse 版本 19.11.12.69, 2019-10-02 {#clickhouse-release-19-11-12-69-2019-10-02} - -#### Bug 修复 {#bug-fix-15} - -- 修复了大型表上复杂键的索引分析性能下降. 这修复了 [#6924](https://github.com/ClickHouse/ClickHouse/issues/6924). [#7075](https://github.com/ClickHouse/ClickHouse/pull/7075) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使用分布式引擎在表中发送数据时避免罕见的 SIGSEGV (`Failed to send batch: file with index XXXXX is absent`). [#7032](https://github.com/ClickHouse/ClickHouse/pull/7032) ([Azat Khuzhin](https://github.com/azat)) -- 使用多个连接修复 `Unknown identifier` . 这修复了 [#5254](https://github.com/ClickHouse/ClickHouse/issues/5254). [#7022](https://github.com/ClickHouse/ClickHouse/pull/7022) ([Artem Zuikov](https://github.com/4ertus2)) - -### ClickHouse 版本 19.11.11.57, 2019-09-13 {#clickhouse-release-19-11-11-57-2019-09-13} - -- 修复从 Kafka 空主题中选择时导致段错误的逻辑错误. [#6902](https://github.com/ClickHouse/ClickHouse/issues/6902) [#6909](https://github.com/ClickHouse/ClickHouse/pull/6909) ([Ivan](https://github.com/abyss7)) -- 修复函数 `АrrayEnumerateUniqRanked` 在参数中带有空数组. [#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([proller](https://github.com/proller)) - -### ClickHouse 版本 19.11.10.54, 2019-09-10 {#clickhouse-release-19-11-10-54-2019-09-10} - -#### Bug 修复 {#bug-fix-16} - -- 手动为 Kafka 消息存储偏移量,以便能够一次为所有分区提交所有偏移量。 修复了 `one consumer - many partitions` 场景中的潜在重复. [#6872](https://github.com/ClickHouse/ClickHouse/pull/6872) ([Ivan](https://github.com/abyss7)) - -### ClickHouse 版本 19.11.9.52, 2019-09-6 {#clickhouse-release-19-11-9-52-2019-09-6} - -- 改进缓存字典中的错误处理. [#6737](https://github.com/ClickHouse/ClickHouse/pull/6737) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复了函数 `arrayEnumerateUniqRanked` 中的错误. [#6779](https://github.com/ClickHouse/ClickHouse/pull/6779) ([proller](https://github.com/proller)) -- 在从 JSON 中提取 `Tuple` 时修复 `JSONExtract` 函数. [#6718](https://github.com/ClickHouse/ClickHouse/pull/6718) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复了在跳过索引的表上进行`ALTER DELETE`查询后可能丢失的数据. [#6224](https://github.com/ClickHouse/ClickHouse/issues/6224) [#6282](https://github.com/ClickHouse/ClickHouse/pull/6282) ([Nikita Vasilev](https://github.com/nikvas0)) -- 修复了性能测试. [#6392](https://github.com/ClickHouse/ClickHouse/pull/6392) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- Parquet: 修复读取布尔列. [#6579](https://github.com/ClickHouse/ClickHouse/pull/6579) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了常量参数的 `nullIf` 函数的错误行为. [#6518](https://github.com/ClickHouse/ClickHouse/pull/6518) ([Guillaume Tassery](https://github.com/YiuRULE)) [#6580](https://github.com/ClickHouse/ClickHouse/pull/6580) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复正常服务器重启时Kafka消息重复问题. [#6597](https://github.com/ClickHouse/ClickHouse/pull/6597) ([Ivan](https://github.com/abyss7)) -- 修复了长时间 `ALTER UPDATE` 或 `ALTER DELETE` 可能会阻止常规合并运行的问题. 如果没有足够的可用线程, 则防止执行突变. [#6502](https://github.com/ClickHouse/ClickHouse/issues/6502) [#6617](https://github.com/ClickHouse/ClickHouse/pull/6617) ([tavplubix](https://github.com/tavplubix)) -- 修复了在服务器配置文件中处理 `timezone` 的错误. [#6709](https://github.com/ClickHouse/ClickHouse/pull/6709) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 kafka 测试. [#6805](https://github.com/ClickHouse/ClickHouse/pull/6805) ([Ivan](https://github.com/abyss7)) - -#### 安全修复 {#security-fix-3} - -- 果攻击者拥有对 ZooKeeper 的写访问权限, 并且能够从运行 ClickHouse 的网络中运行可用的自定义服务器, 则它可以创建自定义构建的恶意服务器, 该服务器将充当 ClickHouse 副本并将其注册到 ZooKeeper 中. 当另一个副本从恶意副本中获取数据部分时, 它可以强制 clickhouse-server 写入文件系统上的任意路径. 由 Yandex 信息安全团队 Eldar Zaitov 发现. [#6247](https://github.com/ClickHouse/ClickHouse/pull/6247) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.11.8.46, 2019-08-22 {#clickhouse-release-19-11-8-46-2019-08-22} - -#### Bug 修复 {#bug-fix-17} - -- 修复带有 `enable_mixed_granularity_parts=1` 的表的 `ALTER TABLE ... UPDATE` 查询. [#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) -- 用带有元组的子查询的 IN 子句时修复 NPE. [#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([tavplubix](https://github.com/tavplubix)) -- 修复了一个问题, 如果一个陈旧的副本变得活跃, 它可能仍然有被 DROP PARTITION 删除的数据部分. [#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([tavplubix](https://github.com/tavplubix)) -- 修复了解析 CSV 的问题 [#6426](https://github.com/ClickHouse/ClickHouse/issues/6426) [#6559](https://github.com/ClickHouse/ClickHouse/pull/6559) ([tavplubix](https://github.com/tavplubix)) -- 修复了 system.parts 表和 ALTER 查询中的数据竞争. 这修复了 [#6245](https://github.com/ClickHouse/ClickHouse/issues/6245). [#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了可能导致内存损坏的突变中的错误代码. 修复了由于从 `system.parts` 或 `system.parts_columns` 并发 `DROP TABLE` 和 `SELECT` 而可能发生的读取地址 `0x14c0` 的段错误. 修复了准备突变查询时的竞争条件. 修复复制表的 `OPTIMIZE` 和 ALTER 等并发修改操作导致的死锁. [#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.11.7.40, 2019-08-14 {#clickhouse-release-19-11-7-40-2019-08-14} - -#### Bug 修复 {#bug-fix-18} - -- Kafka 集成已在此版本中修复. -- 修复了当使用 `arrayReduce` 作为常量参数时的段错误. [#6326](https://github.com/ClickHouse/ClickHouse/pull/6326) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 `toFloat()` 单调性. [#6374](https://github.com/ClickHouse/ClickHouse/pull/6374) ([dimarub2000](https://github.com/dimarub2000)) -- 修复了启用的 `optimize_skip_unused_shards` 和丢失的分片键修复段错误. [#6384](https://github.com/ClickHouse/ClickHouse/pull/6384) ([CurtizJ](https://github.com/CurtizJ)) -- 修复了`arrayEnumerateUniqRanked` 函数的逻辑. [#6423](https://github.com/ClickHouse/ClickHouse/pull/6423) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 从 MySQL 处理程序中删除了额外的详细日志记录. [#6389](https://github.com/ClickHouse/ClickHouse/pull/6389) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 `topK` 和 `topK Weighted` 聚合函数中的错误行为和可能的段错误. [#6404](https://github.com/ClickHouse/ClickHouse/pull/6404) ([CurtizJ](https://github.com/CurtizJ)) -- 不要在 `system.columns` 表中暴露虚拟列. 这是向后兼容所必需的. [#6406](https://github.com/ClickHouse/ClickHouse/pull/6406) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复复杂键缓存字典中字符串字段的内存分配错误. [#6447](https://github.com/ClickHouse/ClickHouse/pull/6447) ([alesapin](https://github.com/alesapin)) -- 修复在为 `Replicated*MergeTree` 表创建新副本时启用自适应粒度的错误. [#6452](https://github.com/ClickHouse/ClickHouse/pull/6452) ([alesapin](https://github.com/alesapin)) -- 修复读取 Kafka 消息时的无限循环. [#6354](https://github.com/ClickHouse/ClickHouse/pull/6354) ([abyss7](https://github.com/abyss7)) -- 修复了由于 SQL 解析器中的堆栈溢出以及 `Merge` 和 `Distributed` 表中的堆栈溢出的可能性, 伪造查询导致服务器崩溃的可能性 [#6433](https://github.com/ClickHouse/ClickHouse/pull/6433) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了小序列上的 Gorilla 编码错误. [#6444](https://github.com/ClickHouse/ClickHouse/pull/6444) ([Enmk](https://github.com/Enmk)) - -#### 改进 {#improvement-5} - -- 允许用户在连接时覆盖 `poll_interval` 和 `idle_connection_timeout` 设置. [#6230](https://github.com/ClickHouse/ClickHouse/pull/6230) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.11.5.28, 2019-08-05 {#clickhouse-release-19-11-5-28-2019-08-05} - -#### Bug 修复 {#bug-fix-19} - -- 修复了服务器过载时挂起查询的可能性. [#6301](https://github.com/ClickHouse/ClickHouse/pull/6301) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 yandexConsistentHash 函数中的 FPE. 这修复了 [#6304](https://github.com/ClickHouse/ClickHouse/issues/6304). [#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了在 `AggregateFunctionFactory` 中转换 `LowCardinality` 类型的错误. 这修复了 [#6257](https://github.com/ClickHouse/ClickHouse/issues/6257). [#6281](https://github.com/ClickHouse/ClickHouse/pull/6281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复从配置文件中的 `true` 和 `false` 字符串解析 `bool` 设置. [#6278](https://github.com/ClickHouse/ClickHouse/pull/6278) ([alesapin](https://github.com/alesapin)) -- 当 `WHERE` 的一部分移动到 `PREWHERE` 时, 修复了在对 `MergeTree` 表上的 `Distributed` 表的查询中流标头不兼容的罕见错误. [#6236](https://github.com/ClickHouse/ClickHouse/pull/6236) ([alesapin](https://github.com/alesapin)) -- 修复了有符号类型到无符号类型的整数除法中的溢出. 这修复了 [#6214](https://github.com/ClickHouse/ClickHouse/issues/6214). [#6233](https://github.com/ClickHouse/ClickHouse/pull/6233) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 向后不兼容的更新 {#backward-incompatible-change-5} - -- `Kafka` 仍然损坏. - -### ClickHouse 版本 19.11.4.24, 2019-08-01 {#clickhouse-release-19-11-4-24-2019-08-01} - -#### Bug 修复 {#bug-fix-20} - -- 修复以自适应粒度写入二级索引标记的错误. [#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alesapin](https://github.com/alesapin)) -- 修复了带有两级聚合的 `GROUP BY` 的 `WITH ROLLUP` 和 `WITH CUBE` 修饰符. [#6225](https://github.com/ClickHouse/ClickHouse/pull/6225) ([Anton Popov](https://github.com/CurtizJ)) -- 修复了 `JSONExtractRaw` 函数中的挂起问题. 已修复 [#6195](https://github.com/ClickHouse/ClickHouse/issues/6195) [#6198](https://github.com/ClickHouse/ClickHouse/pull/6198) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 ExternalLoader::reloadOutdated() 中的段错误. [#6082](https://github.com/ClickHouse/ClickHouse/pull/6082) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复了服务器可能会关闭侦听套接字但不会关闭并继续服务剩余查询的情况. 您最终可能会运行两个 clickhouse-server 进程. 有时, 服务器可能会为剩余的查询返回错误 `bad_function_call`. [#6231](https://github.com/ClickHouse/ClickHouse/pull/6231) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了通过 ODBC、MySQL、ClickHouse 和 HTTP 初始加载外部词典时更新字段上无用和不正确的条件. 这修复了 [#6069](https://github.com/ClickHouse/ClickHouse/issues/6069) [#6083](https://github.com/ClickHouse/ClickHouse/pull/6083) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了将 `LowCardinality(Nullable)` 转换为 not-Nullable 列中的不相关异常,以防它不包含 Nulls(例如, 像在 `SELECT CAST(CAST('Hello' AS LowCardinality(Nullable(String))) AS String` 这样的查询中). [#6094](https://github.com/ClickHouse/ClickHouse/issues/6094) [#6119](https://github.com/ClickHouse/ClickHouse/pull/6119) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 在极少数情况下修复 `uniq` 聚合函数的非确定性结果. 该错误存在于所有 ClickHouse 版本中. [#6058](https://github.com/ClickHouse/ClickHouse/pull/6058) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 当我们在函数 `IPv6CIDRToRange` 上设置太高的 CIDR 时出现段错误. [#6068](https://github.com/ClickHouse/ClickHouse/pull/6068) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 修复了服务器从许多不同的上下文中抛出许多异常时的小内存泄漏. [#6144](https://github.com/ClickHouse/ClickHouse/pull/6144) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复消费者订阅前暂停, 订阅后未恢复的情况. [#6075](https://github.com/ClickHouse/ClickHouse/pull/6075) ([Ivan](https://github.com/abyss7)) Note that Kafka is broken in this version. -- 清除之前已完成但出现错误的读取操作中的 Kafka 数据缓冲区 [#6026](https://github.com/ClickHouse/ClickHouse/pull/6026) ([Nikolay](https://github.com/ bopohaa)) 请注意, 此版本中 Kafka 已损坏. -- 由于 `StorageMergeTree::background_task_handle` 是在`startup()` 中初始化的, 所以 `MergeTreeBlockOutputStream::write()` 可能会在初始化之前尝试使用它. 只需检查它是否已初始化. [#6080](https://github.com/ClickHouse/ClickHouse/pull/6080) ([Ivan](https://github.com/abyss7)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-6} - -- 添加官方`rpm`包. [#5740](https://github.com/ClickHouse/ClickHouse/pull/5740) ([proller](https://github.com/proller)) ([alesapin](https://github.com/alesapin)) -- 添加使用`packager`脚本构建`.rpm`和`.tgz`包的能力. [#5769](https://github.com/ClickHouse/ClickHouse/pull/5769) ([alesapin](https://github.com/alesapin)) -- 修复“Arcadia”构建系统. [#6223](https://github.com/ClickHouse/ClickHouse/pull/6223) ([proller](https://github.com/proller)) - -#### 向后不兼容的更新 {#backward-incompatible-change-6} - -- `Kafka` 在这个版本中仍然被损坏. - -### ClickHouse 版本 19.11.3.11, 2019-07-18 {#clickhouse-release-19-11-3-11-2019-07-18} - -#### 新特征 {#new-feature-6} - -- 添加了对准备好的语句的支持. [#5331](https://github.com/ClickHouse/ClickHouse/pull/5331/) ([Alexander](https://github.com/sanych73)) [#5630](https://github.com/ClickHouse/ClickHouse/pull/5630) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- `DoubleDelta` 和 `Gorilla` 列编解码器. [#5600](https://github.com/ClickHouse/ClickHouse/pull/5600) ([Vasily Nemkov](https://github.com/Enmk)) -- 添加了 `os_thread_priority` 设置, 允许控制操作系统使用的查询处理线程的 `nice` 值来调整动态调度优先级. 它需要 `CAP_SYS_NICE` 功能才能工作. 这实现 [#5858](https://github.com/ClickHouse/ClickHouse/issues/5858) [#5909](https://github.com/ClickHouse/ClickHouse/pull/5909) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 为 Kafka 引擎实现 `_topic`、`_offset`、`_key` 列 [#5382](https://github.com/ClickHouse/ClickHouse/pull/5382) ([Ivan](https://github.com/ abyss7)) 请注意, 这个版本中 Kafka 已损坏. -- 添加聚合函数组合器 `-Resample`. [#5590](https://github.com/ClickHouse/ClickHouse/pull/5590) ([hcz](https://github.com/hczhcz)) -- 聚合函数`groupArrayMovingSum(win_size)(x)` 和`groupArrayMovingAvg(win_size)(x)`, 计算有或没有窗口大小限制的移动总和/平均. [#5595](https://github.com/ClickHouse/ClickHouse/pull/5595) ([inv2004](https://github.com/inv2004)) -- 添加同义词 `arrayFlatten` \<-\> `flatten`. [#5764](https://github.com/ClickHouse/ClickHouse/pull/5764) ([hcz](https://github.com/hczhcz)) -- 将优步的H3功能 `geoToH3` 集成在一起. [#4724](https://github.com/ClickHouse/ClickHouse/pull/4724) ([Remen Ivan](https://github.com/BHYCHIK)) [#5805](https://github.com/ClickHouse/ClickHouse/pull/5805) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### Bug 修复 {#bug-fix-21} - -- 使用异步更新实现 DNS 缓存. 单独的线程解析所有主机并使用周期更新 DNS 缓存 (设置 `dns_cache_update_period`). 当主机的 ip 频繁更改时. 它应该会有所帮助. [#5857](https://github.com/ClickHouse/ClickHouse/pull/5857) ([Anton Popov](https://github.com/CurtizJ)) -- 修复 `Delta` 编解码器中的段错误, 该错误会影响值小于 32 位大小的列. 该错误导致随机内存损坏. [#5786](https://github.com/ClickHouse/ClickHouse/pull/5786) ([alesapin](https://github.com/alesapin)) -- 修复 TTL 合并中的段错误与块中的非物理列. [#5819](https://github.com/ClickHouse/ClickHouse/pull/5819) ([Anton Popov](https://github.com/CurtizJ)) -- 修复了检查带有 `LowCardinality` 列的部分的罕见错误. 以前, `checkDataPart` 对于带有 `LowCardinality` 列的部分总是失败. [#5832](https://github.com/ClickHouse/ClickHouse/pull/5832) ([alesapin](https://github.com/alesapin)) -- 避免在服务器线程池已满时挂起连接. 当连接超时很长时, 对于从 `remote` 表函数的连接或到没有副本的分片的连接很重要. 这修复了 [#5878](https://github.com/ClickHouse/ClickHouse/issues/5878) [#5881](https://github.com/ClickHouse/ClickHouse/pull/5881) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 支持 `evalMLModel` 函数的常量参数. 这修复了 [#5817](https://github.com/ClickHouse/ClickHouse/issues/5817) [#5820](https://github.com/ClickHouse/ClickHouse/pull/5820) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 ClickHouse 将默认时区确定为 `UCT` 而不是 `UTC` 时的问题. 这修复了 [#5804](https://github.com/ClickHouse/ClickHouse/issues/5804). [#5828](https://github.com/ClickHouse/ClickHouse/pull/5828) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 `visitParamExtractRaw` 中的缓冲区下溢. 这修复了 [#5901](https://github.com/ClickHouse/ClickHouse/issues/5901) [#5902](https://github.com/ClickHouse/ClickHouse/pull/5902) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 现在分布式的`DROP/ALTER/TRUNCATE/OPTIMIZE ON CLUSTER`查询将直接在leader副本上执行. [#5757](https://github.com/ClickHouse/ClickHouse/pull/5757) ([alesapin](https://github.com/alesapin)) -- 使用 `ColumnNullable` + 相关更改修复 `ColumnConst` 的 `coalesce`. [#5755](https://github.com/ClickHouse/ClickHouse/pull/5755) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复 `ReadBufferFromKafkaConsumer` 以便它在 `commit()` 之后继续读取新消息,即使它之前被停止. [#5852](https://github.com/ClickHouse/ClickHouse/pull/5852) ([Ivan](https://github.com/abyss7)) -- 在右表中的 `Nullable` 键上连接时修复 `FULL` 和 `RIGHT` 连接结果. [#5859](https://github.com/ClickHouse/ClickHouse/pull/5859) ([Artem Zuikov](https://github.com/4ertus2)) -- 低优先级查询无限休眠的可能修复. [#5842](https://github.com/ClickHouse/ClickHouse/pull/5842) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复竞争条件, 导致某些查询在 `SYSTEM FLUSH LOGS` 查询后可能不会出现在 query_log 中. [#5456](https://github.com/ClickHouse/ClickHouse/issues/5456) [#5685](https://github.com/ClickHouse/ClickHouse/pull/5685) ([Anton Popov](https://github.com/CurtizJ)) -- 修复了 ClusterCopier 中的 `heap-use-after-free` ASan 警告,由 watch 导致尝试使用已删除的复制器对象. [#5871](https://github.com/ClickHouse/ClickHouse/pull/5871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复了由 `IColumn::deserializeAndInsertFromArena` 的某些实现返回的错误 `StringRef` 指针. 此错误仅影响单元测试. [#5973](https://github.com/ClickHouse/ClickHouse/pull/5973) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 防止屏蔽同名列的源和中间数组连接列. [#5941](https://github.com/ClickHouse/ClickHouse/pull/5941) ([Artem Zuikov](https://github.com/4ertus2)) -- 使用 MySQL 样式标识符引用修复对 MySQL 引擎的插入和选择查询. [#5704](https://github.com/ClickHouse/ClickHouse/pull/5704) ([Winter Zhang](https://github.com/zhang2014)) -- 现在 `CHECK TABLE` 查询可以与 MergeTree 引擎系列一起使用. 如果每个部分 (或在更简单的引擎情况下的文件) 有任何检查状态和消息, 它会返回检查状态和消息. 此外, 修复了获取损坏部分的错误. [#5865](https://github.com/ClickHouse/ClickHouse/pull/5865) ([alesapin](https://github.com/alesapin)) -- 修复 SPLIT_SHARED_LIBRARIES 运行时. [#5793](https://github.com/ClickHouse/ClickHouse/pull/5793) ([Danila Kutenin](https://github.com/danlark1)) -- 当 `/etc/localtime` 是一个像 `../usr/share/zoneinfo/Asia/Istanbul` 这样的相对符号链接时, 修复了时区初始化 [#5922](https://github.com/ClickHouse/ClickHouse/pull/5922) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- clickhouse-copier: 修复关机后免费使用. [#5752](https://github.com/ClickHouse/ClickHouse/pull/5752) ([proller](https://github.com/proller)) -- 更新了 `simdjson` . 修复部分无效的零字节JSON解析成功的问题. [#5938](https://github.com/ClickHouse/ClickHouse/pull/5938) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复关闭系统日志 [#5802](https://github.com/ClickHouse/ClickHouse/pull/5802) ([Anton Popov](https://github.com/CurtizJ)) -- 修复 invalidate_query 中的条件依赖于字典时挂起. [#6011](https://github.com/ClickHouse/ClickHouse/pull/6011) ([Vitaly Baranov](https://github.com/vitlibar)) - -#### 改进 {#improvement-6} - -- 在集群配置中允许无法解析的地址. 它们将被视为不可用并在每次连接尝试时尝试解决. 这对 Kubernetes 尤其有用. 这修复了 [#5714](https://github.com/ClickHouse/ClickHouse/issues/5714) [#5924](https://github.com/ClickHouse/ClickHouse/pull/5924) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 关闭空闲的 TCP 连接 (默认超时一小时). 这对于在每台服务器上有多个分布式表的大型集群尤其重要, 因为每台服务器都可能保持与其他所有服务器的连接池, 并且在查询并发峰值之后, 连接将停止. 这修复了 [#5879](https://github.com/ClickHouse/ClickHouse/issues/5879) [#5880](https://github.com/ClickHouse/ClickHouse/pull/5880) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- `topK` 函数的质量更好. 如果新元素具有更大的权重, 则更改 SavingSpace 设置行为以删除最后一个元素. [#5833](https://github.com/ClickHouse/ClickHouse/issues/5833) [#5850](https://github.com/ClickHouse/ClickHouse/pull/5850) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 用于域的 URL 函数现在可以用于没有方案的不完整 URL. [#5725](https://github.com/ClickHouse/ClickHouse/pull/5725) ([alesapin](https://github.com/alesapin)) -- 将校验和添加到 `system.parts_columns` 表. [#5874](https://github.com/ClickHouse/ClickHouse/pull/5874) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -- 添加了 `Enum` 数据类型作为 `Enum` 或 `Enum 16` 的同义词. [#5886](https://github.com/ClickHouse/ClickHouse/pull/5886) ([dimarub2000](https://github.com/dimarub2000)) -- `T64` 编解码器的全位转置变体. 可以使用 `zstd` 实现更好的压缩. [#5742](https://github.com/ClickHouse/ClickHouse/pull/5742) ([Artem Zuikov](https://github.com/4ertus2)) -- `startsWith` 函数的条件现在可以使用主键. 这修复了 [#5310](https://github.com/ClickHouse/ClickHouse/issues/5310) and [#5882](https://github.com/ClickHouse/ClickHouse/issues/5882) [#5919](https://github.com/ClickHouse/ClickHouse/pull/5919) ([dimarub2000](https://github.com/dimarub2000)) -- 通过允许空数据库名称, 允许将 `clickhouse-copier` 与交叉复制集群拓扑一起使用. [#5745](https://github.com/ClickHouse/ClickHouse/pull/5745) ([nvartolomei](https://github.com/nvartolomei)) -- 在没有 `tzdata` 的系统 (例如裸 Docker 容器) 上使用 `UTC` 作为默认时区. 在此补丁之前,打印错误消息 `Could not determine local time zone` 并且服务器或客户端拒绝启动. [#5827](https://github.com/ClickHouse/ClickHouse/pull/5827) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 返回对函数 `quantileTiming` 中浮点参数的支持, 以实现向后兼容. [#5911](https://github.com/ClickHouse/ClickHouse/pull/5911) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在错误消息中显示哪个表缺少列. [#5768](https://github.com/ClickHouse/ClickHouse/pull/5768) ([Ivan](https://github.com/abyss7)) -- 禁止不同用户使用相同的 query_id 运行查询. [#5430](https://github.com/ClickHouse/ClickHouse/pull/5430) ([proller](https://github.com/proller)) -- 用于将指标发送到 Graphite 的更强大的代码。 即使在长时间的 `RENAME TABLE` 操作期间它也能工作. [#5875](https://github.com/ClickHouse/ClickHouse/pull/5875) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 当 ThreadPool 无法安排要执行的任务时, 将显示更多信息性错误消息. 这修复了 [#5305](https://github.com/ClickHouse/ClickHouse/issues/5305) [#5801](https://github.com/ClickHouse/ClickHouse/pull/5801) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 倒置ngramSearch更直观. [#5807](https://github.com/ClickHouse/ClickHouse/pull/5807) ([Danila Kutenin](https://github.com/danlark1)) -- 在 HDFS 引擎构建器中添加用户解析. [#5946](https://github.com/ClickHouse/ClickHouse/pull/5946) ([akonyaev90](https://github.com/akonyaev90)) -- 更新 `max_ast_elements parameter` 的默认值. [#5933](https://github.com/ClickHouse/ClickHouse/pull/5933) ([Artem Konovalov](https://github.com/izebit)) -- 添加了过时设置的概念. 可以使用过时的设置 `allow_experimental_low_cardinality_type` 没有效果. [0f15c01c6802f7ce1a1494c12c846be8c98944cd](https://github.com/ClickHouse/ClickHouse/commit/0f15c01c6802f7ce1a1494c12c846be8c98944cd) [Alexey Milovidov](https://github.com/alexey-milovidov) - -#### 性能改进 {#performance-improvement-4} - -- 增加从合并表中选择的流数量, 以实现更均匀的线程分布. 添加了设置 `max_streams_multiplier_for_merge_tables`. 这修复了 [#5797](https://github.com/ClickHouse/ClickHouse/issues/5797) [#5915](https://github.com/ClickHouse/ClickHouse/pull/5915) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-7} - -- 为客户端-服务器与不同版本的clickhouse交互添加向后兼容性测试. [#5868](https://github.com/ClickHouse/ClickHouse/pull/5868) ([alesapin](https://github.com/alesapin)) -- 在每个提交和拉取请求中测试覆盖率信息. [#5896](https://github.com/ClickHouse/ClickHouse/pull/5896) ([alesapin](https://github.com/alesapin)) -- 与 address sanitizer 合作以支持我们的自定义分配器 (`Arena` 和 `ArenaWithFreeLists`), 以便更好地调试 `use-after-free` 错误. [#5728](https://github.com/ClickHouse/ClickHouse/pull/5728) ([akuzm](https://github.com/akuzm)) -- 切换到 [LLVM libunwind implementation](https://github.com/llvm-mirror/libunwind) 以进行 C++ 异常处理和堆栈跟踪打印. [#4828](https://github.com/ClickHouse/ClickHouse/pull/4828) ([Nikita Lapkov](https://github.com/laplab)) -- 添加来自 -Weverything 的另外两个警告. [#5923](https://github.com/ClickHouse/ClickHouse/pull/5923) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 允许使用 Memory Sanitizer 构建 ClickHouse. [#3949](https://github.com/ClickHouse/ClickHouse/pull/3949) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了关于模糊测试中 `bitTest` 函数的 ubsan 报告. [#5943](https://github.com/ClickHouse/ClickHouse/pull/5943) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- Docker: 增加了初始化需要身份验证的 ClickHouse 实例的可能性. [#5727](https://github.com/ClickHouse/ClickHouse/pull/5727) ([Korviakov Andrey](https://github.com/shurshun)) -- 将 librdkafka 更新至 1.1.0 版. [#5872](https://github.com/ClickHouse/ClickHouse/pull/5872) ([Ivan](https://github.com/abyss7)) -- 为集成测试添加全局超时并在测试代码中禁用其中的一些. [#5741](https://github.com/ClickHouse/ClickHouse/pull/5741) ([alesapin](https://github.com/alesapin)) -- 修复一些 ThreadSanitizer 故障. [#5854](https://github.com/ClickHouse/ClickHouse/pull/5854) ([akuzm](https://github.com/akuzm)) -- `--no-undefined` 选项强制链接器在链接时检查所有外部名称是否存在. 在拆分构建模式下跟踪库之间的真实依赖关系非常有用. [#5855](https://github.com/ClickHouse/ClickHouse/pull/5855) ([Ivan](https://github.com/abyss7)) -- 添加了 [#5797](https://github.com/ClickHouse/ClickHouse/issues/5797) [#5914](https://github.com/ClickHouse/ClickHouse/pull/5914) ([alexey-milovidov](https://github.com/alexey-milovidov)) 的性能测试. -- 修复了与 gcc-7 的兼容性. [#5840](https://github.com/ClickHouse/ClickHouse/pull/5840) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了对 gcc-9 的支持. 这修复了 [#5717](https://github.com/ClickHouse/ClickHouse/issues/5717) [#5774](https://github.com/ClickHouse/ClickHouse/pull/5774) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 libunwind 可以错误链接时的错误. [#5948](https://github.com/ClickHouse/ClickHouse/pull/5948) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 PVS-Studio 发现的一些警告. [#5921](https://github.com/ClickHouse/ClickHouse/pull/5921) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了对 `clang-tidy` 静态分析器的初始支持. [#5806](https://github.com/ClickHouse/ClickHouse/pull/5806) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 将 BSD/Linux 字节序宏 (`be64toh` 和 `htobe64`) 转换为 Mac OS X 等价物. [#5785](https://github.com/ClickHouse/ClickHouse/pull/5785) ([Fu Chen](https://github.com/fredchenbj)) -- 改进的集成测试指南. [#5796](https://github.com/ClickHouse/ClickHouse/pull/5796) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 修复在macosx + gcc9的构建. [#5822](https://github.com/ClickHouse/ClickHouse/pull/5822) ([filimonov](https://github.com/filimonov)) -- 修复一个难以发现的拼写错误: aggreGate -\>aggregate. [#5753](https://github.com/ClickHouse/ClickHouse/pull/5753) ([akuzm](https://github.com/akuzm)) -- 修复 freebsd 构建. [#5760](https://github.com/ClickHouse/ClickHouse/pull/5760) ([proller](https://github.com/proller)) -- 将实验性 YouTube 频道的链接添加到网站 [#5845](https://github.com/ClickHouse/ClickHouse/pull/5845) ([Ivan Blinkov](https://github.com/blinkov)) -- CMake: 添加覆盖标志选项: WITH_COVERAGE [#5776](https://github.com/ClickHouse/ClickHouse/pull/5776) ([proller](https://github.com/proller)) -- 修复一些内联 PODArray 的初始大小. [#5787](https://github.com/ClickHouse/ClickHouse/pull/5787) ([akuzm](https://github.com/akuzm)) -- clickhouse-server.postinst: 修复 centos 6 的操作系统检测. [#5788](https://github.com/ClickHouse/ClickHouse/pull/5788) ([proller](https://github.com/proller)) -- 添加了 Arch linux 包生成. [#5719](https://github.com/ClickHouse/ClickHouse/pull/5719) ([Vladimir Chebotarev](https://github.com/excitoon)) -- 通过 libs (dbms) 拆分 Common/config.h. [#5715](https://github.com/ClickHouse/ClickHouse/pull/5715) ([proller](https://github.com/proller)) -- 修复 `Arcadia` 构建平台 [#5795](https://github.com/ClickHouse/ClickHouse/pull/5795) ([proller](https://github.com/proller)) -- 修复非常规构建 (gcc9, 无子模块). [#5792](https://github.com/ClickHouse/ClickHouse/pull/5792) ([proller](https://github.com/proller)) -- 在 unalignedStore 中需要显式类型, 因为它被证明容易出错. [#5791](https://github.com/ClickHouse/ClickHouse/pull/5791) ([akuzm](https://github.com/akuzm)) -- 修复 MacOS 构建. [#5830](https://github.com/ClickHouse/ClickHouse/pull/5830) ([filimonov](https://github.com/filimonov)) -- 根据此处的要求, 关于具有更大数据集的新 JIT 功能的性能测试 [#5263](https://github.com/ClickHouse/ClickHouse/issues/5263) [#5887](https://github.com/ClickHouse/ClickHouse/pull/5887) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 在压力测试中运行状态测试 [12693e568722f11e19859742f56428455501fd2a](https://github.com/ClickHouse/ClickHouse/commit/12693e568722f11e19859742f56428455501fd2a) ([alesapin](https://github.com/alesapin)) - -#### 向后不兼容变更 {#backward-incompatible-change-7} - -- `Kafka` 在这个版本中被损坏. -- 默认情况下为新的 `MergeTree` 表启用 `adaptive_index_granularity` = 10MB. 如果您在 19.11+ 版本上创建了新的 MergeTree 表, 则无法降级到 19.6 之前的版本. [#5628](https://github.com/ClickHouse/ClickHouse/pull/5628) ([alesapin](https://github.com/alesapin)) -- 删除了 Yandex.Metrica 使用的过时的未记录的嵌入式词典. `OSIn`、`SEIn`、`OSToRoot`、`SEToRoot`、`OSHierarchy`、`SEHierarchy` 函数不再可用. 如果您正在使用这些功能, 请发送电子邮件至 clickhouse-feedback@yandex-team.com. 注意: 最后一刻我们决定暂时保留这些功能. [#5780](https://github.com/ClickHouse/ClickHouse/pull/5780) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -## ClickHouse 版本 19.10 {#clickhouse-release-19-10} - -### ClickHouse 版本 19.10.1.5, 2019-07-12 {#clickhouse-release-19-10-1-5-2019-07-12} - -#### 新特征 {#new-feature-7} - -- 添加新的列编解码器:`T64`. 适用于 (U)IntX/EnumX/Data(Time)/DecimalX 列. 它应该适用于具有恒定值或小范围值的列. 编解码器本身允许放大或缩小数据类型而无需重新压缩. [#5557](https://github.com/ClickHouse/ClickHouse/pull/5557) ([Artem Zuikov](https://github.com/4ertus2)) -- 添加数据库引擎`MySQL`, 允许查看远程MySQL服务器中的所有表. [#5599](https://github.com/ClickHouse/ClickHouse/pull/5599) ([Winter Zhang](https://github.com/zhang2014)) -- `bitmapContains` 实现. 如果第二个位图包含一个元素, 它比 `bitmapHasAny` 快 2 倍. [#5535](https://github.com/ClickHouse/ClickHouse/pull/5535) ([Zhichang Yu](https://github.com/yuzhichang)) -- 支持 `crc32` 函数 (行为与 MySQL 或 PHP 完全相同). 如果您需要哈希函数, 请不要使用它. [#5661](https://github.com/ClickHouse/ClickHouse/pull/5661) ([Remen Ivan](https://github.com/BHYCHIK)) -- 实现了 `SYSTEM START/STOP DISTRIBUTED SENDS` 查询以控制对 `Distributed` 表的异步插入. [#4935](https://github.com/ClickHouse/ClickHouse/pull/4935) ([Winter Zhang](https://github.com/zhang2014)) - -#### Bug 修复 {#bug-fix-22} - -- 执行突变时忽略查询执行限制和合并限制的最大部分大小. [#5659](https://github.com/ClickHouse/ClickHouse/pull/5659) ([Anton Popov](https://github.com/CurtizJ)) -- 修复可能导致正常块重复数据删除 (极其罕见) 和插入重复块 (更常见) 的错误. [#5549](https://github.com/ClickHouse/ClickHouse/pull/5549) ([alesapin](https://github.com/alesapin)) -- 修复函数 `arrayEnumerateUniqRanked` 的空数组参数. [#5559](https://github.com/ClickHouse/ClickHouse/pull/5559) ([proller](https://github.com/proller)) -- 不要在无意轮询任何消息的情况下订阅 Kafka 主题. [#5698](https://github.com/ClickHouse/ClickHouse/pull/5698) ([Ivan](https://github.com/abyss7)) -- 使设置 `join_use_nulls` 对不能在 Nullable 内的类型无效. [#5700](https://github.com/ClickHouse/ClickHouse/pull/5700) ([Olga Khvostikova](https://github.com/stavrolia)) -- 修复了 `Incorrect size of index granularity` 错误. [#5720](https://github.com/ClickHouse/ClickHouse/pull/5720) ([coraxster](https://github.com/coraxster)) -- 修复 Float 到 Decimal 转换溢出. [#5607](https://github.com/ClickHouse/ClickHouse/pull/5607) ([coraxster](https://github.com/coraxster)) -- 当 `WriteBufferFromHDFS` 的析构函数被调用时刷新缓冲区. 这修复了写入`HDFS`. [#5684](https://github.com/ClickHouse/ClickHouse/pull/5684) ([Xindong Peng](https://github.com/eejoin)) - -#### 改进 {#improvement-7} - -- 启用设置 `input_format_defaults_for_omited_fields` 时,将 `CSV` 中的空单元格视为默认值. [#5625](https://github.com/ClickHouse/ClickHouse/pull/5625) ([akuzm](https://github.com/akuzm)) -- 非阻塞加载外部字典. [#5567](https://github.com/ClickHouse/ClickHouse/pull/5567) ([Vitaly Baranov](https://github.com/vitlibar)) -- 可以根据设置为已建立的连接动态更改网络超时. [#4558](https://github.com/ClickHouse/ClickHouse/pull/4558) ([Konstantin Podshumok](https://github.com/podshumok)) -- 使用 `public_suffix_list` 作为函数 `firstSignificantSubdomain`、`cutToFirstSignificantSubdomain`. 它使用由`gperf` 生成的完美哈希表和从文件生成的列表: https://publicsuffix.org/list/public_suffix_list.dat. (例如, 现在我们认为域 `ac.uk` 不重要). [#5030](https://github.com/ClickHouse/ClickHouse/pull/5030) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 在系统表中采用了 `IPv6` 数据类型; `system.processes` 和 `system.query_log` 中的统一客户端信息列. [#5640](https://github.com/ClickHouse/ClickHouse/pull/5640) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使用会话与 MySQL 兼容协议进行连接. #5476 [#5646](https://github.com/ClickHouse/ClickHouse/pull/5646) ([Yuriy Baranov](https://github.com/yurriy)) -- 支持更多 `ALTER` 查询 `ON CLUSTER`. [#5593](https://github.com/ClickHouse/ClickHouse/pull/5593) [#5613](https://github.com/ClickHouse/ClickHouse/pull/5613) ([sundyli](https://github.com/sundy-li)) -- 支持 `clickhouse-local` 配置文件中的 `` 部分. [#5540](https://github.com/ClickHouse/ClickHouse/pull/5540) ([proller](https://github.com/proller)) -- 允许在 `clickhouse-local` 中使用 `remote` 表函数运行查询. [#5627](https://github.com/ClickHouse/ClickHouse/pull/5627) ([proller](https://github.com/proller)) - -#### 性能改进 {#performance-improvement-5} - -- 添加在 MergeTree 列末尾写入最终标记的可能性. 它允许避免对超出表数据范围的键进行无用的读取. 仅在使用自适应索引粒度时才启用. [#5624](https://github.com/ClickHouse/ClickHouse/pull/5624) ([alesapin](https://github.com/alesapin)) -- 通过减少 `stat` 系统调用的数量, 改进了 MergeTree 表在非常慢的文件系统上的性能. [#5648](https://github.com/ClickHouse/ClickHouse/pull/5648) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了从版本 19.6 中引入的 MergeTree 表读取时的性能下降. 修复 #5631. [#5633](https://github.com/ClickHouse/ClickHouse/pull/5633) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-8} - -- 实现了 `TestKeeper` 作为用于测试的 ZooKeeper 接口的实现. [#5643](https://github.com/ClickHouse/ClickHouse/pull/5643) ([alexey-milovidov](https://github.com/alexey-milovidov)) ([levushkin aleksej](https://github.com/alexey-milovidov)) -- 现在开始, `.sql` 测试可以由服务器独立运行, 与随机数据库并行运行. 它允许更快地运行它们, 使用自定义服务器配置添加新测试, 并确保不同的测试不会相互影响. [#5554](https://github.com/ClickHouse/ClickHouse/pull/5554) ([Ivan](https://github.com/abyss7)) -- 从性能测试中删除 `` 和 ``. [#5672](https://github.com/ClickHouse/ClickHouse/pull/5672) ([Olga Khvostikova](https://github.com/stavrolia)) -- 修复了 `Pretty` 格式的 `select_format` 性能测试. [#5642](https://github.com/ClickHouse/ClickHouse/pull/5642) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -## ClickHouse 版本 19.9 {#clickhouse-release-19-9} - -### ClickHouse 版本 19.9.3.31, 2019-07-05 {#clickhouse-release-19-9-3-31-2019-07-05} - -#### Bug 修复 {#bug-fix-23} - -- 修复 Delta 编解码器中的段错误, 该错误会影响值小于 32 位大小的列. 该错误导致随机内存损坏. [#5786](https://github.com/ClickHouse/ClickHouse/pull/5786) ([alesapin](https://github.com/alesapin)) -- 修复使用低基数列检查零件时的罕见错误. [#5832](https://github.com/ClickHouse/ClickHouse/pull/5832) ([alesapin](https://github.com/alesapin)) -- 修复 TTL 合并中的段错误与块中的非物理列. [#5819](https://github.com/ClickHouse/ClickHouse/pull/5819) ([Anton Popov](https://github.com/CurtizJ)) -- 修复低优先级查询的潜在无限睡眠. [#5842](https://github.com/ClickHouse/ClickHouse/pull/5842) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 ClickHouse 如何将默认时区确定为 UCT 而不是 UTC. [#5828](https://github.com/ClickHouse/ClickHouse/pull/5828) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复关于在领导者副本之前在跟随者副本上执行分布式 DROP/ALTER/TRUNCATE/OPTIMIZE ON CLUSTER 查询的错误. 现在它们将直接在领导者副本上执行. [#5757](https://github.com/ClickHouse/ClickHouse/pull/5757) ([alesapin](https://github.com/alesapin)) -- 修复竞争条件, 导致某些查询在 SYSTEM FLUSH LOGS 查询后可能不会立即出现在 query_log 中. [#5685](https://github.com/ClickHouse/ClickHouse/pull/5685) ([Anton Popov](https://github.com/CurtizJ)) -- 为 `evalMLModel` 函数添加了对常量参数的缺失支持. [#5820](https://github.com/ClickHouse/ClickHouse/pull/5820) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.9.2.4, 2019-06-24 {#clickhouse-release-19-9-2-4-2019-06-24} - -#### 新特征 {#new-feature-8} - -- 在 `system.parts` 表中打印有关冻结部件的信息. [#5471](https://github.com/ClickHouse/ClickHouse/pull/5471) ([proller](https://github.com/proller)) -- 如果未在参数中设置, 则在 tty 上启动 clickhouse-client 时询问客户端密码. [#5092](https://github.com/ClickHouse/ClickHouse/pull/5092) ([proller](https://github.com/proller)) -- 为 Decimal 类型实现 `dictGet` 和 `dictGetOrDefault` 函数. [#5394](https://github.com/ClickHouse/ClickHouse/pull/5394) ([Artem Zuikov](https://github.com/4ertus2)) - -#### 改进 {#improvement-8} - -- Debian init: 添加服务停止超时. [#5522](https://github.com/ClickHouse/ClickHouse/pull/5522) ([proller](https://github.com/proller)) -- 添加默认禁止设置为 LowCardinality 创建具有可疑类型的表. [#5448](https://github.com/ClickHouse/ClickHouse/pull/5448) ([Olga Khvostikova](https://github.com/stavrolia)) -- 回归函数在不用作函数 `evalMLMethod` 中的状态时返回模型权重. [#5411](https://github.com/ClickHouse/ClickHouse/pull/5411) ([Quid37](https://github.com/Quid37)) -- 重命名和改进回归方法. [#5492](https://github.com/ClickHouse/ClickHouse/pull/5492) ([Quid37](https://github.com/Quid37)) -- 字符串搜索器的界面更清晰. [#5586](https://github.com/ClickHouse/ClickHouse/pull/5586) ([Danila Kutenin](https://github.com/danlark1)) - -#### Bug 修复 {#bug-fix-24} - -- 修复 Kafka 中潜在的数据丢失问题. [#5445](https://github.com/ClickHouse/ClickHouse/pull/5445) ([Ivan](https://github.com/abyss7)) -- 使用零列调用时以 `PrettySpace` 格式修复潜在的无限循环. [#5560](https://github.com/ClickHouse/ClickHouse/pull/5560) ([Olga Khvostikova](https://github.com/stavrolia)) -- 修复了线性模型中的 UInt32 溢出错误. 允许 eval ML 模型用于非常量模型参数. [#5516](https://github.com/ClickHouse/ClickHouse/pull/5516) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- `ALTER TABLE ... DROP INDEX IF EXISTS ...` 如果提供的索引不存在,则不应引发异常. [#5524](https://github.com/ClickHouse/ClickHouse/pull/5524) ([Gleb Novikov](https://github.com/NanoBjorn)) -- 在标量子查询中使用 `bitmapHasAny` 修复段错误. [#5528](https://github.com/ClickHouse/ClickHouse/pull/5528) ([Zhichang Yu](https://github.com/yuzhichang)) -- 修复了复制连接池不重试解析主机时的错误, 即使 DNS 缓存已删除. [#5534](https://github.com/ClickHouse/ClickHouse/pull/5534) ([alesapin](https://github.com/alesapin)) -- 修复了 ReplicatedMergeTree 上的 `ALTER ... MODIFY TTL` . [#5539](https://github.com/ClickHouse/ClickHouse/pull/5539) ([Anton Popov](https://github.com/CurtizJ)) -- 使用 MATERIALIZED 列将 INSERT 修复到分布式表中. [#5429](https://github.com/ClickHouse/ClickHouse/pull/5429) ([Azat Khuzhin](https://github.com/azat)) -- 在截断 Join 存储时修复错误分配 [#5437](https://github.com/ClickHouse/ClickHouse/pull/5437) ([TCeason](https://github.com/TCeason)) -- 在包 tzdata 的最新版本中, 一些文件现在是符号链接. 当前检测默认时区的机制被破坏, 并为某些时区提供了错误的名称. 现在至少我们将时区名称强制为 TZ 的内容 (如果提供). [#5443](https://github.com/ClickHouse/ClickHouse/pull/5443) ([Ivan](https://github.com/abyss7)) -- 使用 MultiVolnitsky 搜索器修复一些非常罕见的情况, 当总针数总和至少为 16KB 时. 该算法遗漏或覆盖了之前的结果, 这可能导致 `multiSearchAny` 的结果不正确. [#5588](https://github.com/ClickHouse/ClickHouse/pull/5588) ([Danila Kutenin](https://github.com/danlark1)) -- 修复 ExternalData 请求的设置无法使用 ClickHouse 设置时的问题. 此外, 目前无法使用设置 `date_time_input_format` 和 `low_cardinality_allow_in_native_format`, 因为名称不明确 (在外部数据中它可以解释为表格式, 在查询中它可以是一个设置). [#5455](https://github.com/ClickHouse/ClickHouse/pull/5455) ([Danila Kutenin](https://github.com/danlark1)) -- 修复了仅从 FS 中删除部件而不将它们从 Zookeeper 中删除的错误. [#5520](https://github.com/ClickHouse/ClickHouse/pull/5520) ([alesapin](https://github.com/alesapin)) -- 从 MySQL 协议中删除调试日志记录. [#5478](https://github.com/ClickHouse/ClickHouse/pull/5478) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在 DDL 查询处理过程中跳过 ZNONODE. [#5489](https://github.com/ClickHouse/ClickHouse/pull/5489) ([Azat Khuzhin](https://github.com/azat)) -- 修复混合 `UNION ALL` 结果列类型. 存在数据和结果列的列类型不一致的情况. [#5503](https://github.com/ClickHouse/ClickHouse/pull/5503) ([Artem Zuikov](https://github.com/4ertus2)) -- 在 dictGetT 函数中对错误的整数抛出异常而不是崩溃. [#5446](https://github.com/ClickHouse/ClickHouse/pull/5446) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复 `system.dictionaries` 表中散列字典的错误 element_count 和 load_factor. [#5440](https://github.com/ClickHouse/ClickHouse/pull/5440) ([Azat Khuzhin](https://github.com/azat)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-9} - -- 修复了没有 `Brotli` HTTP 压缩支持的构建 (`ENABLE_BROTLI=OFF` cmake 变量). [#5521](https://github.com/ClickHouse/ClickHouse/pull/5521) ([Anton Yuzhaninov](https://github.com/citrin)) -- 包含 roaring.h 作为 roaring/roaring.h. [#5523](https://github.com/ClickHouse/ClickHouse/pull/5523) ([Orivej Desh](https://github.com/orivej)) -- 修复 hyperscan 中的 gcc9 警告 (#line directive is evil!). [#5546](https://github.com/ClickHouse/ClickHouse/pull/5546) ([Danila Kutenin](https://github.com/danlark1)) -- 修复使用 gcc-9 编译时的所有警告. 修复一些贡献问题. 修复 gcc9 ICE 并提交给 bugzilla. [#5498](https://github.com/ClickHouse/ClickHouse/pull/5498) ([Danila Kutenin](https://github.com/danlark1)) -- 修复了与 lld 的链接. [#5477](https://github.com/ClickHouse/ClickHouse/pull/5477) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 删除字典中未使用的专业化. [#5452](https://github.com/ClickHouse/ClickHouse/pull/5452) ([Artem Zuikov](https://github.com/4ertus2)) -- 针对不同类型文件的格式化和解析表的改进性能测试. [#5497](https://github.com/ClickHouse/ClickHouse/pull/5497) ([Olga Khvostikova](https://github.com/stavrolia)) -- 修复并行测试运行. [#5506](https://github.com/ClickHouse/ClickHouse/pull/5506) ([proller](https://github.com/proller)) -- Docker: 使用 clickhouse-test 中的配置. [#5531](https://github.com/ClickHouse/ClickHouse/pull/5531) ([proller](https://github.com/proller)) -- 修复 FreeBSD 编译. [#5447](https://github.com/ClickHouse/ClickHouse/pull/5447) ([proller](https://github.com/proller)) -- 升级 boost 到 1.70. [#5570](https://github.com/ClickHouse/ClickHouse/pull/5570) ([proller](https://github.com/proller)) -- 修复构建clickhouse作为子模块的问题. [#5574](https://github.com/ClickHouse/ClickHouse/pull/5574) ([proller](https://github.com/proller)) -- 改进 JSONExtract 性能测试. [#5444](https://github.com/ClickHouse/ClickHouse/pull/5444) ([Vitaly Baranov](https://github.com/vitlibar)) - -## ClickHouse 版本 19.8 {#clickhouse-release-19-8} - -### ClickHouse 版本 19.8.3.8, 2019-06-11 {#clickhouse-release-19-8-3-8-2019-06-11} - -#### 新特征 {#new-features} - -- 添加了使用 JSON 的函数. [#4686](https://github.com/ClickHouse/ClickHouse/pull/4686) ([hcz](https://github.com/hczhcz)) [#5124](https://github.com/ClickHouse/ClickHouse/pull/5124). ([Vitaly Baranov](https://github.com/vitlibar)) -- 添加一个函数 basename, 其行为类似于 basename 函数, 该函数存在于很多语言中 (python 中的 `os.path.basename`,PHP 中的 `basename` 等......). 使用类 UNIX 路径或 Windows 路径. [#5136](https://github.com/ClickHouse/ClickHouse/pull/5136) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 添加了 `LIMIT n, m BY` 或 `LIMIT m OFFSET n BY` 语法来为LIMIT BY 子句设置n 的偏移量. [#5138](https://github.com/ClickHouse/ClickHouse/pull/5138) ([Anton Popov](https://github.com/CurtizJ)) -- 添加了新的数据类型 `SimpleAggregateFunction`, 它允许在 `AggregatingMergeTree` 中具有轻聚合的列. 这只能与简单的函数一起使用, 如 `any`、`anyLast`、`sum`、`min`、`max`. [#4629](https://github.com/ClickHouse/ClickHouse/pull/4629) ([Boris Granveaud](https://github.com/bgranvea)) -- 在函数 `ngramDistance` 中添加了对非常量参数的支持. [#5198](https://github.com/ClickHouse/ClickHouse/pull/5198) ([Danila Kutenin](https://github.com/danlark1)) -- 添加函数 `skewPop`、`skewSamp`、`kurtPop` 和 `kurtSamp` 分别计算序列偏度、样本偏度、峰度和样本峰度. [#5200](https://github.com/ClickHouse/ClickHouse/pull/5200) ([hcz](https://github.com/hczhcz)) -- 支持 `MaterializeView` 存储的重命名操作. [#5209](https://github.com/ClickHouse/ClickHouse/pull/5209) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 添加了允许使用 MySQL 客户端连接到 ClickHouse 的服务器. [#4715](https://github.com/ClickHouse/ClickHouse/pull/4715) ([Yuriy Baranov](https://github.com/yurriy)) -- 添加 `toDecimal*OrZero` 和 `toDecimal*OrNull` 函数. [#5291](https://github.com/ClickHouse/ClickHouse/pull/5291) ([Artem Zuikov](https://github.com/4ertus2)) -- 支持函数中的十进制类型: `quantile`、`quantiles`、`median`、`quantileExactWeighted`、`quantilesExactWeighted`、`medianExactWeighted`. [#5304](https://github.com/ClickHouse/ClickHouse/pull/5304) ([Artem Zuikov](https://github.com/4ertus2)) -- 添加了 `toValidUTF8` 函数,用替换字符 � (U+FFFD) 替换所有无效的 UTF-8 字符. [#5322](https://github.com/ClickHouse/ClickHouse/pull/5322) ([Danila Kutenin](https://github.com/danlark1)) -- 添加了 `format` 功能. 使用参数中列出的字符串格式化常量模式 (简化的 Python 格式模式). [#5330](https://github.com/ClickHouse/ClickHouse/pull/5330) ([Danila Kutenin](https://github.com/danlark1)) -- 添加了 `system.detached_parts` 表, 其中包含有关 `MergeTree` 表的分离部分的信息. [#5353](https://github.com/ClickHouse/ClickHouse/pull/5353) ([akuzm](https://github.com/akuzm)) -- 添加了 `ngramSearch` 函数来计算needle和haystack之间的非对称差异. [#5418](https://github.com/ClickHouse/ClickHouse/pull/5418)[#5422](https://github.com/ClickHouse/ClickHouse/pull/5422) ([Danila Kutenin](https://github.com/danlark1)) -- 使用聚合函数接口实现基本机器学习方法 (随机线性回归和逻辑回归). 有不同的更新模型权重的策略 (简单梯度下降、动量方法、Nesterov 方法). 还支持自定义尺寸的小批量. [#4943](https://github.com/ClickHouse/ClickHouse/pull/4943) ([Quid37](https://github.com/Quid37)) -- `geohashEncode` 和 `geohashDecode` 函数的实现. [#5003](https://github.com/ClickHouse/ClickHouse/pull/5003) ([Vasily Nemkov](https://github.com/Enmk)) -- 添加聚合函数`timeSeriesGroupSum`, 可以聚合采样时间戳不对齐的不同时间序列. 它将在两个样本时间戳之间使用线性插值, 然后将时间序列相加. 添加聚合函数 `timeSeriesGroupRateSum` , 它计算时间序列的速率, 然后将速率相加. [#4542](https://github.com/ClickHouse/ClickHouse/pull/4542) ([Yangkuan Liu](https://github.com/LiuYangkuan)) -- 添加了函数 `IPv4CIDRtoIPv4Range` 和 `IPv6CIDRtoIPv6Range` 以使用 CIDR 计算子网中 IP 的下限和上限. [#5095](https://github.com/ClickHouse/ClickHouse/pull/5095) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 当我们使用启用设置 `send_progress_in_http_headers` 的 HTTP 发送查询时, 添加 X-ClickHouse-Summary 标头. 返回 X-ClickHouse-Progress 的常用信息, 附加信息, 如查询中插入了多少行和字节数. [#5116](https://github.com/ClickHouse/ClickHouse/pull/5116) ([Guillaume Tassery](https://github.com/YiuRULE)) - -#### 改进 {#improvements} - -- 为 MergeTree 系列表(默认值: 100 000) 添加了 `max_parts_in_total` 设置, 以防止不安全的分区键规范 #5166. [#5171](https://github.com/ClickHouse/ClickHouse/pull/5171) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- `clickhouse-obfuscator`: 通过将初始种子与列名而不是列位置相结合来为各个列派生种子. 这旨在转换具有多个相关表的数据集, 以便转换后表保持可连接. [#5178](https://github.com/ClickHouse/ClickHouse/pull/5178) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了函数`JSONExtractRaw`、`JSONExtractKeyAndValues`. 将函数 `jsonExtract` 重命名为 `JSONExtract`. 当出现问题时, 这些函数返回相应的值, 而不是 `NULL` . 修改了函数`JSONExtract`, 现在它从它的最后一个参数中获取返回类型并且不注入可空值. 在 AVX2 指令不可用的情况下, 实现了对 RapidJSON 的回退. Simdjson 库更新到新版本. [#5235](https://github.com/ClickHouse/ClickHouse/pull/5235) ([Vitaly Baranov](https://github.com/vitlibar)) -- 现在 `if` 和 `multiIf` 函数不依赖于条件的 `Nullable` , 而是依赖于分支的sql兼容性. [#5238](https://github.com/ClickHouse/ClickHouse/pull/5238) ([Jian Wu](https://github.com/janplus)) -- `In` 谓词现在从 `Null` 输入生成 `Null` 结果, 就像 `Equal` 函数一样. [#5152](https://github.com/ClickHouse/ClickHouse/pull/5152) ([Jian Wu](https://github.com/janplus)) -- 查来自 Kafka 的每 (flush_interval / poll_timeout) 行数的时间限制. 这允许更频繁地中断 Kafka 消费者的读取并检查顶级流的时间限制. [#5249](https://github.com/ClickHouse/ClickHouse/pull/5249) ([Ivan](https://github.com/abyss7)) -- 将 rdkafka 与捆绑的 SASL 联系起来. 它应该允许使用 SASL SCRAM 身份验证. [#5253](https://github.com/ClickHouse/ClickHouse/pull/5253) ([Ivan](https://github.com/abyss7)) -- 用于 ALL JOINS 的 RowRefList 的批处理版本. [#5267](https://github.com/ClickHouse/ClickHouse/pull/5267) ([Artem Zuikov](https://github.com/4ertus2)) -- clickhouse-server: 提供更多信息的侦听错误消息. [#5268](https://github.com/ClickHouse/ClickHouse/pull/5268) ([proller](https://github.com/proller)) -- 支持 clickhouse-copier 中的字典用于 `` 中的函数. [#5270](https://github.com/ClickHouse/ClickHouse/pull/5270) ([proller](https://github.com/proller)) -- 添加新设置 `kafka_commit_every_batch` 以规范 Kafka 提交策略. - 它允许设置提交模式: 在处理每批消息之后, 或在整个块写入存储之后. 这是在某些极端情况下丢失某些消息或读取它们两次之间的权衡. [#5308](https://github.com/ClickHouse/ClickHouse/pull/5308) ([Ivan](https://github.com/abyss7)) -- 使 `windowFunnel` 支持其他无符号整数类型. [#5320](https://github.com/ClickHouse/ClickHouse/pull/5320) ([sundyli](https://github.com/sundy-li)) -- 允许在 Merge 引擎中隐藏虚拟列 `_table`. [#5325](https://github.com/ClickHouse/ClickHouse/pull/5325) ([Ivan](https://github.com/abyss7)) -- 使 `sequenceMatch` 聚合函数支持其他无符号整数类型. [#5339](https://github.com/ClickHouse/ClickHouse/pull/5339) ([sundyli](https://github.com/sundy-li)) -- 如果校验和不匹配最有可能是由硬件故障引起的, 则会提供更好的错误消息. [#5355](https://github.com/ClickHouse/ClickHouse/pull/5355) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 检查底层表是否支持对 `StorageMerge` 的采样 [#5366](https://github.com/ClickHouse/ClickHouse/pull/5366) ([Ivan](https://github.com/abyss7)) -- 在外部字典中使用后关闭 MySQL 连接. 它与问题 #893 有关. [#5395](https://github.com/ClickHouse/ClickHouse/pull/5395) ([Clément Rodriguez](https://github.com/clemrodriguez)) -- MySQL Wire 协议的改进. 将格式名称更改为 MySQLWire. 使用 RAII 调用 RSA_free. 如果无法创建上下文, 则禁用 SSL. [#5419](https://github.com/ClickHouse/ClickHouse/pull/5419) ([Yuriy Baranov](https://github.com/yurriy)) -- 允许使用不可访问的历史文件运行 (只读,没有磁盘空间,文件是目录,...). [#5431](https://github.com/ClickHouse/ClickHouse/pull/5431) ([proller](https://github.com/proller)) -- 尊重异步 INSERT 中的查询设置到分布式表. [#4936](https://github.com/ClickHouse/ClickHouse/pull/4936) ([TCeason](https://github.com/TCeason)) -- 将函数 `leastSqr` 重命名为 `simpleLinearRegression`,将 `LinearRegression` 重命名为 `linearRegression`,将 `LogisticRegression` 重命名为 `logisticRegression`. [#5391](https://github.com/ClickHouse/ClickHouse/pull/5391) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) - -#### 性能改进 {#performance-improvements} - -- 在 ALTER MODIFY 查询中并行处理部分非复制 MergeTree 表. [#4639](https://github.com/ClickHouse/ClickHouse/pull/4639) ([Ivan Kush](https://github.com/IvanKush)) -- 正则表达式提取优化. [#5193](https://github.com/ClickHouse/ClickHouse/pull/5193) [#5191](https://github.com/ClickHouse/ClickHouse/pull/5191) ([Danila Kutenin](https://github.com/danlark1)) -- 如果仅在连接部分中使用, 请勿添加右连接键列以连接结果. [#5260](https://github.com/ClickHouse/ClickHouse/pull/5260) ([Artem Zuikov](https://github.com/4ertus2)) -- 在第一个空响应后冻结 Kafka 缓冲区. 它避免了多次调用 `ReadBuffer::next()` 以获得一些行解析流中的空结果. [#5283](https://github.com/ClickHouse/ClickHouse/pull/5283) ([Ivan](https://github.com/abyss7)) -- 多参数的 `concat` 函数优化. [#5357](https://github.com/ClickHouse/ClickHouse/pull/5357) ([Danila Kutenin](https://github.com/danlark1)) -- 查询优化. 允许在将逗号/交叉连接重写为内部语句时下推 IN 语句. [#5396](https://github.com/ClickHouse/ClickHouse/pull/5396) ([Artem Zuikov](https://github.com/4ertus2)) -- 用参考文件1升级您的LZ4实现以获得更快的解压. [#5070](https://github.com/ClickHouse/ClickHouse/pull/5070) ([Danila Kutenin](https://github.com/danlark1)) -- 实现了 MSD 基数排序 (基于 kxsort) 和部分排序. [#5129](https://github.com/ClickHouse/ClickHouse/pull/5129) ([Evgenii Pravda](https://github.com/kvinty)) - -#### Bug 修复 {#bug-fixes} - -- 修复推送需要加入的列. [#5192](https://github.com/ClickHouse/ClickHouse/pull/5192) ([Winter Zhang](https://github.com/zhang2014)) -- 修复了当 ClickHouse 由 systemd 运行时, 命令 `sudo service clickhouse-server forcerestart` 没有按预期工作的问题. [#5204](https://github.com/ClickHouse/ClickHouse/pull/5204) ([proller](https://github.com/proller)) -- 复 DataPartsExchange 中的 http 错误代码 (9009 端口上的服务器间 http 服务器始终返回代码 200, 即使出现错误). [#5216](https://github.com/ClickHouse/ClickHouse/pull/5216) ([proller](https://github.com/proller)) -- 修复长度超过 MAX_SMALL_STRING_SIZE 的字符串的 SimpleAggregateFunction [#5311](https://github.com/ClickHouse/ClickHouse/pull/5311) ([Azat Khuzhin](https://github.com/azat)) -- 修复 IN 中 `Decimal` 到 `Nullable(Decimal)` 的转换错误. 支持其他十进制到十进制的转换 (包括不同的尺度). [#5350](https://github.com/ClickHouse/ClickHouse/pull/5350) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了 simdjson 库中的 FPU 破坏导致 `uniqHLL` 和 `uniqCombined` 聚合函数和数学函数 (如 `log`) 计算错误的问题. [#5354](https://github.com/ClickHouse/ClickHouse/pull/5354) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 JSON 函数中混合常量/非常量情况的处理. [#5435](https://github.com/ClickHouse/ClickHouse/pull/5435) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复 `retention` 功能. 现在在一行数据中满足的所有条件都添加到数据状态中. [#5119](https://github.com/ClickHouse/ClickHouse/pull/5119) ([小路](https://github.com/nicelulu)) -- 用小数修复 `quantileExact` 的结果类型. [#5304](https://github.com/ClickHouse/ClickHouse/pull/5304) ([Artem Zuikov](https://github.com/4ertus2)) - -#### 文档 {#documentation} - -- 将 `CollapsingMergeTree` 的文档翻译成中文. [#5168](https://github.com/ClickHouse/ClickHouse/pull/5168) ([张风啸](https://github.com/AlexZFX)) -- 将一些关于表引擎的文档翻译成中文. [#5134](https://github.com/ClickHouse/ClickHouse/pull/5134) [#5328](https://github.com/ClickHouse/ClickHouse/pull/5328) ([never lee](https://github.com/neverlee)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvements} - -- 复一些显示可能在免费后使用的清除报告. [#5139](https://github.com/ClickHouse/ClickHouse/pull/5139) [#5143](https://github.com/ClickHouse/ClickHouse/pull/5143) [#5393](https://github.com/ClickHouse/ClickHouse/pull/5393) ([Ivan](https://github.com/abyss7)) -- 为方便起见, 将性能测试移出单独的目录. [#5158](https://github.com/ClickHouse/ClickHouse/pull/5158) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复不正确的性能测试. [#5255](https://github.com/ClickHouse/ClickHouse/pull/5255) ([alesapin](https://github.com/alesapin)) -- 增加了一个工具来计算由位转换引起的校验和来调试硬件问题. [#5334](https://github.com/ClickHouse/ClickHouse/pull/5334) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使运行脚本更有用. [#5340](https://github.com/ClickHouse/ClickHouse/pull/5340)[#5360](https://github.com/ClickHouse/ClickHouse/pull/5360) ([filimonov](https://github.com/filimonov)) -- 添加如何编写性能测试的小说明. [#5408](https://github.com/ClickHouse/ClickHouse/pull/5408) ([alesapin](https://github.com/alesapin)) -- 添加在性能测试中的创建、填充和删除查询中进行替换的能力. [#5367](https://github.com/ClickHouse/ClickHouse/pull/5367) ([Olga Khvostikova](https://github.com/stavrolia)) - -## ClickHouse 版本 19.7 {#clickhouse-release-19-7} - -### ClickHouse 版本 19.7.5.29, 2019-07-05 {#clickhouse-release-19-7-5-29-2019-07-05} - -#### Bug 修复 {#bug-fix-25} - -- 使用 JOIN 修复某些查询中的性能回归. [#5192](https://github.com/ClickHouse/ClickHouse/pull/5192) ([Winter Zhang](https://github.com/zhang2014)) - -### ClickHouse 版本 19.7.5.27, 2019-06-09 {#clickhouse-release-19-7-5-27-2019-06-09} - -#### 新特征 {#new-features-1} - -- 添加位图相关函数 `bitmapHasAny` 和 `bitmapHasAll` 类似于数组的 `hasAny` 和 `hasAll` 函数. [#5279](https://github.com/ClickHouse/ClickHouse/pull/5279) ([Sergi Vladykin](https://github.com/svladykin)) - -#### Bug 修复 {#bug-fixes-1} - -- 使用 Null 值修复 `minmax` INDEX 上的段错误. [#5246](https://github.com/ClickHouse/ClickHouse/pull/5246) ([Nikita Vasilev](https://github.com/nikvas0)) -- 将 LIMIT BY 中的所有输入列标记为所需输出。 它修复了某些分布式查询中的 `Not found column` 错误. [#5407](https://github.com/ClickHouse/ClickHouse/pull/5407) ([Constantin S. Pan](https://github.com/kvap)) -- 在带有 DEFAULT 的列上修复 `SELECT .. PREWHERE` 中的 `Column '0' already exists` 错误. [#5397](https://github.com/ClickHouse/ClickHouse/pull/5397) ([proller](https://github.com/proller)) -- 修复 `ReplicatedMergeTree` 上的 `ALTER MODIFY TTL` 查询. [#5539](https://github.com/ClickHouse/ClickHouse/pull/5539/commits) ([Anton Popov](https://github.com/CurtizJ)) -- 当 Kafka 消费者启动失败时不要让服务器崩溃. [#5285](https://github.com/ClickHouse/ClickHouse/pull/5285) ([Ivan](https://github.com/abyss7)) -- 修复位图函数产生错误结果. [#5359](https://github.com/ClickHouse/ClickHouse/pull/5359) ([Andy Yang](https://github.com/andyyzh)) -- 修复哈希字典的 element_count (不包括重复项). [#5440](https://github.com/ClickHouse/ClickHouse/pull/5440) ([Azat Khuzhin](https://github.com/azat)) -- 使用环境变量 TZ 的内容作为时区的名称. 在某些情况下有助于正确检测默认时区. [#5443](https://github.com/ClickHouse/ClickHouse/pull/5443) ([Ivan](https://github.com/abyss7)) -- 不要尝试在 `dictGetT` 函数中转换整数, 因为它不能正常工作. 改为抛出异常. [#5446](https://github.com/ClickHouse/ClickHouse/pull/5446) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复 ExternalData HTTP 请求中的设置. [#5455](https://github.com/ClickHouse/ClickHouse/pull/5455) ([Danila - Kutenin](https://github.com/danlark1)) -- 修复了仅从 FS 中删除部件而不将它们从 Zookeeper 中删除的错误. [#5520](https://github.com/ClickHouse/ClickHouse/pull/5520) ([alesapin](https://github.com/alesapin)) -- 修复了 `bitmapHasAny` 函数中的分段错误. [#5528](https://github.com/ClickHouse/ClickHouse/pull/5528) ([Zhichang Yu](https://github.com/yuzhichang)) -- 修复了复制连接池不重试解析主机时的错误, 即使 DNS 缓存已删除. [#5534](https://github.com/ClickHouse/ClickHouse/pull/5534) ([alesapin](https://github.com/alesapin)) -- 修复了 `DROP INDEX IF EXISTS` 查询. 现在 `ALTER TABLE ... DROP INDEX IF EXISTS ...` 如果提供的索引不存在, 查询不会引发异常. [#5524](https://github.com/ClickHouse/ClickHouse/pull/5524) ([Gleb Novikov](https://github.com/NanoBjorn)) -- 修复联合所有超类型列. 存在数据和结果列的列类型不一致的情况. [#5503](https://github.com/ClickHouse/ClickHouse/pull/5503) ([Artem Zuikov](https://github.com/4ertus2)) -- 在 DDL 查询处理期间跳过 ZNONODE. 在另一个节点删除任务队列中的 znode 之前, 没有处理它但已经获得孩子列表的节点将终止 DDLWorker 线程. [#5489](https://github.com/ClickHouse/ClickHouse/pull/5489) ([Azat Khuzhin](https://github.com/azat)) -- 使用 MATERIALIZED 列将 INSERT 修复到 Distributed() 表中. [#5429](https://github.com/ClickHouse/ClickHouse/pull/5429) ([Azat Khuzhin](https://github.com/azat)) - -### ClickHouse 版本 19.7.3.9, 2019-05-30 {#clickhouse-release-19-7-3-9-2019-05-30} - -#### 新特征 {#new-features-2} - -- 允许限制用户可以指定的设置范围. 这些约束可以在用户设置配置文件中设置. [#4931](https://github.com/ClickHouse/ClickHouse/pull/4931) ([Vitaly Baranov](https://github.com/vitlibar)) -- 添加函数 `groupUniqArray` 的第二个版本, 并带有一个可选的 `max_size` 参数, 用于限制结果数组的大小, 这种行为类似于 `groupArray(max_size)(x)` 函数. [#5026](https://github.com/ClickHouse/ClickHouse/pull/5026) ([Guillaume Tassery](https://github.com/YiuRULE)) -- 对于 TSVWithNames/CSVWithNames 输入文件格式, 现在可以根据文件标题确定列顺序. 这由 `input_format_with_names_use_header` 参数控制. - [#5081](https://github.com/ClickHouse/ClickHouse/pull/5081) ([Alexander](https://github.com/Akazz)) - -#### Bug 修复 {#bug-fixes-2} - -- uncompressed_cache + JOIN在合并期间崩溃. (#5197)[#5133](https://github.com/ClickHouse/ClickHouse/pull/5133) ([Danila Kutenin](https://github.com/danlark1)) -- clickhouse 客户端查询系统表时出现分段错误. #5066. [#5127](https://github.com/ClickHouse/ClickHouse/pull/5127) ([Ivan](https://github.com/abyss7)) -- 通过 KafkaEngine 重载数据丢失. (#4736) [#5080](https://github.com/ClickHouse/ClickHouse/pull/5080) ([Ivan](https://github.com/abyss7)) -- 修复了在使用 UNION ALL 执行涉及至少两个来自 system.columns、system.tables、system.parts、system.parts_tables 或 Merge 系列表的查询并执行相关列的 ALTER 时可能发生的非常罕见的数据竞争条件并发表. [#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 性能改进 {#performance-improvements-1} - -- 使用基数排序按 `ORDER BY` 中的单个数字列进行排序, 而无需 `LIMIT`. [#5106](https://github.com/ClickHouse/ClickHouse/pull/5106), [#4439](https://github.com/ClickHouse/ClickHouse/pull/4439) ([Evgenii Pravda](https://github.com/kvinty), [alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 文档 {#documentation-1} - -- 将一些表引擎的文档翻译成中文. [#5107](https://github.com/ClickHouse/ClickHouse/pull/5107), [#5094](https://github.com/ClickHouse/ClickHouse/pull/5094), [#5087](https://github.com/ClickHouse/ClickHouse/pull/5087) ([张风啸](https://github.com/AlexZFX)), [#5068](https://github.com/ClickHouse/ClickHouse/pull/5068) ([never lee](https://github.com/neverlee)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvements-1} - -- 在 `clickhouse-test` 中正确打印 UTF-8 字符. [#5084](https://github.com/ClickHouse/ClickHouse/pull/5084) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 为 clickhouse-client 添加命令行参数以始终加载建议数据. [#5102](https://github.com/ClickHouse/ClickHouse/pull/5102) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 解决部分 PVS-Studio 警告. [#5082](https://github.com/ClickHouse/ClickHouse/pull/5082) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 更新 LZ4. [#5040](https://github.com/ClickHouse/ClickHouse/pull/5040) ([Danila Kutenin](https://github.com/danlark1)) -- 添加 gperf 以构建即将到来的拉取请求的需求 #5030. [#5110](https://github.com/ClickHouse/ClickHouse/pull/5110) ([proller](https://github.com/proller)) - -## ClickHouse 版本 19.6 {#clickhouse-release-19-6} - -### ClickHouse 版本 19.6.3.18, 2019-06-13 {#clickhouse-release-19-6-3-18-2019-06-13} - -#### Bug 修复 {#bug-fixes-3} - -- 修复了来自表函数 `mysql` 和 `odbc` 以及相应表引擎的查询的 IN 条件下推. 这修复了 #3540 和 #2384. [#5313](https://github.com/ClickHouse/ClickHouse/pull/5313) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 Zookeeper 中的死锁. [#5297](https://github.com/ClickHouse/ClickHouse/pull/5297) ([github1youlc](https://github.com/github1youlc)) -- 允许在 CSV 中引用小数. [#5284](https://github.com/ClickHouse/ClickHouse/pull/5284) ([Artem Zuikov](https://github.com/4ertus2) -- 禁止从浮点 Inf/NaN 转换为小数 (抛出异常). [#5282](https://github.com/ClickHouse/ClickHouse/pull/5282) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复重命名查询中的数据竞争. [#5247](https://github.com/ClickHouse/ClickHouse/pull/5247) ([Winter Zhang](https://github.com/zhang2014)) -- 暂时禁用 LFAlloc. 使用 LFAlloc 可能会导致在分配 UncompressedCache 时出现大量 MAP_FAILED 并导致高负载服务器上的查询崩溃. [cfdba93](https://github.com/ClickHouse/ClickHouse/commit/cfdba938ce22f16efeec504f7f90206a515b1280)([Danila Kutenin](https://github.com/danlark1)) - -### ClickHouse 版本 19.6.2.11, 2019-05-13 {#clickhouse-release-19-6-2-11-2019-05-13} - -#### 新特征 {#new-features-3} - -- 列和表的 TTL 表达式. [#4212](https://github.com/ClickHouse/ClickHouse/pull/4212) ([Anton Popov](https://github.com/CurtizJ)) -- 添加了对 HTTP 响应的 `brotli` 压缩的支持 (接受编码:br). [#4388](https://github.com/ClickHouse/ClickHouse/pull/4388) ([Mikhail](https://github.com/fandyushin)) -- 添加了新函数 `isValidUTF8` 用于检查一组字节是否正确 utf-8 编码. [#4934](https://github.com/ClickHouse/ClickHouse/pull/4934) ([Danila Kutenin](https://github.com/danlark1)) -- 添加新的负载平衡策略 `first_or_random` , 它将查询发送到第一个指定的主机, 如果无法访问, 则将查询发送到分片的随机主机. 对交叉复制拓扑设置有用. [#5012](https://github.com/ClickHouse/ClickHouse/pull/5012) ([nvartolomei](https://github.com/nvartolomei)) - -#### 实验功能 {#experimental-features-1} - -- 为 MergeTree\* 表族添加设置 `index_granularity_bytes` (自适应索引粒度). [#4826](https://github.com/ClickHouse/ClickHouse/pull/4826) ([alesapin](https://github.com/alesapin)) - -#### 改进 {#improvements-1} - -- 添加了对函数 `substringUTF8` 的非常量和负大小和长度参数的支持. [#4989](https://github.com/ClickHouse/ClickHouse/pull/4989) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在左连接中禁用右表下推, 右连接中禁用左表, 以及完全连接中的两个表. 这在某些情况下修复了错误的 JOIN 结果. [#4846](https://github.com/ClickHouse/ClickHouse/pull/4846) ([Ivan](https://github.com/abyss7)) -- `clickhouse-copier`: 从`--task-file`选项自动上传任务配置. [#4876](https://github.com/ClickHouse/ClickHouse/pull/4876) ([proller](https://github.com/proller)) -- 为存储工厂和表函数工厂添加了错别字处理程序. [#4891](https://github.com/ClickHouse/ClickHouse/pull/4891) ([Danila Kutenin](https://github.com/danlark1)) -- 支持无子查询的多个连接的星号和合格星号. [#4898](https://github.com/ClickHouse/ClickHouse/pull/4898) ([Artem Zuikov](https://github.com/4ertus2)) -- 使缺失列错误消息更加用户友好. [#4915](https://github.com/ClickHouse/ClickHouse/pull/4915) ([Artem Zuikov](https://github.com/4ertus2)) - -#### 性能改进 {#performance-improvements-2} - -- ASOF JOIN 的显着加速. [#4924](https://github.com/ClickHouse/ClickHouse/pull/4924) ([Martijn Bakker](https://github.com/Gladdy)) - -#### 向后不兼容更改 {#backward-incompatible-changes} - -- HTTP 标头 `Query-Id` 重命名为 `X-ClickHouse-Query-Id` 以保持一致性. [#4972](https://github.com/ClickHouse/ClickHouse/pull/4972) ([Mikhail](https://github.com/fandyushin)) - -#### Bug 修复 {#bug-fixes-4} - -- 修复了 `clickhouse-copier` 中潜在的空指针取消引用. [#4900](https://github.com/ClickHouse/ClickHouse/pull/4900) ([proller](https://github.com/proller)) -- 修复了 JOIN + ARRAY JOIN 查询错误. [#4938](https://github.com/ClickHouse/ClickHouse/pull/4938) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了当字典通过带有 engine=Dictionary 的数据库依赖另一个字典时服务器启动时挂起的问题. [#4962](https://github.com/ClickHouse/ClickHouse/pull/4962) ([Vitaly Baranov](https://github.com/vitlibar)) -- 部分修复了 `distributed_product_mode = local` . 可以通过表别名允许本地表的列在 `where/have/order by/...` 中. 如果表没有别名, 则抛出异常. 目前还无法访问没有表别名的列. [#4986](https://github.com/ClickHouse/ClickHouse/pull/4986) ([Artem Zuikov](https://github.com/4ertus2)) -- 使用 `JOIN` 修复 `SELECT DISTINCT` 的潜在错误结果. [#5001](https://github.com/ClickHouse/ClickHouse/pull/5001) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了在使用 UNION ALL 执行涉及至少两个来自 system.columns、system.tables、system.parts、system.parts_tables 或 Merge 系列表的查询并执行相关列的 ALTER 时可能发生的非常罕见的数据竞争条件并发表. [#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvements-2} - -- 修复了在不同主机上运行 clickhouse-server 时的测试失败. [#4713](https://github.com/ClickHouse/ClickHouse/pull/4713) ([Vasily Nemkov](https://github.com/Enmk)) -- clickhouse-test: 在非 tty 环境中禁用颜色控制序列. [#4937](https://github.com/ClickHouse/ClickHouse/pull/4937) ([alesapin](https://github.com/alesapin)) -- clickhouse-test: 允许使用任何测试数据库 (尽可能删除 `test.` 限定) [#5008](https://github.com/ClickHouse/ClickHouse/pull/5008) ([proller](https://github.com/proller)) -- 修复 ubsan 错误. [#5037](https://github.com/ClickHouse/ClickHouse/pull/5037) ([Vitaly Baranov](https://github.com/vitlibar)) -- 在 ClickHouse 中添加了 Yandex LFAlloc 以不同方式分配 MarkCache 和 UncompressedCache 数据以更可靠地捕获段错误. [#4995](https://github.com/ClickHouse/ClickHouse/pull/4995) ([Danila Kutenin](https://github.com/danlark1)) -- Python util 可帮助进行向后移植和更改日志. [#4949](https://github.com/ClickHouse/ClickHouse/pull/4949) ([Ivan](https://github.com/abyss7)) - -## ClickHouse 版本 19.5 {#clickhouse-release-19-5} - -### ClickHouse 版本 19.5.4.22, 2019-05-13 {#clickhouse-release-19-5-4-22-2019-05-13} - -#### Bug 修复 {#bug-fixes-5} - -- 修复了位图\* 函数中可能发生的崩溃. [#5220](https://github.com/ClickHouse/ClickHouse/pull/5220) [#5228](https://github.com/ClickHouse/ClickHouse/pull/5228) ([Andy Yang](https://github.com/andyyzh)) -- 修复了在使用 UNION ALL 执行涉及至少两个来自 system.columns、system.tables、system.parts、system.parts_tables 或 Merge 系列表的查询并执行相关列的 ALTER 时可能发生的非常罕见的数据竞争条件并发表. [#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 `Set for IN is not created yet in case of using single LowCardinality column in the left part of IN`. 如果 LowCardinality 列是主键的一部分,则会发生此错误. #5031 [#5154](https://github.com/ClickHouse/ClickHouse/pull/5154) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 保留函数修改: 如果一行同时满足第一个和第NTH个条件, 则只将第一个满足的条件添加到数据状态中. 现在在一行数据中满足的所有条件都添加到数据状态中. [#5119](https://github.com/ClickHouse/ClickHouse/pull/5119) ([小路](https://github.com/nicelulu)) - -### ClickHouse 版本 19.5.3.8, 2019-04-18 {#clickhouse-release-19-5-3-8-2019-04-18} - -#### Bug 修复 {#bug-fixes-6} - -- 固定类型的设置 `max_partitions_per_insert_block` 从布尔值到 UInt64. [#5028](https://github.com/ClickHouse/ClickHouse/pull/5028) ([Mohammad Hossein Sekhavat](https://github.com/mhsekhavat)) - -### ClickHouse 版本 19.5.2.6, 2019-04-15 {#clickhouse-release-19-5-2-6-2019-04-15} - -#### 新特征 {#new-features-4} - -- [Hyperscan](https://github.com/intel/hyperscan) 添加了多个正则表达式匹配 (函数`multiMatchAny`、`multiMatchAnyIndex`、`multiFuzzyMatchAny`、`multiFuzzyMatchAnyIndex`). [#4780](https://github.com/ClickHouse/ClickHouse/pull/4780), [#4841](https://github.com/ClickHouse/ClickHouse/pull/4841) ([Danila Kutenin](https://github.com/danlark1)) -- 添加了 `multiSearchFirstPosition` 功能. [#4780](https://github.com/ClickHouse/ClickHouse/pull/4780) ([Danila Kutenin](https://github.com/danlark1)) -- 表实现每行预定义的表达式过滤器. [#4792](https://github.com/ClickHouse/ClickHouse/pull/4792) ([Ivan](https://github.com/abyss7)) -- 一种基于布隆过滤器的新型数据跳过索引 (可用于`equal`、`in`和`like`函数). [#4499](https://github.com/ClickHouse/ClickHouse/pull/4499) ([Nikita Vasilev](https://github.com/nikvas0)) -- 添加了`ASOF JOIN`, 它允许运行连接到已知最新值的查询. [#4774](https://github.com/ClickHouse/ClickHouse/pull/4774) [#4867](https://github.com/ClickHouse/ClickHouse/pull/4867) [#4863](https://github.com/ClickHouse/ClickHouse/pull/4863) [#4875](https://github.com/ClickHouse/ClickHouse/pull/4875) ([Martijn Bakker](https://github.com/Gladdy), [Artem Zuikov](https://github.com/4ertus2)) -- 将多个 `COMMA JOIN` 重写为 `CROSS JOIN`. 如果可能, 然后将它们重写为 `INNER JOIN` . [#4661](https://github.com/ClickHouse/ClickHouse/pull/4661) ([Artem Zuikov](https://github.com/4ertus2)) - -#### 改进 {#improvement-9} - -- `topK` 和 `topK Weighted` 现在支持自定义 `load Factor`. (fixes issue [#4252](https://github.com/ClickHouse/ClickHouse/issues/4252)). [#4634](https://github.com/ClickHouse/ClickHouse/pull/4634) ([Kirill Danshin](https://github.com/kirillDanshin)) -- 即使对于没有采样的表, 也允许使用 `parallel_replicas_count > 1` (该设置被简单地忽略). 在以前的版本中, 它导致异常. [#4637](https://github.com/ClickHouse/ClickHouse/pull/4637) ([Alexey Elymanov](https://github.com/digitalist)) -- 支持 `CREATE OR REPLACE VIEW`. 允许在单个语句中创建视图或设置新定义. [#4654](https://github.com/ClickHouse/ClickHouse/pull/4654) ([Boris Granveaud](https://github.com/bgranvea)) -- `Buffer` 表引擎现在支持 `PREWHERE`. [#4671](https://github.com/ClickHouse/ClickHouse/pull/4671) ([Yangkuan Liu](https://github.com/LiuYangkuan)) -- 添加在 `readonly` 模式下在zookeeper中启动没有元数据的复制表的能力. [#4691](https://github.com/ClickHouse/ClickHouse/pull/4691) ([alesapin](https://github.com/alesapin)) -- 修复了 clickhouse-client 中进度条的闪烁. 将 `FORMAT Null` 与流查询一起使用时, 该问题最为明显. [#4811](https://github.com/ClickHouse/ClickHouse/pull/4811) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 允许在每个用户的基础上禁用带有 `hyperscan` 库的功能, 以限制可能过度和不受控制的资源使用. [#4816](https://github.com/ClickHouse/ClickHouse/pull/4816) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加版本号记录所有错误. [#4824](https://github.com/ClickHouse/ClickHouse/pull/4824) ([proller](https://github.com/proller)) -- 向 `multiMatch` 函数添加了限制, 该限制要求字符串大小适合 `unsigned int`。 还为 `multiSearch` 函数添加了参数数量限制. [#4834](https://github.com/ClickHouse/ClickHouse/pull/4834) ([Danila Kutenin](https://github.com/danlark1)) -- 改进了 Hyperscan 中暂存空间的使用和错误处理. [#4866](https://github.com/ClickHouse/ClickHouse/pull/4866) ([Danila Kutenin](https://github.com/danlark1)) -- 从 `*GraphiteMergeTree` 引擎表的表配置中填充 `system.graphite_detentions`. [#4584](https://github.com/ClickHouse/ClickHouse/pull/4584) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) -- 将 `trigramDistance` 函数重命名为 `ngramDistance` 并添加更多带有 `CaseInsensitive` 和 `UTF` 的函数. [#4602](https://github.com/ClickHouse/ClickHouse/pull/4602) ([Danila Kutenin](https://github.com/danlark1)) -- 改进的数据跳跃指数计算. [#4640](https://github.com/ClickHouse/ClickHouse/pull/4640) ([Nikita Vasilev](https://github.com/nikvas0)) -- 将普通、`DEFAULT`、`MATERIALIZED` 和`ALIAS` 列保留在一个列表中 (修复问题 [#2867](https://github.com/ClickHouse/ClickHouse/issues/2867)). [#4707](https://github.com/ClickHouse/ClickHouse/pull/4707) ([Alex Zatelepin](https://github.com/ztlpn)) - -#### Bug 修复 {#bug-fix-26} - -- 在内存分配失败的情况下避免使用 `std::terminate`. 现在按预期抛出 `std::bad_alloc` 异常. [#4665](https://github.com/ClickHouse/ClickHouse/pull/4665) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了从缓冲区读取 capnproto 的问题. 有时文件未通过 HTTP 成功加载. [#4674](https://github.com/ClickHouse/ClickHouse/pull/4674) ([Vladislav](https://github.com/smirnov-vs)) -- 在 `OPTIMIZE TABLE FINAL` 查询后修复错误 `Unknown log entry type: 0` . [#4683](https://github.com/ClickHouse/ClickHouse/pull/4683) ([Amos Bird](https://github.com/amosbird)) -- `hasAny` 或 `hasAll` 函数的错误参数可能会导致段错误. [#4698](https://github.com/ClickHouse/ClickHouse/pull/4698) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 执行 `DROP DATABASE dictionary` 查询时可能发生死锁. [#4701](https://github.com/ClickHouse/ClickHouse/pull/4701) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 `median` 和 `quantile` 函数中未定义的行为. [#4702](https://github.com/ClickHouse/ClickHouse/pull/4702) ([hcz](https://github.com/hczhcz)) -- 修复 `network_compression_method` 为小写时的压缩级别检测. 在 v19.1 中损坏. [#4706](https://github.com/ClickHouse/ClickHouse/pull/4706) ([proller](https://github.com/proller)) -- 修复了对 `UTC` 设置的无知 (修复了问题 [#4658](https://github.com/ClickHouse/ClickHouse/issues/4658). [#4718](https://github.com/ClickHouse/ClickHouse/pull/4718) ([proller](https://github.com/proller)) -- 使用 `Distributed` 表修复 `histogram` 函数行为. [#4741](https://github.com/ClickHouse/ClickHouse/pull/4741) ([olegkv](https://github.com/olegkv)) -- 修复了 tsan 报告 `destroy of a locked mutex` 的问题. [#4742](https://github.com/ClickHouse/ClickHouse/pull/4742) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了由于系统日志使用中的竞争条件而导致关闭的 TSan 报告。 修复了启用 part_log 时关闭时潜在的释放后使用问题. [#4758](https://github.com/ClickHouse/ClickHouse/pull/4758) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 `ReplicatedMergeTreeAlterThread` 中的重新检查部分以防出错. [#4772](https://github.com/ClickHouse/ClickHouse/pull/4772) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 中间聚合函数状态的算术运算不适用于常量参数 (例如子查询结果). [#4776](https://github.com/ClickHouse/ClickHouse/pull/4776) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 始终在元数据中反引用列名称. 否则不可能创建一个名为`index`的列的表 (由于元数据中的`ATTACH`查询格式错误, 服务器不会重启). [#4782](https://github.com/ClickHouse/ClickHouse/pull/4782) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 `Distributed` 表上的 `ALTER ... MODIFY ORDER BY` 崩溃. [#4790](https://github.com/ClickHouse/ClickHouse/pull/4790) ([TCeason](https://github.com/TCeason)) -- 使用启用的 `enable_optimize_predicate_expression` 修复 `JOIN ON` 中的段错误. [#4794](https://github.com/ClickHouse/ClickHouse/pull/4794) ([Winter Zhang](https://github.com/zhang2014)) -- 使用来自 Kafka 的 protobuf 消息后通过添加无关行来修复错误. [#4808](https://github.com/ClickHouse/ClickHouse/pull/4808) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复 `JOIN` 在不可为空与可为空列上的崩溃. 修复 `ANY JOIN` + `join_use_nulls` 中右键中的 `NULLs`. [#4815](https://github.com/ClickHouse/ClickHouse/pull/4815) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复 `clickhouse-copier` 中的分段错误. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) -- 如果表被重命名或同时更改, 则修复了来自 `system.tables` 的 `SELECT` 中的竞争条件. [#4836](https://github.com/ClickHouse/ClickHouse/pull/4836) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在获取已经过时的数据部分时修复了数据竞争. [#4839](https://github.com/ClickHouse/ClickHouse/pull/4839) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 MergeTree 系列的 `RENAME` 表中可能发生的罕见数据竞争. [#4844](https://github.com/ClickHouse/ClickHouse/pull/4844) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了函数 `arrayIntersect` 中的分段错误. 如果使用混合常量和普通参数调用函数, 可能会发生分段错误. [#4847](https://github.com/ClickHouse/ClickHouse/pull/4847) ([Lixiang Qian](https://github.com/fancyqlx)) -- 当列包含一长串空数组时, 修复了在极少数情况下从 `Array(LowCardinality)` 列读取的问题. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 当我们加入可空与不可空时,, 修复 `FULL/RIGHT JOIN` 中的崩溃. [#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) -- 在副本之间获取部分时修复 `No message received` 异常. [#4856](https://github.com/ClickHouse/ClickHouse/pull/4856) ([alesapin](https://github.com/alesapin)) -- 修复了在单个数组中有多个重复值的情况下`arrayIntersect`函数错误结果. [#4871](https://github.com/ClickHouse/ClickHouse/pull/4871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复并发 `ALTER COLUMN` 查询期间可能导致服务器崩溃的竞争条件 (修复问题 [#3421](https://github.com/ClickHouse/ClickHouse/issues/3421)). [#4592](https://github.com/ClickHouse/ClickHouse/pull/4592) ([Alex Zatelepin](https://github.com/ztlpn)) -- 使用 const 列修复 `FULL/RIGHT JOIN` 中的错误结果. [#4723](https://github.com/ClickHouse/ClickHouse/pull/4723) ([Artem Zuikov](https://github.com/4ertus2)) -- 用星号修复 `GLOBAL JOIN` 中的重复项. [#4705](https://github.com/ClickHouse/ClickHouse/pull/4705) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复未指定列类型时列 `CODEC` 的 `ALTER MODIFY` 中的参数推导. [#4883](https://github.com/ClickHouse/ClickHouse/pull/4883) ([alesapin](https://github.com/alesapin)) -- 函数 `cutQueryStringAndFragment()` 和 `queryStringAndFragment()` 现在可以在 `URL` 包含片段且没有查询时正常工作. [#4894](https://github.com/ClickHouse/ClickHouse/pull/4894) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复了设置 `min_bytes_to_use_direct_io` 大于零时的罕见错误,当线程必须在列文件中向后寻找时会发生这种情况. [#4897](https://github.com/ClickHouse/ClickHouse/pull/4897) ([alesapin](https://github.com/alesapin)) -- 用 `LowCardinality` 参数修复聚合函数的错误参数类型 (修复问题 [#4919](https://github.com/ClickHouse/ClickHouse/issues/4919)). [#4922](https://github.com/ClickHouse/ClickHouse/pull/4922) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复`GLOBAL JOIN`中的错误名称限定. [#4969](https://github.com/ClickHouse/ClickHouse/pull/4969) ([Artem Zuikov](https://github.com/4ertus2)) -- 修正函数 `toISOWeek` 结果为1970年. [#4988](https://github.com/ClickHouse/ClickHouse/pull/4988) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 `DROP`、`TRUNCATE` 和 `OPTIMIZE` 查询重复, 当在 `ON CLUSTER` 上为 `ReplicatedMergeTree*` 表族执行时. [#4991](https://github.com/ClickHouse/ClickHouse/pull/4991) ([alesapin](https://github.com/alesapin)) - -#### 向后不兼容更新 {#backward-incompatible-change-8} - -- 将设置 `insert_sample_with_metadata` 重命名为设置 `input_format_defaults_for_omited_fields`. [#4771](https://github.com/ClickHouse/ClickHouse/pull/4771) ([Artem Zuikov](https://github.com/4ertus2)) -- 添加了设置 `max_partitions_per_insert_block` (默认值为 100). 如果插入的块包含更多的分区, 则抛出异常. 如果要取消限制, 请将其设置为 0 (不推荐). [#4845](https://github.com/ClickHouse/ClickHouse/pull/4845) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 多重搜索功能被重命名 (`multiPosition` 到 `multiSearchAllPositions`, `multiSearch` 到 `multiSearchAny`, `firstMatch` 到 `multiSearchFirstIndex`). [#4780](https://github.com/ClickHouse/ClickHouse/pull/4780) ([Danila Kutenin](https://github.com/danlark1)) - -#### 性能改进 {#performance-improvement-6} - -- 通过内联优化 Volnitsky 搜索器, 为具有许多针或许多相似二元组的查询提供大约 5-10% 的搜索改进. [#4862](https://github.com/ClickHouse/ClickHouse/pull/4862) ([Danila Kutenin](https://github.com/danlark1)) -- 修复了当设置 `use_uncompressed_cache` 大于零时的性能问题, 当所有读取包含在缓存中的数据时出现 [#4913](https://github.com/ClickHouse/ClickHouse/pull/4913) ([alesapin](https://github.com/alesapin)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-10} - -- 强化调试构建: 更细粒度的内存映射和 ASLR; 为标记缓存和索引添加内存保护. 这允许在 ASan 和 MSan 无法执行的情况下找到更多内存踩踏错误. [#4632](https://github.com/ClickHouse/ClickHouse/pull/4632) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加对 cmake 变量 `ENABLE_PROTOBUF`、`ENABLE_PARQUET` 和`ENABLE_BROTLI` 的支持, 允许启用/禁用上述功能 (与我们对 librdkafka、mysql 等所做的一样). [#4669](https://github.com/ClickHouse/ClickHouse/pull/4669) ([Silviu Caragea](https://github.com/silviucpp)) -- 如果在测试运行后挂起某些查询, 则添加打印所有线程的进程列表和堆栈跟踪的功能. [#4675](https://github.com/ClickHouse/ClickHouse/pull/4675) ([alesapin](https://github.com/alesapin)) -- 在 `clickhouse-test` 中添加对 `Connection loss` 错误的重试. [#4682](https://github.com/ClickHouse/ClickHouse/pull/4682) ([alesapin](https://github.com/alesapin)) -- 使用 vagrant 添加 freebsd 构建并使用线程清理器构建打包脚本. [#4712](https://github.com/ClickHouse/ClickHouse/pull/4712) [#4748](https://github.com/ClickHouse/ClickHouse/pull/4748) ([alesapin](https://github.com/alesapin)) -- 现在用户在安装过程中要求用户 `default` 的密码. [#4725](https://github.com/ClickHouse/ClickHouse/pull/4725) ([proller](https://github.com/proller)) -- 抑制 `rdkafka` 库中的警告. [#4740](https://github.com/ClickHouse/ClickHouse/pull/4740) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 允许在没有 ssl 的情况下构建. [#4750](https://github.com/ClickHouse/ClickHouse/pull/4750) ([proller](https://github.com/proller)) -- 添加一种从自定义用户启动 clickhouse-server 图像的方法. [#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) -- 将 contrib 升级到 1.69. [#4793](https://github.com/ClickHouse/ClickHouse/pull/4793) ([proller](https://github.com/proller)) -- 使用 Thread Sanitizer 编译时禁用 `mremap`. 令人惊讶的是, TSan 没有拦截导致误报的 `mremap` (尽管它确实拦截了 `mmap`、`munmap`). 修复了状态测试中的 TSan 报告. [#4859](https://github.com/ClickHouse/ClickHouse/pull/4859) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 通过 HTTP 接口使用格式模式添加测试检查. [#4864](https://github.com/ClickHouse/ClickHouse/pull/4864) ([Vitaly Baranov](https://github.com/vitlibar)) - -## ClickHouse 版本 19.4 {#clickhouse-release-19-4} - -### ClickHouse 版本 19.4.4.33, 2019-04-17 {#clickhouse-release-19-4-4-33-2019-04-17} - -#### Bug 修复 {#bug-fixes-7} - -- 在内存分配失败的情况下避免使用 `std::terminate`。 现在按预期抛出 `std::bad_alloc` 异常. [#4665](https://github.com/ClickHouse/ClickHouse/pull/4665) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了从缓冲区读取 capnproto 的问题. 有时文件未通过 HTTP 成功加载. [#4674](https://github.com/ClickHouse/ClickHouse/pull/4674) ([Vladislav](https://github.com/smirnov-vs)) -- 在 `OPTIMIZE TABLE FINAL` 查询后修复错误 `Unknown log entry type: 0` . [#4683](https://github.com/ClickHouse/ClickHouse/pull/4683) ([Amos Bird](https://github.com/amosbird)) -- `hasAny` 或 `hasAll` 函数的错误参数可能会导致段错误. [#4698](https://github.com/ClickHouse/ClickHouse/pull/4698) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 执行 `DROP DATABASE dictionary` 查询时可能发生死锁. [#4701](https://github.com/ClickHouse/ClickHouse/pull/4701) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 `median` 和 `quantile` 函数中未定义的行为. [#4702](https://github.com/ClickHouse/ClickHouse/pull/4702) ([hcz](https://github.com/hczhcz)) -- 修复 `network_compression_method` 为小写时的压缩级别检测. 在 v19.1 中损坏. [#4706](https://github.com/ClickHouse/ClickHouse/pull/4706) ([proller](https://github.com/proller)) -- 修复了对 `UTC` 设置的无知 (修复了问题 [#4658](https://github.com/ClickHouse/ClickHouse/issues/4658)). [#4718](https://github.com/ClickHouse/ClickHouse/pull/4718) ([proller](https://github.com/proller)) -- 使用 `Distributed` 表修复 `histogram` 函数行为. [#4741](https://github.com/ClickHouse/ClickHouse/pull/4741) ([olegkv](https://github.com/olegkv)) -- 修复了 tsan 报告 `destroy of a locked mutex` 的问题. [#4742](https://github.com/ClickHouse/ClickHouse/pull/4742) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了由于系统日志使用中的竞争条件而导致关闭的 TSan 报告. 修复了启用 part_log 时关闭时潜在的释放后使用问题. [#4758](https://github.com/ClickHouse/ClickHouse/pull/4758) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 `ReplicatedMergeTreeAlterThread` 中的重新检查部分以防出错. [#4772](https://github.com/ClickHouse/ClickHouse/pull/4772) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 中间聚合函数状态的算术运算不适用于常量参数 (例如子查询结果). [#4776](https://github.com/ClickHouse/ClickHouse/pull/4776) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 始终在元数据中反引用列名称. 否则不可能创建一个名为 `index` 的列的表 (由于元数据中的`ATTACH`查询格式错误, 服务器不会重启). [#4782](https://github.com/ClickHouse/ClickHouse/pull/4782) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 `Distributed` 表上的 `ALTER ... MODIFY ORDER BY` 崩溃. [#4790](https://github.com/ClickHouse/ClickHouse/pull/4790) ([TCeason](https://github.com/TCeason)) -- 修复了启用 `enable_optimize_predicate_expression` 的 `JOIN ON` 中段错误. [#4794](https://github.com/ClickHouse/ClickHouse/pull/4794) ([Winter Zhang](https://github.com/zhang2014)) -- 使用来自 Kafka 的 protobuf 消息后通过添加无关行来修复错误. [#4808](https://github.com/ClickHouse/ClickHouse/pull/4808) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复 `clickhouse-copier` 中的分段错误. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) -- 如果表被重命名或同时更改, 则修复了来自 `system.tables` 的 `SELECT` 中的竞争条件. [#4836](https://github.com/ClickHouse/ClickHouse/pull/4836) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在获取已经过时的数据部分时修复了数据竞争. [#4839](https://github.com/ClickHouse/ClickHouse/pull/4839) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 MergeTree 系列的 `RENAME` 表中可能发生的罕见数据竞争. [#4844](https://github.com/ClickHouse/ClickHouse/pull/4844) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了函数 `arrayIntersect` 中的分段错误. Segmentation fault could happen if function was called with mixed constant and ordinary arguments. [#4847](https://github.com/ClickHouse/ClickHouse/pull/4847) ([Lixiang Qian](https://github.com/fancyqlx)) -- 当列包含一长串空数组时, 修复了在极少数情况下从 `Array(LowCardinality)` 列读取的问题. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 在副本之间获取部分时修复 `No message received` 异常. [#4856](https://github.com/ClickHouse/ClickHouse/pull/4856) ([alesapin](https://github.com/alesapin)) -- 修复了在单个数组中有多个重复值的情况下`arrayIntersect`函数错误结果. [#4871](https://github.com/ClickHouse/ClickHouse/pull/4871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复并发 `ALTER COLUMN` 查询期间可能导致服务器崩溃的竞争条件 (修复问题 [#3421](https://github.com/ClickHouse/ClickHouse/issues/3421)). [#4592](https://github.com/ClickHouse/ClickHouse/pull/4592) ([Alex Zatelepin](https://github.com/ztlpn)) -- 修复未指定列类型时列 `CODEC` 的 `ALTER MODIFY` 中的参数推导. [#4883](https://github.com/ClickHouse/ClickHouse/pull/4883) ([alesapin](https://github.com/alesapin)) -- 函数 `cutQueryStringAndFragment()` 和 `queryStringAndFragment()` 现在可以在 `URL` 包含片段且没有查询时正常工作. [#4894](https://github.com/ClickHouse/ClickHouse/pull/4894) ([Vitaly Baranov](https://github.com/vitlibar)) -- 修复了设置 `min_bytes_to_use_direct_io` 大于零时的罕见错误,当线程必须在列文件中向后寻找时会发生这种情况. [#4897](https://github.com/ClickHouse/ClickHouse/pull/4897) ([alesapin](https://github.com/alesapin)) -- 使用 `LowCardinality` 参数修复聚合函数的错误参数类型 (修复问题 [#4919](https://github.com/ClickHouse/ClickHouse/issues/4919)). [#4922](https://github.com/ClickHouse/ClickHouse/pull/4922) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修正函数 `toISOWeek` 结果为1970年. [#4988](https://github.com/ClickHouse/ClickHouse/pull/4988) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 `DROP`、`TRUNCATE` 和 `OPTIMIZE` 查询重复,当在 `ON CLUSTER` 上为 `ReplicatedMergeTree*` 表族执行时. [#4991](https://github.com/ClickHouse/ClickHouse/pull/4991) ([alesapin](https://github.com/alesapin)) - -#### 改进 {#improvements-2} - -- 将普通、`DEFAULT`、`MATERIALIZED` 和`ALIAS` 列保留在一个列表中 (修复问题 [#2867](https://github.com/ClickHouse/ClickHouse/issues/2867)). [#4707](https://github.com/ClickHouse/ClickHouse/pull/4707) ([Alex Zatelepin](https://github.com/ztlpn)) - -### ClickHouse 版本 19.4.3.11, 2019-04-02 {#clickhouse-release-19-4-3-11-2019-04-02} - -#### Bug 修复 {#bug-fixes-8} - -- 当我们加入可空与不可空时, 修复 `FULL/RIGHT JOIN` 中的崩溃. [#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复 `clickhouse-copier` 中的分段错误. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-11} - -- Add a way to launch clickhouse-server image from a custom user. [#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) - -### ClickHouse 版本 19.4.2.7, 2019-03-30 {#clickhouse-release-19-4-2-7-2019-03-30} - -#### Bug 修复 {#bug-fixes-9} - -- 当列包含一长串空数组时, 修复了在极少数情况下从 `Array(LowCardinality)` 列读取的问题. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) - -### ClickHouse 版本 19.4.1.3, 2019-03-19 {#clickhouse-release-19-4-1-3-2019-03-19} - -#### Bug 修复 {#bug-fixes-10} - -- 修复了同时包含`LIMIT BY` 和`LIMIT` 的远程查询. 以前, 如果使用 `LIMIT BY` 和 `LIMIT` 进行远程查询, `LIMIT`可能发生在`LIMIT BY`之前, 导致过滤结果过分. [#4708](https://github.com/ClickHouse/ClickHouse/pull/4708) ([Constantin S. Pan](https://github.com/kvap)) - -### ClickHouse 版本 19.4.0.49, 2019-03-09 {#clickhouse-release-19-4-0-49-2019-03-09} - -#### 新特征 {#new-features-5} - -- 添加了对 `Protobuf` 格式的完全支持 (输入和输出, 嵌套数据结构). [#4174](https://github.com/ClickHouse/ClickHouse/pull/4174) [#4493](https://github.com/ClickHouse/ClickHouse/pull/4493) ([Vitaly Baranov](https://github.com/vitlibar)) -- 使用 Roaring Bitmaps 添加位图功能. [#4207](https://github.com/ClickHouse/ClickHouse/pull/4207) ([Andy Yang](https://github.com/andyyzh)) [#4568](https://github.com/ClickHouse/ClickHouse/pull/4568) ([Vitaly Baranov](https://github.com/vitlibar)) -- Parquet 格式支持. [#4448](https://github.com/ClickHouse/ClickHouse/pull/4448) ([proller](https://github.com/proller)) -- 添加了 N-gram 距离以进行模糊字符串比较. 它类似于 R 语言中的 q-gram 度量. [#4466](https://github.com/ClickHouse/ClickHouse/pull/4466) ([Danila Kutenin](https://github.com/danlark1)) -- 从专用的聚合和保留模式中组合石墨聚合规则. [#4426](https://github.com/ClickHouse/ClickHouse/pull/4426) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) -- 添加了 `max_execution_speed` 和 `max_execution_speed_bytes` 以限制资源使用. 添加了`min_execution_speed_bytes`设置以补充`min_execution_speed`. [#4430](https://github.com/ClickHouse/ClickHouse/pull/4430) ([Winter Zhang](https://github.com/zhang2014)) -- 实现的函数`flatten`. [#4555](https://github.com/ClickHouse/ClickHouse/pull/4555) [#4409](https://github.com/ClickHouse/ClickHouse/pull/4409) ([alexey-milovidov](https://github.com/alexey-milovidov), [kzon](https://github.com/kzon)) -- 添加了函数 `arrayEnumerateDenseRanked` 和 `arrayEnumerateUniqRanked` (类似于 `arrayEnumerateUniq`, 但允许微调数组深度以查看多维数组内部). [#4475](https://github.com/ClickHouse/ClickHouse/pull/4475) ([proller](https://github.com/proller)) [#4601](https://github.com/ClickHouse/ClickHouse/pull/4601) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 有一些限制的多个 JOINS: 没有星号, 在 ON/WHERE/GROUP BY/... 中没有复杂的别名. [#4462](https://github.com/ClickHouse/ClickHouse/pull/4462) ([Artem Zuikov](https://github.com/4ertus2)) - -#### Bug 修复 {#bug-fixes-11} - -- 此版本还包含 19.3 和 19.1 的所有错误修复. -- 修复了数据跳过索引中的错误: INSERT 后的颗粒顺序不正确. [#4407](https://github.com/ClickHouse/ClickHouse/pull/4407) ([Nikita Vasilev](https://github.com/nikvas0)) -- 修复了 `Nullable` 和 `LowCardinality` 列的 `set` 索引. 在此之前, 带有 `Nullable` 或 `LowCardinality` 列的 `set` 索引在选择时导致错误 `Data type must be deserialized with multiple streams` . [#4594](https://github.com/ClickHouse/ClickHouse/pull/4594) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 在完整的 `executable` 字典更新时正确设置 update_time. [#4551](https://github.com/ClickHouse/ClickHouse/pull/4551) ([Tema Novikov](https://github.com/temoon)) -- 修复 19.3 中损坏的进度条. [#4627](https://github.com/ClickHouse/ClickHouse/pull/4627) ([filimonov](https://github.com/filimonov)) -- 修复了在某些情况下内存区域缩小时 MemoryTracker 不一致的值. [#4619](https://github.com/ClickHouse/ClickHouse/pull/4619) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 ThreadPool 中未定义的行为. [#4612](https://github.com/ClickHouse/ClickHouse/pull/4612) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了一个非常罕见的崩溃, 消息 `mutex lock failed: Invalid argument` 可能发生在 MergeTree 表与 SELECT 同时删除时. [#4608](https://github.com/ClickHouse/ClickHouse/pull/4608) ([Alex Zatelepin](https://github.com/ztlpn)) -- ODBC 驱动程序与 `LowCardinality` 数据类型兼容. [#4381](https://github.com/ClickHouse/ClickHouse/pull/4381) ([proller](https://github.com/proller)) -- FreeBSD: `AIOcontextPool: Found io_event with unknown id 0` 错误的修复. [#4438](https://github.com/ClickHouse/ClickHouse/pull/4438) ([urgordeadbeef](https://github.com/urgordeadbeef)) -- `system.part_log` 表的创建与配置无关. [#4483](https://github.com/ClickHouse/ClickHouse/pull/4483) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 复缓存字典的 `dictIsIn` 函数中未定义的行为. [#4515](https://github.com/ClickHouse/ClickHouse/pull/4515) ([alesapin](https://github.com/alesapin)) -- 修复了当 SELECT 查询多次锁定同一个表 (例如来自不同线程或执行多个子查询时) 并且存在并发 DDL 查询时的死锁. [#4535](https://github.com/ClickHouse/ClickHouse/pull/4535) ([Alex Zatelepin](https://github.com/ztlpn)) -- 默认情况下禁用 compile_expressions 直到我们获得自己的 `llvm` contrib 并且可以使用 `clang` 和 `asan` 对其进行测试. [#4579](https://github.com/ClickHouse/ClickHouse/pull/4579) ([alesapin](https://github.com/alesapin)) -- `clickhouse` 外部字典源的 `invalidate_query` 返回错误的结果集 (空或多于一行或多于一列) 时, 防止 `std::terminate`. 修复了每五秒执行一次 `invalidate_query` 的问题, 而不管 `lifetime`. [#4583](https://github.com/ClickHouse/ClickHouse/pull/4583) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 当具有 `clickhouse` 源的字典的 `invalidate_query` 涉及 `system.dictionaries` 表或 `Dictionaries` 数据库时, 避免死锁 (罕见情况). [#4599](https://github.com/ClickHouse/ClickHouse/pull/4599) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 WHERE 为空的 CROSS JOIN. [#4598](https://github.com/ClickHouse/ClickHouse/pull/4598) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了传递常量参数时函数 `replicate` 中的段错误. [#4603](https://github.com/ClickHouse/ClickHouse/pull/4603) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使用谓词优化器修复 lambda 函数. [#4408](https://github.com/ClickHouse/ClickHouse/pull/4408) ([Winter Zhang](https://github.com/zhang2014)) -- 多个连接多个修复. [#4595](https://github.com/ClickHouse/ClickHouse/pull/4595) ([Artem Zuikov](https://github.com/4ertus2)) - -#### 改进 {#improvements-3} - -- 支持右表列的 JOIN ON 部分中的别名. [#4412](https://github.com/ClickHouse/ClickHouse/pull/4412) ([Artem Zuikov](https://github.com/4ertus2)) -- 多个 JOIN 的结果需要在子选择中使用正确的结果名称. 在结果中用源名称替换平面别名. [#4474](https://github.com/ClickHouse/ClickHouse/pull/4474) ([Artem Zuikov](https://github.com/4ertus2)) -- 改进连接语句的下推逻辑. [#4387](https://github.com/ClickHouse/ClickHouse/pull/4387) ([Ivan](https://github.com/abyss7)) - -#### 性能改进 {#performance-improvements-3} - -- 改进了 `move to PREWHERE` 优化的启发式方法. [#4405](https://github.com/ClickHouse/ClickHouse/pull/4405) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使用适当的查找表, 使用 HashTable 的 API 获取 8 位和 16 位密钥. [#4536](https://github.com/ClickHouse/ClickHouse/pull/4536) ([Amos Bird](https://github.com/amosbird)) -- 改进了字符串比较的性能. [#4564](https://github.com/ClickHouse/ClickHouse/pull/4564) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在单独的线程中清理分布式 DDL 队列, 使其不会减慢处理分布式 DDL 任务的主循环. [#4502](https://github.com/ClickHouse/ClickHouse/pull/4502) ([Alex Zatelepin](https://github.com/ztlpn)) -- 当 `min_bytes_to_use_direct_io` 设置为 1 时, 并不是每个文件都以 O_DIRECT 模式打开, 因为读取的数据大小有时会被一个压缩块的大小低估. [#4526](https://github.com/ClickHouse/ClickHouse/pull/4526) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-12} - -- 添加了对 clang-9 的支持. [#4604](https://github.com/ClickHouse/ClickHouse/pull/4604) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复错误的 `__asm__` 指令 (再次). [#4621](https://github.com/ClickHouse/ClickHouse/pull/4621) ([Konstantin Podshumok](https://github.com/podshumok)) -- 添加从命令行指定 `clickhouse-performance-test` 设置的功能. [#4437](https://github.com/ClickHouse/ClickHouse/pull/4437) ([alesapin](https://github.com/alesapin)) -- 将字典测试添加到集成测试. [#4477](https://github.com/ClickHouse/ClickHouse/pull/4477) ([alesapin](https://github.com/alesapin)) -- 将来自网站基准测试的查询添加到自动化性能测试中. [#4496](https://github.com/ClickHouse/ClickHouse/pull/4496) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- `xxhash.h` 在外部 lz4 中不存在, 因为它是一个实现细节, 它的符号使用 `XXH_NAMESPACE` 宏命名. 当 lz4 是外部的时, xxHash 也必须是外部的, 并且依赖项必须链接到它. [#4495](https://github.com/ClickHouse/ClickHouse/pull/4495) ([Orivej Desh](https://github.com/orivej)) -- 修复了可以使用负数或浮点参数调用 `quantileTiming` 聚合函数的情况 (这修复了使用未定义行为清理器的模糊测试). [#4506](https://github.com/ClickHouse/ClickHouse/pull/4506) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 拼写错误更正. [#4531](https://github.com/ClickHouse/ClickHouse/pull/4531) ([sdk2](https://github.com/sdk2)) -- 修复 Mac 上的编译. [#4371](https://github.com/ClickHouse/ClickHouse/pull/4371) ([Vitaly Baranov](https://github.com/vitlibar)) -- 为 FreeBSD 和各种不寻常的构建配置构建修复. [#4444](https://github.com/ClickHouse/ClickHouse/pull/4444) ([proller](https://github.com/proller)) - -## ClickHouse 版本 19.3 {#clickhouse-release-19-3} - -### ClickHouse 版本 19.3.9.1, 2019-04-02 {#clickhouse-release-19-3-9-1-2019-04-02} - -#### Bug 修复 {#bug-fixes-12} - -- 当我们加入可空与不可空时, 修复 `FULL/RIGHT JOIN` 中的崩溃. [#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复 `clickhouse-copier` 中的分段错误. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) -- 当列包含一长串空数组时, 修复了在极少数情况下从 `Array(LowCardinality)` 列读取的问题. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvement-13} - -- 添加一种从自定义用户启动 clickhouse-server 图像的方法. [#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) - -### ClickHouse 版本 19.3.7, 2019-03-12 {#clickhouse-release-19-3-7-2019-03-12} - -#### Bug 修复 {#bug-fixes-13} - -- 修复了 #3920 中的错误。 此错误表现为随机缓存损坏 (消息 `Unknown codec family code`, `Cannot seek through file` ) 和段错误. 此错误首先出现在 19.1 版本中, 并存在于 19.1.10 和 19.3.6 之前的版本中. [#4623](https://github.com/ClickHouse/ClickHouse/pull/4623) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.3.6, 2019-03-02 {#clickhouse-release-19-3-6-2019-03-02} - -#### Bug 修复 {#bug-fixes-14} - -- 当线程池中的线程超过1000个时, 线程退出可能会发生`std::terminate`. [Azat Khuzhin](https://github.com/azat) [#4485](https://github.com/ClickHouse/ClickHouse/pull/4485) [#4505](https://github.com/ClickHouse/ClickHouse/pull/4505) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 现在可以创建带有注释的 `ReplicatedMergeTree*` 表,没有默认值的列和带有没有注释和默认值的列编解码器的表. 还修复了编解码器的比较. [#4523](https://github.com/ClickHouse/ClickHouse/pull/4523) ([alesapin](https://github.com/alesapin)) -- 修复了使用数组或元组 JOIN 时的崩溃. [#4552](https://github.com/ClickHouse/ClickHouse/pull/4552) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了 clickhouse-copier 崩溃并显示消息 `ThreadStatus not created` . [#4540](https://github.com/ClickHouse/ClickHouse/pull/4540) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了使用分布式ddl时服务器关闭时的挂起问题. [#4472](https://github.com/ClickHouse/ClickHouse/pull/4472) ([Alex Zatelepin](https://github.com/ztlpn)) -- 错误消息中打印了不正确的列号, 该错误消息是对编号大于 10 的列进行文本格式解析. [#4484](https://github.com/ClickHouse/ClickHouse/pull/4484) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvements-3} - -- 修复了启用 AVX 的构建. [#4527](https://github.com/ClickHouse/ClickHouse/pull/4527) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 用基于已知版本而不是编译它的内核的扩展记帐和 IO 记帐. [#4541](https://github.com/ClickHouse/ClickHouse/pull/4541) ([nvartolomei](https://github.com/nvartolomei)) -- 用基于已知版本而不是合成它的知识的扩展记录帐和 IO. [#4473](https://github.com/ClickHouse/ClickHouse/pull/4473) ([proller](https://github.com/proller)) -- 删除了 `Field.cpp` 中 `void readBinary(...)` 的 `inline` 标签. 还合并了冗余的 `namespace DB` 块. [#4530](https://github.com/ClickHouse/ClickHouse/pull/4530) ([hcz](https://github.com/hczhcz)) - -### ClickHouse 版本 19.3.5, 2019-02-21 {#clickhouse-release-19-3-5-2019-02-21} - -#### Bug 修复 {#bug-fixes-15} - -- 修复了大型 http 插入查询处理的错误. [#4454](https://github.com/ClickHouse/ClickHouse/pull/4454) ([alesapin](https://github.com/alesapin)) -- 修复了由于 `send_logs_level` 设置的错误实现而导致的与旧版本的向后不兼容. [#4445](https://github.com/ClickHouse/ClickHouse/pull/4445) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了使用列注释引入的表函数`remote` 向后不兼容的问题. [#4446](https://github.com/ClickHouse/ClickHouse/pull/4446) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.3.4, 2019-02-16 {#clickhouse-release-19-3-4-2019-02-16} - -#### 改进 {#improvements-4} - -- 当执行 `ATTACH Table` 查询时, 表索引大小不考虑内存限制. 避免了表被分离后无法被附加的可能性. [#4396](https://github.com/ClickHouse/ClickHouse/pull/4396) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 稍微提高了从 ZooKeeper 接收的最大字符串和数组大小的限制. 它允许继续使用 ZooKeeper 上增加的 `CLIENT_JVMFLAGS=-Djute.maxbuffer=...` 大小. [#4398](https://github.com/ClickHouse/ClickHouse/pull/4398) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 允许修复废弃的副本, 即使它的队列中已经有大量节点. [#4399](https://github.com/ClickHouse/ClickHouse/pull/4399) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 向`SET`索引添加一个必需参数 (最大存储行数). [#4386](https://github.com/ClickHouse/ClickHouse/pull/4386) ([Nikita Vasilev](https://github.com/nikvas0)) - -#### Bug 修复 {#bug-fixes-16} - -- 修复了按单个 `LowCardinality` 键分组的 `WITH ROLLUP` 结果. [#4384](https://github.com/ClickHouse/ClickHouse/pull/4384) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 修复了集合索引中的错误 (如果包含超过 `max_rows` 行,则删除一个粒度). [#4386](https://github.com/ClickHouse/ClickHouse/pull/4386) ([Nikita Vasilev](https://github.com/nikvas0)) -- 许多 FreeBSD 构建修复. [#4397](https://github.com/ClickHouse/ClickHouse/pull/4397) ([proller](https://github.com/proller)) -- 使用包含相同别名的子查询修复了查询中的别名替换 (问题 [#4110](https://github.com/ClickHouse/ClickHouse/issues/4110)). [#4351](https://github.com/ClickHouse/ClickHouse/pull/4351) ([Artem Zuikov](https://github.com/4ertus2)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvements-4} - -- 添加在 docker 镜像中运行 `clickhouse-server` 以进行无状态测试的能力. [#4347](https://github.com/ClickHouse/ClickHouse/pull/4347) ([Vasily Nemkov](https://github.com/Enmk)) - -### ClickHouse 版本 19.3.3, 2019-02-13 {#clickhouse-release-19-3-3-2019-02-13} - -#### 新特征 {#new-features-6} - -- 添加了 `KILL MUTATION` 语句,允许删除由于某些原因卡住的突变。 将 `latest_failed_part`、`latest_fail_time`、`latest_fail_reason` 字段添加到 `system.mutations` 表中,以便于故障排除. [#4287](https://github.com/ClickHouse/ClickHouse/pull/4287) ([Alex Zatelepin](https://github.com/ztlpn)) -- 添加了计算信息熵的聚合函数 `entropy` . [#4238](https://github.com/ClickHouse/ClickHouse/pull/4238) ([Quid37](https://github.com/Quid37)) -- 添加了向服务器发送查询 `INSERT INTO tbl VALUES (....)` 的功能, 而无需拆分 `query` 和 `data` 部分. [#4301](https://github.com/ClickHouse/ClickHouse/pull/4301) ([alesapin](https://github.com/alesapin)) -- 添加了 `arrayWithConstant` 函数的通用实现. [#4322](https://github.com/ClickHouse/ClickHouse/pull/4322) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 实现了`NOT BETWEEN`比较运算符. [#4228](https://github.com/ClickHouse/ClickHouse/pull/4228) ([Dmitry Naumov](https://github.com/nezed)) -- 实现 `sumMapFiltered` 以便能够限制 `sumMap` 对其值求和的键的数量. [#4129](https://github.com/ClickHouse/ClickHouse/pull/4129) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) -- 在 `mysql` 表函数中添加了对 `Nullable` 类型的支持. [#4198](https://github.com/ClickHouse/ClickHouse/pull/4198) ([Emmanuel Donin de Rosière](https://github.com/edonin)) -- 支持 `LIMIT` 子句中的任意常量表达式. [#4246](https://github.com/ClickHouse/ClickHouse/pull/4246) ([k3box](https://github.com/k3box)) -- 添加了 `topKWeighted` 聚合函数, 该函数采用带 (无符号整数) 权重的附加参数. [#4245](https://github.com/ClickHouse/ClickHouse/pull/4245) ([Andrew Golman](https://github.com/andrewgolman)) -- `StorageJoin` 现在支持 `join_any_take_last_row` 设置, 允许覆盖相同键的现有值. [#3973](https://github.com/ClickHouse/ClickHouse/pull/3973) ([Amos Bird](https://github.com/amosbird) -- 添加函数 `toStartOfInterval` . [#4304](https://github.com/ClickHouse/ClickHouse/pull/4304) ([Vitaly Baranov](https://github.com/vitlibar)) -- 添加了 `RowBinaryWithNamesAndTypes` 格式. [#4200](https://github.com/ClickHouse/ClickHouse/pull/4200) ([Oleg V. Kozlyuk](https://github.com/DarkWanderer)) -- 添加了 `IPv4` 和 `IPv6` 数据类型. 更有效地实现 `IPv*` 功能. [#3669](https://github.com/ClickHouse/ClickHouse/pull/3669) ([Vasily Nemkov](https://github.com/Enmk)) -- 添加函数 `toStartOfTenMinutes()`. [#4298](https://github.com/ClickHouse/ClickHouse/pull/4298) ([Vitaly Baranov](https://github.com/vitlibar)) -- 添加了 `Protobuf` 输出格式. [#4005](https://github.com/ClickHouse/ClickHouse/pull/4005) [#4158](https://github.com/ClickHouse/ClickHouse/pull/4158) ([Vitaly Baranov](https://github.com/vitlibar)) -- 为数据导入的 HTTP 接口添加了 brotli 支持 (插入). [#4235](https://github.com/ClickHouse/ClickHouse/pull/4235) ([Mikhail](https://github.com/fandyushin)) -- 添加了用户在函数名称中输入拼写错误或在命令行客户端中输入时的提示. [#4239](https://github.com/ClickHouse/ClickHouse/pull/4239) ([Danila Kutenin](https://github.com/danlark1)) -- 将 `Query-Id` 添加到服务器的 HTTP 响应标头. [#4231](https://github.com/ClickHouse/ClickHouse/pull/4231) ([Mikhail](https://github.com/fandyushin)) - -#### 实验功能 {#experimental-features-2} - -- 为 MergeTree 表引擎系列添加了 `minmax` 和 `set` 数据跳过索引. [#4143](https://github.com/ClickHouse/ClickHouse/pull/4143) ([Nikita Vasilev](https://github.com/nikvas0)) -- 如果可能, 添加了 `CROSS JOIN` 到 `INNER JOIN` 的转换. [#4221](https://github.com/ClickHouse/ClickHouse/pull/4221) [#4266](https://github.com/ClickHouse/ClickHouse/pull/4266) ([Artem Zuikov](https://github.com/4ertus2)) - -#### Bug 修复 {#bug-fixes-17} - -- 修复了 `JOIN ON` 部分中重复列的 `Not found column` . [#4279](https://github.com/ClickHouse/ClickHouse/pull/4279) ([Artem Zuikov](https://github.com/4ertus2)) -- 使 `START REPLICATED SENDS` 命令开始复制发送. [#4229](https://github.com/ClickHouse/ClickHouse/pull/4229) ([nvartolomei](https://github.com/nvartolomei)) -- 使用 `Array(LowCardinality)` 参数修复了聚合函数的执行. [#4055](https://github.com/ClickHouse/ClickHouse/pull/4055) ([KochetovNicolai](https://github.com/KochetovNicolai)) -- 修复了在执行 `INSERT ... SELECT ... FROM file(...)` 查询和文件具有 `CSVWithNames` 或 `TSVWIthNames` 格式并且缺少第一个数据行时的错误行为. [#4297](https://github.com/ClickHouse/ClickHouse/pull/4297) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了字典不可用时重新加载字典时崩溃的问题. 这个bug出现在19.1.6. [#4188](https://github.com/ClickHouse/ClickHouse/pull/4188) ([proller](https://github.com/proller)) -- 修复了右表中有重复项的 `ALL JOIN` . [#4184](https://github.com/ClickHouse/ClickHouse/pull/4184) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了 `use_uncompressed_cache=1` 的分段错误和错误未压缩大小的异常. 这个bug出现在19.1.6. [#4186](https://github.com/ClickHouse/ClickHouse/pull/4186) ([alesapin](https://github.com/alesapin)) -- 修复了 `compile_expressions` 与大 (超过 int16) 日期比较的错误. [#4341](https://github.com/ClickHouse/ClickHouse/pull/4341) ([alesapin](https://github.com/alesapin)) -- 从表函数 `numbers(0)` 中选择时修复了无限循环. [#4280](https://github.com/ClickHouse/ClickHouse/pull/4280) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 暂时禁用 `ORDER BY` 的谓词优化. [#3890](https://github.com/ClickHouse/ClickHouse/pull/3890) ([Winter Zhang](https://github.com/zhang2014)) -- 修复了在旧 CPU 上使用 base64 函数时的 `Illegal instruction` 错误. 仅在使用 gcc-8 编译 ClickHouse 时才重现此错误. [#4275](https://github.com/ClickHouse/ClickHouse/pull/4275) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了通过 TLS 连接与 PostgreSQL ODBC 驱动程序交互时的 `No message received` 错误. 还修复了使用 MySQL ODBC 驱动程序时的段错误. [#4170](https://github.com/ClickHouse/ClickHouse/pull/4170) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了在条件运算符 (函数 `if`) 的分支中使用 `Date` 和 `DateTime` 参数时不正确的结果. 为函数 `if` 添加了通用情况. [#4243](https://github.com/ClickHouse/ClickHouse/pull/4243) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- ClickHouse 词典现在在 `clickhouse` 进程中加载. [#4166](https://github.com/ClickHouse/ClickHouse/pull/4166) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了在 `No such file or directory` 错误后重试带有 `File` 引擎的表中的 `SELECT` 时的死锁. [#4161](https://github.com/ClickHouse/ClickHouse/pull/4161) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了从 `system.tables` 中选择时的竞争条件可能会出现 `table does not exist` 错误. [#4313](https://github.com/ClickHouse/ClickHouse/pull/4313) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 如果以交互模式运行, `clickhouse-client` 可以在退出时加载命令行建议数据时出现段错误. [#4317](https://github.com/ClickHouse/ClickHouse/pull/4317) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了执行包含 `IN` 运算符的突变时产生错误结果的错误. [#4099](https://github.com/ClickHouse/ClickHouse/pull/4099) ([Alex Zatelepin](https://github.com/ztlpn)) -- 修复错误: 如果有一个带有 `Dictionary` 引擎的数据库, 所有词典都在服务器启动时强制加载, 如果有来自localhost的带有ClickHouse源的词典, 则该词典无法加载. [#4255](https://github.com/ClickHouse/ClickHouse/pull/4255) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了在服务器关闭时尝试再次创建系统日志时的错误. [#4254](https://github.com/ClickHouse/ClickHouse/pull/4254) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 正确返回正确的类型并正确处理 `joinGet` 函数中的锁. [#4153](https://github.com/ClickHouse/ClickHouse/pull/4153) ([Amos Bird](https://github.com/amosbird)) -- 添加了 `sumMapWithOverflow` 函数. [#4151](https://github.com/ClickHouse/ClickHouse/pull/4151) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) -- 使用 `allow_experimental_multiple_joins_emulation` 修复段错误. [52de2c](https://github.com/ClickHouse/ClickHouse/commit/52de2cd927f7b5257dd67e175f0a5560a48840d0) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了错误的 `Date` 和`DateTime` 比较错误. [#4237](https://github.com/ClickHouse/ClickHouse/pull/4237) ([valexey](https://github.com/valexey)) -- 修复了未定义行为消毒剂下的模糊测试: 添加了对 `quantile*Weighted` 系列函数的参数类型检查. [#4145](https://github.com/ClickHouse/ClickHouse/pull/4145) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了删除旧数据部分可能会因 `File not found` 错误而失败时的罕见竞争条件. [#4378](https://github.com/ClickHouse/ClickHouse/pull/4378) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复缺少 /etc/clickhouse-server/config.xml 的安装包. [#4343](https://github.com/ClickHouse/ClickHouse/pull/4343) ([proller](https://github.com/proller)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvements-5} - -- Debian 软件包: 根据配置更正 /etc/clickhouse-server/preprocessed 链接. [#4205](https://github.com/ClickHouse/ClickHouse/pull/4205) ([proller](https://github.com/proller)) -- FreeBSD 的各种构建修复. [#4225](https://github.com/ClickHouse/ClickHouse/pull/4225) ([proller](https://github.com/proller)) -- 添加了在 perftest 中创建、填充和删除表格的功能. [#4220](https://github.com/ClickHouse/ClickHouse/pull/4220) ([alesapin](https://github.com/alesapin)) -- 添加了一个脚本来检查重复的包含. [#4326](https://github.com/ClickHouse/ClickHouse/pull/4326) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了在性能测试中按索引运行查询的功能. [#4264](https://github.com/ClickHouse/ClickHouse/pull/4264) ([alesapin](https://github.com/alesapin)) -- 建议安装带有调试符号的包. [#4274](https://github.com/ClickHouse/ClickHouse/pull/4274) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 重构性能测试. 更好的日志记录和信号处理. [#4171](https://github.com/ClickHouse/ClickHouse/pull/4171) ([alesapin](https://github.com/alesapin)) -- 向匿名化的 Yandex.Metrika 数据集添加了文档. [#4164](https://github.com/ClickHouse/ClickHouse/pull/4164) ([alesapin](https://github.com/alesapin)) -- Аdded 工具, 用于将旧的月份分区部分转换为自定义分区格式. [#4195](https://github.com/ClickHouse/ClickHouse/pull/4195) ([Alex Zatelepin](https://github.com/ztlpn)) -- 在 s3 中添加了关于两个数据集的文档. [#4144](https://github.com/ClickHouse/ClickHouse/pull/4144) ([alesapin](https://github.com/alesapin)) -- 添加了从拉取请求描述创建变更日志的脚本. [#4169](https://github.com/ClickHouse/ClickHouse/pull/4169) [#4173](https://github.com/ClickHouse/ClickHouse/pull/4173) ([KochetovNicolai](https://github.com/KochetovNicolai)) ([KochetovNicolai](https://github.com/KochetovNicolai)) -- 为 ClickHouse 添加了 puppet 模块. [#4182](https://github.com/ClickHouse/ClickHouse/pull/4182) ([Maxim Fedotov](https://github.com/MaxFedotov)) -- 添加了一组未记录功能的文档. [#4168](https://github.com/ClickHouse/ClickHouse/pull/4168) ([Winter Zhang](https://github.com/zhang2014)) -- ARM 构建修复. [#4210](https://github.com/ClickHouse/ClickHouse/pull/4210)[#4306](https://github.com/ClickHouse/ClickHouse/pull/4306) [#4291](https://github.com/ClickHouse/ClickHouse/pull/4291) ([proller](https://github.com/proller)) ([proller](https://github.com/proller)) -- 字典测试现在可以从 `ctest` 运行. [#4189](https://github.com/ClickHouse/ClickHouse/pull/4189) ([proller](https://github.com/proller)) -- 现在 `/etc/ssl` 被用作 SSL 证书的默认目录. [#4167](https://github.com/ClickHouse/ClickHouse/pull/4167) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 在开始时添加了检查 SSE 和 AVX 指令. [#4234](https://github.com/ClickHouse/ClickHouse/pull/4234) ([Igr](https://github.com/igron99)) -- 初始化脚本将等待服务器直到启动. [#4281](https://github.com/ClickHouse/ClickHouse/pull/4281) ([proller](https://github.com/proller)) - -#### 向后不兼容更改 {#backward-incompatible-changes-1} - -- 删除了 `allow_experimental_low_cardinality_type` 设置. `LowCardinality` 数据类型是生产就绪的. [#4323](https://github.com/ClickHouse/ClickHouse/pull/4323) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 根据可用内存量减少标记缓存大小和未压缩缓存大小. [#4240](https://github.com/ClickHouse/ClickHouse/pull/4240) ([Lopatin Konstantin](https://github.com/k-lopatin) -- 在 `CREATE TABLE` 查询中添加了关键字 `INDEX` . 名称为 `index` 的列必须用反引号或双引号引用: `` `index` ``. [#4143](https://github.com/ClickHouse/ClickHouse/pull/4143) ([Nikita Vasilev](https://github.com/nikvas0)) -- `sumMap` 现在提升结果类型而不是溢出. 旧的 `sumMap` 行为可以通过使用 `sumMapWithOverflow` 函数获得. [#4151](https://github.com/ClickHouse/ClickHouse/pull/4151) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) - -#### 性能改进 {#performance-improvements-4} - -- `std::sort` 替换为 `pdqsort` 用于没有 `LIMIT` 的查询. [#4236](https://github.com/ClickHouse/ClickHouse/pull/4236) ([Evgenii Pravda](https://github.com/kvinty)) -- 现在服务器重用来自全局线程池的线程. 这会影响某些极端情况下的性能. [#4150](https://github.com/ClickHouse/ClickHouse/pull/4150) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 改进 {#improvements-5} - -- 为 FreeBSD 实现 AIO 支持. [#4305](https://github.com/ClickHouse/ClickHouse/pull/4305) ([urgordeadbeef](https://github.com/urgordeadbeef)) -- `SELECT * FROM a JOIN b USING a, b` 现在只从左表返回 `a` 和 `b` 列. [#4141](https://github.com/ClickHouse/ClickHouse/pull/4141) ([Artem Zuikov](https://github.com/4ertus2)) -- 允许客户端的`-C` 选项作为`-c` 选项工作. [#4232](https://github.com/ClickHouse/ClickHouse/pull/4232) ([syominsergey](https://github.com/syominsergey)) -- 现在不带值使用的选项 `--password` 需要来自 stdin 的密码. [#4230](https://github.com/ClickHouse/ClickHouse/pull/4230) ([BSD_Conqueror](https://github.com/bsd-conqueror)) -- 在包含 `LIKE` 表达式或正则表达式的字符串文字中添加了未转义元字符的突出显示. [#4327](https://github.com/ClickHouse/ClickHouse/pull/4327) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 如果客户端套接字消失, 则添加取消 HTTP 只读查询. [#4213](https://github.com/ClickHouse/ClickHouse/pull/4213) ([nvartolomei](https://github.com/nvartolomei)) -- 现在服务器报告进度以保持客户端连接有效. [#4215](https://github.com/ClickHouse/ClickHouse/pull/4215) ([Ivan](https://github.com/abyss7)) -- 启用了 `optimize_throw_if_noop` 设置的 OPTIMIZE 查询原因稍微好一点的消息. [#4294](https://github.com/ClickHouse/ClickHouse/pull/4294) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 为 clickhouse 服务器添加了对 `--version` 选项的支持. [#4251](https://github.com/ClickHouse/ClickHouse/pull/4251) ([Lopatin Konstantin](https://github.com/k-lopatin)) -- 为 `clickhouse-server` 添加了 `--help/-h` 选项. [#4233](https://github.com/ClickHouse/ClickHouse/pull/4233) ([Yuriy Baranov](https://github.com/yurriy)) -- 添加了对具有聚合函数状态结果的标量子查询的支持. [#4348](https://github.com/ClickHouse/ClickHouse/pull/4348) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -- 改进了服务器关闭时间和 ALTERs 等待时间. [#4372](https://github.com/ClickHouse/ClickHouse/pull/4372) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 向 system.replicas 添加了关于 replicad_can_become_leader 设置的信息, 如果副本不会尝试成为领导者,则添加日志记录. [#4379](https://github.com/ClickHouse/ClickHouse/pull/4379) ([Alex Zatelepin](https://github.com/ztlpn)) - -## ClickHouse 版本 19.1 {#clickhouse-release-19-1} - -### ClickHouse 版本 19.1.14, 2019-03-14 {#clickhouse-release-19-1-14-2019-03-14} - -- 修复了在将 `GLOBAL JOIN` 与 `SELECT *` (罕见情况) 一起使用的情况下, 如果设置 `asterisk_left_columns_only` 设置为 1 时可能发生的错误 `Column ... queried more than once`. 该问题在 19.3 及更新版本中不存在. [6bac7d8d](https://github.com/ClickHouse/ClickHouse/pull/4692/commits/6bac7d8d11a9b0d6de0b32b53c47eb2f6f8e7062) ([Artem Zuikov](https://github.com/4ertus2)) - -### ClickHouse 版本 19.1.13, 2019-03-12 {#clickhouse-release-19-1-13-2019-03-12} - -此版本包含与 19.3.7 完全相同的补丁集. - -### ClickHouse 版本 19.1.10, 2019-03-03 {#clickhouse-release-19-1-10-2019-03-03} - -此版本包含与 19.3.6 完全相同的补丁集 - -## ClickHouse 版本 19.1 {#clickhouse-release-19-1-1} - -### ClickHouse 版本 19.1.9, 2019-02-21 {#clickhouse-release-19-1-9-2019-02-21} - -#### Bug 修复 {#bug-fixes-18} - -- 修复了由于 `send_logs_level` 设置的错误实现而导致的与旧版本的向后不兼容. [#4445](https://github.com/ClickHouse/ClickHouse/pull/4445) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了使用列注释引入的表函数 `remote` 向后不兼容的问题. [#4446](https://github.com/ClickHouse/ClickHouse/pull/4446) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.1.8, 2019-02-16 {#clickhouse-release-19-1-8-2019-02-16} - -#### Bug 修复 {#bug-fixes-19} - -- 修复缺少 /etc/clickhouse-server/config.xml 的安装包. [#4343](https://github.com/ClickHouse/ClickHouse/pull/4343) ([proller](https://github.com/proller)) - -## ClickHouse 版本 19.1 {#clickhouse-release-19-1-2} - -### ClickHouse 版本 19.1.7, 2019-02-15 {#clickhouse-release-19-1-7-2019-02-15} - -#### Bug 修复 {#bug-fixes-20} - -- 正确返回正确的类型并正确处理`joinGet`函数中的锁. [#4153](https://github.com/ClickHouse/ClickHouse/pull/4153) ([Amos Bird](https://github.com/amosbird)) -- 修复了在服务器关闭时尝试再次创建系统日志时的错误. [#4254](https://github.com/ClickHouse/ClickHouse/pull/4254) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复错误: 如果有一个带有 `Dictionary` 引擎的数据库, 所有词典都在服务器启动时强制加载, 如果有来自localhost的带有ClickHouse源的词典, 则该词典无法加载. [#4255](https://github.com/ClickHouse/ClickHouse/pull/4255) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了执行包含 `IN` 运算符的突变时产生错误结果的错误. [#4099](https://github.com/ClickHouse/ClickHouse/pull/4099) ([Alex Zatelepin](https://github.com/ztlpn)) -- 如果以交互模式运行, `clickhouse-client` 可以在退出时加载命令行建议数据时出现段错误. [#4317](https://github.com/ClickHouse/ClickHouse/pull/4317) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 从 `system.tables` 中选择时固定的竞争条件可能会给出“表不存在”错误. [#4313](https://github.com/ClickHouse/ClickHouse/pull/4313) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了在 `No such file or directory` 错误后重试带有 `File` 引擎的表中的 `SELECT` 时的死锁. [#4161](https://github.com/ClickHouse/ClickHouse/pull/4161) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了一个问题: 本地 ClickHouse 词典通过 TCP 加载, 但应在进程内加载. [#4166](https://github.com/ClickHouse/ClickHouse/pull/4166) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了通过 TLS 连接与 PostgreSQL ODBC 驱动程序交互时的 `No message received` 错误. 还修复了使用 MySQL ODBC 驱动程序时的段错误. [#4170](https://github.com/ClickHouse/ClickHouse/pull/4170) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 暂时禁用`ORDER BY` 的谓词优化. [#3890](https://github.com/ClickHouse/ClickHouse/pull/3890) ([Winter Zhang](https://github.com/zhang2014)) -- 从表函数 `numbers(0)` 中选择时修复了无限循环. [#4280](https://github.com/ClickHouse/ClickHouse/pull/4280) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 `compile_expressions` 与大 (超过 int16) 日期比较的错误. [#4341](https://github.com/ClickHouse/ClickHouse/pull/4341) ([alesapin](https://github.com/alesapin)) -- 修复了 `uncompressed_cache=1` 的分段错误和错误的未压缩大小的异常. [#4186](https://github.com/ClickHouse/ClickHouse/pull/4186) ([alesapin](https://github.com/alesapin)) -- 修复了右表中有重复项的 `ALL JOIN`. [#4184](https://github.com/ClickHouse/ClickHouse/pull/4184) ([Artem Zuikov](https://github.com/4ertus2)) -- 修复了在执行 `INSERT ... SELECT ... FROM file(...)` 查询和文件具有 `CSVWithNames` 或 `TSVWIthNames` 格式并且缺少第一个数据行时的错误行为. [#4297](https://github.com/ClickHouse/ClickHouse/pull/4297) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使用 `Array(LowCardinality)` 参数修复了聚合函数的执行. [#4055](https://github.com/ClickHouse/ClickHouse/pull/4055) ([KochetovNicolai](https://github.com/KochetovNicolai)) -- Debian 软件包: 根据配置更正 /etc/clickhouse-server/preprocessed 链接. [#4205](https://github.com/ClickHouse/ClickHouse/pull/4205) ([proller](https://github.com/proller)) -- 修复了未定义行为消毒剂下的模糊测试: 添加了对 `quantile*Weighted` 系列函数的参数类型检查. [#4145](https://github.com/ClickHouse/ClickHouse/pull/4145) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使 `START REPLICATED SENDS` 命令开始复制发送. [#4229](https://github.com/ClickHouse/ClickHouse/pull/4229) ([nvartolomei](https://github.com/nvartolomei)) -- 修复了 JOIN ON 部分中重复列的 `Not found column`. [#4279](https://github.com/ClickHouse/ClickHouse/pull/4279) ([Artem Zuikov](https://github.com/4ertus2)) -- 现在 `/etc/ssl` 被用作 SSL 证书的默认目录. [#4167](https://github.com/ClickHouse/ClickHouse/pull/4167) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了字典不可用时重新加载字典时崩溃的问题. [#4188](https://github.com/ClickHouse/ClickHouse/pull/4188) ([proller](https://github.com/proller)) -- 修复了错误的 `Date` 和`DateTime` 比较错误. [#4237](https://github.com/ClickHouse/ClickHouse/pull/4237) ([valexey](https://github.com/valexey)) -- 修复了在条件运算符(函数 `if`) 的分支中使用 `Date` 和 `DateTime` 参数时不正确的结果. 为函数 `if` 添加了通用情况. [#4243](https://github.com/ClickHouse/ClickHouse/pull/4243) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -### ClickHouse 版本 19.1.6, 2019-01-24 {#clickhouse-release-19-1-6-2019-01-24} - -#### 新特征 {#new-features-7} - -- 表的自定义每列压缩编解码器. [#3899](https://github.com/ClickHouse/ClickHouse/pull/3899) [#4111](https://github.com/ClickHouse/ClickHouse/pull/4111) ([alesapin](https://github.com/alesapin), [Winter Zhang](https://github.com/zhang2014), [Anatoly](https://github.com/Sindbag)) -- 添加了压缩编解码器 `Delta`. [#4052](https://github.com/ClickHouse/ClickHouse/pull/4052) ([alesapin](https://github.com/alesapin)) -- 允许`ALTER`压缩编解码器. [#4054](https://github.com/ClickHouse/ClickHouse/pull/4054) ([alesapin](https://github.com/alesapin)) -- 添加函数`left`、`right`、`trim`、`ltrim`、`rtrim`、`timestampadd`、`timestampsub` 以实现SQL标准兼容性. [#3826](https://github.com/ClickHouse/ClickHouse/pull/3826) ([Ivan Blinkov](https://github.com/blinkov)) -- 支持写入`HDFS`表和`hdfs`表功能. [#4084](https://github.com/ClickHouse/ClickHouse/pull/4084) ([alesapin](https://github.com/alesapin)) -- 添加了从大型 haystack 中搜索多个常量字符串的函数: `multiPosition`、`multiSearch`、`firstMatch` 以及 `-UTF8`、`-CaseInsensitive` 和 `-CaseInsensitiveUTF8` 变体. [#4053](https://github.com/ClickHouse/ClickHouse/pull/4053) ([Danila Kutenin](https://github.com/danlark1)) -- 如果`SELECT` 查询通过分片键进行过滤, 则修剪未使用的分片 (设置`optimize_skip_unused_shards`). [#3851](https://github.com/ClickHouse/ClickHouse/pull/3851) ([Gleb Kanterov](https://github.com/kanterov), [Ivan](https://github.com/abyss7)) -- 允许 `Kafka` 引擎忽略每个块的一些解析错误. [#4094](https://github.com/ClickHouse/ClickHouse/pull/4094) ([Ivan](https://github.com/abyss7)) -- 添加了对`CatBoost` 多类模型评估的支持。 函数`modelEvaluate` 返回带有多类模型的每类原始预测的元组。 `libcatboostmodel.so` 应该使用 [#607](https://github.com/catboost/catboost/pull/607) 构建. [#3959](https://github.com/ClickHouse/ClickHouse/pull/3959) ([KochetovNicolai](https://github.com/KochetovNicolai)) -- 添加函数 `filesystemAvailable`、`filesystemFree`、`filesystemCapacity`. [#4097](https://github.com/ClickHouse/ClickHouse/pull/4097) ([Boris Granveaud](https://github.com/bgranvea)) -- 添加了散列函数 `xxHash64` 和 `xxHash32`. [#3905](https://github.com/ClickHouse/ClickHouse/pull/3905) ([filimonov](https://github.com/filimonov)) -- 添加了 `gccMurmurHash` 散列函数 (GCC 风味的 Murmur 散列), 它使用与 [gcc] (https://github.com/gcc-mirror/gcc/blob/41d6b10e96a1de98e90a7c0378437c3255814b16/libstdc%2B%2B-v3/include/bits/functional_hash.h#L191)相同的散列种子. [#4000](https://github.com/ClickHouse/ClickHouse/pull/4000) ([sundyli](https://github.com/sundy-li)) -- 添加了散列函数 `javaHash`、`hiveHash`. [#3811](https://github.com/ClickHouse/ClickHouse/pull/3811) ([shangshujie365](https://github.com/shangshujie365)) -- 添加了表功能`remoteSecure`. 功能作为 `remote` 工作,但使用安全连接. [#4088](https://github.com/ClickHouse/ClickHouse/pull/4088) ([proller](https://github.com/proller)) - -#### 实验功能 {#experimental-features-3} - -- 添加了多个 JOIN 仿真 (`allow_experimental_multiple_joins_emulation` 设置). [#3946](https://github.com/ClickHouse/ClickHouse/pull/3946) ([Artem Zuikov](https://github.com/4ertus2)) - -#### Bug 修复 {#bug-fixes-21} - -- 将 `compiled_expression_cache_size` 设置限制为默认以降低内存消耗. [#4041](https://github.com/ClickHouse/ClickHouse/pull/4041) ([alesapin](https://github.com/alesapin)) -- 修复导致执行复制表 ALTER 的线程和从 ZooKeeper 更新配置的线程挂起的错误. [#2947](https://github.com/ClickHouse/ClickHouse/issues/2947) [#3891](https://github.com/ClickHouse/ClickHouse/issues/3891) [#3934](https://github.com/ClickHouse/ClickHouse/pull/3934) ([Alex Zatelepin](https://github.com/ztlpn)) -- 修复了执行分布式 ALTER 任务时的竞争条件. 竞争条件导致多个副本尝试执行任务, 所有副本除了一个因 ZooKeeper 错误而失败. [#3904](https://github.com/ClickHouse/ClickHouse/pull/3904) ([Alex Zatelepin](https://github.com/ztlpn)) -- 修复了在对 ZooKeeper 的请求超时后不刷新 `from_zk` 配置元素的错误. [#2947](https://github.com/ClickHouse/ClickHouse/issues/2947) [#3947](https://github.com/ClickHouse/ClickHouse/pull/3947) ([Alex Zatelepin](https://github.com/ztlpn)) -- 修复错误前缀的错误 IPv4 子网掩码. [#3945](https://github.com/ClickHouse/ClickHouse/pull/3945) ([alesapin](https://github.com/alesapin)) -- 修复了由于资源耗尽而无法创建新线程的极少数情况下的崩溃 (`std::terminate`). [#3956](https://github.com/ClickHouse/ClickHouse/pull/3956) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复在 `getStructureOfRemoteTable` 中使用错误限制时在 `remote` 表函数执行中的错误. [#4009](https://github.com/ClickHouse/ClickHouse/pull/4009) ([alesapin](https://github.com/alesapin)) -- 修复 netlink 套接字泄漏. 它们被放置在一个永远不会被删除的池中, 并且当所有当前套接字都在使用时, 在新线程开始时创建新套接字. [#4017](https://github.com/ClickHouse/ClickHouse/pull/4017) ([Alex Zatelepin](https://github.com/ztlpn)) -- 修复在分支 `odbc-bridge` 子进程后, 在从 `/proc` 读取所有 fds 之前关闭 `/proc/self/fd` 目录的错误. [#4120](https://github.com/ClickHouse/ClickHouse/pull/4120) ([alesapin](https://github.com/alesapin)) -- 在主键中使用字符串的情况下修复了字符串到 UInt 的单调转换. [#3870](https://github.com/ClickHouse/ClickHouse/pull/3870) ([Winter Zhang](https://github.com/zhang2014)) -- 修复整数转换函数单调性计算错误. [#3921](https://github.com/ClickHouse/ClickHouse/pull/3921) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 `arrayEnumerateUniq`、`arrayEnumerateDense` 函数中某些无效参数的段错误. [#3909](https://github.com/ClickHouse/ClickHouse/pull/3909) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复 StorageMerge 中的 UB. [#3910](https://github.com/ClickHouse/ClickHouse/pull/3910) ([Amos Bird](https://github.com/amosbird)) -- 修复了函数 `addDays`、`subtractDays` 中的段错误. [#3913](https://github.com/ClickHouse/ClickHouse/pull/3913) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复错误: 函数`round`、`floor`、`trunc`、`ceil` 在整数参数和大的负比例上执行时可能返回虚假结果. [#3914](https://github.com/ClickHouse/ClickHouse/pull/3914) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了由 `kill query sync` 引起的导致核心转储的错误. [#3916](https://github.com/ClickHouse/ClickHouse/pull/3916) ([muVulDeePecker](https://github.com/fancyqlx)) -- 修复空复制队列后长时间延迟的错误. [#3928](https://github.com/ClickHouse/ClickHouse/pull/3928) [#3932](https://github.com/ClickHouse/ClickHouse/pull/3932) ([alesapin](https://github.com/alesapin)) -- 修复了使用 `LowCardinality` 主键插入表时过多的内存使用. [#3955](https://github.com/ClickHouse/ClickHouse/pull/3955) ([KochetovNicolai](https://github.com/KochetovNicolai)) -- 在空数组的情况下修复了`Native`格式的`LowCardinality`序列化. [#3907](https://github.com/ClickHouse/ClickHouse/issues/3907) [#4011](https://github.com/ClickHouse/ClickHouse/pull/4011) ([KochetovNicolai](https://github.com/KochetovNicolai)) -- 修复了使用单 LowCardinality 数字列不同时的错误结果. [#3895](https://github.com/ClickHouse/ClickHouse/issues/3895) [#4012](https://github.com/ClickHouse/ClickHouse/pull/4012) ([KochetovNicolai](https://github.com/KochetovNicolai)) -- 使用 LowCardinality 键修复了专门的聚合 (如果启用了 `compile` 设置). [#3886](https://github.com/ClickHouse/ClickHouse/pull/3886) ([KochetovNicolai](https://github.com/KochetovNicolai)) -- 修复复制表查询的用户和密码转发. [#3957](https://github.com/ClickHouse/ClickHouse/pull/3957) ([alesapin](https://github.com/alesapin)) ([小路](https://github.com/nicelulu)) -- 修复了在重新加载字典时列出字典数据库中的表时可能发生的非常罕见的竞争条件. [#3970](https://github.com/ClickHouse/ClickHouse/pull/3970) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了当 HAVING 与 ROLLUP 或 CUBE 一起使用时的错误结果. [#3756](https://github.com/ClickHouse/ClickHouse/issues/3756) [#3837](https://github.com/ClickHouse/ClickHouse/pull/3837) ([Sam Chou](https://github.com/reflection)) -- 使用 `JOIN ON` 语法和分布式表进行查询的固定列别名. [#3980](https://github.com/ClickHouse/ClickHouse/pull/3980) ([Winter Zhang](https://github.com/zhang2014)) -- 修复了 `quantileTDigest` (由 Artem Vakhrushev 发现) 的内部实现中的错误. 此错误从未发生在 ClickHouse 中, 仅与直接使用 ClickHouse 代码库作为库的人相关. [#3935](https://github.com/ClickHouse/ClickHouse/pull/3935) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 改进 {#improvements-6} - -- 支持 `ALTER TABLE ADD COLUMN` 语句中的 `IF NOT EXISTS` 以及 `DROP/MODIFY/CLEAR/COMMENT COLUMN` 中的 `IF EXISTS`. [#3900](https://github.com/ClickHouse/ClickHouse/pull/3900) ([Boris Granveaud](https://github.com/bgranvea)) -- 函数 `parseDateTimeBestEffort`: 支持`DD.MM.YYYY`、`DD.MM.YY`、`DD-MM-YYYY`、`DD-Mon-YYYY`、`DD/Month/YYYY`等格式. [#3922](https://github.com/ClickHouse/ClickHouse/pull/3922) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- `CapnProtoInputStream` 现在支持锯齿状结构. [#4063](https://github.com/ClickHouse/ClickHouse/pull/4063) ([Odin Hultgren Van Der Horst](https://github.com/Miniwoffer)) -- 可用性改进: 添加了检查服务器进程是否从数据目录的所有者启动. 如果数据属于非 root 用户, 则不允许从 root 启动服务器. [#3785](https://github.com/ClickHouse/ClickHouse/pull/3785) ([sergey-v-galtsev](https://github.com/sergey-v-galtsev)) -- 在使用 JOIN 分析查询期间检查所需列的更好逻辑. [#3930](https://github.com/ClickHouse/ClickHouse/pull/3930) ([Artem Zuikov](https://github.com/4ertus2)) -- 在单个服务器中有大量分布式表的情况下减少连接数. [#3726](https://github.com/ClickHouse/ClickHouse/pull/3726) ([Winter Zhang](https://github.com/zhang2014)) -- 支持 ODBC 驱动程序 `WITH TOTALS` 查询的总计行. [#3836](https://github.com/ClickHouse/ClickHouse/pull/3836) ([Maksim Koritckiy](https://github.com/nightweb)) -- 允许在 if 函数中使用 `Enum` 作为整数. [#3875](https://github.com/ClickHouse/ClickHouse/pull/3875) ([Ivan](https://github.com/abyss7)) -- 添加了 `low_cardinality_allow_in_native_format` 设置. 如果禁用, 请勿使用 `Native` 格式的 `LowCadrinality` 类型. [#3879](https://github.com/ClickHouse/ClickHouse/pull/3879) ([KochetovNicolai](https://github.com/KochetovNicolai)) -- 从已编译的表达式缓存中删除了一些冗余对象以降低内存使用率. [#4042](https://github.com/ClickHouse/ClickHouse/pull/4042) ([alesapin](https://github.com/alesapin)) -- 添加检查 `SET send_logs_level = 'value'` 查询接受适当的值. [#3873](https://github.com/ClickHouse/ClickHouse/pull/3873) ([Sabyanin Maxim](https://github.com/s-mx)) -- 类型转换函数中的固定数据类型检查. [#3896](https://github.com/ClickHouse/ClickHouse/pull/3896) ([Winter Zhang](https://github.com/zhang2014)) - -#### 性能改进 {#performance-improvements-5} - -- 添加 MergeTree 设置 `use_minimalistic_part_header_in_zookeeper`. 如果启用,复制表将在单个部分 znode 中存储压缩部分元数据. 这可以显着减少 ZooKeeper 快照大小 (特别是如果表有很多列). 请注意, 启用此设置后, 您将无法降级到不支持它的版本. [#3960](https://github.com/ClickHouse/ClickHouse/pull/3960) ([Alex Zatelepin](https://github.com/ztlpn)) -- 为函数 `sequenceMatch` 和 `sequenceCount` 添加基于 DFA 的实现,以防模式不包含时间. [#4004](https://github.com/ClickHouse/ClickHouse/pull/4004) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) -- 整数序列化的性能改进. [#3968](https://github.com/ClickHouse/ClickHouse/pull/3968) ([Amos Bird](https://github.com/amosbird)) -- 零左填充 PODArray 以便 -1 元素始终有效并归零. 它用于偏移量的无分支计算. [#3920](https://github.com/ClickHouse/ClickHouse/pull/3920) ([Amos Bird](https://github.com/amosbird)) -- 恢复了导致性能下降的 `jemalloc` 版本. [#4018](https://github.com/ClickHouse/ClickHouse/pull/4018) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 向后不兼容更改 {#backward-incompatible-changes-2} - -- 删除了未记录的特性 `ALTER MODIFY PRIMARY KEY`, 因为它被 `ALTER MODIFY ORDER BY` 命令取代. [#3887](https://github.com/ClickHouse/ClickHouse/pull/3887) ([Alex Zatelepin](https://github.com/ztlpn)) -- 删除了函数 `shardByHash`. [#3833](https://github.com/ClickHouse/ClickHouse/pull/3833) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 禁止使用类型为 `AggregateFunction` 的标量子查询. [#3865](https://github.com/ClickHouse/ClickHouse/pull/3865) ([Ivan](https://github.com/abyss7)) - -#### 构建/测试/打包改进 {#buildtestingpackaging-improvements-6} - -- 添加了对 PowerPC (`ppc64le`) 构建的支持. [#4132](https://github.com/ClickHouse/ClickHouse/pull/4132) ([Danila Kutenin](https://github.com/danlark1)) -- 在公共可用数据集上运行状态功能测试. [#3969](https://github.com/ClickHouse/ClickHouse/pull/3969) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了当服务器无法以 Docker 或 systemd-nspawn 中的 `bash: /usr/bin/clickhouse-extract-from-config: Operation not allowed` 消息启动时的错误. [#4136](https://github.com/ClickHouse/ClickHouse/pull/4136) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 将 `rdkafka` 库更新到 v1.0.0-RC5. 使用 cppkafka 而不是原始 C 接口. [#4025](https://github.com/ClickHouse/ClickHouse/pull/4025) ([Ivan](https://github.com/abyss7)) -- 更新了 `mariadb-client` 库. 修复了 UBSan 发现的问题之一. [#3924](https://github.com/ClickHouse/ClickHouse/pull/3924) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- UBSan 版本的一些修复. [#3926](https://github.com/ClickHouse/ClickHouse/pull/3926) [#3021](https://github.com/ClickHouse/ClickHouse/pull/3021) [#3948](https://github.com/ClickHouse/ClickHouse/pull/3948) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使用 UBSan 构建添加了每次提交的测试运行. -- 添加了 PVS-Studio 静态分析器的每次提交运行. -- 修复了 PVS-Studio 发现的错误. [#4013](https://github.com/ClickHouse/ClickHouse/pull/4013) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 glibc 兼容性问题. [#4100](https://github.com/ClickHouse/ClickHouse/pull/4100) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 将 Docker 镜像移至 18.10 并添加 glibc \>= 2.28 的兼容性文件. [#3965](https://github.com/ClickHouse/ClickHouse/pull/3965) ([alesapin](https://github.com/alesapin)) -- 如果用户不想在服务器 Docker 映像中 chown 目录,请添加 env 变量. [#3967](https://github.com/ClickHouse/ClickHouse/pull/3967) ([alesapin](https://github.com/alesapin)) -- 在 clang 中启用了来自 `-Weverything` 的大部分警告. 启用 `-Wpedantic` . [#3986](https://github.com/ClickHouse/ClickHouse/pull/3986) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 添加了一些仅在 clang 8 中可用的警告. [#3993](https://github.com/ClickHouse/ClickHouse/pull/3993) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 使用共享链接时链接到 `libLLVM` 而不是单个 LLVM 库. [#3989](https://github.com/ClickHouse/ClickHouse/pull/3989) ([Orivej Desh](https://github.com/orivej)) -- 测试图像添加了清除变量. [#4072](https://github.com/ClickHouse/ClickHouse/pull/4072) ([alesapin](https://github.com/alesapin)) -- `clickhouse-server` debian 包会推荐 `libcap2-bin` 包使用 `setcap` 工具设置功能. 这是可选的. [#4093](https://github.com/ClickHouse/ClickHouse/pull/4093) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 改进了编译时间, 修复了包含. [#3898](https://github.com/ClickHouse/ClickHouse/pull/3898) ([proller](https://github.com/proller)) -- 添加了哈希函数的性能测试. [#3918](https://github.com/ClickHouse/ClickHouse/pull/3918) ([filimonov](https://github.com/filimonov)) -- 修复了循环库依赖. [#3958](https://github.com/ClickHouse/ClickHouse/pull/3958) ([proller](https://github.com/proller)) -- 改进了低可用内存的编译. [#4030](https://github.com/ClickHouse/ClickHouse/pull/4030) ([proller](https://github.com/proller)) -- 添加了测试脚本以重现 `jemalloc` 中的性能下降. [#4036](https://github.com/ClickHouse/ClickHouse/pull/4036) ([alexey-milovidov](https://github.com/alexey-milovidov)) -- 修复了 `dbms` 下注释和字符串中的拼写错误. [#4122](https://github.com/ClickHouse/ClickHouse/pull/4122) ([maiha](https://github.com/maiha)) -- 修正了评论中的错别字. [#4089](https://github.com/ClickHouse/ClickHouse/pull/4089) ([Evgenii Pravda](https://github.com/kvinty)) - -## [Changelog for 2018](../../whats-new/changelog/2018.md#clickhouse-release-18-16) {#changelog-for-2018} diff --git a/docs/zh/whats-new/changelog/2020.md b/docs/zh/whats-new/changelog/2020.md deleted file mode 100644 index 30531d74030..00000000000 --- a/docs/zh/whats-new/changelog/2020.md +++ /dev/null @@ -1,3529 +0,0 @@ ---- -slug: /zh/whats-new/changelog/2020 ---- -### ClickHouse 版本 20.12 - -### ClickHouse 版本 v20.12.5.14-stable, 2020-12-28 - -#### Bug 修复 - -* 在合并期间禁用 AIO 写入, 因为它会导致合并期间主键列的数据损坏极为罕见. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). -* 修复了在使用类型为 `Nullable(String)` 的参数执行 `toType(...)` 函数 (`toDate`、`toUInt32` 等)时出现的 `value is too short` 错误. 现在这些函数在解析错误时返回 `NULL` 而不是抛出异常. 修复 [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). -* 限制从宽部分合并到紧凑部分. 在垂直合并的情况下, 它会导致结果部分损坏. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). -* 修复填充表 `system.settings_profile_elements`. 此 PR 修复了 [#18231](https://github.com/ClickHouse/ClickHouse/issues/18231). [#18379](https://github.com/ClickHouse/ClickHouse/pull/18379) ([Vitaly Baranov](https://github.com/vitlibar)). -* 使用组合子 `Distinct` 修复聚合函数中可能的崩溃, 同时使用两级聚合. 修复 [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). -* 修复查询 `MODIFY COLUMN ... REMOVE TTL` 并没有真正删除列 TTL 时的错误. [#18130](https://github.com/ClickHouse/ClickHouse/pull/18130) ([alesapin](https://github.com/alesapin)). - -#### 构建/测试/打包改进 - -* 将时区信息更新为 2020e. [#18531](https://github.com/ClickHouse/ClickHouse/pull/18531) ([alesapin](https://github.com/alesapin)). - - -### ClickHouse 版本 v20.12.4.5-stable, 2020-12-24 - -#### Bug 修复 - -* 修复了在具有双 IPv4/IPv6 堆栈的机器上服务器无法访问 `clickhouse-odbc-bridge` 进程的问题; - 修复了使用格式错误的查询执行 ODBC 字典更新和/或导致崩溃的问题; 可能关闭 [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). -* 修复了 Enum 和 Int 类型之间的键比较. 这修复了 [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). -* 修复了 `MaterializeMySQL` 数据库引擎中唯一键转换崩溃的问题. 这修复了 [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) 并修复了 [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了 S3 URL 解析中的 `std::out_of_range: basic_string`. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 修复了由于 MaterializeMySQL 不支持转换 MySQL 前缀索引而导致某些表无法从 MySQL 同步到 ClickHouse 的问题. 这修复了 [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) 并修复了 [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了查询包含 `ARRAY JOIN` 时查询优化产生错误结果的问题. [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). -* 修复了 `topK` 聚合函数中可能出现的段错误. 这将关闭 [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). -* 修复了服务器在守护进程模式下运行时空的 `system.stack_trace` 表. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). - - -### ClickHouse 版本 v20.12.3.3-stable, 2020-12-13 - -#### 向后不兼容变更 - -* 默认启用`use_compact_format_in_distributed_parts_names` (参考文档). [#16728](https://github.com/ClickHouse/ClickHouse/pull/16728) ([Azat Khuzhin](https://github.com/azat)). -* 创建使用 `File` 引擎的表时, 在 `SETTINGS` 子句中接受与文件格式 (例如 `format_csv_delimiter` ) 相关的用户设置, 并在所有 `INSERT` 和 `SELECT` 中使用这些设置. 当前用户会话中或 DML 查询本身的 `SETTINGS` 子句中更改的文件格式设置不再影响查询. [#16591](https://github.com/ClickHouse/ClickHouse/pull/16591) ([Alexander Kuzmenkov](https://github.com/akuzm)). - -#### 新特征 - -* 添加 `*.xz` 压缩/解压支持。它允许在 `file()` 函数中使用 `*.xz`. 这将关闭 [#8828](https://github.com/ClickHouse/ClickHouse/issues/8828). [#16578](https://github.com/ClickHouse/ClickHouse/pull/16578) ([Abi Palagashvili](https://github.com/fibersel)). -* 引入查询`ALTER TABLE ... DROP|DETACH PART 'part_name'`. [#15511](https://github.com/ClickHouse/ClickHouse/pull/15511) ([nvartolomei](https://github.com/nvartolomei)). -* 添加了新的 ALTER UPDATE/DELETE IN PARTITION 语法. [#13403](https://github.com/ClickHouse/ClickHouse/pull/13403) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 允许在使用 JSON 输入/输出格式时将命名元组格式化为 JSON 对象, 由 `output_format_json_named_tuples_as_objects` 设置控制, 默认禁用. [#17175](https://github.com/ClickHouse/ClickHouse/pull/17175) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 在TSV和CSV格式默认情况下添加一种可能的输入枚举值作为它的id. [#16834](https://github.com/ClickHouse/ClickHouse/pull/16834) ([Kruglov Pavel](https://github.com/Avogar)). -* 添加对 Nullable、LowCardinality、Array 和 Tuple 的 COLLATE 支持,其中嵌套类型为 String. 同时重构ColumnString.cpp中与collations相关的代码. [#16273](https://github.com/ClickHouse/ClickHouse/pull/16273) ([Kruglov Pavel](https://github.com/Avogar)). -* 新的 `tcpPort` 函数返回此服务器监听的 TCP 端口. [#17134](https://github.com/ClickHouse/ClickHouse/pull/17134) ([Ivan](https://github.com/abyss7)). -* 添加新的数学函数:`acosh`、`asinh`、`atan2`、`atanh`、`cosh`、`hypot`、`log1p`、`sinh`. [#16636](https://github.com/ClickHouse/ClickHouse/pull/16636) ([Konstantin Malanchev](https://github.com/hombit)). -* 在不同副本之间分配合并的可能性. 引入 `execute_merges_on_single_replica_time_threshold` 合并树设置. [#16424](https://github.com/ClickHouse/ClickHouse/pull/16424) ([filimonov](https://github.com/filimonov)). -* 添加设置 `aggregate_functions_null_for_empty` 以实现 SQL 标准兼容性. 此选项将重写查询中的所有聚合函数, 并向它们添加 -OrNull 后缀. 实现 [10273](https://github.com/ClickHouse/ClickHouse/issues/10273). [#16123](https://github.com/ClickHouse/ClickHouse/pull/16123) ([flynn](https://github.com/ucasFL)). -* 更新了 DateTime、DateTime64 解析以接受字符串日期文字格式. [#16040](https://github.com/ClickHouse/ClickHouse/pull/16040) ([Maksim Kita](https://github.com/kitaisreal)). -* 可以使用 `--history_file` 参数在 `clickhouse-client` 中更改历史文件的路径. [#15960](https://github.com/ClickHouse/ClickHouse/pull/15960) ([Maksim Kita](https://github.com/kitaisreal)). - -#### Bug 修复 - -* 修复在极少数情况下服务器可以停止接受连接的问题. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([Amos Bird](https://github.com/amosbird)). -* 修复了在 Linux 的 Windows 子系统上运行的 ClickHouse 在 `Atomic` 数据库中执行 `RENAME` 查询时出现的 `Function not implementation` 错误. 修复 [#17661](https://github.com/ClickHouse/ClickHouse/issues/17661). [#17664](https://github.com/ClickHouse/ClickHouse/pull/17664) ([tavplubix](https://github.com/tavplubix)). -* 如果禁用了`in_memory_parts_enable_wal`, 则不要从 WAL 恢复部件. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). -* 使用 `min_compress_block_size` 修复 MergeTreeWriterSettings 的 `max_compress_block_size` 的错误初始化. [#17833](https://github.com/ClickHouse/ClickHouse/pull/17833) ([flynn](https://github.com/ucasFL)). -* 有关要删除的最大表大小的异常消息显示不正确. [#17764](https://github.com/ClickHouse/ClickHouse/pull/17764) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了插入 `Distributed` 表时空间不足时可能出现的段错误. [#17737](https://github.com/ClickHouse/ClickHouse/pull/17737) ([tavplubix](https://github.com/tavplubix)). -* 修复了 ClickHouse 无法恢复与 MySQL 服务器的连接时的问题. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). -* 当 `pool_size` > 1 时, 由于竞争条件, 在执行 `ON CLUSTER` 查询时, 可能会错误地确定集群是否为循环 (交叉) 复制. 已修复. [#17640](https://github.com/ClickHouse/ClickHouse/pull/17640) ([tavplubix](https://github.com/tavplubix)). -* 异常 `fmt::v7::format_error` 可以记录在 MergeTree 表的后台. 这修复了 [#17613](https://github.com/ClickHouse/ClickHouse/issues/17613). [#17615](https://github.com/ClickHouse/ClickHouse/pull/17615) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当 clickhouse-client 在交互模式下与多行查询一起使用时, 单行注释被错误地扩展到查询结束. 这修复了 [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当相应的突变在不同的副本上被杀死时, 修复更改查询挂起. 修复 [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). -* 修复了 clickhouse 低估了标记缓存大小的问题. 当有很多带有标记的小文件时可能会发生. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). -* 启用设置 `optimize_redundant_functions_in_order_by` 来修复 `ORDER BY`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). -* 修复 `DISTINCT` 之后由于不正确优化而可能出现的重复项. 修复 [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复从具有 `LowCardinality` 类型的 `JOIN` 表读取时崩溃的问题. 修复 [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 `toInt256(inf)` 堆栈溢出. Int256 是一项实验性功能. 已关闭 [#17235](https://github.com/ClickHouse/ClickHouse/issues/17235). [#17257](https://github.com/ClickHouse/ClickHouse/pull/17257) ([flynn](https://github.com/ucasFL)). -* 使用 `LIMIT` 修复分布式查询中可能记录的 `Unexpected packet Data received from client` 错误. [#17254](https://github.com/ClickHouse/ClickHouse/pull/17254) ([Azat Khuzhin](https://github.com/azat)). -* 修复子查询中存在 const 列时设置索引失效的问题. 这修复了 [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246). [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). -* 修复索引比较类型不同时可能出现的错误索引分析. 这修复了 [#17122](https://github.com/ClickHouse/ClickHouse/issues/17122). [#17145](https://github.com/ClickHouse/ClickHouse/pull/17145) ([Amos Bird](https://github.com/amosbird)). -* 修复 ColumnConst 比较导致崩溃. 这个修复了 [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088). [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). -* MaterializeMySQL (实验功能) 的多个修复. 修复 [#16923](https://github.com/ClickHouse/ClickHouse/issues/16923) 修复 [#15883](https://github.com/ClickHouse/ClickHouse/issues/15883) 修复 MaterializeMySQL 同步失败时修改 MySQL binlog_checksum. [#17091](https://github.com/ClickHouse/ClickHouse/pull/17091) ([Winter Zhang](https://github.com/zhang2014)). -* 修复非领导者 ReplicatedMergeTree 表的 `ON CLUSTER` 查询可能永远挂起的错误. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). -* 修复了在创建 `some_table` 时 `CREATE TABLE ... AS some_table` 查询崩溃 `AS table_function()` 修复. [#17072](https://github.com/ClickHouse/ClickHouse/pull/17072) ([tavplubix](https://github.com/tavplubix)). -* 功能模糊位的错误未完成的实现, 相关问题: [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). -* 在 CFA 寄存器为 RAX 的情况下修复 LLVM 的 libunwind. 这是 [LLVM's libunwind](https://github.com/llvm/llvm-project/tree/master/libunwind) 中的 [bug](https://bugs.llvm.org/show_bug.cgi?id=48186) ). 我们已经有针对此错误的解决方法. [#17046](https://github.com/ClickHouse/ClickHouse/pull/17046) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 避免远程查询的不必要的网络错误, 这些错误在执行时可能会被取消, 例如使用 `LIMIT` 的查询. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). -* 修复 `optimize_distributed_group_by_sharding_key` 设置 (默认情况下禁用) 以仅使用 OFFSET 进行查询. [#16996](https://github.com/ClickHouse/ClickHouse/pull/16996) ([Azat Khuzhin](https://github.com/azat)). -* 修复了使用 JOIN 在分布式表上合并表的问题. [#16993](https://github.com/ClickHouse/ClickHouse/pull/16993) ([Azat Khuzhin](https://github.com/azat)). -* 修复了从 double 转换时大整数 (128、256 位) 的错误结果。 大整数支持是实验性的. [#16986](https://github.com/ClickHouse/ClickHouse/pull/16986) ([Mike](https://github.com/myrrc)). -* 修复在 `ALTER TABLE ... MODIFY COLUMN ... NewType` 之后可能发生的服务器崩溃, 当 `SELECT` 在更改列上具有 `WHERE` 表达式并且更改尚未完成时. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). -* `clickhouse-git-import` 中没有正确计算批判信息. [#16959](https://github.com/ClickHouse/ClickHouse/pull/16959) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 通过使用单调函数进行优化来修复顺序. 修复 [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). -* 通过启用 `optimize_aggregators_of_group_by_keys` 和 join 设置来修复组的优化. 修复 [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). -* 修复使用 `ORDER BY` 的查询可能出现的错误 `Illegal type of argument` . 修复 [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 InterpreterShowAccessQuery 中的奇怪代码. [#16866](https://github.com/ClickHouse/ClickHouse/pull/16866) ([tavplubix](https://github.com/tavplubix)). -* 使用函数 `timeSeriesGroupSum` 时防止clickhouse 服务器崩溃. 该功能已从较新的 ClickHouse 版本中删除. [#16865](https://github.com/ClickHouse/ClickHouse/pull/16865) ([filimonov](https://github.com/filimonov)). -* 当查询分析器打开并且 ClickHouse 安装在操作系统上时, 修复罕见的无声崩溃, glibc 版本已经 (据说) 损坏了某些功能的异步展开表. 这修复了 [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复在不带任何参数的情况下使用 `any` 时的崩溃。 这是针对 [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803)的 . cc @azat. [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). -* 如果在磁盘上写入表元数据时无法分配内存, 则可以写入损坏的元数据文件. [#16772](https://github.com/ClickHouse/ClickHouse/pull/16772) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使用分区谓词修复琐碎的查询优化. [#16767](https://github.com/ClickHouse/ClickHouse/pull/16767) ([Azat Khuzhin](https://github.com/azat)). -* 在启用了 `transform_null_in` 设置的情况下修复多列和元组上的 `IN` 运算符. 修复 [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). -* 通过 MySQL 协议返回 INSERT 查询的受影响行数. 以前 ClickHouse 过去总是返回 0, 现在已修复. 修复 [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). -* 修复使用 `if` 后缀聚合函数时远程查询失败的问题. 修复 [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) Fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). -* 修复由 `select_sequential_consistency` 引起的不一致行为, 用于优化的琐碎计数查询和 system.tables. [#16309](https://github.com/ClickHouse/ClickHouse/pull/16309) ([Hao Chen](https://github.com/haoch)). - -#### 改进 - -* 删除被 TTL、变异或折叠合并算法修剪后的空部分. [#16895](https://github.com/ClickHouse/ClickHouse/pull/16895) ([Anton Popov](https://github.com/CurtizJ)). -* 为分布式表中的异步发送启用紧凑格式的目录: `use_compact_format_in_distributed_parts_names` 默认设置为 1. [#16788](https://github.com/ClickHouse/ClickHouse/pull/16788) ([Azat Khuzhin](https://github.com/azat)). -* 如果没有数据写入 S3, 则中止分段上传. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). -* 重新解析 `format_avro_schema_registry_url` 的IP. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). -* 在 system.distribution_queue 中的 data_path 中屏蔽密码. [#16727](https://github.com/ClickHouse/ClickHouse/pull/16727) ([Azat Khuzhin](https://github.com/azat)). -* 使用列转换器替换不存在的列时抛出错误. [#16183](https://github.com/ClickHouse/ClickHouse/pull/16183) ([hexiaoting](https://github.com/hexiaoting)). -* 当没有足够的内存供所有线程同时工作时关闭并行解析. 当有人试图插入非常大的行 (> min_chunk_bytes_for_parallel_parsing) 时, 也可能有 `Memory limit exceeded` 之类的例外, 因为要解析的每个部分都必须是独立的一组字符串 (一个或多个). [#16721](https://github.com/ClickHouse/ClickHouse/pull/16721) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 安装脚本应始终在 config 文件夹中创建子目录. 这仅与使用自定义配置的 Docker 构建相关. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). -* 纠正 JSONEachRow、JSONCompactEachRow 和 RegexpRow 输入格式的错误消息中的语法. [#17205](https://github.com/ClickHouse/ClickHouse/pull/17205) ([nico piderman](https://github.com/sneako)). -* 将 `SOURCE(CLICKHOUSE(...))` 的默认 `host` 和 `port` 参数设置为当前实例,并将默认的 `user` 值设置为 `default`. [#16997](https://github.com/ClickHouse/ClickHouse/pull/16997) ([vdimir](https://github.com/vdimir)). -* 执行`ATTACH/DETACH TABLE ` 时抛出信息性错误消息. 在此 PR 之前, `detach table ` 可以工作, 但会导致内存中元数据格式错误. [#16885](https://github.com/ClickHouse/ClickHouse/pull/16885) ([Amos Bird](https://github.com/amosbird)). -* 添加 cutToFirstSignificantSubdomainWithWWW(). [#16845](https://github.com/ClickHouse/ClickHouse/pull/16845) ([Azat Khuzhin](https://github.com/azat)). -* 如果给出错误的配置, 服务器拒绝启动并显示异常消息 (缺少`metric_log`.`collect_interval_milliseconds`). [#16815](https://github.com/ClickHouse/ClickHouse/pull/16815) ([Ivan](https://github.com/abyss7)). -* 不存在分布式 DDL 配置时更好的异常消息. 这修复了 [#5075](https://github.com/ClickHouse/ClickHouse/issues/5075). [#16769](https://github.com/ClickHouse/ClickHouse/pull/16769) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 可用性改进:当 `CODEC` 表达式在 `CREATE TABLE` 查询中错位时, 在语法错误消息中提供更好的建议. 这修复了 [#12493](https://github.com/ClickHouse/ClickHouse/issues/12493). [#16768](https://github.com/ClickHouse/ClickHouse/pull/16768) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在分布式引擎启动时删除异步插入的空目录. [#16729](https://github.com/ClickHouse/ClickHouse/pull/16729) ([Azat Khuzhin](https://github.com/azat)). -* 将 S3 与 nginx 服务器一起用作代理的解决方法. Nginx 当前不接受像 `http://domain.com?delete` 这样的空路径 url, 但是 vanilla aws-sdk-cpp 会产生这种 url. 此提交使用修补过的 aws-sdk-cpp 版本, 在这种情况下, 它使 url 以 "/" 作为路径, 例如 `http://domain.com/?delete`. [#16709](https://github.com/ClickHouse/ClickHouse/pull/16709) ([ianton-ru](https://github.com/ianton-ru)). -* 允许 `reinterpretAs*` 函数处理相同大小的整数和浮点数. 实现 [16640](https://github.com/ClickHouse/ClickHouse/issues/16640). [#16657](https://github.com/ClickHouse/ClickHouse/pull/16657) ([flynn](https://github.com/ucasFL)). -* 现在,`` 配置可以在 `config.xml` 中更改并在不启动服务器的情况下重新加载. [#16627](https://github.com/ClickHouse/ClickHouse/pull/16627) ([Amos Bird](https://github.com/amosbird)). -* 在到远程资源的 https 连接中支持 SNI. 这将允许连接到需要 SNI 的 Cloudflare 服务器. 这修复了 [#10055](https://github.com/ClickHouse/ClickHouse/issues/10055). [#16252](https://github.com/ClickHouse/ClickHouse/pull/16252) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 可以连接到需要 SNI 的 `clickhouse-server` 安全端点. 当 `clickhouse-server` 托管在 TLS 代理之后是可能的. [#16938](https://github.com/ClickHouse/ClickHouse/pull/16938) ([filimonov](https://github.com/filimonov)). -* 如果创建了物化视图循环, 则修复可能的堆栈溢出. 这将关闭 [#15732](https://github.com/ClickHouse/ClickHouse/issues/15732). [#16048](https://github.com/ClickHouse/ClickHouse/pull/16048) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 简化 MergeTree 表引擎系列的后台任务处理的实现. 用户应该没有明显的变化. [#15983](https://github.com/ClickHouse/ClickHouse/pull/15983) ([alesapin](https://github.com/alesapin)). -* MaterializeMySQL (实验功能) 的改进. 当 MySQL 同步用户有错误权限时抛出关于正确同步权限的异常. [#15977](https://github.com/ClickHouse/ClickHouse/pull/15977) ([TCeason](https://github.com/TCeason)). -* 使用 BloomFilter 生成 `indexOf()` . [#14977](https://github.com/ClickHouse/ClickHouse/pull/14977) ([achimbab](https://github.com/achimbab)). - -#### 性能改进 - -* 使用 Floyd-Rivest 算法, 它是 ClickHouse 部分排序用例的最佳选择. 基准在 https://github.com/danlark1/miniselect 和 [here](https://drive.google.com/drive/folders/1DHEaeXgZuX6AJ9eByeZ8iQVQv0ueP8XM). [#16825](https://github.com/ClickHouse/ClickHouse/pull/16825) ([Danila Kutenin](https://github.com/danlark1)). -* 现在, `ReplicatedMergeTree` 树引擎系列使用单独的线程池进行复制提取. 通过设置“background_fetches_pool_size”限制池的大小, 可以通过服务器重启进行调整. 设置的默认值是 3, 这意味着最大并行提取量等于 3 (允许使用 10G 网络) . 修复 #520. [#16390](https://github.com/ClickHouse/ClickHouse/pull/16390) ([alesapin](https://github.com/alesapin)). -* 修复了 `quantileTDigest` 状态的不受控制的增长. [#16680](https://github.com/ClickHouse/ClickHouse/pull/16680) ([hrissan](https://github.com/hrissan)). -* 将 `VIEW` 子查询描述添加到 `EXPLAIN`. 限制`VIEW`的下推优化. 将 `Distributed` 的本地副本添加到查询计划中. [#14936](https://github.com/ClickHouse/ClickHouse/pull/14936) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 max_threads > 0 和 ORDER BY 中的表达式修复 optimize_read_in_order/optimize_aggregation_in_order. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). -* 修复从 `Merge` 表读取大量 `MergeTree` 表的性能. 修复 [#7748](https://github.com/ClickHouse/ClickHouse/issues/7748). [#16988](https://github.com/ClickHouse/ClickHouse/pull/16988) ([Anton Popov](https://github.com/CurtizJ)). -* 现在我们可以安全地修剪具有精确匹配的分区. 有用的案例: 假设表由 `intHash64(x) % 100` 分区, 并且查询的条件是逐字的, 而不是 x. [#16253](https://github.com/ClickHouse/ClickHouse/pull/16253) ([Amos Bird](https://github.com/amosbird)). - -#### 实验功能 - -* 添加 `Embedded RocksDB` 表引擎 (可用于字典). [#15073](https://github.com/ClickHouse/ClickHouse/pull/15073) ([sundyli](https://github.com/sundy-li)). - -#### 构建/测试/打包改进 - -* 测试覆盖率构建图像的改进. [#17233](https://github.com/ClickHouse/ClickHouse/pull/17233) ([alesapin](https://github.com/alesapin)). -* 将嵌入的时区数据更新到 2020d 版 (同时将 cctz 更新到最新的 master). [#17204](https://github.com/ClickHouse/ClickHouse/pull/17204) ([filimonov](https://github.com/filimonov)). -* 修复 Poco 中的 UBSan 报告. 这将关闭 [#12719](https://github.com/ClickHouse/ClickHouse/issues/12719). [#16765](https://github.com/ClickHouse/ClickHouse/pull/16765) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 不要使用 UBSan 检测第三方库. [#16764](https://github.com/ClickHouse/ClickHouse/pull/16764) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复缓存字典中的 UBSan 报告. 这将关闭 [#12641](https://github.com/ClickHouse/ClickHouse/issues/12641). [#16763](https://github.com/ClickHouse/ClickHouse/pull/16763) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在尝试将无限浮点数转换为整数时修复 UBSan 报告. 这将关闭 [#14190](https://github.com/ClickHouse/ClickHouse/issues/14190). [#16677](https://github.com/ClickHouse/ClickHouse/pull/16677) ([alexey-milovidov](https://github.com/alexey-milovidov)). - - -## ClickHouse 版本 20.11 - -### ClickHouse 版本 v20.11.7.16-stable, 2021-03-02 - -#### 改进 - -* 将 clickhouse 用户和组的 uid / gid 显式设置为 clickhouse-server 图像中的固定值 (101). [#19096](https://github.com/ClickHouse/ClickHouse/pull/19096) ([filimonov](https://github.com/filimonov)). - -#### Bug 修复 - -* BloomFilter 索引崩溃修复. 修复 [#19757](https://github.com/ClickHouse/ClickHouse/issues/19757). [#19884](https://github.com/ClickHouse/ClickHouse/pull/19884) ([Maksim Kita](https://github.com/kitaisreal)). -* 如果启用了 system.text_log, 则可能出现死锁. 这修复了 [#19874](https://github.com/ClickHouse/ClickHouse/issues/19874). [#19875](https://github.com/ClickHouse/ClickHouse/pull/19875) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在以前的版本中, 函数 arrayEnumerateUniq 的异常参数可能会导致崩溃或无限循环. 这关闭 [#19787](https://github.com/ClickHouse/ClickHouse/issues/19787). [#19788](https://github.com/ClickHouse/ClickHouse/pull/19788) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了使用算术类型与字符串类型的准确比较时的堆栈溢出. [#19773](https://github.com/ClickHouse/ClickHouse/pull/19773) ([tavplubix](https://github.com/tavplubix)). -* 修复 `bitmapAndnot` 函数中的分段错误. 修复 [#19668](https://github.com/ClickHouse/ClickHouse/issues/19668). [#19713](https://github.com/ClickHouse/ClickHouse/pull/19713) ([Maksim Kita](https://github.com/kitaisreal)). -* 一些具有大整数的函数可能会导致段错误. 大整数是实验性功能. 这关闭 [#19667](https://github.com/ClickHouse/ClickHouse/issues/19667). [#19672](https://github.com/ClickHouse/ClickHouse/pull/19672) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `LowCardinality` 参数的 `neighbor` 函数的错误结果. 修复 [#10333](https://github.com/ClickHouse/ClickHouse/issues/10333). [#19617](https://github.com/ClickHouse/ClickHouse/pull/19617) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复断开连接后连接中 CompressedWriteBuffer 的 use-after-free. [#19599](https://github.com/ClickHouse/ClickHouse/pull/19599) ([Azat Khuzhin](https://github.com/azat)). -* `DROP/DETACH TABLE table ON CLUSTER cluster SYNC` 查询可能会挂起, 已修复. 修复 [#19568](https://github.com/ClickHouse/ClickHouse/issues/19568). [#19572](https://github.com/ClickHouse/ClickHouse/pull/19572) ([tavplubix](https://github.com/tavplubix)). -* 查询 CREATE DICTIONARY id 表达式修复. [#19571](https://github.com/ClickHouse/ClickHouse/pull/19571) ([Maksim Kita](https://github.com/kitaisreal)). -* 使用 merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read=0/UINT64_MAX 修复 SIGSEGV. [#19528](https://github.com/ClickHouse/ClickHouse/pull/19528) ([Azat Khuzhin](https://github.com/azat)). -* 如果使用专门设计的参数调用 `addMonth` 函数, 则可能会发生缓冲区溢出 (在内存读取时). 这修复了 [#19441](https://github.com/ClickHouse/ClickHouse/issues/19441). This fixes [#19413](https://github.com/ClickHouse/ClickHouse/issues/19413). [#19472](https://github.com/ClickHouse/ClickHouse/pull/19472) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果文件之一中有空数据块,则将分布式批处理标记为已损坏. [#19449](https://github.com/ClickHouse/ClickHouse/pull/19449) ([Azat Khuzhin](https://github.com/azat)). -* 修复 Uber H3 库中可能的缓冲区溢出. 请参阅 https://github.com/uber/h3/issues/392. 这将关闭 [#19219](https://github.com/ClickHouse/ClickHouse/issues/19219). [#19383](https://github.com/ClickHouse/ClickHouse/pull/19383) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 system.parts _state 列 (查询此列时出现 LOGICAL_ERROR,由于顺序不正确). [#19346](https://github.com/ClickHouse/ClickHouse/pull/19346) ([Azat Khuzhin](https://github.com/azat)). -* 修复错误 `Cannot convert column now64() because it is constant but values of constants are different in source and result` . 续 [#7156](https://github.com/ClickHouse/ClickHouse/issues/7156). [#19316](https://github.com/ClickHouse/ClickHouse/pull/19316) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复在处理 ReplicatedMergeTree 表时并发 `ALTER` 和 `DROP` 查询可能挂起的错误. [#19237](https://github.com/ClickHouse/ClickHouse/pull/19237) ([alesapin](https://github.com/alesapin)). -* 修复了从 `ORC` 格式的文件中无限读取的问题 (在 [#10580](https://github.com/ClickHouse/ClickHouse/issues/10580) 中引入). 修复 [#19095](https://github.com/ClickHouse/ClickHouse/issues/19095). [#19134](https://github.com/ClickHouse/ClickHouse/pull/19134) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 clickhouse 无法从 `LowCardinality(Nullable(...))` 读取压缩编解码器并抛出异常 `Attempt to read after EOF` 时的启动错误. 修复 [#18340](https://github.com/ClickHouse/ClickHouse/issues/18340). [#19101](https://github.com/ClickHouse/ClickHouse/pull/19101) ([alesapin](https://github.com/alesapin)). -* 修复了使用 `Template` 或 `CustomSeparated` 格式通过 http 接口插入数据时出现的 `There no checkpoint` 错误. 修复 [#19021](https://github.com/ClickHouse/ClickHouse/issues/19021). [#19072](https://github.com/ClickHouse/ClickHouse/pull/19072) ([tavplubix](https://github.com/tavplubix)). -* 限制对以旧语法创建的 `MergeTree` 表的 `MODIFY TTL` 查询. 之前查询成功了, 但实际上没有效果. [#19064](https://github.com/ClickHouse/ClickHouse/pull/19064) ([Anton Popov](https://github.com/CurtizJ)). -* 确保 `groupUniqArray` 为 Enum 类型的参数返回正确的类型. 这将关闭 [#17875](https://github.com/ClickHouse/ClickHouse/issues/17875). [#19019](https://github.com/ClickHouse/ClickHouse/pull/19019) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果将函数 `ignore` 与 `LowCardinality` 参数一起使用, 则修复可能的错误 `Expected single dictionary argument for function` . 修复 [#14275](https://github.com/ClickHouse/ClickHouse/issues/14275). [#19016](https://github.com/ClickHouse/ClickHouse/pull/19016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 `TinyLog` 引擎修复将 `LowCardinality` 列插入到表中的问题. 修复 [#18629](https://github.com/ClickHouse/ClickHouse/issues/18629). [#19010](https://github.com/ClickHouse/ClickHouse/pull/19010) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 禁用 `optimize_move_functions_out_of_any` 因为优化并不总是正确的. 这将关闭 [#18051](https://github.com/ClickHouse/ClickHouse/issues/18051). 这将关闭 [#18973](https://github.com/ClickHouse/ClickHouse/issues/18973). [#18981](https://github.com/ClickHouse/ClickHouse/pull/18981) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了非常罕见的关机死锁. [#18977](https://github.com/ClickHouse/ClickHouse/pull/18977) ([tavplubix](https://github.com/tavplubix)). -* 修复某些转义文本突变时的错误 (例如 `ALTER ... UPDATE e = CAST('foo', 'Enum8(\'foo\' = 1')` 序列化不正确). 修复 [#18878](https://github.com/ClickHouse/ClickHouse/issues/18878). [#18944](https://github.com/ClickHouse/ClickHouse/pull/18944) ([alesapin](https://github.com/alesapin)). -* 附加分区应该重置突变. [#18804](https://github.com/ClickHouse/ClickHouse/issues/18804). [#18935](https://github.com/ClickHouse/ClickHouse/pull/18935) ([fastio](https://github.com/fastio)). -* 修复 clickhouse-local 关机时可能挂起的问题. 这修复了 [#18891](https://github.com/ClickHouse/ClickHouse/issues/18891). [#18893](https://github.com/ClickHouse/ClickHouse/pull/18893) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 *If 具有一元函数和 Nullable 类型的组合器. [#18806](https://github.com/ClickHouse/ClickHouse/pull/18806) ([Azat Khuzhin](https://github.com/azat)). -* 如果设置`network_compression_method`全局设置为非默认值,则服务器可以拒绝异步分布式插入. 这修复了 [#18741](https://github.com/ClickHouse/ClickHouse/issues/18741). [#18776](https://github.com/ClickHouse/ClickHouse/pull/18776) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在尝试将 `CAST` `NULL` 从 `Nullable(String)` 转换为 `Nullable(Decimal(P, S))` 时的 `Attempt to read after eof` 错误. 现在函数`CAST` 在它不能从可为空的字符串解析十进制时返回`NULL`. 修复 [#7690](https://github.com/ClickHouse/ClickHouse/issues/7690). [#18718](https://github.com/ClickHouse/ClickHouse/pull/18718) ([Winter Zhang](https://github.com/zhang2014)). -* 使用不匹配的 arg 大小修复 Logger. [#18717](https://github.com/ClickHouse/ClickHouse/pull/18717) ([sundyli](https://github.com/sundy-li)). -* 添加 FixedString 数据类型支持. 将数据从 MySQL 复制到 ClickHouse 时, 我会收到此异常 `Code: 50, e.displayText() = DB::Exception: Unsupported type FixedString(1)` . 此补丁修复了错误 [#18450](https://github.com/ClickHouse/ClickHouse/issues/18450) 还修复了 [#6556](https://github.com/ClickHouse/ClickHouse/issues/6556). [#18553](https://github.com/ClickHouse/ClickHouse/pull/18553) ([awesomeleo](https://github.com/awesomeleo)). -* 在使用 `RIGHT` 或 FULL` 连接进行子查询后使用 `ORDER BY` 时修复可能的 `Pipeline stuck` 错误. [#18550](https://github.com/ClickHouse/ClickHouse/pull/18550) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复在相应的突变杀死后可能导致 `ALTER` 查询挂起的错误. 由线程模糊器发现. [#18518](https://github.com/ClickHouse/ClickHouse/pull/18518) ([alesapin](https://github.com/alesapin)). -* 在合并期间禁用AIO写, 因为这可能导致合并期间主键列的数据损坏. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). -* 当无法计算结果时, 在分析阶段禁用子查询的常量折叠. [#18446](https://github.com/ClickHouse/ClickHouse/pull/18446) ([Azat Khuzhin](https://github.com/azat)). -* 修复了在使用类型为 Nullable(String) 的参数执行 `toType(...)` 函数 (`toDate`、`toUInt32` 等) 时出现的 `value is too short` 错误. 现在这些函数在解析错误时返回 `NULL` 而不是抛出异常. 修复 [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). -* 限制从宽部分合并到紧凑部分. 在垂直合并的情况下, 它会导致结果部分损坏. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). -* 修复填充表 `system.settings_profile_elements` . 这个 PR 修复了 [#18231](https://github.com/ClickHouse/ClickHouse/issues/18231). [#18379](https://github.com/ClickHouse/ClickHouse/pull/18379) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复带有常量参数的二元函数的索引分析, 导致错误的查询结果. 这修复了 [#18364](https://github.com/ClickHouse/ClickHouse/issues/18364). [#18373](https://github.com/ClickHouse/ClickHouse/pull/18373) ([Amos Bird](https://github.com/amosbird)). -* 使用组合子 `Distinct` 修复聚合函数中可能的崩溃,同时使用两级聚合. 修复 [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). -* 如果只能从 `table` 中选择任意一列, 现在可以执行 `SELECT count() FROM table` . 此 PR 修复 [#10639](https://github.com/ClickHouse/ClickHouse/issues/10639). [#18233](https://github.com/ClickHouse/ClickHouse/pull/18233) ([Vitaly Baranov](https://github.com/vitlibar)). -* `SELECT JOIN` 现在需要对每个连接表的 `SELECT` 权限. 此 PR 修复 [#17654](https://github.com/ClickHouse/ClickHouse/issues/17654). [#18232](https://github.com/ClickHouse/ClickHouse/pull/18232) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复在读取退避的情况下从 `MergeTree*` 读取时可能不完整的查询结果 (消息`Debug: MergeTreeReadPool: Will lower number of threads in logs). 在 [#16423](https://github.com/ClickHouse/ClickHouse/issues/16423) 中引入. 修复 [#18137](https://github.com/ClickHouse/ClickHouse/issues/18137). [#18216](https://github.com/ClickHouse/ClickHouse/pull/18216) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复查询 `MODIFY COLUMN ... REMOVE TTL` 并没有真正删除列 TTL 时的错误. [#18130](https://github.com/ClickHouse/ClickHouse/pull/18130) ([alesapin](https://github.com/alesapin)). -* 使用谓词优化器修复不确定函数. 这修复了 [#17244](https://github.com/ClickHouse/ClickHouse/issues/17244). [#17273](https://github.com/ClickHouse/ClickHouse/pull/17273) ([Winter Zhang](https://github.com/zhang2014)). -* Mutation 可能会在 `MOVE` 或 `REPLACE PARTITION` 之后等待一些不存在的部分, 或者在极少数情况下, 在 `DETACH` 或 `DROP PARTITION` 之后挂起. 是固定的. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). - -#### 构建/测试/打包改进 - -* 将时区信息更新为 2020e. [#18531](https://github.com/ClickHouse/ClickHouse/pull/18531) ([alesapin](https://github.com/alesapin)). - - -### ClickHouse 版本 v20.11.6.6-stable, 2020-12-24 - -#### Bug 修复 - -* 修复了在具有双 `IPv4/IPv6 stack` 的机器上的服务器无法访问 `clickhouse-odbc-bridge` 进程时的问题, 并修复了使用格式错误的查询执行 ODBC 字典更新和/或导致崩溃时的问题. 这可能会关闭 [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). -* 修复了 Enum 和 Int 类型之间的键比较. 这修复了 [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). -* 修复了 `MaterializeMySQL` 数据库引擎中唯一键转换崩溃的问题. 这修复了 [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) 并修复了 [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了 S3 URL 解析中的 `std::out_of_range: basic_string`. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 修复了由于 MaterializeMySQL 不支持转换 MySQL 前缀索引而导致某些表无法从 MySQL 同步到 ClickHouse 的问题. 这修复了 [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) 并修复了 [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了查询包含`ARRAY JOIN`时查询优化产生错误结果的问题. [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). -* 修复 `topK` 聚合函数中可能出现的段错误. 这将关闭 [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). -* 如果禁用了`in_memory_parts_enable_wal`, 则不要从 WAL 恢复部件. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). -* 修复了 ClickHouse 无法恢复与 MySQL 服务器的连接时的问题. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). -* 修复了 `optimize_trivial_count_query` 与分区谓词不一致的行为. [#17644](https://github.com/ClickHouse/ClickHouse/pull/17644) ([Azat Khuzhin](https://github.com/azat)). -* 修复了服务器在守护进程模式下运行时空的 `system.stack_trace` 表. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). -* 修复了当 xxception `fmt::v7::format_error` 可以登录到 MergeTree 表的后台时的行为. 这修复了 [#17613](https://github.com/ClickHouse/ClickHouse/issues/17613). [#17615](https://github.com/ClickHouse/ClickHouse/pull/17615) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 clickhouse-client 在交互模式下使用多行查询和单行注释错误地扩展到查询结束时的行为. 这修复了 [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了服务器在极少数情况下停止接受连接的问题. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在不同副本上杀死相应突变时更改查询挂起的问题. 这修复了 [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). -* 修复了 clickhouse 低估标记缓存大小时的错误. 当有很多带有标记的小文件时可能会发生. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). -* 修复了启用设置 `optimize_redundant_functions_in_order_by` 的 `ORDER BY`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 `DISTINCT` 之后由于不正确优化而可能出现的重复项. 这修复了 [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了从具有 `LowCardinality` 类型的 `JOIN` 表读取时崩溃的问题. 这修复了 [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了子查询中有 const 列时设置索引失效的问题. 这修复了 [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246). [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). -* 修复索引比较类型不同时可能出现的错误索引分析. 这修复了 [#17122](https://github.com/ClickHouse/ClickHouse/issues/17122). [#17145](https://github.com/ClickHouse/ClickHouse/pull/17145) ([Amos Bird](https://github.com/amosbird)). -* 修复了 `ColumnConst` 比较导致崩溃. 这修复了 [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). -* 修复了非领导者 `ReplicatedMergeTreeTables` 的 `ON CLUSTER` 查询可能永远挂起的错误. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). -* 修复了函数 `fuzz Bits` 中模糊器发现的错误. 这修复了 [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). -* 避免远程查询的不必要的网络错误, 这些错误在执行时可能会被取消, 例如使用 `LIMIT` 的查询. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). -* 修复了从 double 转换时大整数 (128、256 位) 的错误结果. [#16986](https://github.com/ClickHouse/ClickHouse/pull/16986) ([Mike](https://github.com/myrrc)). -* 出现错误时解析 `format_avro_schema_registry_url` 的IP. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). -* 修复了在 `ALTER TABLE ... MODIFY COLUMN ... NewType` 之后, 当 `SELECT` 在更改列上具有 `WHERE` 表达式并且更改尚未完成时可能出现的服务器崩溃. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). -* `clickhouse-git-import` 中没有正确计算批判信息. [#16959](https://github.com/ClickHouse/ClickHouse/pull/16959) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 通过单调函数优化来固定顺序. 修复 [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了启用设置 `optimize_aggregators_of_group_by_keys` 和 joins 的 group by 优化. 这修复了 [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). -* 安装脚本应始终在 config 文件夹中创建子目录. 这仅与使用自定义配置的 Docker 构建相关. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). -* 修复了使用 `ORDER BY` 的查询可能出现的错误 `Illegal type of argument` . 这修复了 [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 如果没有数据写入 WriteBufferFromS3, 则中止分段上传. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). -* 修复了在不带任何参数的情况下使用 `any` 时崩溃的问题. 这修复了 [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803). [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). -* 修复了 ClickHouse 过去总是返回 0 而不是通过 MySQL 协议进行 `INSERT` 查询的受影响行数时的行为. 这修复了 [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了 TDigest 不受控制的增长. [#16680](https://github.com/ClickHouse/ClickHouse/pull/16680) ([hrissan](https://github.com/hrissan)). -* 修复了在 Aggregate 函数中使用后缀 `if` 时远程查询失败的问题. 这修复了 [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了由 `select_sequential_consistency` 导致优化的琐碎计数查询和 system.tables 的不一致行为. [#16309](https://github.com/ClickHouse/ClickHouse/pull/16309) ([Hao Chen](https://github.com/haoch)). -* 使用 ColumnTransformer 替换不存在的列时抛出错误. [#16183](https://github.com/ClickHouse/ClickHouse/pull/16183) ([hexiaoting](https://github.com/hexiaoting)). - - -### ClickHouse 版本 v20.11.3.3-stable, 2020-11-13 - -#### Bug 修复 - -* 当查询分析器打开并且 ClickHouse 安装在操作系统上时, 修复罕见的无声崩溃, glibc 版本已经 (据说) 损坏了某些功能的异步展开表. 这修复了 [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). - - -### ClickHouse 版本 v20.11.2.1, 2020-11-11 - -#### 向后不兼容变更 - -* 如果在 `distributed_ddl` 配置部分指定了一些 `profile`, 那么这个配置文件可以在服务器启动时覆盖 `default` 配置文件的设置. 已修复, 现在分布式 DDL 查询的设置不应影响全局服务器设置. [#16635](https://github.com/ClickHouse/ClickHouse/pull/16635) ([tavplubix](https://github.com/tavplubix)). -* 限制在键 (排序键、主键、分区键等) 中使用不可比较的数据类型 (如 `AggregateFunction`). [#16601](https://github.com/ClickHouse/ClickHouse/pull/16601) ([alesapin](https://github.com/alesapin)). -* 删除 `ANALYZE` 和 `AST` 查询,并使设置 `enable_debug_queries` 过时, 因为它现在是全功能 `EXPLAIN` 查询的一部分. [#16536](https://github.com/ClickHouse/ClickHouse/pull/16536) ([Ivan](https://github.com/abyss7)). -* 聚合函数 `boundingRatio`、`rankCorr`、`retention`、`timeSeriesGroupSum`、`timeSeriesGroupRateSum`、`windowFunnel` 被错误地设为不区分大小写. 现在他们的名字按照设计区分大小写. 只有在 SQL 标准中指定的函数或为了与其他 DBMS 兼容而制作的函数或与这些函数类似的函数才应不区分大小写. [#16407](https://github.com/ClickHouse/ClickHouse/pull/16407) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使 `rankCorr` 函数在数据不足时返回 nan [#16124](https://github.com/ClickHouse/ClickHouse/issues/16124). [#16135](https://github.com/ClickHouse/ClickHouse/pull/16135) ([hexiaoting](https://github.com/hexiaoting)). -* 从20.5以上的版本升级时, 如果进行滚动更新, 集群同时包含20.5以上和20.5以下的版本, 如果旧版本的ClickHouse节点重启, 旧版本在新版本存在的情况下启动, 可能会导致 到 `Part ... intersects previous part` 错误. 为防止出现此错误, 首先在所有集群节点上安装更新的 clickhouse-server 软件包, 然后重新启动 (因此,当 clickhouse-server 重新启动时, 它将以新版本启动). - -#### 新特征 - -* 添加了对 LDAP 作为本地不存在用户的用户目录的支持. [#12736](https://github.com/ClickHouse/ClickHouse/pull/12736) ([Denis Glazachev](https://github.com/traceon)). -* 添加 `system.replicated_fetches` 表, 显示当前正在运行的后台提取. [#16428](https://github.com/ClickHouse/ClickHouse/pull/16428) ([alesapin](https://github.com/alesapin)). -* 添加设置`date_time_output_format`. [#15845](https://github.com/ClickHouse/ClickHouse/pull/15845) ([Maksim Kita](https://github.com/kitaisreal)). -* 为 ClickHouse 添加了最小的 Web UI. [#16158](https://github.com/ClickHouse/ClickHouse/pull/16158) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 允许一次读/写单个 protobuf 消息 (无长度分隔符). [#15199](https://github.com/ClickHouse/ClickHouse/pull/15199) ([filimonov](https://github.com/filimonov)). -* 添加了初始 OpenTelemetry 支持. ClickHouse 现在通过 Native 和 HTTP 协议接受 OpenTelemetry traceparent 标头, 并在某些情况下向下游传递它们. 执行查询的跟踪跨度保存到 `system.opentelemetry_span_log` 表中. [#14195](https://github.com/ClickHouse/ClickHouse/pull/14195) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 允许在 `CREATE TABLE` 查询的列列表中指定主键. 这是与其他 SQL 方言兼容所必需的. [#15823](https://github.com/ClickHouse/ClickHouse/pull/15823) ([Maksim Kita](https://github.com/kitaisreal)). -* 实现 `OFFSET offset_row_count {ROW | ROWS} FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} {ONLY | WITH TIES}` 在带有 ORDER BY 的 SELECT 查询中. 这是指定 `LIMIT` 的SQL标准方式. [#15855](https://github.com/ClickHouse/ClickHouse/pull/15855) ([hexiaoting](https://github.com/hexiaoting)). -* `errorCodeToName` 函数 - 返回错误的变量名称 (用于分析 query_log 和类似的). `system.errors` 表 - 显示错误发生的次数 (包括 `system_events_show_zero_values`). [#16438](https://github.com/ClickHouse/ClickHouse/pull/16438) ([Azat Khuzhin](https://github.com/azat)). -* 添加了函数 `untuple`, 这是一个特殊的函数, 它可以通过扩展命名元组将新列引入到 SELECT 列表中. [#16242](https://github.com/ClickHouse/ClickHouse/pull/16242) ([Nikolai Kochetov](https://github.com/KochetovNicolai), [Amos Bird](https://github.com/amosbird)). -* 现在我们可以通过查询参数提供标识符. 并且这些参数可以用作表对象或列. [#16594](https://github.com/ClickHouse/ClickHouse/pull/16594) ([Amos Bird](https://github.com/amosbird)). -* 为 MergeTree BloomFilter 索引添加了大整数 (UInt256、Int128、Int256)和 UUID 数据类型支持. 大整数是一项实验性功能. [#16642](https://github.com/ClickHouse/ClickHouse/pull/16642) ([Maksim Kita](https://github.com/kitaisreal)). -* 添加 `farmFingerprint64` 函数 (非加密字符串散列). [#16570](https://github.com/ClickHouse/ClickHouse/pull/16570) ([Jacob Hayes](https://github.com/JacobHayes)). -* 添加 `log_queries_min_query_duration_ms`, 只有比这个设置的值慢的查询才会转到 `query_log`/`query_thread_log` (例如mysql中的 `slow_query_log` ). [#16529](https://github.com/ClickHouse/ClickHouse/pull/16529) ([Azat Khuzhin](https://github.com/azat)). -* 能够在 `Alpine` 的顶部创建一个 docker 图像. 使用来自 ubuntu 20.04 的预编译二进制和 glibc 组件. [#16479](https://github.com/ClickHouse/ClickHouse/pull/16479) ([filimonov](https://github.com/filimonov)). -* 添加了 `toUUIDOrNull`、`toUUIDOrZero` 转换函数. [#16337](https://github.com/ClickHouse/ClickHouse/pull/16337) ([Maksim Kita](https://github.com/kitaisreal)). -* 添加 `max_concurrent_queries_for_all_users` 设置, 用例见 [#6636](https://github.com/ClickHouse/ClickHouse/issues/6636). [#16154](https://github.com/ClickHouse/ClickHouse/pull/16154) ([nvartolomei](https://github.com/nvartolomei)). -* 向 clickhouse-client 添加一个新选项 `print_query_id`. 它有助于使用客户端生成的当前查询 ID 生成任意字符串. 默认情况下还会在 clickhouse-client 中打印查询 ID. [#15809](https://github.com/ClickHouse/ClickHouse/pull/15809) ([Amos Bird](https://github.com/amosbird)). -* 添加 `tid` 和 `logTrace` 函数. 这将关闭 [#9434](https://github.com/ClickHouse/ClickHouse/issues/9434). [#15803](https://github.com/ClickHouse/ClickHouse/pull/15803) ([flynn](https://github.com/ucasFL)). -* 添加函数 `formatReadableTimeDelta`, 将时间增量格式化为人类可读的字符串... [#15497](https://github.com/ClickHouse/ClickHouse/pull/15497) ([Filipe Caixeta](https://github.com/filipecaixeta)). -* 在多磁盘配置中为卷添加了 `disable_merges` 选项. [#13956](https://github.com/ClickHouse/ClickHouse/pull/13956) ([Vladimir Chebotarev](https://github.com/excitoon)). - -#### 实验功能 - -* 新函数 `encrypt`、`aes_encrypt_mysql`、`decrypt`、`aes_decrypt_mysql`. 这些功能运行缓慢, 因此我们将其视为实验性功能. [#11844](https://github.com/ClickHouse/ClickHouse/pull/11844) ([Vasily Nemkov](https://github.com/Enmk)). - -#### Bug 修复 - -* 在 `system.distribution_queue` 中的data_path中屏蔽密码. [#16727](https://github.com/ClickHouse/ClickHouse/pull/16727) ([Azat Khuzhin](https://github.com/azat)). -* 在启用了 `transform_null_in` 设置的情况下修复多个列和元组上的 `IN` 运算符. 修复 [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). -* 如果查询的表没有采样, 设置 `max_parallel_replicas` 将无法正常工作. 这修复了 [#5733](https://github.com/ClickHouse/ClickHouse/issues/5733). [#16675](https://github.com/ClickHouse/ClickHouse/pull/16675) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使用 max_threads > 0 和 ORDER BY 中的表达式修复 optimize_read_in_order/optimize_aggregation_in_order. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). -* `DEFAULT` 表达式的计算涉及可能的名称冲突 (这是不太可能遇到的). 这修复了 [#9359](https://github.com/ClickHouse/ClickHouse/issues/9359). [#16612](https://github.com/ClickHouse/ClickHouse/pull/16612) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `query_thread_log.query_duration_ms` 单元. [#16563](https://github.com/ClickHouse/ClickHouse/pull/16563) ([Azat Khuzhin](https://github.com/azat)). -* 修复使用 MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine 时的错误. `MaterializeMySQL` 是一个实验性功能. [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). -* 带有 `Decimal` 的 `round` 函数的特别设计参数导致整数除以零. 这修复了 [#13338](https://github.com/ClickHouse/ClickHouse/issues/13338). [#16451](https://github.com/ClickHouse/ClickHouse/pull/16451) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复分布式的 DROP TABLE (使用 INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). -* 修复复制队列中非常大的条目的处理. 如果表结构非常大 (接近 1 MB), 则非常大的条目可能会出现在 ALTER 查询中. 这修复了 [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了由于未创建过滤集而可能删除部分返回数据时的不一致行为. [#16308](https://github.com/ClickHouse/ClickHouse/pull/16308) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复 sharding_key 中的 dictGet (以及类似的地方, 即当函数上下文被永久存储时). [#16205](https://github.com/ClickHouse/ClickHouse/pull/16205) ([Azat Khuzhin](https://github.com/azat)). -* 修复尝试执行 `OPTIMIZE` 命令时在 `clickhouse-local` 中抛出的异常. 修复 [#16076](https://github.com/ClickHouse/ClickHouse/issues/16076). [#16192](https://github.com/ClickHouse/ClickHouse/pull/16192) ([filimonov](https://github.com/filimonov)). -* 修复 [#15780](https://github.com/ClickHouse/ClickHouse/issues/15780) 回归, 例如 `indexOf([1, 2, 3], toLowCardinality(1))` 现在被禁止, 但不应该. [#16038](https://github.com/ClickHouse/ClickHouse/pull/16038) ([Mike](https://github.com/myrrc)). -* 修复 MySQL 数据库的错误. 当用作数据库引擎的 MySQL 服务器关闭时, 某些查询会引发异常, 因为它们试图从禁用的服务器获取表, 而这是不必要的. 例如, 查询 `SELECT ... FROM system.parts` 应该只适用于 MergeTree 表并且根本不要接触 MySQL 数据库. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). -* 现在, 当 `ALTER MODIFY COLUMN ... DEFAULT ...` 与列类型的默认值不兼容时, 将抛出异常. 修复 [#15854](https://github.com/ClickHouse/ClickHouse/issues/15854). [#15858](https://github.com/ClickHouse/ClickHouse/pull/15858) ([alesapin](https://github.com/alesapin)). -* 修复了 IPv4CIDRToRange/IPv6CIDRToRange 函数以接受常量 IP 列值. [#15856](https://github.com/ClickHouse/ClickHouse/pull/15856) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). - -#### 改进 - -* 将 `INTERVAL '1 hours'` 视为等同于 `INTERVAL 1 HOUR`, 以与 Postgres 和类似的兼容. 这修复了 [#15637](https://github.com/ClickHouse/ClickHouse/issues/15637). [#15978](https://github.com/ClickHouse/ClickHouse/pull/15978) ([flynn](https://github.com/ucasFL)). -* 启用通过 CSV、TSV 和 JSON 输入格式的数字 ID 解析枚举值. [#15685](https://github.com/ClickHouse/ClickHouse/pull/15685) ([vivarum](https://github.com/vivarum)). -* 更好地为 JBOD 架构和 `MergeTree` 存储安排读取任务. 新设置 `read_backoff_min_concurrency` 作为读取线程数的下限. [#16423](https://github.com/ClickHouse/ClickHouse/pull/16423) ([Amos Bird](https://github.com/amosbird)). -* 在 `Avro` 格式中添加对 `LowCardinality` 的缺失支持. [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). -* 将 `S3` 与 nginx 服务器一起用作代理的解决方法. Nginx 当前不接受像 `http://domain.com?delete` 这样的空路径 url, 但是 vanilla aws-sdk-cpp 会产生这种 url. 此提交使用修补过的 aws-sdk-cpp 版本, 在这种情况下, 它使 url 以"/"作为路径, 例如 `http://domain.com/?delete`. [#16814](https://github.com/ClickHouse/ClickHouse/pull/16814) ([ianton-ru](https://github.com/ianton-ru)). -* 更好地诊断输入数据中的解析错误. 在 `Cannot read all data` 错误上提供行号. [#16644](https://github.com/ClickHouse/ClickHouse/pull/16644) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使 `mind Map` 和`maxMap` 的行为更加可取. 它不会在结果中跳过零值. 修复 [#16087](https://github.com/ClickHouse/ClickHouse/issues/16087). [#16631](https://github.com/ClickHouse/ClickHouse/pull/16631) ([Ildus Kurbangaliev](https://github.com/ildus)). -* 在运行时更好地更新 ZooKeeper 配置. [#16630](https://github.com/ClickHouse/ClickHouse/pull/16630) ([sundyli](https://github.com/sundy-li)). -* 尽早应用 SETTINGS 子句. 它允许修改查询中的更多设置. 这将关闭 [#3178](https://github.com/ClickHouse/ClickHouse/issues/3178). [#16619](https://github.com/ClickHouse/ClickHouse/pull/16619) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在 `event_time_microseconds` 字段存储在 Decimal64 中, 而不是 UInt64. [#16617](https://github.com/ClickHouse/ClickHouse/pull/16617) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 现在可以在`APPLY`列转换器中使用参数化函数. [#16589](https://github.com/ClickHouse/ClickHouse/pull/16589) ([Amos Bird](https://github.com/amosbird)). -* 改进后台任务的调度, 该任务删除 `Atomic` 数据库中已删除表的数据. 如果表实际上没有数据目录, `Atomic` 数据库不会创建到表数据目录的损坏符号链接. [#16584](https://github.com/ClickHouse/ClickHouse/pull/16584) ([tavplubix](https://github.com/tavplubix)). -* `WITH` 部分 (CTE) 中的子查询可以通过名称引用 `WITH` 部分中先前的子查询. [#16575](https://github.com/ClickHouse/ClickHouse/pull/16575) ([Amos Bird](https://github.com/amosbird)). -* 将 current_database 添加到 `system.query_thread_log`. [#16558](https://github.com/ClickHouse/ClickHouse/pull/16558) ([Azat Khuzhin](https://github.com/azat)). -* 允许将当前实例中已经提交或过时的部分提取到分离目录中. 当从另一个集群迁移表并具有 N 到 1 个分片映射时, 它很有用. 它也与当前的 fetchPartition 实现一致. [#16538](https://github.com/ClickHouse/ClickHouse/pull/16538) ([Amos Bird](https://github.com/amosbird)). -* `RabbitMQ` 的多项改进: 修复了 [#16263](https://github.com/ClickHouse/ClickHouse/issues/16263) 的错误. 还最小化了事件循环生命周期. 添加了更高效的队列设置. [#16426](https://github.com/ClickHouse/ClickHouse/pull/16426) ([Kseniia Sumarokova](https://github.com/kssenii)). -* 修复 `quantileDeterministic` 函数中的调试断言. 在以前的版本中, 它还可以通过网络传输多达两倍的数据. 虽然不存在错误. 这修复了 [#15683](https://github.com/ClickHouse/ClickHouse/issues/15683). [#16410](https://github.com/ClickHouse/ClickHouse/pull/16410) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加 `TablesToDropQueueSize` 指标. 它等于正在等待后台数据删除的已删除表的数量. [#16364](https://github.com/ClickHouse/ClickHouse/pull/16364) ([tavplubix](https://github.com/tavplubix)). -* 当客户端断开连接时更好的诊断. 在以前的版本中, 服务器中记录了 `Attempt to read after EOF` 和 `Broken pipe` 异常. 在新版本中, 它的信息消息 `Client has dropped the connection, cancel the query.`. [#16329](https://github.com/ClickHouse/ClickHouse/pull/16329) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 为 Set/Join 表引擎添加 total_rows/total_bytes (来自 system.tables) 支持. [#16306](https://github.com/ClickHouse/ClickHouse/pull/16306) ([Azat Khuzhin](https://github.com/azat)). -* 现在可以为 MergeTree 表引擎系列指定没有 `ORDER BY` 的 `PRIMARY KEY`. 关闭 [#15591](https://github.com/ClickHouse/ClickHouse/issues/15591). [#16284](https://github.com/ClickHouse/ClickHouse/pull/16284) ([alesapin](https://github.com/alesapin)). -* 如果系统中没有 tmp 文件夹 (chroot、错误配置等) `clickhouse-local` 将在当前目录中创建临时子文件夹. [#16280](https://github.com/ClickHouse/ClickHouse/pull/16280) ([filimonov](https://github.com/filimonov)). -* 添加对嵌套数据类型 (如命名元组) 作为子类型的支持. 修复 [#15587](https://github.com/ClickHouse/ClickHouse/issues/15587). [#16262](https://github.com/ClickHouse/ClickHouse/pull/16262) ([Ivan](https://github.com/abyss7)). -* 支持`database_atomic_wait_for_drop_and_detach_synchronously`/`NO DELAY`/`SYNC` for `DROP DATABASE`. [#16127](https://github.com/ClickHouse/ClickHouse/pull/16127) ([Azat Khuzhin](https://github.com/azat)). -* 添加 `allow_nondeterministic_optimize_skip_unused_shards` (允许在分片键中使用非确定性,如 `rand()` 或 `dictGet()`). [#16105](https://github.com/ClickHouse/ClickHouse/pull/16105) ([Azat Khuzhin](https://github.com/azat)). -* 修复 `memory_profiler_step`/`max_untracked_memory` 以通过 HTTP 进行查询 (包括测试). 修复在 xml 配置中全局调整此值也无济于事的问题, 因为这些设置无论如何都不会应用, 只有默认 (4MB) 值是 [used](https://github.com/ClickHouse/ClickHouse/blob/17731245336d8c84f75e4c0894c5797ed7732190 /src/Common/ThreadStatus.h#L104). 修复 http 查询最根 ThreadStatus 的 `query_id` (通过在读取 query_id 后初始化 QueryScope). [#16101](https://github.com/ClickHouse/ClickHouse/pull/16101) ([Azat Khuzhin](https://github.com/azat)). -* 现在, 无论集群配置中的 `` 设置如何,都可以执行 `ALTER ... ON CLUSTER` 查询. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). -* 修复了 `clickhouse-client` 可能因加载建议而在退出时中止的罕见问题. 这修复了 [#16035](https://github.com/ClickHouse/ClickHouse/issues/16035). [#16047](https://github.com/ClickHouse/ClickHouse/pull/16047) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 为具有复杂键的 `Redis` 字典添加 `cache` 布局支持. [#15985](https://github.com/ClickHouse/ClickHouse/pull/15985) ([Anton Popov](https://github.com/CurtizJ)). -* 在配置错误的情况下修复查询挂起 (无限循环) (`connections_with_failover_max_tries` 设置为 0). [#15876](https://github.com/ClickHouse/ClickHouse/pull/15876) ([Azat Khuzhin](https://github.com/azat)). -* 将某些日志消息的级别从信息更改为调试, 因此不会为每个查询显示信息消息. 这将关闭 [#5293](https://github.com/ClickHouse/ClickHouse/issues/5293). [#15816](https://github.com/ClickHouse/ClickHouse/pull/15816) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 删除 `MemoryTrackingInBackground*` 指标以避免潜在的误导性结果. 这修复了 [#15684](https://github.com/ClickHouse/ClickHouse/issues/15684). [#15813](https://github.com/ClickHouse/ClickHouse/pull/15813) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加重新连接到 `zookeeper-dump-tree` 工具. [#15711](https://github.com/ClickHouse/ClickHouse/pull/15711) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 允许在 `CREATE TABLE table AS table_function(...)` 查询中明确指定列列表. 修复 [#9249](https://github.com/ClickHouse/ClickHouse/issues/9249) 修复 [#14214](https://github.com/ClickHouse/ClickHouse/issues/14214). [#14295](https://github.com/ClickHouse/ClickHouse/pull/14295) ([tavplubix](https://github.com/tavplubix)). - -#### 性能改进 - -* 不要在 SELECT FINAL 中跨分区合并部分. [#15938](https://github.com/ClickHouse/ClickHouse/pull/15938) ([Kruglov Pavel](https://github.com/Avogar)). -* 提高 `-OrNull` 和 `-OrDefault` 聚合函数的性能. [#16661](https://github.com/ClickHouse/ClickHouse/pull/16661) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 提高 `quantileMerge` 的性能. 在以前的版本中, 它非常慢. 这将关闭 [#1463](https://github.com/ClickHouse/ClickHouse/issues/1463). [#16643](https://github.com/ClickHouse/ClickHouse/pull/16643) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 稍微提高逻辑函数的性能. [#16347](https://github.com/ClickHouse/ClickHouse/pull/16347) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 改进了 MergeTree 表引擎中合并分配的性能. 不应该对用户可见. [#16191](https://github.com/ClickHouse/ClickHouse/pull/16191) ([alesapin](https://github.com/alesapin)). -* 通过预分配哈希表加速哈希/sparse_hashed 字典加载. [#15454](https://github.com/ClickHouse/ClickHouse/pull/15454) ([Azat Khuzhin](https://github.com/azat)). -* 现在, 琐碎的计数优化变得有点不琐碎了.包含精确分区expr的谓词也可以被优化. 这也修复了[#11092](https://github.com/ClickHouse/ClickHouse/issues/11092)当 `max_parallel_replicas > 1` 时返回错误计数的问题. [#15074](https://github.com/ClickHouse/ClickHouse/pull/15074) ([Amos Bird](https://github.com/amosbird)). - -#### 构建/测试/打包改进 - -* 为无状态测试添加薄片检查. 在功能测试被合并之前, 它将提前检测出可能不可靠的功能测试. [#16238](https://github.com/ClickHouse/ClickHouse/pull/16238) ([alesapin](https://github.com/alesapin)). -* 使用适当的版本进行 `croaring` 而不是合并. [#16285](https://github.com/ClickHouse/ClickHouse/pull/16285) ([sundyli](https://github.com/sundy-li)). -* 改进为 `ya.make` 构建系统生成构建文件 (Arcadia). [#16700](https://github.com/ClickHouse/ClickHouse/pull/16700) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 为 `MaterializeMySQL` 数据库引擎添加MySQL BinLog文件检查工具. `MaterializeMySQL` 是一个实验性功能. [#16223](https://github.com/ClickHouse/ClickHouse/pull/16223) ([Winter Zhang](https://github.com/zhang2014)). -* 检查非可执行文件上的可执行位. 人们经常不小心从 Windows 提交可执行文件. [#15843](https://github.com/ClickHouse/ClickHouse/pull/15843) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 检查标题中的 `#pragma once` . [#15818](https://github.com/ClickHouse/ClickHouse/pull/15818) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 libhdfs3 中非法代码样式 `&vector[idx]`. 这修复了 libcxx 调试版本。 另见 https://github.com/ClickHouse-Extras/libhdfs3/pull/8 . [#15815](https://github.com/ClickHouse/ClickHouse/pull/15815) ([Amos Bird](https://github.com/amosbird)). -* 在 Mac OS 上修复一个杂项示例工具的构建. 请注意, 我们不在我们的 CI 中在 Mac OS 上构建示例 (我们仅构建 ClickHouse 二进制文件), 因此它不会再次中断的可能性为零. 这修复了 [#15804](https://github.com/ClickHouse/ClickHouse/issues/15804). [#15808](https://github.com/ClickHouse/ClickHouse/pull/15808) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 简化 Sys/V 初始化脚本. [#14135](https://github.com/ClickHouse/ClickHouse/pull/14135) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 将 `boost::program_options` 添加到 `db_generator` 以提高其可用性. 这将关闭 [#15940](https://github.com/ClickHouse/ClickHouse/issues/15940). [#15973](https://github.com/ClickHouse/ClickHouse/pull/15973) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). - - -## ClickHouse 版本 20.10 - -### ClickHouse 版本 v20.10.7.4-stable, 2020-12-24 - -#### Bug 修复 - -* 修复了 `clickhouse-odbc-bridge` 进程无法被具有双 `IPv4/IPv6` 堆栈的机器上的服务器访问的问题, 并修复了使用格式错误的查询执行 ODBC 字典更新和/或导致崩溃时的问题. 这可能会关闭 [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). -* 修复 Enum 和 Int 类型之间的键比较. 这修复了 [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). -* 修复了 `MaterializeMySQL` 数据库引擎中唯一键转换崩溃的问题. 这修复了 [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) 并修复了 [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了 S3 URL 解析中的 `std::out_of_range: basic_string`. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 修复了由于 MaterializeMySQL 不支持转换 MySQL 前缀索引而导致某些表无法从 MySQL 同步到 ClickHouse 的问题. 这修复了 [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) 并修复了 [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). -* 修复 `topK` 聚合函数中可能出现的段错误. 这将关闭 [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). -* 如果禁用了`in_memory_parts_enable_wal`, 则不要从 `WAL` 恢复部件. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). -* 修复了 ClickHouse 无法恢复与 MySQL 服务器的连接时的问题. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). -* 修复了服务器在守护进程模式下运行时空的 `system.stack_trace` 表. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). -* 修复了在多行查询的交互模式下使用 `clickhouse-client` 时的行为, 并且单行注释被错误地扩展到查询结束. 这修复了 [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了服务器在极少数情况下停止接受连接的问题. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在不同副本上杀死相应突变时的 `ALTER` 查询挂起. 这修复了 [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). -* 修复了 clickhouse 低估标记缓存大小时的错误. 当有很多带有标记的小文件时可能会发生. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). -* 修复了启用设置 `optimize_redundant_functions_in_order_by` 的 `ORDER BY` . [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 `DISTINCT` 之后由于不正确优化而可能出现的重复项. 修复 [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了从具有 `LowCardinality` 类型的 `JOIN` 表读取时崩溃的问题. 这修复了 [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了子查询中存在 const 列时设置索引失效的问题. 这修复了 [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246). [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). -* 修复了导致崩溃的 `ColumnConst` 比较. 这个修复了 [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088). [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). -* 修复了非领导者 `ReplicatedMergeTreeTables` 的 `ON CLUSTER` 查询可能永远挂起的错误. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). -* 修复了函数 `fuzzBits` 中的模糊器发现错误. 这修复了. [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). -* 避免远程查询的不必要的网络错误, 这些错误在执行时可能会被取消, 例如使用 `LIMIT` 的查询. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). -* 修复了从 double 转换时大整数 (128、256 位) 的错误结果. [#16986](https://github.com/ClickHouse/ClickHouse/pull/16986) ([Mike](https://github.com/myrrc)). -* 出现错误时解析 `format_avro_schema_registry_url` 的IP. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). -* 修复了在 `ALTER TABLE ... MODIFY COLUMN ... NewType` 之后, 当“SELECT”在更改列上具有 `WHERE` 表达式并且更改尚未完成时可能出现的服务器崩溃. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). -* `clickhouse-git-import` 中没有正确计算批判信息. [#16959](https://github.com/ClickHouse/ClickHouse/pull/16959) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 通过单调函数优化来固定顺序. 这修复了 [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). -* Fixrf 通过启用设置 `optimize_aggregators_of_group_by_keys` 和连接来优化组. 这修复了 [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). -* 安装脚本应始终在 config 文件夹中创建子目录. 这仅与使用自定义配置的 Docker 构建相关. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). -* 使用 `ORDER BY` 的查询修复可能的错误 `Illegal type of argument` . 这修复了 [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 如果没有数据写入`WriteBufferFromS3`, 则中止分段上传. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). -* 修复了在不带任何参数的情况下使用 `any` 时的崩溃问题. 这修复了 [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803). [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). -* 修复了 ClickHouse 过去总是通过 MySQL 协议为 `INSERT` 查询返回许多受影响行的 0 插入的行为. 这修复了 [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了 `TDigest` 不受控制的增长. [#16680](https://github.com/ClickHouse/ClickHouse/pull/16680) ([hrissan](https://github.com/hrissan)). -* 修复了在 Aggregate 函数中使用后缀 `if` 时远程查询失败的问题. 这修复了 [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). - - -### ClickHouse 版本 v20.10.4.1-stable, 2020-11-13 - -#### Bug 修复 - -* 当查询分析器打开并且 ClickHouse 安装在操作系统上时, 修复罕见的无声崩溃, glibc 版本已经 (据说) 损坏了某些功能的异步展开表. 这修复了 [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301)。 这修复了 [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在启用了 `transform_null_in` 设置的情况下修复多个列和元组上的 `IN` 运算符. 修复 [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). -* 这将修复 optimize_read_in_order/optimize_aggregation_in_order 与 max_threads>0 和 ORDER BY 中的表达式. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). -* 现在, 当从输入解析 AVRO 时, LowCardinality 从类型中删除. 修复 [#16188](https://github.com/ClickHouse/ClickHouse/issues/16188). [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). -* 通过适当缩小 GTID 集, 修复使用 MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine 和 MySQL Slave 上启用的 `slave_parallel_worker` 时元数据的快速增长. 这修复了 [#15951](https://github.com/ClickHouse/ClickHouse/issues/15951). [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). -* 修复分布式的 DROP TABLE (使用 INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). -* 修复复制队列中非常大的条目的处理. 如果表结构非常大 (接近 1 MB), 则非常大的条目可能会出现在 ALTER 查询中. 这修复了 [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 MySQL 数据库的错误. 当用作数据库引擎的 MySQL 服务器关闭时, 某些查询会引发异常, 因为它们试图从禁用的服务器获取表, 而这是不必要的. 例如, 查询 `SELECT ... FROM system.parts` 应该只适用于 MergeTree 表并且根本不要接触 MySQL 数据库. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). - -#### 改进 - -* 将 S3 与 nginx 服务器一起用作代理的解决方法。 Nginx 当前不接受像 http://domain.com?delete 这样的空路径 url,但是 vanilla aws-sdk-cpp 会生成这种 url。 此提交使用修补过的 aws-sdk-cpp 版本,在这种情况下,它使 url 以“/”作为路径,例如 http://domain.com/?delete. [#16813](https://github.com/ClickHouse/ClickHouse/pull/16813) ([ianton-ru](https://github.com/ianton-ru)). - - -### ClickHouse 版本 v20.10.3.30, 2020-10-28 - -#### 向后不兼容变更 - -* 使 `multiple_joins_rewriter_version` 过时. 删除连接重写器的第一个版本. [#15472](https://github.com/ClickHouse/ClickHouse/pull/15472) ([Artem Zuikov](https://github.com/4ertus2)). -* 将 `format_regexp_escaping_rule` 设置的默认值 (它与 `Regexp` 格式相关) 更改为 `Raw` (这意味着 - 将整个子模式作为一个值读取), 使行为更符合用户的期望. [#15426](https://github.com/ClickHouse/ClickHouse/pull/15426) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 SQL 中添加对嵌套多行注释 `/* 注释 /* 注释 */ */` 的支持. 这符合SQL标准. [#14655](https://github.com/ClickHouse/ClickHouse/pull/14655) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了 MergeTree 设置 (`max_replicated_merges_with_ttl_in_queue` 和 `max_number_of_merges_with_ttl_in_pool`) 来控制后台池和复制队列中与 TTL 合并的数量. 仅当您使用删除 TTL 时, 此更改才会破坏与旧版本的兼容性. 否则, 复制将保持兼容. 如果您一次更新所有分片副本或执行 `SYSTEM STOP TTL MERGES` 直到完成所有副本的更新, 您可以避免不兼容问题. 如果你在复制队列中得到一个不兼容的条目, 首先, 执行 `SYSTEM STOP TTL MERGES` , 然后在 `ALTER TABLE ... DETACH PARTITION ...` 分配不兼容的TTL合并的分区. 将其重新连接到单个副本上. [#14490](https://github.com/ClickHouse/ClickHouse/pull/14490) ([alesapin](https://github.com/alesapin)). -* 从20.5以上的版本升级时, 如果进行滚动更新, 集群同时包含20.5以上和20.5以下的版本, 如果旧版本的ClickHouse节点重启, 旧版本在新版本存在的情况下启动, 可能会导致 `Part ... intersects previous part` 错误. 为防止出现此错误, 首先在所有集群节点上安装更新的 clickhouse-server 软件包, 然后重新启动 (因此, 当 clickhouse-server 重新启动时, 它将以新版本启动). - -#### 新特征 - -* 后台数据再压缩. 添加为 MergeTree 表引擎系列指定 `TTL ... RECOMPRESS codec_name` 的能力. [#14494](https://github.com/ClickHouse/ClickHouse/pull/14494) ([alesapin](https://github.com/alesapin)). -* 添加并行仲裁插入. 这将关闭 [#15601](https://github.com/ClickHouse/ClickHouse/issues/15601). [#15601](https://github.com/ClickHouse/ClickHouse/pull/15601) ([Latysheva Alexandra](https://github.com/alexelex)). -* 用于额外强制执行数据持久性的设置. 对非复制设置有用. [#11948](https://github.com/ClickHouse/ClickHouse/pull/11948) ([Anton Popov](https://github.com/CurtizJ)). -* 当复制块写入本地不存在的副本时 (尚未从副本中提取), 不要忽略它并在本地写入, 以达到与复制成功相同的效果. [#11684](https://github.com/ClickHouse/ClickHouse/pull/11684) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在我们支持 `WITH AS (subquery) ... ` 在查询上下文中引入命名子查询. 这将关闭 [#2416](https://github.com/ClickHouse/ClickHouse/issues/2416). 这将关闭 [#4967](https://github.com/ClickHouse/ClickHouse/issues/4967). [#14771](https://github.com/ClickHouse/ClickHouse/pull/14771) ([Amos Bird](https://github.com/amosbird)). -* 引入 `enable_global_with_statement` 设置, 它将第一个 select 的 `WITH` 语句传播到同一级别的其他选择查询, 并使 `WITH` 语句中的别名对子查询可见. [#15451](https://github.com/ClickHouse/ClickHouse/pull/15451) ([Amos Bird](https://github.com/amosbird)). -* 安全的集群间查询执行 (initial_user 作为当前查询用户). [#13156](https://github.com/ClickHouse/ClickHouse/pull/13156) ([Azat Khuzhin](https://github.com/azat)). [#15551](https://github.com/ClickHouse/ClickHouse/pull/15551) ([Azat Khuzhin](https://github.com/azat)). -* 添加删除列属性和表 TTL 的功能. 引入了查询 `ALTER TABLE MODIFY COLUMN col_name REMOVE what_to_remove`和`ALTER TABLE REMOVE TTL`. 这两个操作都是轻量级的, 并且在元数据级别执行. [#14742](https://github.com/ClickHouse/ClickHouse/pull/14742) ([alesapin](https://github.com/alesapin)). -* 添加格式 `RawBLOB` . 它用于输入或输出没有任何转义和分隔符的单个值. 这将关闭 [#15349](https://github.com/ClickHouse/ClickHouse/issues/15349). [#15364](https://github.com/ClickHouse/ClickHouse/pull/15364) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加 `reinterpretAsUUID` 函数, 允许将大端字节字符串转换为 UUID. [#15480](https://github.com/ClickHouse/ClickHouse/pull/15480) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 实现 `force_data_skiping_indices` 设置. [#15642](https://github.com/ClickHouse/ClickHouse/pull/15642) ([Azat Khuzhin](https://github.com/azat)). -* 添加一个设置 `output_format_pretty_row_numbers` 以计算出漂亮格式的结果. 这将关闭 [#15350](https://github.com/ClickHouse/ClickHouse/issues/15350). [#15443](https://github.com/ClickHouse/ClickHouse/pull/15443) ([flynn](https://github.com/ucasFL)). -* 添加了查询混淆工具. 它允许共享更多查询以进行更好的测试. 这将关闭 [#15268](https://github.com/ClickHouse/ClickHouse/issues/15268). [#15321](https://github.com/ClickHouse/ClickHouse/pull/15321) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加表函数 `null('structure')` . [#14797](https://github.com/ClickHouse/ClickHouse/pull/14797) ([vxider](https://github.com/Vxider)). -* 添加了 `formatReadableQuantity` 函数. 它对于人类读取大数字很有用. [#14725](https://github.com/ClickHouse/ClickHouse/pull/14725) ([Artem Hnilov](https://github.com/BooBSD)). -* 添加格式 `LineAsString` 接受由换行符分隔的一系列行, 每一行都作为一个整体解析为单个 String 字段. [#14703](https://github.com/ClickHouse/ClickHouse/pull/14703) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)), [#13846](https://github.com/ClickHouse/ClickHouse/pull/13846) ([hexiaoting](https://github.com/hexiaoting)). -* 添加以字符串数组形式输出数据的 `JSONStrings` 格式. [#14333](https://github.com/ClickHouse/ClickHouse/pull/14333) ([hcz](https://github.com/hczhcz)). -* 为`Regexp` 格式添加对 `Raw` 列格式的支持。 它允许简单地将子模式作为一个整体提取,而无需任何转义规则. [#15363](https://github.com/ClickHouse/ClickHouse/pull/15363) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 允许 `TSV` 输出格式的可配置 `NULL` 表示. 它由设置 `output_format_tsv_null_representation` 控制, 默认情况下为 `\N`. 这将关闭 [#9375](https://github.com/ClickHouse/ClickHouse/issues/9375). 请注意, 该设置仅控制输出格式, 并且 `\N` 是 `TSV` 输入格式唯一支持的 `NULL` 表示. [#14586](https://github.com/ClickHouse/ClickHouse/pull/14586) ([Kruglov Pavel](https://github.com/Avogar)). -* 支持 `MaterializeMySQL` 的十进制数据类型。 `MaterializeMySQL` 是一个实验性功能. [#14535](https://github.com/ClickHouse/ClickHouse/pull/14535) ([Winter Zhang](https://github.com/zhang2014)). -* 添加新功能: `SHOW DATABASES LIKE 'xxx'`. [#14521](https://github.com/ClickHouse/ClickHouse/pull/14521) ([hexiaoting](https://github.com/hexiaoting)). -* 添加了将 (任意) git 存储库作为示例数据集导入到 ClickHouse 的脚本. [#14471](https://github.com/ClickHouse/ClickHouse/pull/14471) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在插入语句可以在列列表中带有带有列转换器的星号 (或变体). [#14453](https://github.com/ClickHouse/ClickHouse/pull/14453) ([Amos Bird](https://github.com/amosbird)). -* 用于分布式查询的新查询复杂度限制设置 `max_rows_to_read_leaf`、`max_bytes_to_read_leaf`, 以限制在叶节点上读取的最大行数/字节数. 限制仅适用于本地读取, *排除*根节点上的最终合并阶段. [#14221](https://github.com/ClickHouse/ClickHouse/pull/14221) ([Roman Khavronenko](https://github.com/hagen1778)). -* 允许用户在配置文件的 `` 部分为 `ReplicatedMergeTree*` 存储指定设置. 它的工作原理类似于 `` 部分. 对于 `ReplicatedMergeTree*` 存储, `` 和 `` 中的设置被一起应用, 但来自 `` 的设置具有更高的优先级. 添加了`system.replicated_merge_tree_settings`表. [#13573](https://github.com/ClickHouse/ClickHouse/pull/13573) ([Amos Bird](https://github.com/amosbird)). -* 添加 `mapPopulateSeries` 函数. [#13166](https://github.com/ClickHouse/ClickHouse/pull/13166) ([Ildus Kurbangaliev](https://github.com/ildus)). -* 支持 MySQL 类型:`decimal` (作为 ClickHouse`Decimal`) 和具有亚秒级精度的 `datetime` (作为 `DateTime64`). [#11512](https://github.com/ClickHouse/ClickHouse/pull/11512) ([Vasily Nemkov](https://github.com/Enmk)). -* 将 `event_time_microseconds` 字段引入 `system.text_log`、`system.trace_log`、`system.query_log` 和 `system.query_thread_log` 表. [#14760](https://github.com/ClickHouse/ClickHouse/pull/14760) ([Bharat Nallan](https://github.com/bharatnc)). -* 将 `event_time_microseconds` 添加到 `system.asynchronous_metric_log` 和 `system.metric_log` 表. [#14514](https://github.com/ClickHouse/ClickHouse/pull/14514) ([Bharat Nallan](https://github.com/bharatnc)). -* 将 `query_start_time_microseconds` 字段添加到 `system.query_log` 和 `system.query_thread_log` 表. [#14252](https://github.com/ClickHouse/ClickHouse/pull/14252) ([Bharat Nallan](https://github.com/bharatnc)). - -#### Bug 修复 - -* 修复无论限制如何都可以过度分配内存的情况. 这将关闭 [#14560](https://github.com/ClickHouse/ClickHouse/issues/14560). [#16206](https://github.com/ClickHouse/ClickHouse/pull/16206) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `executable` 字典源挂起. 在以前的版本中, 当使用某些格式 (例如`JSONEachRow`) 时, 数据在至少输出一些东西之前不会提供给子进程. 这将关闭 [#1697](https://github.com/ClickHouse/ClickHouse/issues/1697). 这将关闭 [#2455](https://github.com/ClickHouse/ClickHouse/issues/2455). [#14525](https://github.com/ClickHouse/ClickHouse/pull/14525) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在函数 `dictGet` 出现异常时修复double free. 如果字典加载错误, 可能会发生这种情况. [#16429](https://github.com/ClickHouse/ClickHouse/pull/16429) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用总数/汇总/多维数据集修饰符和最小/最大功能按键修复分组. 修复 [#16393](https://github.com/ClickHouse/ClickHouse/issues/16393). [#16397](https://github.com/ClickHouse/ClickHouse/pull/16397) ([Anton Popov](https://github.com/CurtizJ)). -* 使用 `prefer_localhost_replica=0` 和 `internal_replication` 修复异步分布式插入. [#16358](https://github.com/ClickHouse/ClickHouse/pull/16358) ([Azat Khuzhin](https://github.com/azat)). -* 修复 TwoLevelStringHashTable 实现中一个很错误的代码,可能导致内存泄漏. [#16264](https://github.com/ClickHouse/ClickHouse/pull/16264) ([Amos Bird](https://github.com/amosbird)). -* 修复了在lambda中某些错误聚合情况下的段错误. [#16082](https://github.com/ClickHouse/ClickHouse/pull/16082) ([Anton Popov](https://github.com/CurtizJ)). -* 修复 `ReplicatedVersionedCollapsingMergeTree` 的 `ALTER MODIFY ... ORDER BY` 查询挂起。 这修复了 [#15980](https://github.com/ClickHouse/ClickHouse/issues/15980). [#16011](https://github.com/ClickHouse/ClickHouse/pull/16011) ([alesapin](https://github.com/alesapin)). -* `MaterializeMySQL` (实验功能): 修复整理名称和字符集名称解析器并支持字符串类型的 `length = 0`. [#16008](https://github.com/ClickHouse/ClickHouse/pull/16008) ([Winter Zhang](https://github.com/zhang2014)). -* 允许对具有复杂键的字典使用 `direct` 布局. [#16007](https://github.com/ClickHouse/ClickHouse/pull/16007) ([Anton Popov](https://github.com/CurtizJ)). -* 在一段时间不活动后发生复制错误时,防止副本挂起 5-10 分钟. [#15987](https://github.com/ClickHouse/ClickHouse/pull/15987) ([filimonov](https://github.com/filimonov)). -* 在插入或从 MaterializedView 中选择并同时删除目标表时修复罕见的段错误 (适用于原子数据库引擎). [#15984](https://github.com/ClickHouse/ClickHouse/pull/15984) ([tavplubix](https://github.com/tavplubix)). -* 修复解析设置配置文件时的歧义: `CREATE USER ... SETTINGS profile readonly` 现在被视为使用名为 `readonly` 的配置文件, 而不是名为 `profile` 的具有只读约束的设置. 这修复了 [#15628](https://github.com/ClickHouse/ClickHouse/issues/15628). [#15982](https://github.com/ClickHouse/ClickHouse/pull/15982) ([Vitaly Baranov](https://github.com/vitlibar)). -* `MaterializeMySQL` (实验功能): 修复创建数据库失败时的崩溃. [#15954](https://github.com/ClickHouse/ClickHouse/pull/15954) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了当表被并发重命名 (对于原子数据库引擎) 时, `DROP TABLE IF EXISTS` 失败并带有 `Table ... does not exist` 错误的问题. 修复了并发执行具有多个表的某些 DDL 查询 (如`DROP DATABASE` 和 `RENAME TABLE` ) 时罕见的死锁 - 修复了并发执行 `DROP/DETACH` 时 `Table ... does not exist` 的 `DROP/DETACH DATABASE` 失败表`. [#15934](https://github.com/ClickHouse/ClickHouse/pull/15934) ([tavplubix](https://github.com/tavplubix)). -* 如果查询具有 `WHERE`、`PREWHERE` 和`GLOBAL IN`, 则修复来自`Distributed` 表的查询的错误空结果. 修复[#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 [#12513](https://github.com/ClickHouse/ClickHouse/issues/12513): 重新分析查询时具有相同别名的差异表达式. [#15886](https://github.com/ClickHouse/ClickHouse/pull/15886) ([Winter Zhang](https://github.com/zhang2014)). -* 修复 RBAC 实现中可能非常罕见的死锁. [#15875](https://github.com/ClickHouse/ClickHouse/pull/15875) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复在 `ALTER MODIFY COLUMN` 查询之后执行的 `SELECT ... ORDER BY DESC` 查询中的异常 `Block structure mismatch` . 修复 [#15800](https://github.com/ClickHouse/ClickHouse/issues/15800). [#15852](https://github.com/ClickHouse/ClickHouse/pull/15852) ([alesapin](https://github.com/alesapin)). -* `MaterializeMySQL` (实验功能): 修复 `select count()` 不准确. [#15767](https://github.com/ClickHouse/ClickHouse/pull/15767) ([tavplubix](https://github.com/tavplubix)). -* 修复某些查询情况, 其中仅选择虚拟列. 以前可能会抛出 `Not found column _nothing in block` 异常. 修复 [#12298](https://github.com/ClickHouse/ClickHouse/issues/12298). [#15756](https://github.com/ClickHouse/ClickHouse/pull/15756) ([Anton Popov](https://github.com/CurtizJ)). -* 修复原子数据库中具有内表的物化视图的删除 (由于工作线程挂起, 由于 MV 内表的递归 DROP TABLE, 因此挂起所有后续 DROP TABLE). [#15743](https://github.com/ClickHouse/ClickHouse/pull/15743) ([Azat Khuzhin](https://github.com/azat)). -* 如果第一次尝试失败, 可以将部分移动到另一个磁盘/卷. [#15723](https://github.com/ClickHouse/ClickHouse/pull/15723) ([Pavel Kovalenko](https://github.com/Jokser)). -* 修复错误 `Cannot find column`, 如果对 `MV` 的查询包含 `ARRAY JOIN` , 则在插入 `MATERIALIZED VIEW` 时可能会发生该错误. [#15717](https://github.com/ClickHouse/ClickHouse/pull/15717) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 `max_replicated_logs_to_keep` 设置的默认值过低, 这可能导致副本过于频繁地丢失. 通过选择要克隆的最新副本来改进丢失的副本恢复过程. 也不要从丢失的复制品中取出旧零件, 而是将它们拆下. [#15701](https://github.com/ClickHouse/ClickHouse/pull/15701) ([tavplubix](https://github.com/tavplubix)). -* 修复 MySQL 字典和表中罕见的竞争条件. [#15686](https://github.com/ClickHouse/ClickHouse/pull/15686) ([alesapin](https://github.com/alesapin)). -* 修复 AMQP-CPP 中的 (良性) 竞争条件. [#15667](https://github.com/ClickHouse/ClickHouse/pull/15667) ([alesapin](https://github.com/alesapin)). -* 修复错误 `Cannot add simple transform to empty Pipe` , 该错误在从与目标表结构不同的 `Buffer` 表中读取时发生. 如果目标表返回空的查询结果是可能的. 修复 [#15529](https://github.com/ClickHouse/ClickHouse/issues/15529). [#15662](https://github.com/ClickHouse/ClickHouse/pull/15662) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 在使用 S3 插入 MergeTree 期间正确处理错误. S3 上的 MergeTree 是一项实验性功能. [#15657](https://github.com/ClickHouse/ClickHouse/pull/15657) ([Pavel Kovalenko](https://github.com/Jokser)). -* 修复了 S3 表功能的错误: 来自 URL 的区域未应用于 S3 客户端配置. [#15646](https://github.com/ClickHouse/ClickHouse/pull/15646) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 修复查询计划的 ReadFromStorage 步骤中资源的销毁顺序. 在极少数情况下, 它可能会导致崩溃. 可能与[#15610](https://github.com/ClickHouse/ClickHouse/issues/15610)有关. [#15645](https://github.com/ClickHouse/ClickHouse/pull/15645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 分离只读表时减去`ReadonlyReplica` 指标. [#15592](https://github.com/ClickHouse/ClickHouse/pull/15592) ([sundyli](https://github.com/sundy-li)). -* 修复了使用 `JSON*` 函数时会导致 `VALUES`、`LIMIT` 或 `IN` 运算符右侧的 `Element ... is not a constant expression` 错误. [#15589](https://github.com/ClickHouse/ClickHouse/pull/15589) ([tavplubix](https://github.com/tavplubix)). -* 如果出现异常, 查询将更快完成. 如果发生异常, 取消对远程副本的执行. [#15578](https://github.com/ClickHouse/ClickHouse/pull/15578) ([Azat Khuzhin](https://github.com/azat)). -* 防止出现错误消息 `Could not calculate available disk space (statvfs), errno: 4, strerror: Interrupted system call` 的可能性. 这修复了 [#15541](https://github.com/ClickHouse/ClickHouse/issues/15541). [#15557](https://github.com/ClickHouse/ClickHouse/pull/15557) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `Database does not exist.` 在启动器上没有数据库时使用 IN 和分布式表的查询. [#15538](https://github.com/ClickHouse/ClickHouse/pull/15538) ([Artem Zuikov](https://github.com/4ertus2)). -* Mutation 可能会在 `MOVE` 或 `REPLACE PARTITION` 之后等待一些不存在的部分, 或者在极少数情况下, 在 `DETACH` 或 `DROP PARTITION` 之后挂起. 已修复. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). -* 修复如果执行具有相同模式的 `LIKE` , 则 `LIKE` 运算符不再区分大小写的错误. [#15536](https://github.com/ClickHouse/ClickHouse/pull/15536) ([alesapin](https://github.com/alesapin)). -* 修复了当选择数据中没有的列,但依赖于数据中也没有的其他列时的 `Missing columns` 错误. 修复 [#15530](https://github.com/ClickHouse/ClickHouse/issues/15530). [#15532](https://github.com/ClickHouse/ClickHouse/pull/15532) ([alesapin](https://github.com/alesapin)). -* 将单个参数传递给 ReplicatedMergeTree 而不是忽略它时抛出错误. [#15516](https://github.com/ClickHouse/ClickHouse/pull/15516) ([nvartolomei](https://github.com/nvartolomei)). -* 修复了 DDLWorker 中事件订阅的错误, 该错误很少会导致查询在 `ON CLUSTER` 中挂起. 引入 [#13450](https://github.com/ClickHouse/ClickHouse/issues/13450). [#15477](https://github.com/ClickHouse/ClickHouse/pull/15477) ([alesapin](https://github.com/alesapin)). -* 当 `boundingRatio` 聚合函数的第二个参数类型错误时报告正确的错误. [#15407](https://github.com/ClickHouse/ClickHouse/pull/15407) ([detailyang](https://github.com/detailyang)). -* 修复 [#15365](https://github.com/ClickHouse/ClickHouse/issues/15365): 附加带有 MySQL 引擎的数据库抛出异常 (无查询上下文) . [#15384](https://github.com/ClickHouse/ClickHouse/pull/15384) ([Winter Zhang](https://github.com/zhang2014)). -* 修复 select 查询中多次出现列转换器的情况. [#15378](https://github.com/ClickHouse/ClickHouse/pull/15378) ([Amos Bird](https://github.com/amosbird)). -* 修复了 `S3` 存储中的压缩. [#15376](https://github.com/ClickHouse/ClickHouse/pull/15376) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 修复诸如 `SELECT toStartOfDay(today())` 之类的查询失败抱怨空 time_zone 参数的错误. [#15319](https://github.com/ClickHouse/ClickHouse/pull/15319) ([Bharat Nallan](https://github.com/bharatnc)). -* 修复合并树表重命名和背景清理过程中的竞争条件. [#15304](https://github.com/ClickHouse/ClickHouse/pull/15304) ([alesapin](https://github.com/alesapin)). -* 修复启用系统日志时服务器启动时罕见的竞争条件. [#15300](https://github.com/ClickHouse/ClickHouse/pull/15300) ([alesapin](https://github.com/alesapin)). -* 修复带有大量子查询的查询挂起到 `MySQL` 引擎的同一个表. 以前, 如果查询中对同一个 `MySQL` 表的子查询超过 16 个, 它将永远挂起. [#15299](https://github.com/ClickHouse/ClickHouse/pull/15299) ([Anton Popov](https://github.com/CurtizJ)). -* 修复 QueryLog 中的 MSan 报告. 未初始化的内存可用于字段 `memory_usage`. [#15258](https://github.com/ClickHouse/ClickHouse/pull/15258) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当查询在 Merge 表上有 JOIN 时,修复 GROUP BY 中的 `Unknown identifier` . [#15242](https://github.com/ClickHouse/ClickHouse/pull/15242) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了将 `joinGet` 与 `LowCardinality` 类型结合使用时的实例崩溃问题. 这修复了 [#15214](https://github.com/ClickHouse/ClickHouse/issues/15214). [#15220](https://github.com/ClickHouse/ClickHouse/pull/15220) ([Amos Bird](https://github.com/amosbird)). -* 修复表引擎 `Buffer` 中的错误, 该错误不允许在 `ALTER` 查询后将新结构的数据插入到 `Buffer` 中. 修复 [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117). [#15192](https://github.com/ClickHouse/ClickHouse/pull/15192) ([alesapin](https://github.com/alesapin)). -* 调整 MySQL 列定义包中的 Decimal 字段大小. [#15152](https://github.com/ClickHouse/ClickHouse/pull/15152) ([maqroll](https://github.com/maqroll)). -* 修复了 `join_algorithm='auto'` 中的`用不同方法压缩的数据`. 在 `join_algorithm='partial_merge'` 中保持 LowCardinality 作为左表连接键的类型. [#15088](https://github.com/ClickHouse/ClickHouse/pull/15088) ([Artem Zuikov](https://github.com/4ertus2)). -* 更新 `jemalloc` 以修复带有亲和掩码的 `percpu_arena`. [#15035](https://github.com/ClickHouse/ClickHouse/pull/15035) ([Azat Khuzhin](https://github.com/azat)). [#14957](https://github.com/ClickHouse/ClickHouse/pull/14957) ([Azat Khuzhin](https://github.com/azat)). -* 我们已经在 String 和 FixedString 之间使用了填充比较 (https://github.com/ClickHouse/ClickHouse/blob/master/src/Functions/FunctionsComparison.h#L333) . 此 PR 将相同的逻辑应用于字段比较, 以更正 FixedString 作为主键的使用. 这修复了 [#14908](https://github.com/ClickHouse/ClickHouse/issues/14908). [#15033](https://github.com/ClickHouse/ClickHouse/pull/15033) ([Amos Bird](https://github.com/amosbird)). -* 如果使用专门设计的参数调用函数 `bar`, 则可能会发生缓冲区溢出. 这将关闭 [#13926](https://github.com/ClickHouse/ClickHouse/issues/13926). [#15028](https://github.com/ClickHouse/ClickHouse/pull/15028) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在 Mac OS 上的 Docker 中运行 clickhouse-server 时, 在原子数据库中执行 DDL 查询时出现的 `Cannot rename ... errno: 22, strerror: Invalid argument` 错误. [#15024](https://github.com/ClickHouse/ClickHouse/pull/15024) ([tavplubix](https://github.com/tavplubix)). -* 当超过内存限制时, 使用 join_algorith='auto' 修复 RIGHT 或 FULL JOIN 中的崩溃, 我们应该使用 MergeJoin 更改 HashJoin. [#15002](https://github.com/ClickHouse/ClickHouse/pull/15002) ([Artem Zuikov](https://github.com/4ertus2)). -* 现在设置 `number_of_free_entries_in_pool_to_execute_mutation` 和 `number_of_free_entries_in_pool_to_lower_max_size_of_merge` 可以等于 `background_pool_size`. [#14975](https://github.com/ClickHouse/ClickHouse/pull/14975) ([alesapin](https://github.com/alesapin)). -* 当子查询包含`finalizeAggregation` 函数时, 修复使谓词下推工作. 修复 [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). -* 在 `system.asynchronous_metrics` 中发布每个逻辑核心的 CPU 频率. 这修复了 [#14923](https://github.com/ClickHouse/ClickHouse/issues/14923). [#14924](https://github.com/ClickHouse/ClickHouse/pull/14924) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* `MaterializeMySQL` (实验功能): 修复了 `.metadata.tmp File exists` 错误. [#14898](https://github.com/ClickHouse/ClickHouse/pull/14898) ([Winter Zhang](https://github.com/zhang2014)). -* 修复部分调用 `extractAllGroups` 函数可能触发 `Memory limit exceeded` 错误的问题. 这修复了 [#13383](https://github.com/ClickHouse/ClickHouse/issues/13383). [#14889](https://github.com/ClickHouse/ClickHouse/pull/14889) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 SIGSEGV 以尝试使用文件描述符插入 StorageFile. [#14887](https://github.com/ClickHouse/ClickHouse/pull/14887) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `cache` 字典中的段错误 [#14837](https://github.com/ClickHouse/ClickHouse/issues/14837). [#14879](https://github.com/ClickHouse/ClickHouse/pull/14879) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* `MaterializeMySQL` (实验功能): 修复了解析 MySQL 二进制日志事件的错误,该错误导致 `MaterializeMySQL` 数据库引擎中的 `Attempt to read after eof` 和 `Packet payload is not fully read`. [#14852](https://github.com/ClickHouse/ClickHouse/pull/14852) ([Winter Zhang](https://github.com/zhang2014)). -* 当被查询的列具有 `DEFAULT` 表达式时, 修复 `SELECT` 查询中的罕见错误, 该表达式依赖于另一列, 该列也具有 `DEFAULT` 并且不存在于选择查询中且不存在于磁盘上. 部分修复 [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). -* 如果必须从 ZK 获取配置文件 (使用 `from_zk` 包含选项) , 则修复服务器在与 ZooKeeper 交谈时可能会在启动时卡住的问题. 这修复了 [#14814](https://github.com/ClickHouse/ClickHouse/issues/14814). [#14843](https://github.com/ClickHouse/ClickHouse/pull/14843) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 修复了收缩的`Int -> Int` 签名类型转换的错误单调性检测. 可能会导致查询结果不正确. 此错误在 [#14513](https://github.com/ClickHouse/ClickHouse/issues/14513) 中公布. [#14783](https://github.com/ClickHouse/ClickHouse/pull/14783) ([Amos Bird](https://github.com/amosbird)). -* `Replace` 列转换器应该用克隆的 AST 替换标识符. 这修复了 [#14695](https://github.com/ClickHouse/ClickHouse/issues/14695). [#14734](https://github.com/ClickHouse/ClickHouse/pull/14734) ([Amos Bird](https://github.com/amosbird)). -* 修复了执行 `ALTER ... MODIFY QUERY` 时物化视图元数据中丢失的默认数据库名称. [#14664](https://github.com/ClickHouse/ClickHouse/pull/14664) ([tavplubix](https://github.com/tavplubix)). -* 修复了当赋值表达式和常量值 (如 `UPDATE x = 42` ) 中带有 `Nullable` 列的 `ALTER UPDATE` 突变导致列或段错误中的值不正确时的错误. 修复 [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). -* 修复错误的十进制乘法结果导致结果列小数位数错误. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复函数 `has` 与 `LowCardinality` 的 `Nullable` . [#14591](https://github.com/ClickHouse/ClickHouse/pull/14591) ([Mike](https://github.com/myrrc)). -* 在为 StorageReplicatedMergeTree 引擎创建查询期间 Zookeeper 异常后清理数据目录. [#14563](https://github.com/ClickHouse/ClickHouse/pull/14563) ([Bharat Nallan](https://github.com/bharatnc)). -* 修复带有组合子 `-Resample` 的函数中罕见的段错误, 这可能会出现在参数非常大的溢出结果中. [#14562](https://github.com/ClickHouse/ClickHouse/pull/14562) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了将 `Nullable(String)` 转换为 Enum 时的错误. 由 [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) 介绍. 这修复了 [#14435](https://github.com/ClickHouse/ClickHouse/issues/14435). [#14530](https://github.com/ClickHouse/ClickHouse/pull/14530) ([Amos Bird](https://github.com/amosbird)). -* 修复了 `Nullable` 列不正确的排序顺序. 这修复了 [#14344](https://github.com/ClickHouse/ClickHouse/issues/14344). [#14495](https://github.com/ClickHouse/ClickHouse/pull/14495) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复 `currentDatabase()` 函数不能在 `ON CLUSTER` ddl 查询中使用. [#14211](https://github.com/ClickHouse/ClickHouse/pull/14211) ([Winter Zhang](https://github.com/zhang2014)). -* `MaterializeMySQL` (实验功能): 修复了 `MaterializeMySQL` 数据库引擎中的 `Packet payload is not full read` 错误. [#14696](https://github.com/ClickHouse/ClickHouse/pull/14696) ([BohuTANG](https://github.com/BohuTANG)). - -#### 改进 - -* 默认情况下为新创建的数据库启用 `Atomic` 数据库引擎. [#15003](https://github.com/ClickHouse/ClickHouse/pull/15003) ([tavplubix](https://github.com/tavplubix)). -* 添加为具有子类型的列指定专用编解码器的功能, 如 `Delta`、`T64` 等. 实现 [#12551](https://github.com/ClickHouse/ClickHouse/issues/12551), 修复 [#11397](https://github.com/ClickHouse/ClickHouse/issues/11397), 修复 [#4609](https://github.com/ClickHouse/ClickHouse/issues/4609). [#15089](https://github.com/ClickHouse/ClickHouse/pull/15089) ([alesapin](https://github.com/alesapin)). -* 动态重新加载zookeeper配置. [#14678](https://github.com/ClickHouse/ClickHouse/pull/14678) ([sundyli](https://github.com/sundy-li)). -* 现在, 无论集群配置中的 `` 设置如何, 都可以执行 `ALTER ... ON CLUSTER` 查询. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). -* 现在 `joinGet` 支持多键查找。 续. [#13015](https://github.com/ClickHouse/ClickHouse/pull/13015) ([Amos Bird](https://github.com/amosbird)). -* 如果为 `Atomic` 数据库指定了 `NO DELAY` 或 `SYNC`, 则等待 `DROP/DETACH TABLE` 实际完成. [#15448](https://github.com/ClickHouse/ClickHouse/pull/15448) ([tavplubix](https://github.com/tavplubix)). -* 现在可以使用 `ALTER` 查询更改 `VersionedCollapsingMergeTree` 的版本列的类型. [#15442](https://github.com/ClickHouse/ClickHouse/pull/15442) ([alesapin](https://github.com/alesapin)). -* 在复制表创建时展开 `zookeeper_path` 中的 `{database}`、`{table}` 和 `{uuid}` 宏. 如果在服务器重启后可能会破坏 `zookeeper_path`, 不要允许 `RENAME TABLE`. 修复 [#6917](https://github.com/ClickHouse/ClickHouse/issues/6917). [#15348](https://github.com/ClickHouse/ClickHouse/pull/15348) ([tavplubix](https://github.com/tavplubix)). -* 函数 `now` 允许使用时区参数. 这关闭 [15264](https://github.com/ClickHouse/ClickHouse/issues/15264). [#15285](https://github.com/ClickHouse/ClickHouse/pull/15285) ([flynn](https://github.com/ucasFL)). -* 在执行 `/docker-entrypoint-initdb.d/` 中的所有脚本之前. 不允许连接到 ClickHouse 服务器. [#15244](https://github.com/ClickHouse/ClickHouse/pull/15244) ([Aleksei Kozharin](https://github.com/alekseik1)). -* 向 `EXPLAIN PLAN` 查询添加了 `optimize` 设置. 如果启用, 则应用查询计划级别优化. 默认启用. [#15201](https://github.com/ClickHouse/ClickHouse/pull/15201) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* CAST 参数数量错误的正确异常消息. 这将关闭 [#13992](https://github.com/ClickHouse/ClickHouse/issues/13992). [#15029](https://github.com/ClickHouse/ClickHouse/pull/15029) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加选项以在数据部分插入时禁用 TTL 移动. [#15000](https://github.com/ClickHouse/ClickHouse/pull/15000) ([Pavel Kovalenko](https://github.com/Jokser)). -* 进行突变时忽略关键约束. 没有这个拉取请求, 当 `force_index_by_date = 1` 或 `force_primary_key = 1` 时不可能进行突变. [#14973](https://github.com/ClickHouse/ClickHouse/pull/14973) ([Amos Bird](https://github.com/amosbird)). -* 如果之前的删除尝试由于 ZooKeeper 会话过期而失败, 则允许删除复制表. 这修复了 [#11891](https://github.com/ClickHouse/ClickHouse/issues/11891). [#14926](https://github.com/ClickHouse/ClickHouse/pull/14926) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了从分布式表中使用 SETTINGS 运行 SELECT 时过多的设置约束冲突. [#14876](https://github.com/ClickHouse/ClickHouse/pull/14876) ([Amos Bird](https://github.com/amosbird)). -* 提供一个 `load_balancing_first_offset` 查询设置来明确说明第一个副本是什么. 它与“FIRST_OR_RANDOM”负载均衡策略一起使用, 允许控制副本工作负载. [#14867](https://github.com/ClickHouse/ClickHouse/pull/14867) ([Amos Bird](https://github.com/amosbird)). -* 在 `EXPLAIN` 结果中显示 `SET` 和 `JOIN` 的子查询. [#14856](https://github.com/ClickHouse/ClickHouse/pull/14856) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 允许在存储 `Distributed` 中使用多卷存储配置. [#14839](https://github.com/ClickHouse/ClickHouse/pull/14839) ([Pavel Kovalenko](https://github.com/Jokser)). -* 从相同的 timespec 构造 `query_start_time` 和 `query_start_time_microseconds`. [#14831](https://github.com/ClickHouse/ClickHouse/pull/14831) ([Bharat Nallan](https://github.com/bharatnc)). -* 支持禁用 `StorageJoin` 和 `StorageSet` 的持久化, 这个特性是通过设置`disable_set_and_join_persistency`来控制的. 这个 PR 解决了问题 [#6318](https://github.com/ClickHouse/ClickHouse/issues/6318). [#14776](https://github.com/ClickHouse/ClickHouse/pull/14776) ([vxider](https://github.com/Vxider)). -* 现在 `COLUMNS` 可用于包装列列表并在之后应用列转换器. [#14775](https://github.com/ClickHouse/ClickHouse/pull/14775) ([Amos Bird](https://github.com/amosbird)). -* 将 `merge_algorithm` 添加到 `system.merges` 表以改进合并检查. [#14705](https://github.com/ClickHouse/ClickHouse/pull/14705) ([Amos Bird](https://github.com/amosbird)). -* 修复 zookeeper 存在 watch 导致的潜在内存泄漏. [#14693](https://github.com/ClickHouse/ClickHouse/pull/14693) ([hustnn](https://github.com/hustnn)). -* 允许并行执行分布式 DDL. [#14684](https://github.com/ClickHouse/ClickHouse/pull/14684) ([Azat Khuzhin](https://github.com/azat)). -* 添加 `QueryMemoryLimitExceeded` 事件计数器. 这将关闭 [#14589](https://github.com/ClickHouse/ClickHouse/issues/14589). [#14647](https://github.com/ClickHouse/ClickHouse/pull/14647) ([fastio](https://github.com/fastio)). -* 修复查询格式中的一些尾随空格. [#14595](https://github.com/ClickHouse/ClickHouse/pull/14595) ([Azat Khuzhin](https://github.com/azat)). -* ClickHouse 对分区 expr 和键 expr 的处理方式不同. 分区 expr 用于构造包含相关列的 minmax 索引, 而主键 expr 存储为 expr. 有时用户可能会在更粗略的级别对表进行分区, 例如 `partition by i / 1000`. 然而, 二元运算符不是单调的, 这个 PR 试图解决这个问题. 它也可能有益于其他用例. [#14513](https://github.com/ClickHouse/ClickHouse/pull/14513) ([Amos Bird](https://github.com/amosbird)). -* 添加一个选项以跳过对 `DiskS3` 的访问检查. `s3` 磁盘是一项实验性功能. [#14497](https://github.com/ClickHouse/ClickHouse/pull/14497) ([Pavel Kovalenko](https://github.com/Jokser)). -* 如果有正在进行的 S3 请求, 则加快服务器关闭过程. [#14496](https://github.com/ClickHouse/ClickHouse/pull/14496) ([Pavel Kovalenko](https://github.com/Jokser)). -* 如果重新加载失败并继续使用以前的 users.xml, `SYSTEM RELOAD CONFIG` 现在会抛出异常. 如果重新加载失败, 后台定期重新加载也会继续使用以前的 users.xml. [#14492](https://github.com/ClickHouse/ClickHouse/pull/14492) ([Vitaly Baranov](https://github.com/vitlibar)). -* 对于 `clickhouse-client` 的脚本模式下带有 VALUES 格式的内联数据的 INSERT, 除了换行外, 还支持分号作为数据终止符. 关闭 [#12288](https://github.com/ClickHouse/ClickHouse/issues/12288). [#13192](https://github.com/ClickHouse/ClickHouse/pull/13192) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 支持紧凑部分的自定义编解码器. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). - -#### 性能改进 - -* 默认情况下为小零件启用紧凑零件. 这将允许稍微更有效地处理频繁插入 (4..100 次). [#11913](https://github.com/ClickHouse/ClickHouse/pull/11913) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 提高 `quantileTDigest` 性能. 这修复了 [#2668](https://github.com/ClickHouse/ClickHouse/issues/2668). [#15542](https://github.com/ClickHouse/ClickHouse/pull/15542) ([Kruglov Pavel](https://github.com/Avogar)). -* 显著减少 AggregatingInOrderTransform/optimize_aggregation_in_order 中的内存使用. [#15543](https://github.com/ClickHouse/ClickHouse/pull/15543) ([Azat Khuzhin](https://github.com/azat)). -* 更快的 256 位乘法. [#15418](https://github.com/ClickHouse/ClickHouse/pull/15418) ([Artem Zuikov](https://github.com/4ertus2)). -* 使用 (u)int64_t 作为宽整数的基本类型提高 256 位类型的性能. 原始宽整数使用 8 位类型作为基数. [#14859](https://github.com/ClickHouse/ClickHouse/pull/14859) ([Artem Zuikov](https://github.com/4ertus2)). -* 显式使用临时磁盘存储垂直合并临时数据. [#15639](https://github.com/ClickHouse/ClickHouse/pull/15639) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). -* 在循环中使用一个 S3 DeleteObjects 请求而不是多个 DeleteObject. 没有任何功能更改, 因此由现有测试 (如集成/test_log_family_s3) 覆盖. [#15238](https://github.com/ClickHouse/ClickHouse/pull/15238) ([ianton-ru](https://github.com/ianton-ru)). -* 修复 `DateTime DateTime` 错误地选择了缓慢的通用实现. 这修复了 [#15153](https://github.com/ClickHouse/ClickHouse/issues/15153). [#15178](https://github.com/ClickHouse/ClickHouse/pull/15178) ([Amos Bird](https://github.com/amosbird)). -* 提高 `FixedString` 类型的 GROUP BY 键的性能. [#15034](https://github.com/ClickHouse/ClickHouse/pull/15034) ([Amos Bird](https://github.com/amosbird)). -* 启动 clickhouse-server 时只有 `mlock` 代码段. 在以前的版本中, 所有映射区域都被锁定在内存中, 包括调试信息. 调试信息通常被拆分为一个单独的文件, 但如果不是, 则会导致 +2..3 GiB 内存使用. [#14929](https://github.com/ClickHouse/ClickHouse/pull/14929) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 由于链接时间优化, ClickHouse 二进制文件变得更小. - -#### 构建/测试/打包改进 - -* 现在我们使用 clang-11 进行生产 ClickHouse 构建. [#15239](https://github.com/ClickHouse/ClickHouse/pull/15239) ([alesapin](https://github.com/alesapin)). -* 现在我们使用 clang-11 在 CI 中构建 ClickHouse. [#14846](https://github.com/ClickHouse/ClickHouse/pull/14846) ([alesapin](https://github.com/alesapin)). -* 将二进制构建 (Linux、Darwin、AArch64、FreeDSD) 切换到 clang-11. [#15622](https://github.com/ClickHouse/ClickHouse/pull/15622) ([Ilya Yatsishin](https://github.com/qoega)). -* 现在所有测试图像都使用 `llvm-symbolizer-11`. [#15069](https://github.com/ClickHouse/ClickHouse/pull/15069) ([alesapin](https://github.com/alesapin)). -* 允许使用 llvm-11 构建. [#15366](https://github.com/ClickHouse/ClickHouse/pull/15366) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 从 `clang-tidy-10` 切换到 `clang-tidy-11` . [#14922](https://github.com/ClickHouse/ClickHouse/pull/14922) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 默认使用 LLVM 的实验通行证管理器. [#15608](https://github.com/ClickHouse/ClickHouse/pull/15608) ([Danila Kutenin](https://github.com/danlark1)). -* 不允许任何 C++ 翻译单元构建超过 10 分钟或使用超过 10 GB 或内存. 这修复了 [#14925](https://github.com/ClickHouse/ClickHouse/issues/14925). [#15060](https://github.com/ClickHouse/ClickHouse/pull/15060) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 通过拆分测试运行和配置文件运行, 使性能测试更加稳定和具有代表性. [#15027](https://github.com/ClickHouse/ClickHouse/pull/15027) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 尝试使性能测试更可靠. 它是通过使用 `madvise` 动态重新映射进程的可执行内存以使用透明大页面来完成的 - 它可以降低 iTLB 未命中的数量, 这是性能测试中不稳定的主要来源. [#14685](https://github.com/ClickHouse/ClickHouse/pull/14685) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 转换为python3. 这将关闭 [#14886](https://github.com/ClickHouse/ClickHouse/issues/14886). [#15007](https://github.com/ClickHouse/ClickHouse/pull/15007) ([Azat Khuzhin](https://github.com/azat)). -* 如果服务器未能响应, 则在功能测试中尽早失败. 这将关闭 [#15262](https://github.com/ClickHouse/ClickHouse/issues/15262). [#15267](https://github.com/ClickHouse/ClickHouse/pull/15267) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 允许在没有配置的情况下运行 AArch64 版本的 clickhouse-server. 这有利于 [#15174](https://github.com/ClickHouse/ClickHouse/issues/15174). [#15266](https://github.com/ClickHouse/ClickHouse/pull/15266) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* CI docker 镜像的改进: 摆脱 ZooKeeper 和用于测试配置安装的单个脚本. [#15215](https://github.com/ClickHouse/ClickHouse/pull/15215) ([alesapin](https://github.com/alesapin)). -* 在快速测试脚本中修复 CMake 选项转发. 修复了 [#14711](https://github.com/ClickHouse/ClickHouse/issues/14711) 中的错误. [#15155](https://github.com/ClickHouse/ClickHouse/pull/15155) ([alesapin](https://github.com/alesapin)). -* 添加了一个脚本以在单个命令中执行硬件基准测试. [#15115](https://github.com/ClickHouse/ClickHouse/pull/15115) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 将巨大的测试 `test_dictionaries_all_layouts_and_sources` 拆分成较小的测试. [#15110](https://github.com/ClickHouse/ClickHouse/pull/15110) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 也许修复 base64 中的 MSan 报告 (在带有 AVX-512 的服务器上). 这修复了. [#15030](https://github.com/ClickHouse/ClickHouse/pull/15030) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 重新格式化和清理所有集成测试 *.py 文件中的代码. [#14864](https://github.com/ClickHouse/ClickHouse/pull/14864) ([Bharat Nallan](https://github.com/bharatnc)). -* 修复在 CI 中发现的 MaterializeMySQL 空事务不稳定测试用例. [#14854](https://github.com/ClickHouse/ClickHouse/pull/14854) ([Winter Zhang](https://github.com/zhang2014)). -* 尝试加快构建速度. [#14808](https://github.com/ClickHouse/ClickHouse/pull/14808) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 通过删除未使用的标头来加快构建速度. [#14714](https://github.com/ClickHouse/ClickHouse/pull/14714) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 OSX 中的构建失败. [#14761](https://github.com/ClickHouse/ClickHouse/pull/14761) ([Winter Zhang](https://github.com/zhang2014)). -* 如果在操作系统中找到 ccache, 则默认在 cmake 中启用. [#14575](https://github.com/ClickHouse/ClickHouse/pull/14575) ([alesapin](https://github.com/alesapin)). -* Control CI 从 ClickHouse 存储库构建配置. [#14547](https://github.com/ClickHouse/ClickHouse/pull/14547) ([alesapin](https://github.com/alesapin)). -* 在 CMake 文件中: - 将一些选项的描述部分移动到上面的注释中. - 替换 0 -> `OFF`, 1 -> `option` 的默认值中的 `ON`. - 在选项中添加了一些说明和文档链接. - 替换了 `FUZZER` 选项 (还有另一个选项 `ENABLE_FUZZING` 也可以启用相同的功能). - 删除了 `ENABLE_GTEST_LIBRARY` 选项, 因为有 `ENABLE_TESTS`. 请参阅 PR 中的完整说明: [#14711](https://github.com/ClickHouse/ClickHouse/pull/14711) ([Mike](https://github.com/myrrc)). -* 使二进制文件更小 (调试版本约为 50 Mb). [#14555](https://github.com/ClickHouse/ClickHouse/pull/14555) ([Artem Zuikov](https://github.com/4ertus2)). -* 在 ConfigProcessor 中使用 std::filesystem::path 连接文件路径. [#14558](https://github.com/ClickHouse/ClickHouse/pull/14558) ([Bharat Nallan](https://github.com/bharatnc)). -* 使用负大整数调用时修复 `bitShiftLeft()` 中的调试断言. [#14697](https://github.com/ClickHouse/ClickHouse/pull/14697) ([Artem Zuikov](https://github.com/4ertus2)). - - -## ClickHouse 版本 20.9 - -### ClickHouse 版本 v20.9.7.11-stable, 2020-12-07 - -#### 性能改进 - -* 修复从 `Merge` 表读取大量 `MergeTree` 表的性能. 修复 [#7748](https://github.com/ClickHouse/ClickHouse/issues/7748). [#16988](https://github.com/ClickHouse/ClickHouse/pull/16988) ([Anton Popov](https://github.com/CurtizJ)). - -#### Bug 修复 - -* 如果禁用了`in_memory_parts_enable_wal`, 则不要从 WAL 恢复部件. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). -* 修复了插入 `Distributed` 表时空间不足时的段错误. [#17737](https://github.com/ClickHouse/ClickHouse/pull/17737) ([tavplubix](https://github.com/tavplubix)). -* 修复了 ClickHouse 无法恢复与 MySQL 服务器的连接时的问题. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). -* 修复了在 Linux 的 Windows 子系统上运行的 ClickHouse 在 `Atomic` 数据库中执行 `RENAME` 查询时出现的 `Function not implementation` 错误. 修复 [#17661](https://github.com/ClickHouse/ClickHouse/issues/17661). [#17664](https://github.com/ClickHouse/ClickHouse/pull/17664) ([tavplubix](https://github.com/tavplubix)). -* 当 clickhouse-client 用于多行查询的交互模式时, 单行注释被错误地扩展到查询结束. 这修复了 [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复在极少数情况下服务器可以停止接受连接的问题. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了当不同副本上的相应突变被杀死时 alter 查询挂起的问题. 修复 [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). -* 修复 clickhouse 低估标记缓存大小时的错误. 当有很多带有标记的小文件时可能会发生. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). -* 修复了启用 `optimize_redundant_functions_in_order_by` 设置的 `ORDER BY` . [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). -* 修复 `DISTINCT` 之后由于不正确优化而可能出现的重复项. 修复 [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了从具有 `LowCardinality` 类型的 `JOIN` 表读取时崩溃的问题. 修复 [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复子查询中存在 const 列时设置索引失效的问题. 这修复了 [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246). [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). -* 修复 ColumnConst 比较导致崩溃. 这个修复了 [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088). [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). -* 修复了在创建 `some_table` 时 `CREATE TABLE ... AS some_table` 查询崩溃 `AS table_function()` 修复 [#16944](https://github.com/ClickHouse/ClickHouse/issues/16944). [#17072](https://github.com/ClickHouse/ClickHouse/pull/17072) ([tavplubix](https://github.com/tavplubix)). -* 功能 fuzzBits 的 Bug 修复, 相关问题: [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). -* 避免远程查询的不必要的网络错误, 这些错误在执行时可能会被取消, 例如使用 `LIMIT` 的查询. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). -* 备忘录. [#16866](https://github.com/ClickHouse/ClickHouse/pull/16866) ([tavplubix](https://github.com/tavplubix)). -* 通过 MySQL 协议返回 INSERT 查询的受影响行数. 以前 ClickHouse 过去总是返回 0, 它是固定的. 修复 [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). - -#### 构建/测试/打包改进 - -* 将嵌入的时区数据更新到 2020d 版 (同时将 cctz 更新到最新的 master). [#17204](https://github.com/ClickHouse/ClickHouse/pull/17204) ([filimonov](https://github.com/filimonov)). - - -### ClickHouse 版本 v20.9.6.14-stable, 2020-11-20 - -#### 改进 - -* 可以连接到需要 SNI 的 `clickhouse-server` 安全端点. 当 `clickhouse-server` 托管在 TLS 代理之后是可能的. [#16938](https://github.com/ClickHouse/ClickHouse/pull/16938) ([filimonov](https://github.com/filimonov)). -* 条件聚合函数 (例如:`avgIf`、`sumIf`、`maxIf`) 在缺少行并使用可为空参数时应返回 `NULL` . [#13964](https://github.com/ClickHouse/ClickHouse/pull/13964) ([Winter Zhang](https://github.com/zhang2014)). - -#### Bug 修复 - -* 修复非领导者 ReplicatedMergeTree 表的 `ON CLUSTER` 查询可能永远挂起的错误. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). -* 出现错误时解析 `format_avro_schema_registry_url` 的IP. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). -* 修复在 `ALTER TABLE ... MODIFY COLUMN ... NewType` 之后可能发生的服务器崩溃, 当 `SELECT` 在更改列上具有 `WHERE` 表达式并且更改尚未完成时. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). -* 安装脚本应始终在 config 文件夹中创建子目录. 这仅与使用自定义配置的 Docker 构建相关. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). -* 修复使用 `ORDER BY` 的查询可能出现的错误 `Illegal type of argument` . 修复 [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 如果没有数据写入 WriteBufferFromS3,则中止分段上传. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). -* 修复在不带任何参数的情况下使用 `any` 时的崩溃. 这是针对 [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803) 的 . cc @azat. [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). -* 在启用了 `transform_null_in` 设置的情况下修复多个列和元组上的 `IN` 运算符. 修复 [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). -* 这将修复 optimize_read_in_order/optimize_aggregation_in_order 与 max_threads>0 和 ORDER BY 中的表达式. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). -* 修复 [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574), 修复 [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231), 修复使用时远程查询失败'if'后缀聚合函数. [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). -* 在异常的情况下查询完成得更快. 如果发生异常, 取消对远程副本的执行. [#15578](https://github.com/ClickHouse/ClickHouse/pull/15578) ([Azat Khuzhin](https://github.com/azat)). - - -### ClickHouse 版本 v20.9.5.5-stable, 2020-11-13 - -#### Bug 修复 - -* 当查询分析器打开并且 ClickHouse 安装在操作系统上时, 修复罕见的无声崩溃, glibc 版本已经 (据说) 损坏了某些功能的异步展开表. 这修复了 [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). 这修复了 [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在, 当从输入解析 AVRO 时, LowCardinality 将从类型中删除. 修复 [#16188](https://github.com/ClickHouse/ClickHouse/issues/16188). [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). -* 通过适当缩小 GTID 集,修复使用 MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine 和 MySQL Slave 上启用的 `slave_parallel_worker` 时元数据的快速增长. 这修复了 [#15951](https://github.com/ClickHouse/ClickHouse/issues/15951). [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). -* 修复分布式的 DROP TABLE (使用 INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). -* 复复制队列中非常大的条目的处理. 如果表结构非常大 (接近 1 MB), 则非常大的条目可能会出现在 ALTER 查询中. 这修复了 [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了由于未创建过滤集而可能删除部分返回数据时的不一致行为. [#16308](https://github.com/ClickHouse/ClickHouse/pull/16308) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复 MySQL 数据库的错误. 当用作数据库引擎的 MySQL 服务器关闭时, 某些查询会引发异常, 因为它们试图从禁用的服务器获取表, 而这是不必要的. 例如, 查询 `SELECT ... FROM system.parts` 应该只适用于 MergeTree 表并且根本不要接触 MySQL 数据库. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). - - -### ClickHouse 版本 v20.9.4.76-stable (2020-10-29) - -#### Bug 修复 - -* 在函数 `dictGet` 出现异常时修复double free. 如果字典加载错误, 可能会发生这种情况. [#16429](https://github.com/ClickHouse/ClickHouse/pull/16429) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复由总数/汇总/多维数据集修饰符和最小/最大功能按键分组. 修复 [#16393](https://github.com/ClickHouse/ClickHouse/issues/16393). [#16397](https://github.com/ClickHouse/ClickHouse/pull/16397) ([Anton Popov](https://github.com/CurtizJ)). -* 修复异步分布式插入 w/prefer_localhost_replica=0 和 internal_replication. [#16358](https://github.com/ClickHouse/ClickHouse/pull/16358) ([Azat Khuzhin](https://github.com/azat)). -* 修复 TwoLevelStringHashTable 实现中的一个非常错误的代码, 这可能会导致内存泄漏. 我很惊讶这个 bug 怎么能潜伏这么久.... [#16264](https://github.com/ClickHouse/ClickHouse/pull/16264) ([Amos Bird](https://github.com/amosbird)). -* 修复无论限制如何都可以过度分配内存的情况. 这将关闭 [#14560](https://github.com/ClickHouse/ClickHouse/issues/14560). [#16206](https://github.com/ClickHouse/ClickHouse/pull/16206) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `ReplicatedVersionedCollapsingMergeTree` 的 `ALTER MODIFY ... ORDER BY` 查询挂起. 这修复了 [#15980](https://github.com/ClickHouse/ClickHouse/issues/15980). [#16011](https://github.com/ClickHouse/ClickHouse/pull/16011) ([alesapin](https://github.com/alesapin)). -* 修复整理名称和字符集名称解析器并支持字符串类型的 `length = 0`. [#16008](https://github.com/ClickHouse/ClickHouse/pull/16008) ([Winter Zhang](https://github.com/zhang2014)). -* 允许对具有复杂键的字典使用直接布局. [#16007](https://github.com/ClickHouse/ClickHouse/pull/16007) ([Anton Popov](https://github.com/CurtizJ)). -* 在一段时间不活动后发生复制错误时, 防止副本挂起 5-10 分钟. [#15987](https://github.com/ClickHouse/ClickHouse/pull/15987) ([filimonov](https://github.com/filimonov)). -* 在插入或从 MaterializedView 中选择并同时删除目标表时修复罕见的段错误 (适用于原子数据库引擎). [#15984](https://github.com/ClickHouse/ClickHouse/pull/15984) ([tavplubix](https://github.com/tavplubix)). -* 修复解析设置配置文件时的歧义: `CREATE USER ... SETTINGS profile readonly` 现在被视为使用名为 `readonly` 的配置文件, 而不是名为 `profile` 的具有只读约束的设置. 这修复了 [#15628](https://github.com/ClickHouse/ClickHouse/issues/15628). [#15982](https://github.com/ClickHouse/ClickHouse/pull/15982) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复数据库创建失败时的崩溃. [#15954](https://github.com/ClickHouse/ClickHouse/pull/15954) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了当表被并发重命名 (对于原子数据库引擎) 时, `DROP TABLE IF EXISTS` 失败并带有 `Table ... does not exist` 错误的问题. 修复了并发执行具有多个表的某些 DDL 查询 (如 `DROP DATABASE”和“RENAME TABLE` )时罕见的死锁 修复了并发执行 `DROP/DETACH TABLE` 时 `Table ... does not exist` 的 `DROP/DETACH DATABASE` 失败 `. [#15934](https://github.com/ClickHouse/ClickHouse/pull/15934) ([tavplubix](https://github.com/tavplubix)). -* 如果查询具有 `WHERE`、`PREWHERE` 和 `GLOBAL IN`, 则修复来自 `Distributed` 表的查询的错误空结果. 修复 [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 RBAC 中可能的死锁. [#15875](https://github.com/ClickHouse/ClickHouse/pull/15875) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复在 `ALTER MODIFY COLUMN` 查询之后执行的 `SELECT ... ORDER BY DESC` 查询中的异常 `Block structure mismatch` . 修复 [#15800](https://github.com/ClickHouse/ClickHouse/issues/15800). [#15852](https://github.com/ClickHouse/ClickHouse/pull/15852) ([alesapin](https://github.com/alesapin)). -* 修复 MaterializeMySQL 的 `select count()` 不准确. [#15767](https://github.com/ClickHouse/ClickHouse/pull/15767) ([tavplubix](https://github.com/tavplubix)). -* 修复某些查询情况, 其中仅选择虚拟列. 以前可能会抛出 `Not found column _nothing in block` 异常. 修复 [#12298](https://github.com/ClickHouse/ClickHouse/issues/12298). [#15756](https://github.com/ClickHouse/ClickHouse/pull/15756) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 `max_replicated_logs_to_keep` 设置的默认值过低, 这可能导致副本过于频繁地丢失. 通过选择要克隆的最新副本来改进丢失的副本恢复过程. 也不要从丢失的复制品中取出旧零件, 而是将它们拆下. [#15701](https://github.com/ClickHouse/ClickHouse/pull/15701) ([tavplubix](https://github.com/tavplubix)). -* 修复错误 `Cannot add simple transform to empty Pipe` ,该错误在从与目标表结构不同的 `Buffer` 表中读取时发生. 如果目标表返回空的查询结果是可能的. 修复 [#15529](https://github.com/ClickHouse/ClickHouse/issues/15529). [#15662](https://github.com/ClickHouse/ClickHouse/pull/15662) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 S3 表函数中的 globs 错误,URL 中的区域未应用于 S3 客户端配置. [#15646](https://github.com/ClickHouse/ClickHouse/pull/15646) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 分离只读表时递减 `ReadonlyReplica` 指标. 这修复了 [#15598](https://github.com/ClickHouse/ClickHouse/issues/15598). [#15592](https://github.com/ClickHouse/ClickHouse/pull/15592) ([sundyli](https://github.com/sundy-li)). -* 将单个参数传递给 ReplicatedMergeTree 而不是忽略它时抛出错误. [#15516](https://github.com/ClickHouse/ClickHouse/pull/15516) ([nvartolomei](https://github.com/nvartolomei)). - -#### 改进 - -* 现在, 无论集群配置中的 `` 设置如何,都可以执行 `ALTER ... ON CLUSTER` 查询. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). -* 在创建表时在 `ReplicatedMergeTree` 参数中展开 `{database}`、`{table}` 和 `{uuid}` 宏. [#16160](https://github.com/ClickHouse/ClickHouse/pull/16160) ([tavplubix](https://github.com/tavplubix)). - - -### ClickHouse 版本 v20.9.3.45-stable (2020-10-09) - -#### Bug 修复 - -* 修复错误 `Cannot find column` , 如果对 `MV` 的查询包含 `ARRAY JOIN` , 则在插入` MATERIALIZED VIEW` 时可能会发生该错误. [#15717](https://github.com/ClickHouse/ClickHouse/pull/15717) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 AMQP-CPP 中的竞争条件. [#15667](https://github.com/ClickHouse/ClickHouse/pull/15667) ([alesapin](https://github.com/alesapin)). -* 修复查询计划的 ReadFromStorage 步骤中资源的销毁顺序. 在极少数情况下, 它可能会导致崩溃. 可能与[#15610](https://github.com/ClickHouse/ClickHouse/issues/15610)有关. [#15645](https://github.com/ClickHouse/ClickHouse/pull/15645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了使用 `JSON*` 函数时会导致 `VALUES`、`LIMIT`或 `IN` 运算符右侧的 `Element ... is not a constant expression` 错误. [#15589](https://github.com/ClickHouse/ClickHouse/pull/15589) ([tavplubix](https://github.com/tavplubix)). -* 防止出现错误消息 `Could not calculate available disk space (statvfs), errno: 4, strerror: Interrupted system call` 的可能性. 这修复了 [#15541](https://github.com/ClickHouse/ClickHouse/issues/15541). [#15557](https://github.com/ClickHouse/ClickHouse/pull/15557) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 显著减少 AggregatingInOrderTransform/optimize_aggregation_in_order 中的内存使用. [#15543](https://github.com/ClickHouse/ClickHouse/pull/15543) ([Azat Khuzhin](https://github.com/azat)). -* Mutation 可能会在 `MOVE` 或 `REPLACE PARTITION` 之后等待一些不存在的部分, 或者在极少数情况下, 在 `DETACH` 或 `DROP PARTITION` 之后挂起. 已修复. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). -* 修复如果执行具有相同模式的 `LIKE` , 则 `LIKE` 运算符不再区分大小写的错误. [#15536](https://github.com/ClickHouse/ClickHouse/pull/15536) ([alesapin](https://github.com/alesapin)). -* 在选择数据中不存在但依赖于数据中也不存在的其他列时修复 `Missing columns` 错误. 修复 [#15530](https://github.com/ClickHouse/ClickHouse/issues/15530). [#15532](https://github.com/ClickHouse/ClickHouse/pull/15532) ([alesapin](https://github.com/alesapin)). -* 修复了 DDLWorker 中事件订阅的错误, 该错误很少会导致查询在 `ON CLUSTER` 中挂起. 引入 [#13450](https://github.com/ClickHouse/ClickHouse/issues/13450). [#15477](https://github.com/ClickHouse/ClickHouse/pull/15477) ([alesapin](https://github.com/alesapin)). -* 当 `boundingRatio` 聚合函数的第二个参数类型错误时报告正确的错误. [#15407](https://github.com/ClickHouse/ClickHouse/pull/15407) ([detailyang](https://github.com/detailyang)). -* 修复诸如 `SELECT toStartOfDay(today())` 之类的查询失败抱怨空 time_zone 参数的错误. [#15319](https://github.com/ClickHouse/ClickHouse/pull/15319) ([Bharat Nallan](https://github.com/bharatnc)). -* 修复合并树表重命名和背景清理过程中的竞争条件. [#15304](https://github.com/ClickHouse/ClickHouse/pull/15304) ([alesapin](https://github.com/alesapin)). -* 修复启用 system.logs 时服务器启动时罕见的竞争条件. [#15300](https://github.com/ClickHouse/ClickHouse/pull/15300) ([alesapin](https://github.com/alesapin)). -* 修复 QueryLog 中的 MSan 报告. 未初始化的内存可用于 `memory_usage` 字段. [#15258](https://github.com/ClickHouse/ClickHouse/pull/15258) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复将 joinGet 与 LowCardinality 类型一起使用时的实例崩溃. 这修复了 [#15214](https://github.com/ClickHouse/ClickHouse/issues/15214). [#15220](https://github.com/ClickHouse/ClickHouse/pull/15220) ([Amos Bird](https://github.com/amosbird)). -* 修复表引擎 `Buffer` 中的错误, 该错误不允许在 `ALTER` 查询后将新结构的数据插入到 `Buffer` 中. 修复 [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117). [#15192](https://github.com/ClickHouse/ClickHouse/pull/15192) ([alesapin](https://github.com/alesapin)). -* 调整mysql列定义包中的decimals字段大小. [#15152](https://github.com/ClickHouse/ClickHouse/pull/15152) ([maqroll](https://github.com/maqroll)). -* 修复了在 Mac OS 上的 docker 中运行 clickhouse-server 时, 在原子数据库中执行 DDL 查询时出现的 `Cannot rename ... errno: 22, strerror: Invalid argument` 错误. [#15024](https://github.com/ClickHouse/ClickHouse/pull/15024) ([tavplubix](https://github.com/tavplubix)). -* 修复了当子查询包含 finalizeAggregation 函数时使谓词下推工作的问题.修复 [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). -* 如果必须从 ZK 获取配置文件 (使用 `from_zk` 包含选项), 则修复服务器在与 ZooKeeper 交谈时可能会在启动时卡住的问题. 这修复了 [#14814](https://github.com/ClickHouse/ClickHouse/issues/14814). [#14843](https://github.com/ClickHouse/ClickHouse/pull/14843) ([Alexander Kuzmenkov](https://github.com/akuzm)). - -#### 改进 - -* 现在可以使用 `ALTER` 查询更改 `VersionedCollapsingMergeTree` 的版本列的类型. [#15442](https://github.com/ClickHouse/ClickHouse/pull/15442) ([alesapin](https://github.com/alesapin)). - - -### ClickHouse 版本 v20.9.2.20, 2020-09-22 - -#### 向后不兼容变更 - -* 从20.5以上的版本升级时, 如果进行滚动更新, 集群同时包含20.5以上和20.5以下的版本, 如果旧版本的ClickHouse节点重启, 旧版本在新版本存在的情况下启动, 可能会导致 到 `Part ... intersects previous part` 错误. 为防止出现此错误, 首先在所有集群节点上安装更新的 clickhouse-server 软件包, 然后重新启动 (因此, 当 clickhouse-server 重新启动时, 它将以新版本启动). - -#### 新特征 - -* 添加了列转换器`EXCEPT`、`REPLACE`、`APPLY`, 可以应用于所选列的列表 (在`*` 或`COLUMNS(...)` 之后). 例如, 您可以编写 `SELECT * EXCEPT(URL) REPLACE(number + 1 AS number)`. 另一个例子: `select * apply(length) apply(max) from wide_string_table` 找出所有字符串列的最大长度. [#14233](https://github.com/ClickHouse/ClickHouse/pull/14233) ([Amos Bird](https://github.com/amosbird)). -* 添加了一个聚合函数 `rankCorr`, 用于计算秩相关系数. [#11769](https://github.com/ClickHouse/ClickHouse/pull/11769) ([antikvist](https://github.com/antikvist)) [#14411](https://github.com/ClickHouse/ClickHouse/pull/14411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 添加了表函数 `view`, 它将子查询转换为表对象. 这有助于传递查询. 例如, 它可以用于远程/集群表功能. [#12567](https://github.com/ClickHouse/ClickHouse/pull/12567) ([Amos Bird](https://github.com/amosbird)). - -#### Bug 修复 - -* 修复了在赋值表达式和常量值 (如 `UPDATE x = 42` )中使用 Nullable 列的 `ALTER UPDATE` 突变导致列或段错误中的值不正确时的错误. 修复[#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). -* 修复了错误的十进制乘法结果导致结果列小数位数错误. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了 `Nullable` 列不正确的排序顺序. 这修复了 [#14344](https://github.com/ClickHouse/ClickHouse/issues/14344). [#14495](https://github.com/ClickHouse/ClickHouse/pull/14495) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复了索引分析中与类型为 `FixedString` 的主键的比较不一致的问题, 如果它们与较小的字符串进行比较. 这修复了 [#14908](https://github.com/ClickHouse/ClickHouse/issues/14908). [#15033](https://github.com/ClickHouse/ClickHouse/pull/15033) ([Amos Bird](https://github.com/amosbird)). -* 修复了如果表具有单个部分的分区会导致错误的合并分配的错误. [#14444](https://github.com/ClickHouse/ClickHouse/pull/14444) ([alesapin](https://github.com/alesapin)). -* 如果使用专门设计的参数调用函数 `bar`, 则可能会发生缓冲区溢出. 这将关闭 [#13926](https://github.com/ClickHouse/ClickHouse/issues/13926). [#15028](https://github.com/ClickHouse/ClickHouse/pull/15028) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 `system.asynchronous_metrics` 中发布每个逻辑核心的 CPU 频率. 这修复了 [#14923](https://github.com/ClickHouse/ClickHouse/issues/14923). [#14924](https://github.com/ClickHouse/ClickHouse/pull/14924) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 修复了使用 `MaterializeMySQL` 数据库引擎时 `.metadata.tmp File exists` 的错误. [#14898](https://github.com/ClickHouse/ClickHouse/pull/14898) ([Winter Zhang](https://github.com/zhang2014)). -* 修复部分调用 `extractAllGroups` 函数可能触发 `Memory limit exceeded` 错误的问题. 这修复了 [#13383](https://github.com/ClickHouse/ClickHouse/issues/13383). [#14889](https://github.com/ClickHouse/ClickHouse/pull/14889) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 SIGSEGV 以尝试插入 StorageFile(fd). [#14887](https://github.com/ClickHouse/ClickHouse/pull/14887) ([Azat Khuzhin](https://github.com/azat)). -* 当被查询的列具有 `DEFAULT` 表达式时, 修复 `SELECT` 查询中的罕见错误, 该表达式依赖于另一列, 该列也具有 `DEFAULT` 并且不存在于选择查询中且不存在于磁盘上. 部分修复 [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). -* 修复了收缩的`Int -> Int` 签名类型转换的错误单调性检测. 可能会导致查询结果不正确. 此错误在 [#14513](https://github.com/ClickHouse/ClickHouse/issues/14513) 中公布. [#14783](https://github.com/ClickHouse/ClickHouse/pull/14783) ([Amos Bird](https://github.com/amosbird)). -* 修复了执行 `ALTER ... MODIFY QUERY` 时物化视图元数据中丢失的默认数据库名称. [#14664](https://github.com/ClickHouse/ClickHouse/pull/14664) ([tavplubix](https://github.com/tavplubix)). -* 修复当涉及 LowCardinality 和 Nullable 类型时函数 `has` 可能不正确的结果. [#14591](https://github.com/ClickHouse/ClickHouse/pull/14591) ([Mike](https://github.com/myrrc)). -* 在使用 ReplicatedMergeTree Engine 对表进行 CREATE 查询期间, 在 Zookeeper 异常后清理数据目录. [#14563](https://github.com/ClickHouse/ClickHouse/pull/14563) ([Bharat Nallan](https://github.com/bharatnc)). -* 修复带有组合子 `-Resample` 的函数中罕见的段错误, 这可能会出现在参数非常大的溢出结果中. [#14562](https://github.com/ClickHouse/ClickHouse/pull/14562) ([Anton Popov](https://github.com/CurtizJ)). -* 检查 `topK` 聚合函数中的数组大小溢出. 如果没有此检查, 用户可能会发送带有精心设计的参数的查询, 这将导致服务器崩溃. 这将关闭 [#14452](https://github.com/ClickHouse/ClickHouse/issues/14452). [#14467](https://github.com/ClickHouse/ClickHouse/pull/14467) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 代理重启/启动/停止/重新加载 SysVinit 到 systemd (如果使用). [#14460](https://github.com/ClickHouse/ClickHouse/pull/14460) ([Azat Khuzhin](https://github.com/azat)). -* 如果 PipelineExecutor 本身发生异常, 则停止查询执行. 这可以防止罕见的查询挂起. [#14334](https://github.com/ClickHouse/ClickHouse/pull/14334) [#14402](https://github.com/ClickHouse/ClickHouse/pull/14402) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复在创建为 `AS table_function` 的表的 `ALTER` 查询期间崩溃. 修复 [#14212](https://github.com/ClickHouse/ClickHouse/issues/14212). [#14326](https://github.com/ClickHouse/ClickHouse/pull/14326) ([alesapin](https://github.com/alesapin)). -* 使用 REFRESH 命令修复 ALTER LIVE VIEW 查询期间的异常. LIVE VIEW 是一项实验性功能. [#14320](https://github.com/ClickHouse/ClickHouse/pull/14320) ([Bharat Nallan](https://github.com/bharatnc)). -* 修复带有嵌套解释器的查询的 QueryPlan 生命周期 (对于 EXPLAIN PIPELINE graph=1). [#14315](https://github.com/ClickHouse/ClickHouse/pull/14315) ([Azat Khuzhin](https://github.com/azat)). -* 更好地检查 SSD 缓存复杂键外部字典中的元组大小. 这修复了 [#13981](https://github.com/ClickHouse/ClickHouse/issues/13981). [#14313](https://github.com/ClickHouse/ClickHouse/pull/14313) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 `ALIAS` 列类型上不允许使用 `CODEC` . 修复[#13911](https://github.com/ClickHouse/ClickHouse/issues/13911). [#14263](https://github.com/ClickHouse/ClickHouse/pull/14263) ([Bharat Nallan](https://github.com/bharatnc)). -* 在非全局级别执行时修复 GRANT ALL 语句. [#13987](https://github.com/ClickHouse/ClickHouse/pull/13987) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复 lambda 中的 arrayJoin() 捕获 (抛出逻辑错误消息的异常). [#13792](https://github.com/ClickHouse/ClickHouse/pull/13792) ([Azat Khuzhin](https://github.com/azat)). - -#### 实验功能 - -* 通过给定的 SELECT 查询添加了用于随机数据库生成的 `db-generator` 工具. 当用户只有不完整的错误报告时, 它可能有助于重现问题. [#14442](https://github.com/ClickHouse/ClickHouse/pull/14442) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [#10973](https://github.com/ClickHouse/ClickHouse/issues/10973) ([ZeDRoman](https://github.com/ZeDRoman)). - -#### 改进 - -* 允许在分布式存储中使用多卷存储配置. [#14839](https://github.com/ClickHouse/ClickHouse/pull/14839) ([Pavel Kovalenko](https://github.com/Jokser)). -* 禁止在 `toStartOf*` 类型的函数中使用空的 time_zone 参数. [#14509](https://github.com/ClickHouse/ClickHouse/pull/14509) ([Bharat Nallan](https://github.com/bharatnc)). -* MySQL 处理程序为诸如 `SET @@var = value` 之类的查询返回 `OK`. 此类声明被忽略. 这是必需的, 因为某些 MySQL 驱动程序会在握手后发送 `SET @@` 查询以进行设置 https://github.com/ClickHouse/ClickHouse/issues/9336#issuecomment-686222422 . [#14469](https://github.com/ClickHouse/ClickHouse/pull/14469) ([BohuTANG](https://github.com/BohuTANG)). -* 现在, 如果之前没有实现 TTL, 将在合并期间应用它们. [#14438](https://github.com/ClickHouse/ClickHouse/pull/14438) ([alesapin](https://github.com/alesapin)). -* 现在 `clickhouse-obfuscator` 支持 [#13163](https://github.com/ClickHouse/ClickHouse/issues/13163) 中提出的 UUID 类型. [#14409](https://github.com/ClickHouse/ClickHouse/pull/14409) ([dimarub2000](https://github.com/dimarub2000)). -* 添加了 [#11384](https://github.com/ClickHouse/ClickHouse/issues/11384) 中提出的新设置 `system_events_show_zero_values`. [#14404](https://github.com/ClickHouse/ClickHouse/pull/14404) ([dimarub2000](https://github.com/dimarub2000)). -* 在 `MaterializeMySQL` 中将主键隐式转换为非空 (与 `MySQL` 相同). 修复 [#14114](https://github.com/ClickHouse/ClickHouse/issues/14114). [#14397](https://github.com/ClickHouse/ClickHouse/pull/14397) ([Winter Zhang](https://github.com/zhang2014)). -* 用 https://github.com/cerevra/int 的实现替换 boost multiprecision 中的宽整数 (256 位). 256 位整数是实验性的. [#14229](https://github.com/ClickHouse/ClickHouse/pull/14229) ([Artem Zuikov](https://github.com/4ertus2)). -* 为 `system.part_log` 中的部分添加默认压缩编解码器, 名称为 `default_compression_codec`. [#14116](https://github.com/ClickHouse/ClickHouse/pull/14116) ([alesapin](https://github.com/alesapin)). -* 为`DateTime` 类型添加精度参数. 它允许使用 `DateTime` 名称代替 `DateTime64`. [#13761](https://github.com/ClickHouse/ClickHouse/pull/13761) ([Winter Zhang](https://github.com/zhang2014)). -* 为 Redis 外部字典添加了 requirepass 授权. [#13688](https://github.com/ClickHouse/ClickHouse/pull/13688) ([Ivan Torgashov](https://github.com/it1804)). -* RabbitMQ 引擎的改进: 添加了连接和通道故障处理、正确提交、插入故障处理、更好的交换、队列持久性和队列恢复机会、新的队列设置. 固定测试. [#12761](https://github.com/ClickHouse/ClickHouse/pull/12761) ([Kseniia Sumarokova](https://github.com/kssenii)). -* 支持紧凑部分的自定义编解码器. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). - -#### 性能改进 - -* 使用 LIMIT/LIMIT BY/ORDER BY 优化查询以使用 GROUP BY sharding_key (在 `optimize_skip_unused_shards` 和 `optimize_distributed_group_by_sharding_key` 下). [#10373](https://github.com/ClickHouse/ClickHouse/pull/10373) ([Azat Khuzhin](https://github.com/azat)). -* 为多个 `JOIN` 和 `IN` 并行创建集合. 它可能会稍微提高具有几种不同 `IN subquery` 表达式的查询的性能. [#14412](https://github.com/ClickHouse/ClickHouse/pull/14412) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 通过为每个消费者提供独立线程来提高 Kafka 引擎性能. 流引擎的单独线程池 (如 Kafka). [#13939](https://github.com/ClickHouse/ClickHouse/pull/13939) ([fastio](https://github.com/fastio)). - -#### 构建/测试/打包改进 - -* 通过从 `Functions` 中删除调试信息来降低调试构建中的二进制大小. 只有 Yandex 中使用非常旧的链接器的一个内部项目才需要这样做. [#14549](https://github.com/ClickHouse/ClickHouse/pull/14549) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 准备使用 clang 11 进行构建. [#14455](https://github.com/ClickHouse/ClickHouse/pull/14455) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复反向移植脚本中的逻辑. 在以前的版本中, 任何 100% 红色的标签都会触发它. 这很奇怪. [#14433](https://github.com/ClickHouse/ClickHouse/pull/14433) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 集成测试使用默认的基本配置. 所有配置更改都是显式的, 例如 main_configs、user_configs 和字典参数. [#13647](https://github.com/ClickHouse/ClickHouse/pull/13647) ([Ilya Yatsishin](https://github.com/qoega)). - - - -## ClickHouse 版本 20.8 - -### ClickHouse 版本 v20.8.12.2-lts, 2021-01-16 - -#### Bug 修复 - -* 修复 *If 具有一元函数和 Nullable 类型的组合器. [#18806](https://github.com/ClickHouse/ClickHouse/pull/18806) ([Azat Khuzhin](https://github.com/azat)). -* 限制从宽部分合并到紧凑部分. 在垂直合并的情况下, 它会导致结果部分损坏. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). - - -### ClickHouse 版本 v20.8.11.17-lts, 2020-12-25 - -#### Bug 修复 - -* 在合并期间禁用 AIO 写入, 因为它会导致合并期间主键列的数据损坏极为罕见. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). -* 修复了在使用类型为 Nullable(String) 的参数执行 `toType(...)` 函数 (`toDate`、`toUInt32` 等) 时出现的 `value is too short` 错误. 现在这些函数在解析错误时返回 `NULL` 而不是抛出异常. 修复 [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). -* 使用组合子 `Distinct` 修复聚合函数中可能的崩溃, 同时使用两级聚合. 修复 [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). - - -### ClickHouse 版本 v20.8.10.13-lts, 2020-12-24 - -#### Bug 修复 - -* 当使用 `logger.size` 参数配置服务器日志轮换并且数值大于 2^32 时, 日志没有正确轮换. [#17905](https://github.com/ClickHouse/ClickHouse/pull/17905) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 使用 `min_compress_block_size` 修复了 MergeTreeWriterSettings 中 `max_compress_block_size` 的错误初始化. [#17833](https://github.com/ClickHouse/ClickHouse/pull/17833) ([flynn](https://github.com/ucasFL)). -* 修复了 ClickHouse 无法恢复与 MySQL 服务器的连接时的问题. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). -* 修复了在不同副本上杀死相应突变时的“ALTER”查询挂起. 这修复了 [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). -* 修复了 ClickHouse 低估标记缓存大小时的错误. 当有很多带有标记的小文件时可能会发生. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). -* 修复了启用设置 `optimize_redundant_functions_in_order_by` 的 `ORDER BY` . [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了导致崩溃的 `ColumnConst` 比较. 这个修复了 [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088). [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). -* 修复了非领导者 ReplicatedMergeTreeTables 的`ON CLUSTER` 查询可能永远挂起的错误. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). -* 避免远程查询的不必要的网络错误, 这些错误在执行时可能会被取消, 例如使用 `LIMIT` 的查询. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). -* 出现错误时解析 `format_avro_schema_registry_url` 的IP. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). -* 修复了在 `ALTER TABLE ... MODIFY COLUMN ... NewType` 之后, 当 `SELECT` 在更改列上具有 `WHERE` 表达式并且更改尚未完成时可能出现的服务器崩溃. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). -* 安装脚本应始终在 config 文件夹中创建子目录. 这仅与使用自定义配置的 Docker 构建相关. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). -* 修复了使用 `ORDER BY` 的查询可能出现的错误 `Illegal type of argument` 。 修复 [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 如果没有数据写入 WriteBufferFromS3,则中止分段上传. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). -* 修复了在不带任何参数的情况下使用 `any` 时的崩溃问题. 这修复了 [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803). [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). -* 修复了多个列和元组上的 `IN` 运算符, 启用了 `transform_null_in` 设置. 修复 [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 `optimize_read_in_order/optimize_aggregation_in_order` 的不一致行为, max_threads > 0 和 ORDER BY 中的表达式. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). -* 修复了查询包含`ARRAY JOIN`时查询优化产生错误结果的问题. [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). -* 在异常的情况下查询完成得更快. 如果发生异常, 取消对远程副本的执行. [#15578](https://github.com/ClickHouse/ClickHouse/pull/15578) ([Azat Khuzhin](https://github.com/azat)). - - -### ClickHouse 版本 v20.8.6.6-lts, 2020-11-13 - -#### Bug 修复 - -* 当查询分析器打开并且 ClickHouse 安装在操作系统上时, 修复罕见的无声崩溃, glibc 版本已经 (据说) 损坏了某些功能的异步展开表. 这修复了 [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). 这修复了 [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在, 当从输入解析 AVRO 时, LowCardinality 将从类型中删除. 修复 [#16188](https://github.com/ClickHouse/ClickHouse/issues/16188). [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). -* 通过适当缩小 GTID 集,修复使用 MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine 和 MySQL Slave 上启用的 `slave_parallel_worker` 时元数据的快速增长. 这修复了 [#15951](https://github.com/ClickHouse/ClickHouse/issues/15951). [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). -* 修复分布式的 DROP TABLE (使用 INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). -* 修复了复制队列中非常大的条目的处理. 如果表结构非常大 (接近 1 MB), 则非常大的条目可能会出现在 ALTER 查询中. 这修复了 [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了由于未创建过滤集而可能删除部分返回数据时的不一致行为. [#16308](https://github.com/ClickHouse/ClickHouse/pull/16308) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复 MySQL 数据库的错误. 当用作数据库引擎的 MySQL 服务器关闭时, 某些查询会引发异常, 因为它们试图从禁用的服务器获取表, 而这是不必要的. 例如, 查询 `SELECT ... FROM system.parts` 应该只适用于 MergeTree 表并且根本不要接触 MySQL 数据库. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). - - -### ClickHouse 版本 v20.8.5.45-lts, 2020-10-29 - -#### Bug 修复 - -* 在函数 `dictGet` 出现异常时修复double free. 如果字典加载错误, 可能会发生这种情况. [#16429](https://github.com/ClickHouse/ClickHouse/pull/16429) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复由总数/汇总/多维数据集修饰符和最小/最大功能按键分组. 修复 [#16393](https://github.com/ClickHouse/ClickHouse/issues/16393). [#16397](https://github.com/ClickHouse/ClickHouse/pull/16397) ([Anton Popov](https://github.com/CurtizJ)). -* 修复异步分布式插入 w/prefer_localhost_replica=0 和 internal_replication. [#16358](https://github.com/ClickHouse/ClickHouse/pull/16358) ([Azat Khuzhin](https://github.com/azat)). -* 修复了在使用字符串键的 `GROUP BY` 期间可能出现的内存泄漏, 这是由 `TwoLevelStringHashTable` 实现中的错误引起的. [#16264](https://github.com/ClickHouse/ClickHouse/pull/16264) ([Amos Bird](https://github.com/amosbird)). -* 修复无论限制如何都可以过度分配内存的情况. 这将关闭 [#14560](https://github.com/ClickHouse/ClickHouse/issues/14560). [#16206](https://github.com/ClickHouse/ClickHouse/pull/16206) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复` ReplicatedVersionedCollapsingMergeTree` 的 `ALTER MODIFY ... ORDER BY` 查询挂起。 这修复了 [#15980](https://github.com/ClickHouse/ClickHouse/issues/15980). [#16011](https://github.com/ClickHouse/ClickHouse/pull/16011) ([alesapin](https://github.com/alesapin)). -* 修复整理名称和字符集名称解析器并支持字符串类型的 `length = 0` . [#16008](https://github.com/ClickHouse/ClickHouse/pull/16008) ([Winter Zhang](https://github.com/zhang2014)). -* 允许对具有复杂键的字典使用直接布局. [#16007](https://github.com/ClickHouse/ClickHouse/pull/16007) ([Anton Popov](https://github.com/CurtizJ)). -* 在一段时间不活动后发生复制错误时, 防止副本挂起 5-10 分钟. [#15987](https://github.com/ClickHouse/ClickHouse/pull/15987) ([filimonov](https://github.com/filimonov)). -* 在插入或从 MaterializedView 中选择并同时删除目标表时修复罕见的段错误 (适用于原子数据库引擎). [#15984](https://github.com/ClickHouse/ClickHouse/pull/15984) ([tavplubix](https://github.com/tavplubix)). -* 修复解析设置配置文件时的歧义: `CREATE USER ... SETTINGS profile readonly` 现在被视为使用名为 `readonly` 的配置文件, 而不是名为 `profile` 的具有只读约束的设置. 这修复了 [#15628](https://github.com/ClickHouse/ClickHouse/issues/15628). [#15982](https://github.com/ClickHouse/ClickHouse/pull/15982) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复数据库创建失败时的崩溃. [#15954](https://github.com/ClickHouse/ClickHouse/pull/15954) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了当表被并发重命名 (对于原子数据库引擎) 时, `DROP TABLE IF EXISTS` 失败并带有 `Table ... does not exist` 错误的问题. 修复了并发执行具有多个表的某些 DDL 查询 (如 `DROP DATABASE` 和 `RENAME TABLE` ) 时罕见的死锁, 修复了并发执行 `DROP/DETACH TABLE` 时 `Table ... does not exist` 的 `DROP/DETACH DATABASE` 失败 `. [#15934](https://github.com/ClickHouse/ClickHouse/pull/15934) ([tavplubix](https://github.com/tavplubix)). -* 如果查询具有`WHERE`、`PREWHERE` 和`GLOBAL IN`, 则修复来自`Distributed` 表的查询的错误空结果. 修复 [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 RBAC 中可能的死锁. [#15875](https://github.com/ClickHouse/ClickHouse/pull/15875) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复在 `ALTER MODIFY COLUMN` 查询之后执行的 `SELECT ... ORDER BY DESC` 查询中的异常 `Block structure mismatch`. 修复 [#15800](https://github.com/ClickHouse/ClickHouse/issues/15800). [#15852](https://github.com/ClickHouse/ClickHouse/pull/15852) ([alesapin](https://github.com/alesapin)). -* 修复某些查询情况, 其中仅选择虚拟列. 以前可能会抛出 `Not found column _nothing in block` 异常. 修复 [#12298](https://github.com/ClickHouse/ClickHouse/issues/12298). [#15756](https://github.com/ClickHouse/ClickHouse/pull/15756) ([Anton Popov](https://github.com/CurtizJ)). -* 修复错误 `Cannot find column` , 如果对 `MV` 的查询包含 `ARRAY JOIN` , 则在插入 `MATERIALIZED VIEW` 时可能会发生该错误. [#15717](https://github.com/ClickHouse/ClickHouse/pull/15717) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 `max_replicated_logs_to_keep` 设置的默认值过低, 这可能导致副本过于频繁地丢失. 通过选择要克隆的最新副本来改进丢失的副本恢复过程. 也不要从丢失的复制品中取出旧零件, 而是将它们拆下. [#15701](https://github.com/ClickHouse/ClickHouse/pull/15701) ([tavplubix](https://github.com/tavplubix)). -* 修复错误 `Cannot add simple transform to empty Pipe`, 该错误在从与目标表结构不同的 `Buffer` 表中读取时发生. 如果目标表返回空的查询结果是可能的. 修复 [#15529](https://github.com/ClickHouse/ClickHouse/issues/15529). [#15662](https://github.com/ClickHouse/ClickHouse/pull/15662) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 S3 表函数中的 globs 错误, URL 中的区域未应用于 S3 客户端配置. [#15646](https://github.com/ClickHouse/ClickHouse/pull/15646) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 分离只读表时递减 `ReadonlyReplica` 指标. 这修复了 [#15598](https://github.com/ClickHouse/ClickHouse/issues/15598). [#15592](https://github.com/ClickHouse/ClickHouse/pull/15592) ([sundyli](https://github.com/sundy-li)). -* 将单个参数传递给 ReplicatedMergeTree 而不是忽略它时抛出错误. [#15516](https://github.com/ClickHouse/ClickHouse/pull/15516) ([nvartolomei](https://github.com/nvartolomei)). - -#### 改进 - -* 现在, 无论集群配置中的 `` 设置如何, 都可以执行 `ALTER ... ON CLUSTER` 查询. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). -* 在创建表时在 `ReplicatedMergeTree` 参数中展开 `{database}`、`{table}` 和 `{uuid}` 宏. [#16159](https://github.com/ClickHouse/ClickHouse/pull/16159) ([tavplubix](https://github.com/tavplubix)). - - -### ClickHouse 版本 v20.8.4.11-lts, 2020-10-09 - -#### Bug 修复 - -* 修复查询计划的 `ReadFromStorage` 步骤中资源的销毁顺序. 在极少数情况下, 它可能会导致崩溃. 可能与[#15610](https://github.com/ClickHouse/ClickHouse/issues/15610)有关. [#15645](https://github.com/ClickHouse/ClickHouse/pull/15645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了使用 `JSON*` 函数时会导致 `VALUES`、 `LIMIT` 或 `IN` 运算符右侧的 `Element ... is not a constant expression` 错误. [#15589](https://github.com/ClickHouse/ClickHouse/pull/15589) ([tavplubix](https://github.com/tavplubix)). -* 防止出现错误消息 `Could not calculate available disk space (statvfs), errno: 4, strerror: Interrupted system call` 的可能性. 这修复了 [#15541](https://github.com/ClickHouse/ClickHouse/issues/15541). [#15557](https://github.com/ClickHouse/ClickHouse/pull/15557) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 显著减少 AggregatingInOrderTransform/optimize_aggregation_in_order 中的内存使用. [#15543](https://github.com/ClickHouse/ClickHouse/pull/15543) ([Azat Khuzhin](https://github.com/azat)). -* Mutation 可能会在 `MOVE` 或 `REPLACE PARTITION` 之后等待一些不存在的部分, 或者在极少数情况下, 在 `DETACH` 或 `DROP PARTITION` 之后挂起. 已修复. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). -* 修复如果执行具有相同模式的 `ILIKE`, 则 `ILIKE` 运算符不再区分大小写的错误. [#15536](https://github.com/ClickHouse/ClickHouse/pull/15536) ([alesapin](https://github.com/alesapin)). -* 在选择数据中不存在但依赖于数据中也不存在的其他列时修复 `Missing columns` 错误. 修复 [#15530](https://github.com/ClickHouse/ClickHouse/issues/15530). [#15532](https://github.com/ClickHouse/ClickHouse/pull/15532) ([alesapin](https://github.com/alesapin)). -* 修复了 DDLWorker 中事件订阅的错误, 该错误很少会导致查询在“ON CLUSTER”中挂起. 引入 [#13450](https://github.com/ClickHouse/ClickHouse/issues/13450). [#15477](https://github.com/ClickHouse/ClickHouse/pull/15477) ([alesapin](https://github.com/alesapin)). -* 当 `boundingRatio` 聚合函数的第二个参数类型错误时报告正确的错误. [#15407](https://github.com/ClickHouse/ClickHouse/pull/15407) ([detailyang](https://github.com/detailyang)). -* 修复合并树表重命名和背景清理过程中的竞争条件. [#15304](https://github.com/ClickHouse/ClickHouse/pull/15304) ([alesapin](https://github.com/alesapin)). -* 修复启用 system.logs 时服务器启动时罕见的竞争条件. [#15300](https://github.com/ClickHouse/ClickHouse/pull/15300) ([alesapin](https://github.com/alesapin)). -* 修复 QueryLog 中的 MSan 报告. 未初始化的内存可用于字段 `memory_usage` . [#15258](https://github.com/ClickHouse/ClickHouse/pull/15258) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复将 joinGet 与 LowCardinality 类型一起使用时的实例崩溃. 这修复了 [#15214](https://github.com/ClickHouse/ClickHouse/issues/15214). [#15220](https://github.com/ClickHouse/ClickHouse/pull/15220) ([Amos Bird](https://github.com/amosbird)). -* 修复表引擎 `Buffer` 中的错误, 该错误不允许在 `ALTER` 查询后将新结构的数据插入到 `Buffer` 中. 修复 [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117). [#15192](https://github.com/ClickHouse/ClickHouse/pull/15192) ([alesapin](https://github.com/alesapin)). -* 调整mysql列定义包中的decimals字段大小. [#15152](https://github.com/ClickHouse/ClickHouse/pull/15152) ([maqroll](https://github.com/maqroll)). -* 我们已经在 String 和 FixedString 之间使用了填充比较 (https://github.com/ClickHouse/ClickHouse/blob/master/src/Functions/FunctionsComparison.h#L333) . 此 PR 将相同的逻辑应用于字段比较, 以更正 FixedString 作为主键的使用. 这修复了 [#14908](https://github.com/ClickHouse/ClickHouse/issues/14908). [#15033](https://github.com/ClickHouse/ClickHouse/pull/15033) ([Amos Bird](https://github.com/amosbird)). -* 如果使用专门设计的参数调用函数 `bar`, 则可能会发生缓冲区溢出. 这将关闭 [#13926](https://github.com/ClickHouse/ClickHouse/issues/13926). [#15028](https://github.com/ClickHouse/ClickHouse/pull/15028) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在 Mac OS 上的 docker 中运行 clickhouse-server 时, 在原子数据库中执行 DDL 查询时出现的 `Cannot rename ... errno: 22, strerror: Invalid argument` 错误. [#15024](https://github.com/ClickHouse/ClickHouse/pull/15024) ([tavplubix](https://github.com/tavplubix)). -* 现在设置 `number_of_free_entries_in_pool_to_execute_mutation` 和 `number_of_free_entries_in_pool_to_lower_max_size_of_merge` 可以等于 `background_pool_size`. [#14975](https://github.com/ClickHouse/ClickHouse/pull/14975) ([alesapin](https://github.com/alesapin)). -* 当子查询包含 finalizeAggregation 函数时, 修复使谓词下推工作. 修复 [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). -* 在 `system.asynchronous_metrics` 中发布每个逻辑核心的 CPU 频率. 这修复了 [#14923](https://github.com/ClickHouse/ClickHouse/issues/14923). [#14924](https://github.com/ClickHouse/ClickHouse/pull/14924) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 修复了使用 `MaterializeMySQL` 数据库引擎时 `.metadata.tmp File exists` 的错误. [#14898](https://github.com/ClickHouse/ClickHouse/pull/14898) ([Winter Zhang](https://github.com/zhang2014)). -* Fix a problem where the server may get stuck on startup while talking to ZooKeeper, if the configuration files have to be fetched from ZK (using the `from_zk` include option). This fixes [#14814](https://github.com/ClickHouse/ClickHouse/issues/14814). [#14843](https://github.com/ClickHouse/ClickHouse/pull/14843) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 修复了收缩的 `Int -> Int` 签名类型转换的错误单调性检测. 可能会导致查询结果不正确. 此错误在 [#14513](https://github.com/ClickHouse/ClickHouse/issues/14513) 中公布. [#14783](https://github.com/ClickHouse/ClickHouse/pull/14783) ([Amos Bird](https://github.com/amosbird)). -* 修复了 `Nullable` 列不正确的排序顺序. 这修复了 [#14344](https://github.com/ClickHouse/ClickHouse/issues/14344). [#14495](https://github.com/ClickHouse/ClickHouse/pull/14495) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). - -#### 改进 - -* 现在可以使用 `ALTER` 查询更改 `VersionedCollapsingMergeTree` 的版本列的类型. [#15442](https://github.com/ClickHouse/ClickHouse/pull/15442) ([alesapin](https://github.com/alesapin)). - - -### ClickHouse 版本 v20.8.3.18-stable, 2020-09-18 - -#### Bug 修复 - -* 修复部分调用 `extractAllGroups` 函数可能触发“超出内存限制”错误的问题. 这修复了 [#13383](https://github.com/ClickHouse/ClickHouse/issues/13383). [#14889](https://github.com/ClickHouse/ClickHouse/pull/14889) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 SIGSEGV 以尝试插入 StorageFile(fd). [#14887](https://github.com/ClickHouse/ClickHouse/pull/14887) ([Azat Khuzhin](https://github.com/azat)). -* 当被查询的列具有 `DEFAULT` 表达式时, 修复 `SELECT` 查询中的罕见错误, 该表达式依赖于另一列, 该列也具有“DEFAULT”并且不存在于选择查询中且不存在于磁盘上. 部分修复 [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). -* 修复了执行 `ALTER ... MODIFY QUERY` 时物化视图元数据中丢失的默认数据库名称. [#14664](https://github.com/ClickHouse/ClickHouse/pull/14664) ([tavplubix](https://github.com/tavplubix)). -* 修复了在赋值表达式和常量值 (如 `UPDATE x = 42`) 中使用 Nullable 列的 `ALTER UPDATE` 突变导致列或段错误中的值不正确时的错误. 修复 [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). -* 修复错误的十进制乘法结果导致结果列小数位数错误. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). -* 添加了检查器, 因为既不调用 `lc->isNullable()` 也不调用 `ls->getDictionaryPtr()->isNullable()` 将返回正确的结果. [#14591](https://github.com/ClickHouse/ClickHouse/pull/14591) ([myrrc](https://github.com/myrrc)). -* 在为 StorageReplicatedMergeTree 引擎创建查询期间 Zookeeper 异常后清理数据目录. [#14563](https://github.com/ClickHouse/ClickHouse/pull/14563) ([Bharat Nallan](https://github.com/bharatnc)). -* 使用组合器 -Resample 修复函数中罕见的段错误, 这可能会出现在参数非常大的溢出结果中. [#14562](https://github.com/ClickHouse/ClickHouse/pull/14562) ([Anton Popov](https://github.com/CurtizJ)). - -#### 改进 - -* 如果有正在进行的 S3 请求, 则加快服务器关闭过程. [#14858](https://github.com/ClickHouse/ClickHouse/pull/14858) ([Pavel Kovalenko](https://github.com/Jokser)). -* 允许在分布式存储中使用多卷存储配置. [#14839](https://github.com/ClickHouse/ClickHouse/pull/14839) ([Pavel Kovalenko](https://github.com/Jokser)). -* 如果有正在进行的 S3 请求, 则加快服务器关闭过程. [#14496](https://github.com/ClickHouse/ClickHouse/pull/14496) ([Pavel Kovalenko](https://github.com/Jokser)). -* 支持紧凑部分的自定义编解码器. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). - - -### ClickHouse 版本 v20.8.2.3-stable, 2020-09-08 - -#### 向后不兼容变更 - -* 现在 `OPTIMIZE FINAL` 查询不会重新计算在创建 TTL 之前添加的部件的 TTL. 使用 `ALTER TABLE ... MATERIALIZE TTL` 一次来计算它们, 之后 `OPTIMIZE FINAL` 将正确评估TTL. 此行为从未适用于复制表. [#14220](https://github.com/ClickHouse/ClickHouse/pull/14220) ([alesapin](https://github.com/alesapin)). -* 扩展 `parallel_distributed_insert_select` 设置, 添加一个选项以将 `INSERT` 运行到本地表中. 该设置将类型从 `Bool` 更改为 `UInt64`, 因此不再支持值 `false` 和 `true`. 如果服务器配置中有这些值, 服务器将不会启动. 请将它们分别替换为 `0` 和 `1`. [#14060](https://github.com/ClickHouse/ClickHouse/pull/14060) ([Azat Khuzhin](https://github.com/azat)). -* 移除对 `ODBCDriver` 输入/输出格式的支持. 这是曾经用于与 ClickHouse ODBC 驱动程序通信的弃用格式, 现在早已被 `ODBCDriver2` 格式取代. 解决 [#13629](https://github.com/ClickHouse/ClickHouse/issues/13629). [#13847](https://github.com/ClickHouse/ClickHouse/pull/13847) ([hexiaoting](https://github.com/hexiaoting)). -* 从20.5以上的版本升级时, 如果进行滚动更新, 集群同时包含20.5以上和20.5以下的版本, 如果旧版本的ClickHouse节点重启, 旧版本在新版本存在的情况下启动, 可能会导致 `Part ... intersects previous part` 错误. 为防止出现此错误, 首先在所有集群节点上安装更新的 clickhouse-server 软件包, 然后重新启动 (因此,当 clickhouse-server 重新启动时, 它将以新版本启动). - -#### 新特征 - -* 添加为与 `config.xml` 中指定的设置相对应的列指定 `Default` 压缩编解码器的功能. 实现: [#9074](https://github.com/ClickHouse/ClickHouse/issues/9074). [#14049](https://github.com/ClickHouse/ClickHouse/pull/14049) ([alesapin](https://github.com/alesapin)). -* 支持 Kafka 中的 Kerberos 身份验证,使用 `krb5` 和 `cyrus-sasl` 库. [#12771](https://github.com/ClickHouse/ClickHouse/pull/12771) ([Ilya Golshtein](https://github.com/ilejn)). -* 添加函数`normalizeQuery`, 用占位符替换文字、文字序列和复杂别名. 添加函数 `normalizedQueryHash` , 为类似的查询返回相同的 64 位哈希值. 它有助于分析查询日志. 这将关闭 [#11271](https://github.com/ClickHouse/ClickHouse/issues/11271). [#13816](https://github.com/ClickHouse/ClickHouse/pull/13816) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加 `time_zones` 表. [#13880](https://github.com/ClickHouse/ClickHouse/pull/13880) ([Bharat Nallan](https://github.com/bharatnc)). -* 添加函数 `defaultValueOfTypeName`, 返回给定类型的默认值. [#13877](https://github.com/ClickHouse/ClickHouse/pull/13877) ([hcz](https://github.com/hczhcz)). -* 添加 `countDigits(x)` 函数, 用于计算整数或小数列中的小数位数. 添加 `isDecimalOverflow(d, [p])` 函数, 用于检查 Decimal 列中的值是否超出其 (或指定的) 精度. [#14151](https://github.com/ClickHouse/ClickHouse/pull/14151) ([Artem Zuikov](https://github.com/4ertus2)). -* 添加 `quantileExactLow` 和 `quantileExactHigh` 实现, 并分别具有 `medianExactLow` 和 `medianExactHigh` 的别名. [#13818](https://github.com/ClickHouse/ClickHouse/pull/13818) ([Bharat Nallan](https://github.com/bharatnc)). -* 添加了将日期/时间值截断为指定日期/时间部分的 `date_trunc` 函数. [#13888](https://github.com/ClickHouse/ClickHouse/pull/13888) ([Vladimir Golovchenko](https://github.com/vladimir-golovchenko)). -* 将新的可选部分 `` 添加到主配置. [#13425](https://github.com/ClickHouse/ClickHouse/pull/13425) ([Vitaly Baranov](https://github.com/vitlibar)). -* 添加允许更改表示例子句的 `ALTER SAMPLE BY` 语句. [#13280](https://github.com/ClickHouse/ClickHouse/pull/13280) ([Amos Bird](https://github.com/amosbird)). -* 函数 `position` 现在支持可选的 `start_pos` 参数. [#13237](https://github.com/ClickHouse/ClickHouse/pull/13237) ([vdimir](https://github.com/vdimir)). - -#### Bug 修复 - -* 修复客户端交互模式下进度条可见数据乱码问题. 这修复了 [#12562](https://github.com/ClickHouse/ClickHouse/issues/12562) 和 [#13369](https://github.com/ClickHouse/ClickHouse/issues/13369) 和 [#13584](https://github.com/ClickHouse/ClickHouse/issues/13584) 并修复了 [#12964](https://github.com/ClickHouse/ClickHouse/issues/12964). [#13691](https://github.com/ClickHouse/ClickHouse/pull/13691) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了按多列排序时如果 `LowCardinality` 列不正确的排序顺序. 这修复了 [#13958](https://github.com/ClickHouse/ClickHouse/issues/13958). [#14223](https://github.com/ClickHouse/ClickHouse/pull/14223) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 检查 `topK` 聚合函数中的数组大小溢出. 如果没有此检查, 用户可能会发送带有精心设计的参数的查询, 这将导致服务器崩溃. 这将关闭 [#14452](https://github.com/ClickHouse/ClickHouse/issues/14452). [#14467](https://github.com/ClickHouse/ClickHouse/pull/14467) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了如果表具有单个部分的分区可能导致错误合并分配的错误. [#14444](https://github.com/ClickHouse/ClickHouse/pull/14444) ([alesapin](https://github.com/alesapin)). -* 如果 PipelineExecutor 本身发生异常, 则停止查询执行. 这可以防止罕见的查询挂起. 续 [#14334](https://github.com/ClickHouse/ClickHouse/issues/14334). [#14402](https://github.com/ClickHouse/ClickHouse/pull/14402) [#14334](https://github.com/ClickHouse/ClickHouse/pull/14334) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复在创建为 `AS table_function` 的表的 `ALTER` 查询期间崩溃. 修复 [#14212](https://github.com/ClickHouse/ClickHouse/issues/14212). [#14326](https://github.com/ClickHouse/ClickHouse/pull/14326) ([alesapin](https://github.com/alesapin)). -* 使用 REFRESH 命令修复 ALTER LIVE VIEW 查询期间的异常. 实时取景是一项实验性功能. [#14320](https://github.com/ClickHouse/ClickHouse/pull/14320) ([Bharat Nallan](https://github.com/bharatnc)). -* 修复带有嵌套解释器的查询的 QueryPlan 生命周期 (对于 EXPLAIN PIPELINE graph=1). [#14315](https://github.com/ClickHouse/ClickHouse/pull/14315) ([Azat Khuzhin](https://github.com/azat)). -* 在从某些外部来源获取架构期间修复 `lickhouse-odbc-bridge` 的段错误. PR 修复了. [#14267](https://github.com/ClickHouse/ClickHouse/pull/14267) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复 [#12277](https://github.com/ClickHouse/ClickHouse/pull/12277) 中引入的标记包含搜索崩溃. [#14225](https://github.com/ClickHouse/ClickHouse/pull/14225) ([Amos Bird](https://github.com/amosbird)). -* 使用命名元组修复表的创建. 这修复了 [#13027](https://github.com/ClickHouse/ClickHouse/issues/13027). [#14143](https://github.com/ClickHouse/ClickHouse/pull/14143) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复最小负十进制数的格式. 这修复了 [#14111](https://github.com/ClickHouse/ClickHouse/issues/14111). [#14119](https://github.com/ClickHouse/ClickHouse/pull/14119) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 修复 `DistributedFilesToInsert` 指标 (不应该归零). [#14095](https://github.com/ClickHouse/ClickHouse/pull/14095) ([Azat Khuzhin](https://github.com/azat)). -* 使用 const 2d 数组将 `pointInPolygon` 修复为多边形. [#14079](https://github.com/ClickHouse/ClickHouse/pull/14079) ([Alexey Ilyukhov](https://github.com/livace)). -* 修复了 `Poco::Exception: no space left on device` 额外信息中错误的挂载点. [#14050](https://github.com/ClickHouse/ClickHouse/pull/14050) ([tavplubix](https://github.com/tavplubix)). -* 在非全局级别执行时修复 GRANT ALL 语句. [#13987](https://github.com/ClickHouse/ClickHouse/pull/13987) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复解析器以拒绝使用引擎创建表作为表函数. [#13940](https://github.com/ClickHouse/ClickHouse/pull/13940) ([hcz](https://github.com/hczhcz)). -* 如果启用了 `optimize_duplicate_order_by_and_distinct` 设置, 则使用 `DISTINCT` 关键字修复选择查询和使用 UNION ALL 的子查询中的错误结果. [#13925](https://github.com/ClickHouse/ClickHouse/pull/13925) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了重命名 `Distributed` 表时潜在的死锁. [#13922](https://github.com/ClickHouse/ClickHouse/pull/13922) ([tavplubix](https://github.com/tavplubix)). -* 修复按多列排序时 `FixedString` 列的不正确排序. 修复 [#13182](https://github.com/ClickHouse/ClickHouse/issues/13182). [#13887](https://github.com/ClickHouse/ClickHouse/pull/13887) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 `topK`/`topKWeighted` 合并的潜在不精确结果 (使用非默认参数). [#13817](https://github.com/ClickHouse/ClickHouse/pull/13817) ([Azat Khuzhin](https://github.com/azat)). -* 修复与 NULL 比较时, 从 MergeTree 表中读取 INDEX 类型为 SET 失败的问题. 这修复了[#13686](https://github.com/ClickHouse/ClickHouse/issues/13686). [#13793](https://github.com/ClickHouse/ClickHouse/pull/13793) ([Amos Bird](https://github.com/amosbird)). -* 修复 lambda 中的 `arrayJoin` 捕获 (LOGICAL_ERROR). [#13792](https://github.com/ClickHouse/ClickHouse/pull/13792) ([Azat Khuzhin](https://github.com/azat)). -* 在函数 `range` 中添加步骤溢出检查. [#13790](https://github.com/ClickHouse/ClickHouse/pull/13790) ([Azat Khuzhin](https://github.com/azat)). -* 修复了并发执行 `DROP DATABASE` 和 `CREATE TABLE` 时的 `Directory not empty` 错误. [#13756](https://github.com/ClickHouse/ClickHouse/pull/13756) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 为 `h3KRing` 函数添加范围检查. 这修复了[#13633](https://github.com/ClickHouse/ClickHouse/issues/13633). [#13752](https://github.com/ClickHouse/ClickHouse/pull/13752) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 DETACH 和后台合并之间的竞争条件. 零件在分离后可能会复活. 这是 [#8602](https://github.com/ClickHouse/ClickHouse/issues/8602) 的延续, 它没有解决问题, 但引入了一个在极少数情况下开始失败的测试, 证明了这个问题. [#13746](https://github.com/ClickHouse/ClickHouse/pull/13746) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当 log_queries_min_type > QUERY_START 时修复日志记录 Settings.Names/Values. [#13737](https://github.com/ClickHouse/ClickHouse/pull/13737) ([Azat Khuzhin](https://github.com/azat)). -* 当verbose=1时修复 `/replicas_status` 端点响应状态代码. [#13722](https://github.com/ClickHouse/ClickHouse/pull/13722) ([javi santana](https://github.com/javisantana)). -* 在检查用户和组时修复 `clickhouse-server.init` 中的错误消息. [#13711](https://github.com/ClickHouse/ClickHouse/pull/13711) ([ylchou](https://github.com/ylchou)). -* 不要在 `optimize_move_functions_out_of_any` 设置下优化 any(arrayJoin()) -> arrayJoin(). [#13681](https://github.com/ClickHouse/ClickHouse/pull/13681) ([Azat Khuzhin](https://github.com/azat)). -* 使用 StorageMerge 和 `set enable_optimize_predicate_expression=1` 修复 JOIN 中的崩溃. [#13679](https://github.com/ClickHouse/ClickHouse/pull/13679) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复关于 `number_of_free_entries_in_pool_to_lower_max_size_of_merge` 设置的值的错误消息中的错字. [#13678](https://github.com/ClickHouse/ClickHouse/pull/13678) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 并发 `ALTER ... REPLACE/MOVE PARTITION ...` 查询可能会导致死锁. 已修复. [#13626](https://github.com/ClickHouse/ClickHouse/pull/13626) ([tavplubix](https://github.com/tavplubix)). -* 修复了有时缓存字典从源返回默认值而不是当前值时的行为. [#13624](https://github.com/ClickHouse/ClickHouse/pull/13624) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复紧凑部分中的二级索引损坏. 紧凑的部件是实验功能. [#13538](https://github.com/ClickHouse/ClickHouse/pull/13538) ([Anton Popov](https://github.com/CurtizJ)). -* 修复必须在单个副本上执行的查询的过早 `ON CLUSTER` 超时. 修复 [#6704](https://github.com/ClickHouse/ClickHouse/issues/6704), [#7228](https://github.com/ClickHouse/ClickHouse/issues/7228), [#13361](https://github.com/ClickHouse/ClickHouse/issues/13361), [#11884](https://github.com/ClickHouse/ClickHouse/issues/11884). [#13450](https://github.com/ClickHouse/ClickHouse/pull/13450) ([alesapin](https://github.com/alesapin)). -* 修复函数 `netloc` 中的错误代码. 这修复了[#13335](https://github.com/ClickHouse/ClickHouse/issues/13335). [#13446](https://github.com/ClickHouse/ClickHouse/pull/13446) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `StorageMemory` 中可能出现的竞争. [#13416](https://github.com/ClickHouse/ClickHouse/pull/13416) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 HTTP 协议中 `TSV/CSVWithNames` 格式中缺失或过多的标头. 这修复了 [#12504](https://github.com/ClickHouse/ClickHouse/issues/12504). [#13343](https://github.com/ClickHouse/ClickHouse/pull/13343) ([Azat Khuzhin](https://github.com/azat)). -* 当数据库或表的名称包含点时, 修复从 users.xml 解析行策略. 这修复了[#5779](https://github.com/ClickHouse/ClickHouse/issues/5779), [#12527](https://github.com/ClickHouse/ClickHouse/issues/12527). [#13199](https://github.com/ClickHouse/ClickHouse/pull/13199) ([Vitaly Baranov](https://github.com/vitlibar)). -* 在连接断开一次后修复对 `redis` 字典的访问. `cache` 和 `direct` 字典布局可能会发生这种情况. [#13082](https://github.com/ClickHouse/ClickHouse/pull/13082) ([Anton Popov](https://github.com/CurtizJ)). -* 删除了使用 ClickHouseDictionarySource 查询远程表时错误的身份验证访问检查. [#12756](https://github.com/ClickHouse/ClickHouse/pull/12756) ([sundyli](https://github.com/sundy-li)). -* 正确区分某些情况下的子查询, 用于公共子表达式的消除. [#8333](https://github.com/ClickHouse/ClickHouse/issues/8333). [#8367](https://github.com/ClickHouse/ClickHouse/pull/8367) ([Amos Bird](https://github.com/amosbird)). - -#### 改进 - -* 在 `ALIAS` 列类型上不允许使用 `CODEC`. 修复 [#13911](https://github.com/ClickHouse/ClickHouse/issues/13911). [#14263](https://github.com/ClickHouse/ClickHouse/pull/14263) ([Bharat Nallan](https://github.com/bharatnc)). -* 等待字典更新完成时, 使用由 `query_wait_timeout_milliseconds` 设置指定的超时而不是硬编码值. [#14105](https://github.com/ClickHouse/ClickHouse/pull/14105) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 添加设置 `min_index_granularity_bytes` 以防止意外创建具有非常低的 `index_granularity_bytes` 设置的表. [#14139](https://github.com/ClickHouse/ClickHouse/pull/14139) ([Bharat Nallan](https://github.com/bharatnc)). -* 现在可以从使用不同 ZooKeeper 的集群中获取分区: `ALTER TABLE table_name FETCH PARTITION partition_expr FROM 'zk-name:/path-in-zookeeper'`. 这对于将数据传送到新集群很有用. [#14155](https://github.com/ClickHouse/ClickHouse/pull/14155) ([Amos Bird](https://github.com/amosbird)). -* 如果 Memory 表是由大量非常小的块构建的, 那么它的性能会稍好一些 (这不太可能). 这个想法的作者: [Mark Papadakis](https://github.com/markpapadakis). 关闭 [#14043](https://github.com/ClickHouse/ClickHouse/issues/14043). [#14056](https://github.com/ClickHouse/ClickHouse/pull/14056) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 条件聚合函数 (例如: `avgIf`、`sumIf`、`maxIf`) 在缺少行并使用可为空参数时应返回 `NULL` . [#13964](https://github.com/ClickHouse/ClickHouse/pull/13964) ([Winter Zhang](https://github.com/zhang2014)). -* 将 -Resample 组合器中的限制增加到 1M. [#13947](https://github.com/ClickHouse/ClickHouse/pull/13947) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). -* 更正了 AvroConfluent 格式的错误, 该错误导致 Kafka 表引擎在收到异常小的、格式错误的消息时停止处理消息. [#13941](https://github.com/ClickHouse/ClickHouse/pull/13941) ([Gervasio Varela](https://github.com/gervarela)). -* 修复长查询的错误错误. 为了正确查询, 可能会出现除 `Max query size exceeded` 之外的语法错误. [#13928](https://github.com/ClickHouse/ClickHouse/pull/13928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* `TabSeparated` 格式的空值的更好的错误消息. [#13906](https://github.com/ClickHouse/ClickHouse/pull/13906) ([jiang tao](https://github.com/tomjiang1987)). -* 如果数组元素的类型是 Float32/Float64, 函数 `arrayCompact` 将按位比较 NaN. 在以前的版本中, 如果数组元素的类型是 Float32/Float64,NaN 总是不相等, 如果类型更复杂, 例如 Nullable(Float64), NaN 总是相等. 这将关闭 [#13857](https://github.com/ClickHouse/ClickHouse/issues/13857). [#13868](https://github.com/ClickHouse/ClickHouse/pull/13868) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `lgamma` 函数中的数据竞争. 这场比赛只在 `tsan` 中被抓到, 没有真正发生过副作用. [#13842](https://github.com/ClickHouse/ClickHouse/pull/13842) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当数组作为字段操作时, 避免太慢的查询. 改为抛出异常. [#13753](https://github.com/ClickHouse/ClickHouse/pull/13753) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 新增Redis requirepass授权 (针对redis字典源码). [#13688](https://github.com/ClickHouse/ClickHouse/pull/13688) ([Ivan Torgashov](https://github.com/it1804)). -* 添加 MergeTree Write-Ahead-Log (WAL) 转储工具. WAL 是一个实验性功能. [#13640](https://github.com/ClickHouse/ClickHouse/pull/13640) ([BohuTANG](https://github.com/BohuTANG)). -* 在以前的版本中, 如果使用专门设计的参数调用, `lcm` 函数可能会在调试构建中产生断言冲突. 这修复了 [#13368](https://github.com/ClickHouse/ClickHouse/issues/13368). [#13510](https://github.com/ClickHouse/ClickHouse/pull/13510) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在更多情况下为 `toDate/toDateTime` 函数提供单调性. 单调性信息用于索引分析 (更复杂的查询将能够使用索引). 现在输入参数更自然地饱和并提供更好的单调性. [#13497](https://github.com/ClickHouse/ClickHouse/pull/13497) ([Amos Bird](https://github.com/amosbird)). -* 支持自定义设置的复合标识符. 自定义设置是 ClickHouse 代码库与其他代码库的集成点 (对 ClickHouse 本身没有好处) [#13496](https://github.com/ClickHouse/ClickHouse/pull/13496) ([Vitaly Baranov](https://github.com/vitlibar)). -* 将部分从 DiskLocal 并行移动到 DiskS3. `DiskS3` 是一个实验性功能. [#13459](https://github.com/ClickHouse/ClickHouse/pull/13459) ([Pavel Kovalenko](https://github.com/Jokser)). -* 默认启用混合粒度部分. [#13449](https://github.com/ClickHouse/ClickHouse/pull/13449) ([alesapin](https://github.com/alesapin)). -* S3 重定向中正确的远程主机检查 (与安全相关的事情). [#13404](https://github.com/ClickHouse/ClickHouse/pull/13404) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 将 `QueryTimeMicroseconds`、`SelectQueryTimeMicroseconds` 和 `InsertQueryTimeMicroseconds` 添加到 system.events. [#13336](https://github.com/ClickHouse/ClickHouse/pull/13336) ([ianton-ru](https://github.com/ianton-ru)). -* 修复 Decimal 具有太大负指数时的调试断言. 修复 [#13188](https://github.com/ClickHouse/ClickHouse/issues/13188). [#13228](https://github.com/ClickHouse/ClickHouse/pull/13228) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 为 DiskS3 添加了缓存层 (缓存到本地磁盘标记和索引文件). `DiskS3` 是一个实验性功能. [#13076](https://github.com/ClickHouse/ClickHouse/pull/13076) ([Pavel Kovalenko](https://github.com/Jokser)). -* 修复 readline 以便现在将历史记录转储到文件中. [#13600](https://github.com/ClickHouse/ClickHouse/pull/13600) ([Amos Bird](https://github.com/amosbird)). -* 默认使用 `Atomic` 引擎创建 `system` 数据库 (准备在任何地方默认启用 `Atomic` 数据库引擎). [#13680](https://github.com/ClickHouse/ClickHouse/pull/13680) ([tavplubix](https://github.com/tavplubix)). - -#### 性能改进 - -* 使用 `LowCardinality` 稍微优化非常短的查询. [#14129](https://github.com/ClickHouse/ClickHouse/pull/14129) ([Anton Popov](https://github.com/CurtizJ)). -* 当设置 `max_insert_threads` 时, 为表引擎 `Null`、`Memory`、`Distributed` 和 `Buffer` 启用并行插入. [#14120](https://github.com/ClickHouse/ClickHouse/pull/14120) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果在部件扫描时超过 `max_rows_to_read` 限制, 则快速失败. 此更改背后的动机是, 如果明显已超过 `max_rows_to_read`, 则跳过所有选定部分的范围扫描. 对于大量零件的查询, 这种变化非常明显. [#13677](https://github.com/ClickHouse/ClickHouse/pull/13677) ([Roman Khavronenko](https://github.com/hagen1778)). -* 通过 UInt8/UInt16 键略微提高聚合性能. [#13099](https://github.com/ClickHouse/ClickHouse/pull/13099) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 优化`has()`、`indexOf()`和 `countEqual()` 函数, 用于 `Array(LowCardinality(T))` 和常量右参数. [#12550](https://github.com/ClickHouse/ClickHouse/pull/12550) ([myrrc](https://github.com/myrrc)). -* 在执行简单的 `INSERT SELECT` 查询时, 自动将 `max_threads` 设置为1 或 `max_insert_threads`, 并将 `max_block_size` 设置为 `min_insert_block_size_rows`. 相关 [#5907](https://github.com/ClickHouse/ClickHouse/issues/5907). [#12195](https://github.com/ClickHouse/ClickHouse/pull/12195) ([flynn](https://github.com/ucasFL)). - -#### 实验功能 - -* ClickHouse 可以用作 MySQL 副本 - 它由 `MaterializeMySQL` 数据库引擎实现. 实现 [#4006](https://github.com/ClickHouse/ClickHouse/issues/4006). [#10851](https://github.com/ClickHouse/ClickHouse/pull/10851) ([Winter Zhang](https://github.com/zhang2014)). -* 为它们添加类型 `Int128`、`Int256`、`UInt256` 和相关函数. 使用 Decimal256 扩展小数 (精度高达 76 位). 新类型在设置 `allow_experimental_bigint_types` 下. 它的工作非常缓慢和糟糕. 实施不完整. 请不要使用此功能. [#13097](https://github.com/ClickHouse/ClickHouse/pull/13097) ([Artem Zuikov](https://github.com/4ertus2)). - -#### 构建/测试/打包改进 - -* 添加了 `clickhouse install` 脚本, 如果你只有一个二进制文件, 这很有用. [#13528](https://github.com/ClickHouse/ClickHouse/pull/13528) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 允许在没有配置的情况下运行 `clickhouse` 二进制文件. [#13515](https://github.com/ClickHouse/ClickHouse/pull/13515) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使用 `codespell` 启用检查代码中的拼写错误. [#13513](https://github.com/ClickHouse/ClickHouse/pull/13513) [#13511](https://github.com/ClickHouse/ClickHouse/pull/13511) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 CI 中启用 Shellcheck 作为 .sh 测试的 linter. 这将关闭 [#13168](https://github.com/ClickHouse/ClickHouse/issues/13168). [#13530](https://github.com/ClickHouse/ClickHouse/pull/13530) [#13529](https://github.com/ClickHouse/ClickHouse/pull/13529) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加 CMake 选项以失败配置而不是自动重新配置, 默认启用. [#13687](https://github.com/ClickHouse/ClickHouse/pull/13687) ([Konstantin](https://github.com/podshumok)). -* 通过 system.build_options 中的 TZDATA_VERSION 公开嵌入式 tzdata 的版本. [#13648](https://github.com/ClickHouse/ClickHouse/pull/13648) ([filimonov](https://github.com/filimonov)). -* 在构建期间改进 system.time_zones 表的生成. 关闭 [#14209](https://github.com/ClickHouse/ClickHouse/issues/14209). [#14215](https://github.com/ClickHouse/ClickHouse/pull/14215) ([filimonov](https://github.com/filimonov)). -* 使用来自包存储库的最新 tzdata 构建 ClickHouse. [#13623](https://github.com/ClickHouse/ClickHouse/pull/13623) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在skip_list.json中添加编写js样式注释的能力. [#14159](https://github.com/ClickHouse/ClickHouse/pull/14159) ([alesapin](https://github.com/alesapin)). -* 确保没有复制粘贴的 GPL 代码. [#13514](https://github.com/ClickHouse/ClickHouse/pull/13514) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 切换测试 docker 图像以使用基于测试的父级. [#14167](https://github.com/ClickHouse/ClickHouse/pull/14167) ([Ilya Yatsishin](https://github.com/qoega)). -* 启动docker-compose集群时添加重试逻辑; 增加 COMPOSE_HTTP_TIMEOUT. [#14112](https://github.com/ClickHouse/ClickHouse/pull/14112) ([vzakaznikov](https://github.com/vzakaznikov)). -* 在压力测试中启用 `system.text_log` 以发现更多错误. [#13855](https://github.com/ClickHouse/ClickHouse/pull/13855) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* Testflows LDAP 模块: 为 openldap4 添加缺少的证书和 dhparam.pem. [#13780](https://github.com/ClickHouse/ClickHouse/pull/13780) ([vzakaznikov](https://github.com/vzakaznikov)). -* ZooKeeper 在 CI 基础设施的单元测试中无法可靠地工作. 使用单元测试进行 ZooKeeper 与真正的 ZooKeeper 交互从一开始就是个坏主意 (单元测试不应该验证复杂的分布式系统). 我们已经为此目的使用集成测试, 它们更适合. [#13745](https://github.com/ClickHouse/ClickHouse/pull/13745) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了用于样式检查的 docker 图像. 添加样式检查所有 docker 和 docker compose 文件都位于 docker 目录中. [#13724](https://github.com/ClickHouse/ClickHouse/pull/13724) ([Ilya Yatsishin](https://github.com/qoega)). -* 修复 Mac OS 上的 cassandra 构建. [#13708](https://github.com/ClickHouse/ClickHouse/pull/13708) ([Ilya Yatsishin](https://github.com/qoega)). -* 修复共享构建中的链接错误. [#13700](https://github.com/ClickHouse/ClickHouse/pull/13700) ([Amos Bird](https://github.com/amosbird)). -* 更新 LDAP 用户身份验证套件以检查它是否适用于 RBAC. [#13656](https://github.com/ClickHouse/ClickHouse/pull/13656) ([vzakaznikov](https://github.com/vzakaznikov)). -* 删除了 `contrib/aws` 的 `-DENABLE_CURL_CLIENT`. [#13628](https://github.com/ClickHouse/ClickHouse/pull/13628) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 增加 ClickHouse 节点的运行状况检查超时, 并在发现不健康的容器时添加对转储 docker-compose 日志的支持. [#13612](https://github.com/ClickHouse/ClickHouse/pull/13612) ([vzakaznikov](https://github.com/vzakaznikov)). -* 确保 [#10977](https://github.com/ClickHouse/ClickHouse/issues/10977) 无效. [#13539](https://github.com/ClickHouse/ClickHouse/pull/13539) ([Amos Bird](https://github.com/amosbird)). -* 从robot-clickhouse 跳过PR. [#13489](https://github.com/ClickHouse/ClickHouse/pull/13489) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 将 Dockerfiles 从集成测试移动到 `docker/test` 目录. docker_compose 文件在 `runner` docker 容器中可用. Docker 镜像是在 CI 中构建的, 而不是在集成测试中. [#13448](https://github.com/ClickHouse/ClickHouse/pull/13448) ([Ilya Yatsishin](https://github.com/qoega)). - - -## ClickHouse 版本 20.7 - -### ClickHouse 版本 v20.7.2.30-stable, 2020-08-31 - -#### 向后不兼容变更 - -* 以至少一个浮点数作为参数的函数 `modulo` (运算符 `%` )将直接计算浮点数的除法余数, 而不将两个参数都转换为整数. 它使行为与大多数 DBMS 兼容. 这也适用于 Date 和 DateTime 数据类型. 添加别名 `mod` . 这将关闭 [#7323](https://github.com/ClickHouse/ClickHouse/issues/7323). [#12585](https://github.com/ClickHouse/ClickHouse/pull/12585) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 弃用零日期/日期时间值的特殊打印为 `0000-00-00` 和`0000-00-00 00:00:00`. [#12442](https://github.com/ClickHouse/ClickHouse/pull/12442) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 函数 `groupArrayMoving*` 不适用于分布式查询. 它的结果是在不正确的数据类型中计算的 (没有升级到最大的类型). `groupArrayMovingAvg` 函数返回的整数与 `avg` 函数不一致. 这修复了[#12568](https://github.com/ClickHouse/ClickHouse/issues/12568). [#12622](https://github.com/ClickHouse/ClickHouse/pull/12622) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 为 MergeTree 设置添加健全性检查. 如果设置不正确,服务器将拒绝启动或创建表, 并向用户打印详细说明. [#13153](https://github.com/ClickHouse/ClickHouse/pull/13153) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 防止用户可能将 `background_pool_size` 设置为低于 `number_of_free_entries_in_pool_to_execute_mutation` 或 `number_of_free_entries_in_pool_to_lower_max_size_of_merge` 的值. 在这些情况下, ALTER 将不起作用或合并的最大大小将太有限. 它将抛出异常解释要做什么. 这将关闭 [#10897](https://github.com/ClickHouse/ClickHouse/issues/10897). [#12728](https://github.com/ClickHouse/ClickHouse/pull/12728) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 从20.5以上的版本升级时, 如果进行滚动更新, 集群同时包含20.5以上和20.5以下的版本, 如果旧版本的ClickHouse节点重启, 旧版本在新版本存在的情况下启动, 可能会导致 `Part ... intersects previous part` 错误. 为防止出现此错误, 首先在所有集群节点上安装更新的 clickhouse-server 软件包, 然后重新启动 (因此, 当 clickhouse-server 重新启动时, 它将以新版本启动). - -#### 新特征 - -* 提供高效 `reverse geocoding` 查找的多边形字典类型 - 在许多多边形的字典 (世界地图) 中通过坐标查找区域. 它使用精心优化的算法和递归网格来保持较低的 CPU 和内存使用率. [#9278](https://github.com/ClickHouse/ClickHouse/pull/9278) ([achulkov2](https://github.com/achulkov2)). -* 添加了对预配置用户的 LDAP 身份验证支持 ( `Simple Bind` 方法). [#11234](https://github.com/ClickHouse/ClickHouse/pull/11234) ([Denis Glazachev](https://github.com/traceon)). -* 引入设置 `alter_partition_verbose_result`, 它为某些类型的 `ALTER TABLE ... PARTITION ...` 查询 (当前是`ATTACH` 和`FREEZE`)输出有关触摸部分的信息. 关闭 [#8076](https://github.com/ClickHouse/ClickHouse/issues/8076). [#13017](https://github.com/ClickHouse/ClickHouse/pull/13017) ([alesapin](https://github.com/alesapin)). -* 为 bayesian-ab-testing 添加 `bayesAB` 函数. [#12327](https://github.com/ClickHouse/ClickHouse/pull/12327) ([achimbab](https://github.com/achimbab)). -* 添加了 `system.crash_log` 表, 用于收集致命错误的堆栈跟踪. 这个表应该是空的. [#12316](https://github.com/ClickHouse/ClickHouse/pull/12316) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了 http 标头 `X-ClickHouse-Database` 和 `X-ClickHouse-Format`, 可用于设置默认数据库和输出格式. [#12981](https://github.com/ClickHouse/ClickHouse/pull/12981) ([hcz](https://github.com/hczhcz)). -* 将 `minMap` 和 `maxMap` 函数支持添加到 `SimpleAggregateFunction`. [#12662](https://github.com/ClickHouse/ClickHouse/pull/12662) ([Ildus Kurbangaliev](https://github.com/ildus)). -* 添加设置 `allow_non_metadata_alters`, 它限制执行修改磁盘上数据的 `ALTER` 查询. 默认禁用. 关闭 [#11547](https://github.com/ClickHouse/ClickHouse/issues/11547). [#12635](https://github.com/ClickHouse/ClickHouse/pull/12635) ([alesapin](https://github.com/alesapin)). -* 添加了一个函数 `formatRow` 以支持通过给定格式将任意表达式转换为字符串. 它对于操作 SQL 输出很有用, 并且与 `columns` 函数结合使用非常通用. [#12574](https://github.com/ClickHouse/ClickHouse/pull/12574) ([Amos Bird](https://github.com/amosbird)). -* 添加 `FROM_UNIXTIME` 函数以兼容 MySQL, 与 [12149](https://github.com/ClickHouse/ClickHouse/issues/12149) 相关. [#12484](https://github.com/ClickHouse/ClickHouse/pull/12484) ([flynn](https://github.com/ucasFL)). -* 如果启用了 `allow_nullable_key` 表设置, 则允许 Nullable 类型作为 MergeTree 表中的键. 关闭 [#5319](https://github.com/ClickHouse/ClickHouse/issues/5319). [#12433](https://github.com/ClickHouse/ClickHouse/pull/12433) ([Amos Bird](https://github.com/amosbird)). -* 与 [COS](https://intl.cloud.tencent.com/product/cos) 集成. [#12386](https://github.com/ClickHouse/ClickHouse/pull/12386) ([fastio](https://github.com/fastio)). -* 添加 `mapAdd` 和 `mapSubtract` 函数以添加/减去键映射值. [#11735](https://github.com/ClickHouse/ClickHouse/pull/11735) ([Ildus Kurbangaliev](https://github.com/ildus)). - -#### Bug 修复 - -* 修复必须在单个副本上执行的查询的过早 `ON CLUSTER` 超时. 修复 [#6704](https://github.com/ClickHouse/ClickHouse/issues/6704), [#7228](https://github.com/ClickHouse/ClickHouse/issues/7228), [#13361](https://github.com/ClickHouse/ClickHouse/issues/13361), [#11884](https://github.com/ClickHouse/ClickHouse/issues/11884). [#13450](https://github.com/ClickHouse/ClickHouse/pull/13450) ([alesapin](https://github.com/alesapin)). -* 修复 [#12277](https://github.com/ClickHouse/ClickHouse/pull/12277) 中引入的标记包含搜索崩溃. [#14225](https://github.com/ClickHouse/ClickHouse/pull/14225) ([Amos Bird](https://github.com/amosbird)). -* 使用缓存布局修复外部字典中的竞争条件, 这可能导致服务器崩溃. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). -* 修复客户端交互模式下进度条可见数据乱码问题. 这修复了 [#12562](https://github.com/ClickHouse/ClickHouse/issues/12562) 和 [#13369](https://github.com/ClickHouse/ClickHouse/issues/13369) 和 [#13584] (https://github.com/ClickHouse/ClickHouse/issues/13584) 并修复了 [#12964](https://github.com/ClickHouse/ClickHouse/issues/12964). [#13691](https://github.com/ClickHouse/ClickHouse/pull/13691) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了当使用 ORDER BY 多列时 `LowCardinality` 列的不正确排序顺序. 这修复了 [#13958](https://github.com/ClickHouse/ClickHouse/issues/13958). [#14223](https://github.com/ClickHouse/ClickHouse/pull/14223) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 删除了硬编码超时, 它错误地否决了缓存字典的 `query_wait_timeout_milliseconds` 设置. [#14105](https://github.com/ClickHouse/ClickHouse/pull/14105) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复了 `Poco::Exception: no space left on device` 额外信息中错误的挂载点. [#14050](https://github.com/ClickHouse/ClickHouse/pull/14050) ([tavplubix](https://github.com/tavplubix)). -* 在启用了 `optimize_duplicate_order_by_and_distinct` 设置的情况下, 当子查询也具有 `DISTINCT` 时, 使用 `DISTINCT` 关键字修复选择查询的错误查询优化. [#13925](https://github.com/ClickHouse/ClickHouse/pull/13925) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了重命名 `Distributed` 表时潜在的死锁. [#13922](https://github.com/ClickHouse/ClickHouse/pull/13922) ([tavplubix](https://github.com/tavplubix)). -* 修复使用 ORDER BY 多列时 `FixedString` 列的不正确排序。 修复 [#13182](https://github.com/ClickHouse/ClickHouse/issues/13182). [#13887](https://github.com/ClickHouse/ClickHouse/pull/13887) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 `topK`/`topKWeighted` 聚合的潜在较低精度 (使用非默认参数). [#13817](https://github.com/ClickHouse/ClickHouse/pull/13817) ([Azat Khuzhin](https://github.com/azat)). -* 修复从 MergeTree 表中读取 INDEX 类型为 SET 时与 NULL 相比失败的问题. 这修复了 [#13686](https://github.com/ClickHouse/ClickHouse/issues/13686). [#13793](https://github.com/ClickHouse/ClickHouse/pull/13793) ([Amos Bird](https://github.com/amosbird)). -* 修复函数`range()`中的步骤溢出. [#13790](https://github.com/ClickHouse/ClickHouse/pull/13790) ([Azat Khuzhin](https://github.com/azat)). -* 修复了并发执行 `DROP DATABASE` 和 `CREATE TABLE` 时的 `Directory not empty` 错误. [#13756](https://github.com/ClickHouse/ClickHouse/pull/13756) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 为 `h3KRing` 函数添加范围检查. 这修复了 [#13633](https://github.com/ClickHouse/ClickHouse/issues/13633). [#13752](https://github.com/ClickHouse/ClickHouse/pull/13752) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 DETACH 和后台合并之间的竞争条件. 零件在分离后可能会复活. 这是 [#8602](https://github.com/ClickHouse/ClickHouse/issues/8602) 的延续, 它没有解决问题, 但引入了一个在极少数情况下开始失败的测试, 证明了这个问题. [#13746](https://github.com/ClickHouse/ClickHouse/pull/13746) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当 `log_queries_min_type` 大于 `QUERY_START` 时修复日志 Settings.Names/Values . [#13737](https://github.com/ClickHouse/ClickHouse/pull/13737) ([Azat Khuzhin](https://github.com/azat)). -* 在检查用户和组时修复 `clickhouse-server.init` 中的错误消息. [#13711](https://github.com/ClickHouse/ClickHouse/pull/13711) ([ylchou](https://github.com/ylchou)). -* 不要在 `optimize_move_functions_out_of_any` 下将 `any(arrayJoin())` 优化为 `arrayJoin()` . [#13681](https://github.com/ClickHouse/ClickHouse/pull/13681) ([Azat Khuzhin](https://github.com/azat)). -* 修复了并发 `ALTER ... REPLACE/MOVE PARTITION ...` 查询中可能出现的死锁. [#13626](https://github.com/ClickHouse/ClickHouse/pull/13626) ([tavplubix](https://github.com/tavplubix)). -* 修复了有时缓存字典从源返回默认值而不是当前值时的行为. [#13624](https://github.com/ClickHouse/ClickHouse/pull/13624) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复紧凑部分中的二级索引损坏 (紧凑部分是一个实验性功能). [#13538](https://github.com/ClickHouse/ClickHouse/pull/13538) ([Anton Popov](https://github.com/CurtizJ)). -* 修复函数 `netloc` 中的错误代码. 这修复了 [#13335](https://github.com/ClickHouse/ClickHouse/issues/13335). [#13446](https://github.com/ClickHouse/ClickHouse/pull/13446) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当 unix 时间戳作为参数传递时, 修复 `parseDateTimeBestEffort` 函数中的错误. 这修复了 [#13362](https://github.com/ClickHouse/ClickHouse/issues/13362). [#13441](https://github.com/ClickHouse/ClickHouse/pull/13441) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复无效的返回类型, 用于将元组与 `NULL` 元素进行比较. 修复 [#12461](https://github.com/ClickHouse/ClickHouse/issues/12461). [#13420](https://github.com/ClickHouse/ClickHouse/pull/13420) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复错误优化导致 `aggregate function any(x) is found inside another aggregate function in query` 错误 `SET optimize_move_functions_out_of_any = 1` 和 `any()` 内的别名. [#13419](https://github.com/ClickHouse/ClickHouse/pull/13419) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复 `storagmemory` 中可能存在的竞争问题. [#13416](https://github.com/ClickHouse/ClickHouse/pull/13416) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 如果查询返回零行, 修复`Arrow` 和`Parquet` 格式的空输出. 这样做是因为空输出对于这种格式无效. [#13399](https://github.com/ClickHouse/ClickHouse/pull/13399) ([hcz](https://github.com/hczhcz)). -* 在 `ORDER BY` 子句中使用常量列和主键前缀修复选择查询. [#13396](https://github.com/ClickHouse/ClickHouse/pull/13396) ([Anton Popov](https://github.com/CurtizJ)). -* 修复 clickhouse-local 的 `PrettyCompactMonoBlock`. 使用 `PrettyCompactMonoBlock` 修复极端/总数. 修复 [#7746](https://github.com/ClickHouse/ClickHouse/issues/7746). [#13394](https://github.com/ClickHouse/ClickHouse/pull/13394) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 system.text_log 中的死锁. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). 它是 [#12339](https://github.com/ClickHouse/ClickHouse/issues/12339) 的一部分. 这修复了 [#12325]. [#13386](https://github.com/ClickHouse/ClickHouse/pull/13386) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复了`File(TSVWithNames*)` (标题被多次写入), 修复了 `clickhouse-local --format CSVWithNames*` (缺少标题, 在[#12197](https://github.com/ClickHouse/ClickHouse/ 问题/12197)), 修复了零行 (缺少标题) 的 `clickhouse-local --format CSVWithNames*`. [#13343](https://github.com/ClickHouse/ClickHouse/pull/13343) ([Azat Khuzhin](https://github.com/azat)). -* 当函数 `groupArrayMovingSum` 反序列化空状态时, 修复段错误. 修复 [#13339](https://github.com/ClickHouse/ClickHouse/issues/13339). [#13341](https://github.com/ClickHouse/ClickHouse/pull/13341) ([alesapin](https://github.com/alesapin)). -* 在 `JOIN ON` 部分中的 `arrayJoin()` 函数上抛出错误. [#13330](https://github.com/ClickHouse/ClickHouse/pull/13330) ([Artem Zuikov](https://github.com/4ertus2)). -* 使用 `join_use_nulls=1` 修复 `LEFT ASOF JOIN` 中的崩溃. [#13291](https://github.com/ClickHouse/ClickHouse/pull/13291) ([Artem Zuikov](https://github.com/4ertus2)). -* 在从延迟副本查询的情况下, 修复可能的错误 `Totals having transform was already added to pipeline` . [#13290](https://github.com/ClickHouse/ClickHouse/pull/13290) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 如果用户将特制的参数传递给函数 `h3ToChildren`, 服务器可能会崩溃. 这修复了 [#13275](https://github.com/ClickHouse/ClickHouse/issues/13275). [#13277](https://github.com/ClickHouse/ClickHouse/pull/13277) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在具有 NaN 值的 Float 类型上调用的 `uniqExact`、`topK`、`sumDistinct` 和类似聚合函数的潜在低性能和稍微不正确的结果. 它还在调试版本中触发断言. 这修复了 [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当主键包含具有单调函数的表达式并且查询包含与类型不同的常量的比较时, 修复 KeyCondition 中的断言. 这修复了[#12465](https://github.com/ClickHouse/ClickHouse/issues/12465). [#13251](https://github.com/ClickHouse/ClickHouse/pull/13251) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 返回在函数 roundUpToPowerOfTwoOrZero() 中设置了 MSB 的数字的传递数字. 它可以防止数组大小溢出时的潜在错误. [#13234](https://github.com/ClickHouse/ClickHouse/pull/13234) ([Azat Khuzhin](https://github.com/azat)). -* 如果使用可为空的 constexpr 作为不是文字 NULL 的 cond, 则修复函数. 修复 [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在数组元素为 Nullable 且数组下标也可为 Null 的情况下, 修复 `arrayElement` 函数中的断言. 这修复了 [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使用常量参数修复 DateTime64 转换函数. [#13205](https://github.com/ClickHouse/ClickHouse/pull/13205) ([Azat Khuzhin](https://github.com/azat)). -* 当数据库或表的名称包含点时, 修复从 users.xml 解析行策略. 这修复了 [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779), [#12527](https://github.com/ClickHouse/ClickHouse/issues/12527). [#13199](https://github.com/ClickHouse/ClickHouse/pull/13199) ([Vitaly Baranov](https://github.com/vitlibar)). -* 在连接断开一次后修复对 `redis` 字典的访问. `cache` 和 `direct` 字典布局可能会发生这种情况. [#13082](https://github.com/ClickHouse/ClickHouse/pull/13082) ([Anton Popov](https://github.com/CurtizJ)). -* 使用函数修复错误的索引分析. 从 `MergeTree` 表中读取时, 可能会导致跳过某些数据部分. 修复 [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). -* 修复错误 `Cannot convert column because it is constant but values of constants are different in source and result` , 远程查询在查询范围内使用确定性函数, 但查询之间不具有确定性, 例如`now()`、`now64()`、`randConstant()`. 修复 [#11327](https://github.com/ClickHouse/ClickHouse/issues/11327). [#13075](https://github.com/ClickHouse/ClickHouse/pull/13075) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了使用 `ORDER BY` 元组和小 `LIMIT` 查询时可能发生的崩溃. 修复 [#12623](https://github.com/ClickHouse/ClickHouse/issues/12623). [#13009](https://github.com/ClickHouse/ClickHouse/pull/13009) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复带有 `UNION` 和 `JOIN` 的查询的 `Block structure mismatch` 错误. 修复 [#12602](https://github.com/ClickHouse/ClickHouse/issues/12602). [#12989](https://github.com/ClickHouse/ClickHouse/pull/12989) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 更正了 `merge_with_ttl_timeout` 逻辑, 当过期影响一个时间间隔内的多个分区时, 该逻辑无法正常工作. (作者 @excitoon). [#12982](https://github.com/ClickHouse/ClickHouse/pull/12982) ([Alexander Kazakov](https://github.com/Akazz)). -* 修复从 DDL 查询创建的范围哈希字典的列重复. 这修复了[#10605](https://github.com/ClickHouse/ClickHouse/issues/10605). [#12857](https://github.com/ClickHouse/ClickHouse/pull/12857) ([alesapin](https://github.com/alesapin)). -* 修复对从本地副本中选择的线程数的不必要限制. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了当 `ALTER DELETE` 和 `ALTER MODIFY COLUMN` 查询作为单个突变同时执行时的罕见错误. 错误导致 `count.txt` 中的行数不正确,从而导致部分数据不正确. 此外, 修复了同时使用 `ALTER RENAME COLUMN` 和 `ALTER ADD COLUMN` 的小错误. [#12760](https://github.com/ClickHouse/ClickHouse/pull/12760) ([alesapin](https://github.com/alesapin)). -* 使用 `clickhouse` 字典源查询远程表时使用了错误的凭据. [#12756](https://github.com/ClickHouse/ClickHouse/pull/12756) ([sundyli](https://github.com/sundy-li)). -* 修复 `CAST(Nullable(String), Enum())`. [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) ([Azat Khuzhin](https://github.com/azat)). -* 修复大元组的性能,这些元组在`IN` 部分被解释为函数. 当用户出于某种晦涩的原因编写 `WHERE x IN tuple(1, 2, ...)` 而不是 `WHERE x IN (1, 2, ...)` 的情况. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). -* 修复 input_format_parallel_parsing 的内存跟踪 (通过将线程附加到组). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). -* 在 `any(func())` 的情况下修复错误的优化 `optimize_move_functions_out_of_any=1`. [#12664](https://github.com/ClickHouse/ClickHouse/pull/12664) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了 [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572) 使用 const 表达式修复布隆过滤器索引. [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). -* 当代理不可用时 (不仅如此) 修复 StorageKafka 中的 SIGSEGV. [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). -* 添加对带有 `Array(UUID)` 参数的函数 `if` 的支持. 这修复了 [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果用户存在, CREATE USER IF NOT EXISTS 现在不会抛出异常. 这修复了[#12507](https://github.com/ClickHouse/ClickHouse/issues/12507). [#12646](https://github.com/ClickHouse/ClickHouse/pull/12646) ([Vitaly Baranov](https://github.com/vitlibar)). -* 在意外情况下 (例如从 UInt64 列中减去时),在 `ALTER ... UPDATE` 期间可以抛出异常 `There is no supertype...`. 这修复了 [#7306](https://github.com/ClickHouse/ClickHouse/issues/7306). This fixes [#4165](https://github.com/ClickHouse/ClickHouse/issues/4165). [#12633](https://github.com/ClickHouse/ClickHouse/pull/12633) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复使用外部排序的查询可能出现的 `Pipeline stuck` 错误. 修复 [#12617](https://github.com/ClickHouse/ClickHouse/issues/12617). [#12618](https://github.com/ClickHouse/ClickHouse/pull/12618) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 `OPTIMIZE DEDUPLICATE` 的错误 `Output of TreeExecutor is not sorted` . 修复 [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572). [#12613](https://github.com/ClickHouse/ClickHouse/pull/12613) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复查询优化过程中函数 `any` 结果的别名可能丢失的问题. [#12593](https://github.com/ClickHouse/ClickHouse/pull/12593) ([Anton Popov](https://github.com/CurtizJ)). -* 在 DROP TABLE 上删除分布式表 (来自异步插入的块) 的数据. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). -现在 ClickHouse 将在文件 `checksums.txt` 不存在时重新计算部件的校验和. 自 [#9827](https://github.com/ClickHouse/ClickHouse/issues/9827) 以来已损坏. [#12545](https://github.com/ClickHouse/ClickHouse/pull/12545) ([alesapin](https://github.com/alesapin)). -* 修复当 `enable_mixed_granularity_parts=1` 时, 在 `ALTER DELETE` 查询后导致旧部件损坏的错误. 修复 [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). -* 修复实时视图表中可能导致数据重复的竞争条件. LIVE VIEW 是一项实验性功能. [#12519](https://github.com/ClickHouse/ClickHouse/pull/12519) ([vzakaznikov](https://github.com/vzakaznikov)). -* 修复 `AggregateFunction(avg, ...)`值二进制格式的向后兼容性. 这修复了 [#12342](https://github.com/ClickHouse/ClickHouse/issues/12342). [#12486](https://github.com/ClickHouse/ClickHouse/pull/12486) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当我们加入字典键的表达时, 修复 JOIN 与字典中的崩溃: `t JOIN dict ON expr(dict.id) = t.id`. 在这种情况下禁用字典连接优化. [#12458](https://github.com/ClickHouse/ClickHouse/pull/12458) ([Artem Zuikov](https://github.com/4ertus2)). -* 当指定非常大的 LIMIT 或 OFFSET 时修复溢出. 这修复了 [#10470](https://github.com/ClickHouse/ClickHouse/issues/10470). 这修复了 [#11372](https://github.com/ClickHouse/ClickHouse/issues/11372). [#12427](https://github.com/ClickHouse/ClickHouse/pull/12427) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* kafka: 修复 SIGSEGV 如果在批处理中间有错误消息. [#12302](https://github.com/ClickHouse/ClickHouse/pull/12302) ([Azat Khuzhin](https://github.com/azat)). - -#### 改进 - -* 在 ZooKeeper 中保留少量日志. 当有许多服务器/表/插入时, 避免在离线副本的情况下过度增长 ZooKeeper 节点. [#13100](https://github.com/ClickHouse/ClickHouse/pull/13100) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在, 如果在 ALTER 或突变期间发生错误, 则异常会转发给客户端. 关闭 [#11329](https://github.com/ClickHouse/ClickHouse/issues/11329). [#12666](https://github.com/ClickHouse/ClickHouse/pull/12666) ([alesapin](https://github.com/alesapin)). -* 将 `QueryTimeMicroseconds`、`SelectQueryTimeMicroseconds` 和 `InsertQueryTimeMicroseconds` 添加到 `system.events`, 以及 system.metrics、processes、query_log 等. [#13028](https://github.com/ClickHouse/ClickHouse/pull/13028) ([ianton-ru](https://github.com/ianton-ru)). -* 将 `SelectedRows` 和 `SelectedBytes` 添加到 `system.events`, 以及 system.metrics、processes、query_log 等. [#12638](https://github.com/ClickHouse/ClickHouse/pull/12638) ([ianton-ru](https://github.com/ianton-ru)). -* 将 `current_database` 信息添加到 `system.query_log`. [#12652](https://github.com/ClickHouse/ClickHouse/pull/12652) ([Amos Bird](https://github.com/amosbird)). -* 允许 `TabSeparatedRaw` 作为输入格式. [#12009](https://github.com/ClickHouse/ClickHouse/pull/12009) ([hcz](https://github.com/hczhcz)). -* 现在 `joinGet` 支持多键查找. [#12418](https://github.com/ClickHouse/ClickHouse/pull/12418) ([Amos Bird](https://github.com/amosbird)). -* 允许 `*Map` 聚合函数处理带有 NULL 的数组. 修复 [#13157](https://github.com/ClickHouse/ClickHouse/issues/13157). [#13225](https://github.com/ClickHouse/ClickHouse/pull/13225) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 避免解析 DateTime 值时溢出, 这将导致其时区中的 unix 时间戳为负 (例如, 莫斯科的 `1970-01-01 00:00:00` ). 相反, 饱和为零. 这修复了 [#3470](https://github.com/ClickHouse/ClickHouse/issues/3470). This fixes [#4172](https://github.com/ClickHouse/ClickHouse/issues/4172). [#12443](https://github.com/ClickHouse/ClickHouse/pull/12443) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* AvroConfluent: 跳过 Kafka 墓碑记录 - 支持跳过损坏的记录 [#13203](https://github.com/ClickHouse/ClickHouse/pull/13203) ([Andrew Onyshchuk](https://github.com/oandrew)). -* 修复长查询的错误错误. 为了正确查询, 可能会出现除 `Max query size exceeded` 之外的语法错误. [#13928](https://github.com/ClickHouse/ClickHouse/pull/13928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 `lgamma` 函数中的数据竞争. 这场比赛只在 `tsan` 中被抓到,真的没有副作用. [#13842](https://github.com/ClickHouse/ClickHouse/pull/13842) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 ATTACH/ALTER/CREATE QUOTA 语句的 `Week` 间隔格式. [#13417](https://github.com/ClickHouse/ClickHouse/pull/13417) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). -* 现在, 在紧凑零件加工中遇到损坏零件时也会报告. 紧凑型零件是一项实验性功能. [#13282](https://github.com/ClickHouse/ClickHouse/pull/13282) ([Amos Bird](https://github.com/amosbird)). -* 修复 `geohashesInBox` 中的断言. 这修复了 [#12554](https://github.com/ClickHouse/ClickHouse/issues/12554). [#13229](https://github.com/ClickHouse/ClickHouse/pull/13229) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `parseDateTimeBestEffort` 中的断言. 这修复了 [#12649](https://github.com/ClickHouse/ClickHouse/issues/12649). [#13227](https://github.com/ClickHouse/ClickHouse/pull/13227) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* Processors/PipelineExecutor 中的小优化: 跳出循环, 因为这样做很有意义. [#13058](https://github.com/ClickHouse/ClickHouse/pull/13058) ([Mark Papadakis](https://github.com/markpapadakis)). -* 支持不带 TABLE 关键字的 TRUNCATE 表. [#12653](https://github.com/ClickHouse/ClickHouse/pull/12653) ([Winter Zhang](https://github.com/zhang2014)). -* 修复默认情况下解释查询格式覆盖. 这修复了 [#12541](https://github.com/ClickHouse/ClickHouse/issues/12432). [#12541](https://github.com/ClickHouse/ClickHouse/pull/12541) ([BohuTANG](https://github.com/BohuTANG)). -* 允许以更标准的方式设置 JOIN 种类和类型: `LEFT SEMI JOIN` 而不是 `SEMI LEFT JOIN`. 目前两者都是正确的. [#12520](https://github.com/ClickHouse/ClickHouse/pull/12520) ([Artem Zuikov](https://github.com/4ertus2)). -* 将 `multiple_joins_rewriter_version` 的默认值更改为 2. 它启用知道列名的新的多连接重写器. [#12469](https://github.com/ClickHouse/ClickHouse/pull/12469) ([Artem Zuikov](https://github.com/4ertus2)). -* 为对 S3 存储的请求添加多个指标. [#12464](https://github.com/ClickHouse/ClickHouse/pull/12464) ([ianton-ru](https://github.com/ianton-ru)). -* 使用 `--secure` 参数为clickhouse-benchmark使用正确的默认安全端口. 这修复了 [#11044](https://github.com/ClickHouse/ClickHouse/issues/11044). [#12440](https://github.com/ClickHouse/ClickHouse/pull/12440) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* `Log`、`TinyLog`、`StripeLog` 引擎中的回滚插入错误. 在以前的版本中, 插入错误会导致表状态不一致 (这按照文档工作,对于这些表引擎来说是正常的). 这修复了 [#12402](https://github.com/ClickHouse/ClickHouse/issues/12402). [#12426](https://github.com/ClickHouse/ClickHouse/pull/12426) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 为`Atomic` 数据库引擎实现`RENAME DATABASE` 和`RENAME DICTIONARY` - 添加隐式`{uuid}` 宏, 可在`ReplicatedMergeTree` 的ZooKeeper 路径中使用. 它适用于 `CREATE ... ON CLUSTER ...` 查询. 将 `show_table_uuid_in_table_create_query_if_not_nil` 设置为 `true` 以使用它. - 将 `ReplicatedMergeTree` 引擎参数设为可选, 默认使用 `/clickhouse/tables/{uuid}/{shard}/` 和 `{replica}`. 关闭 [#12135](https://github.com/ClickHouse/ClickHouse/issues/12135). - 小修正. - 这些更改破坏了 `Atomic` 数据库引擎的向后兼容性. 以前创建的“原子”数据库必须手动转换为新格式. 原子数据库是一个实验性功能. [#12343](https://github.com/ClickHouse/ClickHouse/pull/12343) ([tavplubix](https://github.com/tavplubix)). -* 将 `AWSAuthV4Signer` 分离到不同的记录器中, 从日志消息中删除过多的 `AWSClient: AWSClient`. [#12320](https://github.com/ClickHouse/ClickHouse/pull/12320) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 磁盘访问存储中更好的异常消息. [#12625](https://github.com/ClickHouse/ClickHouse/pull/12625) ([alesapin](https://github.com/alesapin)). -* 参数数目无效的函数 `in` 的更好例外. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). -* 修复有关自适应粒度的错误消息. [#12624](https://github.com/ClickHouse/ClickHouse/pull/12624) ([alesapin](https://github.com/alesapin)). -* 修复格式化后的设置解析. [#12480](https://github.com/ClickHouse/ClickHouse/pull/12480) ([Azat Khuzhin](https://github.com/azat)). -* 如果 MergeTree 表不包含 ORDER BY 或 PARTITION BY, 则可能会请求 ALTER 清除所有列, 而 ALTER 将卡住. 已修复 [#7941](https://github.com/ClickHouse/ClickHouse/issues/7941). [#12382](https://github.com/ClickHouse/ClickHouse/pull/12382) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 避免在每次查询后从历史文件重新加载完成 (以避免历史与其他客户端会话重叠). [#13086](https://github.com/ClickHouse/ClickHouse/pull/13086) ([Azat Khuzhin](https://github.com/azat)). - -#### 性能改进 - -* 某些操作的内存使用量降低高达 2 倍. [#12424](https://github.com/ClickHouse/ClickHouse/pull/12424) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 针对匹配精确 PK 范围的查询优化 PK 查找. [#12277](https://github.com/ClickHouse/ClickHouse/pull/12277) ([Ivan Babrou](https://github.com/bobrik)). -* 使用 `LowCardinality` 稍微优化非常短的查询. [#14129](https://github.com/ClickHouse/ClickHouse/pull/14129) ([Anton Popov](https://github.com/CurtizJ)). -* 通过 UInt8/UInt16 键略微提高聚合性能. [#13091](https://github.com/ClickHouse/ClickHouse/pull/13091) and [#13055](https://github.com/ClickHouse/ClickHouse/pull/13055) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 下推`LIMIT`步骤查询计划 (在子查询内). [#13016](https://github.com/ClickHouse/ClickHouse/pull/13016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 并行主键查找和跳过部分的索引阶段, 如 [#11564](https://github.com/ClickHouse/ClickHouse/issues/11564) 中所述. [#12589](https://github.com/ClickHouse/ClickHouse/pull/12589) ([Ivan Babrou](https://github.com/bobrik)). -* 如果 `set optimize_if_transform_strings_to_enum = 1`, 则将函数 `if` 和 `transform` 的字符串类型参数转换为枚举. [#12515](https://github.com/ClickHouse/ClickHouse/pull/12515) ([Artem Zuikov](https://github.com/4ertus2)). -* 如果 `set optimize_monotonous_functions_in_order_by=1`, 则用 `ORDER BY` 中的参数替换单调函数. [#12467](https://github.com/ClickHouse/ClickHouse/pull/12467) ([Artem Zuikov](https://github.com/4ertus2)). -* 通过优化添加顺序, 如果 `set optimize_redundant_functions_in_order_by = 1`, 则用 `ORDER by x` 重写 `ORDER BY x, f(x)` . [#12404](https://github.com/ClickHouse/ClickHouse/pull/12404) ([Artem Zuikov](https://github.com/4ertus2)). -* 当子查询包含`WITH` 子句时允许下推谓词. 这修复了 [#12293](https://github.com/ClickHouse/ClickHouse/issues/12293) [#12663](https://github.com/ClickHouse/ClickHouse/pull/12663) ([Winter Zhang](https://github.com/zhang2014)). -* 提高读取紧凑部件的性能. 紧凑型零件是一项实验性功能. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). -* 尝试在 `DiskS3` 中实现流优化. DiskS3 是一项实验性功能. [#12434](https://github.com/ClickHouse/ClickHouse/pull/12434) ([Vladimir Chebotarev](https://github.com/excitoon)). - -#### 构建/测试/打包改进 - -* 使用 `shellcheck` 进行 sh 测试 linting. [#13200](https://github.com/ClickHouse/ClickHouse/pull/13200) [#13207](https://github.com/ClickHouse/ClickHouse/pull/13207) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 GitHub 挂钩中添加为拉取请求设置标签的脚本. [#13183](https://github.com/ClickHouse/ClickHouse/pull/13183) ([alesapin](https://github.com/alesapin)). -* 删除一些递归子模块. 见 [#13378](https://github.com/ClickHouse/ClickHouse/issues/13378). [#13379](https://github.com/ClickHouse/ClickHouse/pull/13379) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 确保所有子模块都来自正确的 URL. Continuation of [#13379](https://github.com/ClickHouse/ClickHouse/issues/13379). This fixes [#13378](https://github.com/ClickHouse/ClickHouse/issues/13378). [#13397](https://github.com/ClickHouse/ClickHouse/pull/13397) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了对用户声明的设置的支持, 可以从内部查询访问. 当 ClickHouse 引擎用作另一个系统的组件时需要这样做. [#13013](https://github.com/ClickHouse/ClickHouse/pull/13013) ([Vitaly Baranov](https://github.com/vitlibar)). -* 在 TestFlows 中添加了对 INSERT 权限的 RBAC 功能的测试. 正在测试 SELECT 的扩展表. 添加了匹配新表引擎测试的要求. [#13340](https://github.com/ClickHouse/ClickHouse/pull/13340) ([MyroTk](https://github.com/MyroTk)). -* 修复压力测试中服务器重启时超时错误. [#13321](https://github.com/ClickHouse/ClickHouse/pull/13321) ([alesapin](https://github.com/alesapin)). -* 现在快速测试将等待服务器重试. [#13284](https://github.com/ClickHouse/ClickHouse/pull/13284) ([alesapin](https://github.com/alesapin)). -* 函数`materialize()` (用于 ClickHouse 测试的函数) 将按预期为 NULL 工作 - 通过将其转换为非常量列. [#13212](https://github.com/ClickHouse/ClickHouse/pull/13212) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 AArch64 中的 libunwind 构建. 这修复了 [#13204](https://github.com/ClickHouse/ClickHouse/issues/13204). [#13208](https://github.com/ClickHouse/ClickHouse/pull/13208) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 zkutil gtest 中进行更多重试以防止测试不稳定. [#13165](https://github.com/ClickHouse/ClickHouse/pull/13165) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 对 RBAC 测试流的小修正. [#13152](https://github.com/ClickHouse/ClickHouse/pull/13152) ([vzakaznikov](https://github.com/vzakaznikov)). -* 修复 `00960_live_view_watch_events_live.py` 测试. [#13108](https://github.com/ClickHouse/ClickHouse/pull/13108) ([vzakaznikov](https://github.com/vzakaznikov)). -* 改进文档部署脚本中的缓存清除. [#13107](https://github.com/ClickHouse/ClickHouse/pull/13107) ([alesapin](https://github.com/alesapin)). -* 重写了一些孤立的测试到gtest. 从测试中移除无用的内容. [#13073](https://github.com/ClickHouse/ClickHouse/pull/13073) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 在 TestFlows 中添加了对 `SELECT` 权限的 RBAC 功能的测试. [#13061](https://github.com/ClickHouse/ClickHouse/pull/13061) ([Ritaank Tiwari](https://github.com/ritaank)). -* 在快速测试检查中重新运行一些测试. [#12992](https://github.com/ClickHouse/ClickHouse/pull/12992) ([alesapin](https://github.com/alesapin)). -* 修复 `rdkafka` 库中的 MSan 错误. 这将关闭 [#12990](https://github.com/ClickHouse/ClickHouse/issues/12990). 将 `rdkafka` 更新到 1.5 版 (主). [#12991](https://github.com/ClickHouse/ClickHouse/pull/12991) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果在带有 AVX-512 的服务器上运行测试, 则修复 base64 中的 UBSan 报告. 这修复了 [#12318](https://github.com/ClickHouse/ClickHouse/issues/12318). 作者: @qoega. [#12441](https://github.com/ClickHouse/ClickHouse/pull/12441) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 HDFS 库中的 UBSan 报告. 这将关闭 [#12330](https://github.com/ClickHouse/ClickHouse/issues/12330). [#12453](https://github.com/ClickHouse/ClickHouse/pull/12453) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 检查我们能够将备份从旧版本恢复到新版本的能力. 这将关闭 [#8979](https://github.com/ClickHouse/ClickHouse/issues/8979). [#12959](https://github.com/ClickHouse/ClickHouse/pull/12959) ([alesapin](https://github.com/alesapin)). -* 不要在集成测试中构建 helper_container 图像. 在 CI 中构建 docker 容器并在集成测试中使用预构建的 helper_container. [#12953](https://github.com/ClickHouse/ClickHouse/pull/12953) ([Ilya Yatsishin](https://github.com/qoega)). -* 为主键列添加对 `ALTER TABLE CLEAR COLUMN` 查询的测试. [#12951](https://github.com/ClickHouse/ClickHouse/pull/12951) ([alesapin](https://github.com/alesapin)). -* 测试流测试中的超时时间增加. [#12949](https://github.com/ClickHouse/ClickHouse/pull/12949) ([vzakaznikov](https://github.com/vzakaznikov)). -* 修复 Mac OS X 下的测试构建. 这将关闭 [#12767](https://github.com/ClickHouse/ClickHouse/issues/12767). [#12772](https://github.com/ClickHouse/ClickHouse/pull/12772) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 连接器-ODBC 更新为 mysql-connector-odbc-8.0.21. [#12739](https://github.com/ClickHouse/ClickHouse/pull/12739) ([Ilya Yatsishin](https://github.com/qoega)). -* 在 TestFlows 中添加 RBAC 语法测试. [#12642](https://github.com/ClickHouse/ClickHouse/pull/12642) ([vzakaznikov](https://github.com/vzakaznikov)). -* 提高 TestKeeper 的性能. 这将加速大量使用复制表的测试. [#12505](https://github.com/ClickHouse/ClickHouse/pull/12505) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在我们检查服务器是否能够在压力测试运行后启动. 这修复了 [#12473](https://github.com/ClickHouse/ClickHouse/issues/12473). [#12496](https://github.com/ClickHouse/ClickHouse/pull/12496) ([alesapin](https://github.com/alesapin)). -* 将 fmtlib 更新到 master (7.0.1). [#12446](https://github.com/ClickHouse/ClickHouse/pull/12446) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加 docker 镜像以进行快速测试. [#12294](https://github.com/ClickHouse/ClickHouse/pull/12294) ([alesapin](https://github.com/alesapin)). -* 集成测试的返工配置路径. [#12285](https://github.com/ClickHouse/ClickHouse/pull/12285) ([Ilya Yatsishin](https://github.com/qoega)). -* 添加编译器选项以控制堆栈帧不会太大. 这将有助于在具有小堆栈大小的纤程中运行代码. [#11524](https://github.com/ClickHouse/ClickHouse/pull/11524) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 更新 gitignore 文件. [#13447](https://github.com/ClickHouse/ClickHouse/pull/13447) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). - - -## ClickHouse 版本 20.6 - -### ClickHouse 版本 v20.6.3.28-stable - -#### 向后不兼容变更 - -* 从20.5以上的版本升级时, 如果进行滚动更新, 集群同时包含20.5以上和20.5以下的版本, 如果旧版本的ClickHouse节点重启, 旧版本在新版本存在的情况下启动,可能会导致 到 `Part ... intersects previous part` 错误. 为防止出现此错误,首先在所有集群节点上安装更新的 clickhouse-server 软件包,然后重新启动 (因此, 当 clickhouse-server 重新启动时, 它将以新版本启动). - -#### 新特征 - -* 添加了 `EXPLAIN` 查询的初始实现. 语法: `EXPLAIN SELECT ...`. 这修复了 [#1118](https://github.com/ClickHouse/ClickHouse/issues/1118). [#11873](https://github.com/ClickHouse/ClickHouse/pull/11873) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 添加了存储 `RabbitMQ` . [#11069](https://github.com/ClickHouse/ClickHouse/pull/11069) ([Kseniia Sumarokova](https://github.com/kssenii)). -* 为 [#11710](https://github.com/ClickHouse/ClickHouse/issues/11710) 实现了类似 PostgreSQL 的 `ILIKE` 操作符. [#12125](https://github.com/ClickHouse/ClickHouse/pull/12125) ([Mike](https://github.com/myrrc)). -* 支持 RIGHT 和 FULL JOIN 与 `SET join_algorithm = 'partial_merge'`. 只允许 ALL 严格 (ANY、SEMI、ANTI、ASOF 不是). [#12118](https://github.com/ClickHouse/ClickHouse/pull/12118) ([Artem Zuikov](https://github.com/4ertus2)). -* 添加了一个函数 `initializeAggregation` 以初始化基于单个值的聚合. [#12109](https://github.com/ClickHouse/ClickHouse/pull/12109) ([Guillaume Tassery](https://github.com/YiuRULE)). -* 支持 `ALTER TABLE ... [ADD|MODIFY] COLUMN ... FIRST` [#4006](https://github.com/ClickHouse/ClickHouse/issues/4006). [#12073](https://github.com/ClickHouse/ClickHouse/pull/12073) ([Winter Zhang](https://github.com/zhang2014)). -* 添加了函数 `parseDateTimeBestEffortUS` . [#12028](https://github.com/ClickHouse/ClickHouse/pull/12028) ([flynn](https://github.com/ucasFL)). -* 支持输出格式 `ORC` (仅支持输入). [#11662](https://github.com/ClickHouse/ClickHouse/pull/11662) ([Kruglov Pavel](https://github.com/Avogar)). - -#### Bug 修复 - -* 修复了 `aggregate function any(x) is found inside another aggregate function in query` 错误, 其中包含 `SET optimize_move_functions_out_of_any = 1` 和 `any()` 中的别名. [#13419](https://github.com/ClickHouse/ClickHouse/pull/13419) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了 clickhouse-local 的 `PrettyCompactMonoBlock` . 使用 `PrettyCompactMonoBlock` 修复了极端/总数. 这修复了 [#7746](https://github.com/ClickHouse/ClickHouse/issues/7746). [#13394](https://github.com/ClickHouse/ClickHouse/pull/13394) ([Azat Khuzhin](https://github.com/azat)). -* 修复了在从延迟副本查询的情况下可能出现的错误 `Totals having transform was already added to pipeline` . [#13290](https://github.com/ClickHouse/ClickHouse/pull/13290) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 如果用户将特制的参数传递给函数 `h3ToChildren`, 服务器可能会崩溃. 这修复了 [#13275](https://github.com/ClickHouse/ClickHouse/issues/13275). [#13277](https://github.com/ClickHouse/ClickHouse/pull/13277) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在具有 NaN 值的 Float 类型上调用的 `uniqExact`、`topK`、`sumDistinct` 和类似聚合函数的潜在低性能和稍微不正确的结果. 它还在调试版本中触发断言. 这修复了 [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了如果以nullable constexpr为cond, 则不是字面量 NULL 问题. 修复 [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在数组元素为 Nullable 且数组下标也可为 Null 的情况下, 修复了 `arrayElement` 函数中的断言. 这修复了 [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了带有常量参数的 `DateTime64` 转换函数. [#13205](https://github.com/ClickHouse/ClickHouse/pull/13205) ([Azat Khuzhin](https://github.com/azat)). -* 用函数修正了错误的索引分析. 在从 `MergeTree` 表中读取时, 它可能会导致修剪错误的部分. 修复 [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了错误 `Cannot convert column because it is constant but values of constants are different in source and result`, 远程查询在查询范围内使用确定性函数, 但查询之间不具有确定性, 例如 `now()`、`now64()`、`randConstant()`. 修复 [#11327](https://github.com/ClickHouse/ClickHouse/issues/11327). [#13075](https://github.com/ClickHouse/ClickHouse/pull/13075) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了对从本地副本进行选择的线程数的不必要限制. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了当 `ALTER DELETE` 和 `ALTER MODIFY COLUMN` 查询作为单个突变同时执行时的罕见错误. 错误导致 `count.txt` 中的行数不正确, 从而导致部分数据不正确. 另外, 修复了一个同时使用`ALTER RENAME COLUMN`和`ALTER ADD COLUMN` 的小错误. [#12760](https://github.com/ClickHouse/ClickHouse/pull/12760) ([alesapin](https://github.com/alesapin)). -* 修复了 `CAST(Nullable(String), Enum())`. [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) ([Azat Khuzhin](https://github.com/azat)). -* 修复了大元组的性能, 这些元组在 `IN` 部分被解释为函数. 当用户出于某种晦涩的原因编写 `WHERE x IN tuple(1, 2, ...)` 而不是 `WHERE x IN (1, 2, ...)` 的情况. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 `input_format_parallel_parsing` 的内存跟踪 (通过将线程附加到组). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). -* 使用 const 表达式修复了布隆过滤器索引. 这修复了 [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572). [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了当 Broker 不可用时 (不仅如此) 在 `StorageKafka` 中的 `SIGSEGV`. [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). -* 添加了对带有 `Array(UUID)` 参数的函数 `if` 的支持. 这修复了 [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果用户存在, `CREATE USER IF NOT EXISTS` 现在不会抛出异常. 这修复了 [#12507](https://github.com/ClickHouse/ClickHouse/issues/12507). [#12646](https://github.com/ClickHouse/ClickHouse/pull/12646) ([Vitaly Baranov](https://github.com/vitlibar)). -* 磁盘访问存储中更好的异常消息. [#12625](https://github.com/ClickHouse/ClickHouse/pull/12625) ([alesapin](https://github.com/alesapin)). -* 函数 `groupArrayMoving*` 不适用于分布式查询. 它的结果是在不正确的数据类型中计算的 (没有升级到最大的类型). `groupArrayMovingAvg` 函数返回的整数与 `avg` 函数不一致. 这修复了 [#12568](https://github.com/ClickHouse/ClickHouse/issues/12568). [#12622](https://github.com/ClickHouse/ClickHouse/pull/12622) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了函数 `any` 缺少别名的问题. [#12593](https://github.com/ClickHouse/ClickHouse/pull/12593) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了带有缓存布局的外部字典中的竞争条件, 这可能导致服务器崩溃. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). -* 在 DROP TABLE 上删除分布式表 (来自异步插入的块) 的数据. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). -* 修复了当 `enable_mixed_granularity_parts=1` 时, 在 `ALTER DELETE` 查询后导致旧部件损坏的错误. 修复 [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). -* 参数数目无效的函数 `in` 的更好例外. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). -* 修复实时视图表中可能导致数据重复的竞争条件. [#12519](https://github.com/ClickHouse/ClickHouse/pull/12519) ([vzakaznikov](https://github.com/vzakaznikov)). -* 修正了从合并部分读取时的性能问题. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 `AggregateFunction(avg, ...)` 值的二进制格式的向后兼容性. 这修复了 [#12342](https://github.com/ClickHouse/ClickHouse/issues/12342). [#12486](https://github.com/ClickHouse/ClickHouse/pull/12486) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 固定设置解析格式后. [#12480](https://github.com/ClickHouse/ClickHouse/pull/12480) ([Azat Khuzhin](https://github.com/azat)). -* 修复了启用 `text_log` 时的死锁. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了指定非常大的 `LIMIT` 或 `OFFSET` 时的溢出. 这修复了 [#10470](https://github.com/ClickHouse/ClickHouse/issues/10470). This fixes [#11372](https://github.com/ClickHouse/ClickHouse/issues/11372). [#12427](https://github.com/ClickHouse/ClickHouse/pull/12427) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果 `StorageMerge` , 则修复了可能的段错误. 这修复了 [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). -* 恢复在 [#11079](https://github.com/ClickHouse/ClickHouse/issues/11079) 中引入的更改以解决 [#12098](https://github.com/ClickHouse/ClickHouse/issues/12098). [#12397](https://github.com/ClickHouse/ClickHouse/pull/12397) ([Mike](https://github.com/myrrc)). -* 额外检查布隆过滤器索引的参数. 这修复了 [#11408](https://github.com/ClickHouse/ClickHouse/issues/11408). [#12388](https://github.com/ClickHouse/ClickHouse/pull/12388) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在索引表的 WHERE 条件中使用负数或浮点常量时避免异常. 这修复了 [#11905](https://github.com/ClickHouse/ClickHouse/issues/11905). [#12384](https://github.com/ClickHouse/ClickHouse/pull/12384) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在索引表的 WHERE 条件中使用负数或浮点常量时避免异常. 这修复了 [#12333](https://github.com/ClickHouse/ClickHouse/issues/12333). [#12378](https://github.com/ClickHouse/ClickHouse/pull/12378) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复带有 `-State` 和 `Nullable` 参数的聚合函数的 `TOTALS/ROLLUP/CUBE`. 这修复了 [#12163](https://github.com/ClickHouse/ClickHouse/issues/12163). [#12376](https://github.com/ClickHouse/ClickHouse/pull/12376) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在不允许使用 `RENAME` 时, `ALTER RENAME COLUMN` 查询的错误消息和退出代码. 修复 [#12301](https://github.com/ClickHouse/ClickHouse/issues/12301) 和 [#12303](https://github.com/ClickHouse/ClickHouse/issues/12303). [#12335](https://github.com/ClickHouse/ClickHouse/pull/12335) ([alesapin](https://github.com/alesapin)). -* 修复了 `ReplicatedMergeTree Queue` 中非常罕见的竞争条件. [#12315](https://github.com/ClickHouse/ClickHouse/pull/12315) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当使用具有非固定宽度类型的编解码器 `Delta` 或 `DoubleDelta` 时, 返回代码为 `LOGICAL_ERROR` 的异常而不是代码为 `BAD_ARGUMENTS` 的异常 (我们确保代码逻辑错误的异常永远不会发生). 这修复了 [#12110](https://github.com/ClickHouse/ClickHouse/issues/12110). [#12308](https://github.com/ClickHouse/ClickHouse/pull/12308) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `WITH FILL` 修饰符中列的顺序. 以前不遵守 `ORDER BY` 语句的列顺序. [#12306](https://github.com/ClickHouse/ClickHouse/pull/12306) ([Anton Popov](https://github.com/CurtizJ)). -* 当存在按虚拟列 (如 `Merge` 表中的 `_table`) 或系统表中的 "index" 列过滤数据 (例如从 `system.tables` 查询时按数据库名称过滤) 时, 避免 `bad cast` 异常 `, 并且这个表达式返回 `Nullable` 类型. 这修复了 [#12166](https://github.com/ClickHouse/ClickHouse/issues/12166). [#12305](https://github.com/ClickHouse/ClickHouse/pull/12305) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了重命名列后的 `TTL`, 它依赖于 TTL 表达式. [#12304](https://github.com/ClickHouse/ClickHouse/pull/12304) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 SIGSEGV 如果在 `Kafka` 引擎中批处理中间有错误消息. [#12302](https://github.com/ClickHouse/ClickHouse/pull/12302) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `DNS` 缓存更新过程中某些线程可能会随机挂起几秒钟的情况. [#12296](https://github.com/ClickHouse/ClickHouse/pull/12296) ([tavplubix](https://github.com/tavplubix)). -* 修复了设置名称中的错字. [#12292](https://github.com/ClickHouse/ClickHouse/pull/12292) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* `TrieDictionary` 加载失败后显示错误. [#12290](https://github.com/ClickHouse/ClickHouse/pull/12290) ([Vitaly Baranov](https://github.com/vitlibar)). -* 对于可能导致崩溃的空数组, 函数 `arrayFill` 工作不正确. 这修复了 [#12263](https://github.com/ClickHouse/ClickHouse/issues/12263). [#12279](https://github.com/ClickHouse/ClickHouse/pull/12279) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 实现到 `LowCardinality` 类型的公共类型的转换. 这允许对具有 LowCardinality 列和其他列的表执行 UNION ALL. 这修复了 [#8212](https://github.com/ClickHouse/ClickHouse/issues/8212). 这修复了 [#4342](https://github.com/ClickHouse/ClickHouse/issues/4342). [#12275](https://github.com/ClickHouse/ClickHouse/pull/12275) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在对 `S3` 存储的请求中达到重定向限制的行为. [#12256](https://github.com/ClickHouse/ClickHouse/pull/12256) ([ianton-ru](https://github.com/ianton-ru)). -* 修复了在某些特殊类型的 `StorageFile` 标头中多次连续插入期间多次写入时的行为. 这个修复了 [#6155](https://github.com/ClickHouse/ClickHouse/issues/6155). [#12197](https://github.com/ClickHouse/ClickHouse/pull/12197) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复了 UInt8 值不等于 0 或 1 时的逻辑函数. [#12196](https://github.com/ClickHouse/ClickHouse/pull/12196) ([Alexander Kazakov](https://github.com/Akazz)). -* 上限 max_memory_usage* 限制为进程驻留内存. [#12182](https://github.com/ClickHouse/ClickHouse/pull/12182) ([Azat Khuzhin](https://github.com/azat)). -* 在 `GROUP BY` 内射函数消除期间修复 dictGet 参数检查. [#12179](https://github.com/ClickHouse/ClickHouse/pull/12179) ([Azat Khuzhin](https://github.com/azat)). -* 修复了当 `SummingMergeTree` 引擎从分区键中汇总列时的行为. 在列的显式定义与分区键列相交的情况下添加了一个例外. 这修复了 [#7867](https://github.com/ClickHouse/ClickHouse/issues/7867). [#12173](https://github.com/ClickHouse/ClickHouse/pull/12173) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 如果 ODBC 连接不支持架构, 则不要将字典源的表名拆分为架构和表名本身. [#12165](https://github.com/ClickHouse/ClickHouse/pull/12165) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复了 `ALTER DELETE` 中的错误逻辑, 当条件评估为 NULL 时会导致删除记录. 这修复了 [#9088](https://github.com/ClickHouse/ClickHouse/issues/9088). This closes [#12106](https://github.com/ClickHouse/ClickHouse/issues/12106). [#12153](https://github.com/ClickHouse/ClickHouse/pull/12153) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在存在别名的情况下发送到外部 DBMS (例如 MySQL、ODBC) 的查询转换. 这修复了[#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了冗余 ORDER BY 优化中的错误代码. 该错误是在 [#10067](https://github.com/ClickHouse/ClickHouse/issues/10067) 中引入的. [#12148](https://github.com/ClickHouse/ClickHouse/pull/12148) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了整数除法中的潜在溢出. 这修复了 [#12119](https://github.com/ClickHouse/ClickHouse/issues/12119). [#12140](https://github.com/ClickHouse/ClickHouse/pull/12140) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `greatCircleDistance`、`geoDistance` 中潜在的无限循环. 这修复了 [#12117](https://github.com/ClickHouse/ClickHouse/issues/12117). [#12137](https://github.com/ClickHouse/ClickHouse/pull/12137) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 规范化 `pid` 文件处理. 在以前的版本中, 如果服务器在没有正确关闭的情况下被杀死, 并且有另一个进程与以前运行的服务器具有相同的 pid, 则服务器可能会拒绝启动. 即使有另一台服务器正在运行, pid 文件也可能在服务器启动失败时被删除. 这修复了 [#3501](https://github.com/ClickHouse/ClickHouse/issues/3501). [#12133](https://github.com/ClickHouse/ClickHouse/pull/12133) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了导致 ZooKeepeer 中 ReplicatedVersionedCollapsingMergeTree 表的表元数据不正确的错误. 修复 [#12093](https://github.com/ClickHouse/ClickHouse/issues/12093). [#12121](https://github.com/ClickHouse/ClickHouse/pull/12121) ([alesapin](https://github.com/alesapin)). -* 对于具有连接或附加到系统日志 (system.query_log、metric_log 等) 或 engine=Buffer 基础表的子查询的物化视图, 避免 `There is no query` 异常. [#12120](https://github.com/ClickHouse/ClickHouse/pull/12120) ([filimonov](https://github.com/filimonov)). -* 修复了对字典的 ENGINE=Dictionary 表的处理依赖性. 这修复了 [#10994](https://github.com/ClickHouse/ClickHouse/issues/10994). 这修复了 [#10397](https://github.com/ClickHouse/ClickHouse/issues/10397). [#12116](https://github.com/ClickHouse/ClickHouse/pull/12116) ([Vitaly Baranov](https://github.com/vitlibar)). -* 格式 `Parquet` 现在可以正确地与 `LowCardinality` 和 `LowCardinality(Nullable)` 类型一起使用. 修复 [#12086](https://github.com/ClickHouse/ClickHouse/issues/12086), [#8406](https://github.com/ClickHouse/ClickHouse/issues/8406). [#12108](https://github.com/ClickHouse/ClickHouse/pull/12108) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了由于线程总数限制错误导致的带有 `UNION` 的选择的性能. 修复 [#12030](https://github.com/ClickHouse/ClickHouse/issues/12030). [#12103](https://github.com/ClickHouse/ClickHouse/pull/12103) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 `-StateResample` 组合器修复了段错误. [#12092](https://github.com/ClickHouse/ClickHouse/pull/12092) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 `system.quey_log` 中选择的空 `result_rows` 和 `result_bytes` 指标. 修复 [#11595](https://github.com/ClickHouse/ClickHouse/issues/11595). [#12089](https://github.com/ClickHouse/ClickHouse/pull/12089) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了不必要的限制从 `VIEW` 中选择的线程数. 修复 [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 DROP TABLE 上 StorageKafka 中的 SIGSEGV. [#12075](https://github.com/ClickHouse/ClickHouse/pull/12075) ([Azat Khuzhin](https://github.com/azat)). -* 修复了对 `PREWHERE` 使用错误类型时可能发生的崩溃。 修复 [#12053](https://github.com/ClickHouse/ClickHouse/issues/12053), [#12060](https://github.com/ClickHouse/ClickHouse/issues/12060). [#12060](https://github.com/ClickHouse/ClickHouse/pull/12060) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了带有 `Tuple(LowCardinality)` 参数的高阶函数的错误 `Cannot capture column`. 修复 [#9766](https://github.com/ClickHouse/ClickHouse/issues/9766). [#12055](https://github.com/ClickHouse/ClickHouse/pull/12055) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 固定约束检查约束是否为常量表达式. 这修复了 [#11360](https://github.com/ClickHouse/ClickHouse/issues/11360). [#12042](https://github.com/ClickHouse/ClickHouse/pull/12042) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在调用具有不同大小的 `FixedString` 类型参数的函数 `if` 时出现错误结果和潜在崩溃的问题. 这修复了 [#11362](https://github.com/ClickHouse/ClickHouse/issues/11362). [#12021](https://github.com/ClickHouse/ClickHouse/pull/12021) ([alexey-milovidov](https://github.com/alexey-milovidov)). - -#### 改进 - -* 允许以更标准的方式设置 `JOIN` 种类和类型: `LEFT SEMI JOIN`而不是`SEMI LEFT JOIN`. 目前两者都是正确的. [#12520](https://github.com/ClickHouse/ClickHouse/pull/12520) ([Artem Zuikov](https://github.com/4ertus2)). -* 缓冲区引擎的lifetime_rows/lifetime_bytes. [#12421](https://github.com/ClickHouse/ClickHouse/pull/12421) ([Azat Khuzhin](https://github.com/azat)). -* 将详细异常消息写入客户端而不是 `MySQL server has gone away` . [#12383](https://github.com/ClickHouse/ClickHouse/pull/12383) ([BohuTANG](https://github.com/BohuTANG)). -* 允许更改用于打印网格边框的字符集. 可用的字符集如下: UTF-8、ASCII. 设置 `output_format_pretty_grid_charset` 启用此功能. [#12372](https://github.com/ClickHouse/ClickHouse/pull/12372) ([Sabyanin Maxim](https://github.com/s-mx)). -* 1.支持 MySQL 'SELECT DATABASE()' [#9336](https://github.com/ClickHouse/ClickHouse/issues/9336). 2. 添加 MySQL 替换查询集成测试. [#12314](https://github.com/ClickHouse/ClickHouse/pull/12314) ([BohuTANG](https://github.com/BohuTANG)). -* 为 MySQL 客户端/驱动程序添加 `KILL QUERY [connection_id]` 以取消长查询, 问题 [#12038](https://github.com/ClickHouse/ClickHouse/issues/12038). [#12152](https://github.com/ClickHouse/ClickHouse/pull/12152) ([BohuTANG](https://github.com/BohuTANG)). -* 在 `formatDateTime` 函数中添加了对 `%g` (两位 ISO 年份) 和 `%G` (四位 ISO 年份) 替换的支持. [#12136](https://github.com/ClickHouse/ClickHouse/pull/12136) ([vivarum](https://github.com/vivarum)). -* 在 system.disks 中添加了 `type` 列. [#12115](https://github.com/ClickHouse/ClickHouse/pull/12115) ([ianton-ru](https://github.com/ianton-ru)). -* 改进的`REVOKE` 命令: 现在它只需要授予/管理选项才能被撤销. 例如, 现在要执行 `REVOKE ALL ON *.* FROM user1`, 不需要通过授予选项授予完全访问权限. 添加命令 `REVOKE ALL FROM user1` - 它从 `user1` 撤销所有授予的角色. [#12083](https://github.com/ClickHouse/ClickHouse/pull/12083) ([Vitaly Baranov](https://github.com/vitlibar)). -* 为 load_balancing 添加了副本优先级 (用于手动确定负载平衡的优先级). [#11995](https://github.com/ClickHouse/ClickHouse/pull/11995) ([Azat Khuzhin](https://github.com/azat)). -* 将 S3 元数据中的路径切换为相对路径, 以便更轻松地处理 S3 blob. [#11892](https://github.com/ClickHouse/ClickHouse/pull/11892) ([Vladimir Chebotarev](https://github.com/excitoon)). - -#### 性能改进 - -* 通过排序键的前缀改进了 `ORDER BY` 和 `GROUP BY` 的性能 (使用 `optimize_aggregation_in_order` 设置启用, 默认禁用). [#11696](https://github.com/ClickHouse/ClickHouse/pull/11696) ([Anton Popov](https://github.com/CurtizJ)). -* 如果 `set optimize_injective_functions_inside_uniq=1`, 则删除 `uniq*()` 内的单射函数. [#12337](https://github.com/ClickHouse/ClickHouse/pull/12337) ([Ruslan Kamalov](https://github.com/kamalov-ruslan)). -* 索引不用于带文字的 IN 运算符, 在 v19.3 前后引入了性能回归. 这修复了[#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). -* 为 DiskS3 (实验功能) 实现单部分上传. [#12026](https://github.com/ClickHouse/ClickHouse/pull/12026) ([Vladimir Chebotarev](https://github.com/excitoon)). - -#### 实验功能 -* 在 `MergeTree` -family 表中添加了新的部件内存格式, 将数据存储在内存中. 第一次合并时将部分写入磁盘. 如果零件的行或字节大小低于阈值 `min_rows_for_compact_part` 和 `min_bytes_for_compact_part`, 将以内存格式创建. 还提供了对 Write-Ahead-Log 的可选支持, 默认情况下启用并通过设置 `in_memory_parts_enable_wal` 来控制. [#10697](https://github.com/ClickHouse/ClickHouse/pull/10697) ([Anton Popov](https://github.com/CurtizJ)). - -#### 构建/测试/打包改进 - -* 为 clickhouse-client 实现基于 AST 的查询模糊测试模式. 请参阅 [this label](https://github.com/ClickHouse/ClickHouse/issues?q=label%3Afuzz+is%3Aissue) 了解我们最近通过模糊测试发现的问题列表. 其中大部分是由这个工具发现的, 还有一些是由 SQLancer 和 `00746_sql_fuzzy.pl` 发现的. [#12111](https://github.com/ClickHouse/ClickHouse/pull/12111) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 添加基于 Testflows 框架的新型测试. [#12090](https://github.com/ClickHouse/ClickHouse/pull/12090) ([vzakaznikov](https://github.com/vzakaznikov)). -* 添加了 S3 HTTPS 集成测试. [#12412](https://github.com/ClickHouse/ClickHouse/pull/12412) ([Pavel Kovalenko](https://github.com/Jokser)). -* 从单独的线程记录清除陷阱消息. 这将防止线程消毒剂下可能出现的死锁. [#12313](https://github.com/ClickHouse/ClickHouse/pull/12313) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在功能和压力测试将能够使用旧版本的 `clickhouse-test` 脚本运行. [#12287](https://github.com/ClickHouse/ClickHouse/pull/12287) ([alesapin](https://github.com/alesapin)). -* 在 `orc` 构建期间删除奇怪的文件创建. [#12258](https://github.com/ClickHouse/ClickHouse/pull/12258) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 将常见的 docker compose 文件放置到集成 docker 容器中. [#12168](https://github.com/ClickHouse/ClickHouse/pull/12168) ([Ilya Yatsishin](https://github.com/qoega)). -* 修复来自 CodeQL 的警告. `CodeQL` 是另一个静态分析器, 我们将与我们已经使用的 `clang-tidy` 和 `PVS-Studio` 一起使用. [#12138](https://github.com/ClickHouse/ClickHouse/pull/12138) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* UNBUNDLED 构建的小 CMake 修复. [#12131](https://github.com/ClickHouse/ClickHouse/pull/12131) ([Matwey V. Kornilov](https://github.com/matwey)). -* 添加了一个不使用任何 Linux 发行版的最小 Docker 镜像的展示. [#12126](https://github.com/ClickHouse/ClickHouse/pull/12126) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 `clickhouse-server` docker 镜像中执行系统包的升级. [#12124](https://github.com/ClickHouse/ClickHouse/pull/12124) ([Ivan Blinkov](https://github.com/blinkov)). -* 将 `UNBUNDLED` 标志添加到 `system.build_options` 表. 将 `clickhouse-test` 的跳过列表移动到 clickhouse repo. [#12107](https://github.com/ClickHouse/ClickHouse/pull/12107) ([alesapin](https://github.com/alesapin)). -* 通过 [Anchore Container Analysis](https://docs.anchore.com) 安全分析工具定期检查, 该工具会在 `clickhouse-server` Docker 镜像中查找 [CVE](https://cve.mitre.org/). 还确认`Dockerfile` 是可构建的. 每天在 `master` 和 `Dockerfile` 的拉取请求上运行. [#12102](https://github.com/ClickHouse/ClickHouse/pull/12102) ([Ivan Blinkov](https://github.com/blinkov)). -* 每日检查 [GitHub CodeQL](https://securitylab.github.com/tools/codeql) 安全分析工具, 寻找 [CWE](https://cwe.mitre.org/). [#12101](https://github.com/ClickHouse/ClickHouse/pull/12101) ([Ivan Blinkov](https://github.com/blinkov)). -* 在 Dockerfile 中的第一个 `apt-get update` 之前安装 `ca-certificates`. [#12095](https://github.com/ClickHouse/ClickHouse/pull/12095) ([Ivan Blinkov](https://github.com/blinkov)). - -## ClickHouse 版本 20.5 - -### ClickHouse 版本 v20.5.4.40-stable 2020-08-10 - -#### Bug 修复 - -* 用函数修正了错误的索引分析. 在从 `MergeTree` 表中读取时, 它可能会导致修剪错误的部分. 修复 [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了对从本地副本进行选择的线程数的不必要限制. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了大元组的性能, 这些元组在 `IN` 部分被解释为函数. 当用户出于某种晦涩的原因编写 `WHERE x IN tuple(1, 2, ...)` 而不是 `WHERE x IN (1, 2, ...)` 的情况. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 input_format_parallel_parsing 的内存跟踪 (通过将线程附加到组). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). -* 使用 const 表达式修复了布隆过滤器索引. 这修复了 [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572). [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了当 Broker 不可用时 (不仅如此) 在 `StorageKafka` 中的 `SIGSEGV`. [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). -* 添加了对带有 `Array(UUID)` 参数的函数 `if` 的支持. 这修复了 [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了函数 `any` 缺少别名的问题. [#12593](https://github.com/ClickHouse/ClickHouse/pull/12593) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了带有缓存布局的外部字典中的竞争条件, 这可能导致服务器崩溃. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). -* 在 DROP TABLE 上删除分布式表 (来自异步插入的块) 的数据. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). -* 修复了当 `enable_mixed_granularity_parts=1` 时, 在 `ALTER DELETE` 查询后导致旧部件损坏的错误. 修复 [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). -* 参数数目无效的函数 `in` 的更好例外. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了实时视图表中可能导致数据重复的竞争条件. [#12519](https://github.com/ClickHouse/ClickHouse/pull/12519) ([vzakaznikov](https://github.com/vzakaznikov)). -* 修正了从合并部分读取时的性能问题. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 `AggregateFunction(avg, ...)` 值的二进制格式的向后兼容性. 这修复了 [#12342](https://github.com/ClickHouse/ClickHouse/issues/12342). [#12486](https://github.com/ClickHouse/ClickHouse/pull/12486) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了启用 `text_log` 时的死锁. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了当指定非常大的限制或偏移量时的溢出问题. 这修复了 [#10470](https://github.com/ClickHouse/ClickHouse/issues/10470). This fixes [#11372](https://github.com/ClickHouse/ClickHouse/issues/11372). [#12427](https://github.com/ClickHouse/ClickHouse/pull/12427) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 StorageMerge 时可能出现的段错误. 关闭 [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). -* 还原 [#11079](https://github.com/ClickHouse/ClickHouse/issues/11079) 中引入的更改以解决 [#12098](https://github.com/ClickHouse/ClickHouse/issues/12098). [#12397](https://github.com/ClickHouse/ClickHouse/pull/12397) ([Mike](https://github.com/myrrc)). -* 在索引表的 WHERE 条件中使用负数或浮点常量时避免异常. 这修复了 [#11905](https://github.com/ClickHouse/ClickHouse/issues/11905). [#12384](https://github.com/ClickHouse/ClickHouse/pull/12384) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 即使存在依赖的 DEFAULT 表达式,也允许 CLEAR 列. 这修复了 [#12333](https://github.com/ClickHouse/ClickHouse/issues/12333). [#12378](https://github.com/ClickHouse/ClickHouse/pull/12378) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了带有 `-State` 和 `Nullable` 参数的聚合函数的 TOTALS/ROLLUP/CUBE. 这修复了 [#12163](https://github.com/ClickHouse/ClickHouse/issues/12163). [#12376](https://github.com/ClickHouse/ClickHouse/pull/12376) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 SIGSEGV 如果在 `Kafka` 引擎中批处理中间有错误消息. [#12302](https://github.com/ClickHouse/ClickHouse/pull/12302) ([Azat Khuzhin](https://github.com/azat)). -* 修复了当 `SummingMergeTree` 引擎从分区键中汇总列时的行为. 在列的显式定义与分区键列相交的情况下添加了一个例外. 这修复了 [#7867](https://github.com/ClickHouse/ClickHouse/issues/7867). [#12173](https://github.com/ClickHouse/ClickHouse/pull/12173) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复了在存在别名的情况下发送到外部 DBMS (例如 MySQL、ODBC) 的查询转换. 这修复了 [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了导致 ZooKeepeer 中 ReplicatedVersionedCollapsingMergeTree 表的表元数据不正确的错误. 修复 [#12093](https://github.com/ClickHouse/ClickHouse/issues/12093). [#12121](https://github.com/ClickHouse/ClickHouse/pull/12121) ([alesapin](https://github.com/alesapin)). -* 修复了从 `VIEW` 中选择的不必要的线程数限制. 修复 [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 `join_algorithm=partial_merge` 修复了具有 LowCardinality 类型的 JOIN 崩溃. [#12035](https://github.com/ClickHouse/ClickHouse/pull/12035) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了条件为 NULL 的 `if()` 的错误结果. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). - -#### 性能改进 - -* 索引不用于带文字的 IN 运算符, 在 v19.3 前后引入了性能回归. 这修复了 [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). - -#### 构建/测试/打包改进 - -* 在 Dockerfile 中的第一个 `apt-get update` 之前安装 `ca-certificates`. [#12095](https://github.com/ClickHouse/ClickHouse/pull/12095) ([Ivan Blinkov](https://github.com/blinkov)). - - -### ClickHouse 版本 v20.5.2.7-stable 2020-07-02 - -#### 向后不兼容变更 - -* 从 COUNT(DISTINCT) 和 `uniq` 聚合函数系列返回不可为空的结果. 如果所有传递的值都是 NULL, 则返回零. 这提高了 SQL 兼容性. [#11661](https://github.com/ClickHouse/ClickHouse/pull/11661) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了对在错误位置指定用户级设置的情况的检查. 用户级设置应该在 `` 部分内的 `users.xml` 中为特定用户配置文件指定 (或在 `` 中指定默认设置). 服务器不会以日志中的异常消息启动. 这修复了 [#9051](https://github.com/ClickHouse/ClickHouse/issues/9051). 如果您想跳过检查, 您可以将设置移动到适当的位置或将 `1` 添加到 config.xml. [#11449](https://github.com/ClickHouse/ClickHouse/pull/11449) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 默认情况下启用设置 `input_format_with_names_use_header`. 它会影响对输入格式 `-WithNames` 和 `-WithNamesAndTypes` 的解析. [#10937](https://github.com/ClickHouse/ClickHouse/pull/10937) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 删除 `experimental_use_processors` 设置. 它默认启用. [#10924](https://github.com/ClickHouse/ClickHouse/pull/10924) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 将 `zstd` 更新到 1.4.4. 它在性能和压缩比方面有一些小的改进. 如果您使用不同版本的 ClickHouse 运行副本, 您可能会看到合理的错误消息 `Data after merge is not byte-identical to data on another replicas.` 并附有说明. 这些消息没问题, 您不必担心. 此更改向后兼容, 但我们将其列在更改日志中, 以防您对这些消息感到疑惑. [#10663](https://github.com/ClickHouse/ClickHouse/pull/10663) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了对无意义编解码器的检查和设置 `allow_suspicious_codecs` 来控制此检查. 这将关闭 [#4966](https://github.com/ClickHouse/ClickHouse/issues/4966). [#10645](https://github.com/ClickHouse/ClickHouse/pull/10645) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 一些 Kafka 设置更改了它们的默认值. 见 [#11388](https://github.com/ClickHouse/ClickHouse/pull/11388). -* 从20.5以上的版本升级时, 如果进行滚动更新, 集群同时包含20.5以上和20.5以下的版本, 如果旧版本的ClickHouse节点重新启动, 旧版本在新版本存在的情况下启动, 可能会导致 `Part ... intersects previous part` 错误. 为防止出现此错误, 首先在所有集群节点上安装更新的 clickhouse-server 软件包, 然后重新启动 (因此, 当 clickhouse-server 重新启动时, 它将以新版本启动). - -#### 新特征 - -* `TTL DELETE WHERE` 和 `TTL GROUP BY` 用于表中的自动数据粗化和汇总. [#10537](https://github.com/ClickHouse/ClickHouse/pull/10537) ([expl0si0nn](https://github.com/expl0si0nn)). -* PostgreSQL 有线协议的实现. [#10242](https://github.com/ClickHouse/ClickHouse/pull/10242) ([Movses](https://github.com/MovElb)). -* 为 users, roles, grants, settings profiles, quotas, row policies 添加了系统表; 添加了命令 SHOW USER, SHOW [CURRENT|ENABLED] ROLES, SHOW SETTINGS PROFILES. [#10387](https://github.com/ClickHouse/ClickHouse/pull/10387) ([Vitaly Baranov](https://github.com/vitlibar)). -* 支持写入 ODBC 表函数 [#10554](https://github.com/ClickHouse/ClickHouse/pull/10554) ([ageraab](https://github.com/ageraab)). [#10901](https://github.com/ClickHouse/ClickHouse/pull/10901) ([tavplubix](https://github.com/tavplubix)). -* 添加基于 Linux `perf_events` 的查询性能指标 (这些指标是使用硬件 CPU 计数器和 OS 计数器计算的). 它是可选的, 需要在 clickhouse 二进制文件上设置 `CAP_SYS_ADMIN`. [#9545](https://github.com/ClickHouse/ClickHouse/pull/9545) [Andrey Skobtsov](https://github.com/And42). [#11226](https://github.com/ClickHouse/ClickHouse/pull/11226) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 现在支持 `CREATE` 查询中数据类型的 `NULL` 和 `NOT NULL` 修饰符. [#11057](https://github.com/ClickHouse/ClickHouse/pull/11057) ([Павел Потемкин](https://github.com/Potya)). -* 添加 `ArrowStream` 输入输出格式. [#11088](https://github.com/ClickHouse/ClickHouse/pull/11088) ([hcz](https://github.com/hczhcz)). -* 支持 Cassandra 作为外部字典源. [#4978](https://github.com/ClickHouse/ClickHouse/pull/4978) ([favstovol](https://github.com/favstovol)). -* 添加了一个新的布局 `direct`, 它直接从每个查询的源加载所有数据, 而不存储或缓存数据. [#10622](https://github.com/ClickHouse/ClickHouse/pull/10622) ([Artem Streltsov](https://github.com/kekekekule)). -* 向字典添加了新的 `complex_key_direct` 布局, 在查询执行期间不会在本地存储任何内容. [#10850](https://github.com/ClickHouse/ClickHouse/pull/10850) ([Artem Streltsov](https://github.com/kekekekule)). -* 添加了对 MySQL 样式全局变量语法 (存根) 的支持. 这是 MySQL 协议兼容性所必需的. [#11832](https://github.com/ClickHouse/ClickHouse/pull/11832) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使用 `repl` 为 `clickhouse-client` 添加了语法高亮. [#11422](https://github.com/ClickHouse/ClickHouse/pull/11422) ([Tagir Kuskarov](https://github.com/kuskarov)). -* 添加了 `mind Map` 和 `maxMap` 函数. [#11603](https://github.com/ClickHouse/ClickHouse/pull/11603) ([Ildus Kurbangaliev](https://github.com/ildus)). -* 添加记录来自 `system.asynchronous_metrics` 的历史指标的 `system.asynchronous_metric_log` 表. [#11588](https://github.com/ClickHouse/ClickHouse/pull/11588) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 添加函数 `extractAllGroupsHorizontal(haystack, re)` 和 `extractAllGroupsVertical(haystack, re)`. [#11554](https://github.com/ClickHouse/ClickHouse/pull/11554) ([Vasily Nemkov](https://github.com/Enmk)). -* 添加 SHOW CLUSTER(S) 查询. [#11467](https://github.com/ClickHouse/ClickHouse/pull/11467) ([hexiaoting](https://github.com/hexiaoting)). -* 添加`netloc`函数用于提取网络位置, 类似于python中的`urlparse(url)`、`netloc`. [#11356](https://github.com/ClickHouse/ClickHouse/pull/11356) ([Guillaume Tassery](https://github.com/YiuRULE)). -* 为 engine=Kafka 添加 2 个虚拟列以访问消息头. [#11283](https://github.com/ClickHouse/ClickHouse/pull/11283) ([filimonov](https://github.com/filimonov)). -* 为 Kafka 引擎添加 `_timestamp_ms` 虚拟列 (类型为 `Nullable(DateTime64(3))`) . [#11260](https://github.com/ClickHouse/ClickHouse/pull/11260) ([filimonov](https://github.com/filimonov)). -* 添加函数 `randomFixedString`. [#10866](https://github.com/ClickHouse/ClickHouse/pull/10866) ([Andrei Nekrashevich](https://github.com/xolm)). -* 添加函数 `fuzzBits`, 以给定的概率随机翻转字符串中的位. [#11237](https://github.com/ClickHouse/ClickHouse/pull/11237) ([Andrei Nekrashevich](https://github.com/xolm)). -* 允许在比较运算符、IN 和 VALUES 部分中将数字与常量字符串进行比较. [#11647](https://github.com/ClickHouse/ClickHouse/pull/11647) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加 `round_robin` 负载平衡模式. [#11645](https://github.com/ClickHouse/ClickHouse/pull/11645) ([Azat Khuzhin](https://github.com/azat)). -* 添加 `cast_keep_nullable` 设置. 如果设置 `CAST(something_nullable AS Type)` 返回 `Nullable(Type)` . [#11733](https://github.com/ClickHouse/ClickHouse/pull/11733) ([Artem Zuikov](https://github.com/4ertus2)). -* 将列 `position` 添加到 `system.columns` 表, 将 `column_position` 添加到 `system.parts_columns` 表. 它包含从 1 开始的表中列的顺序位置.这将关闭 [#7744](https://github.com/ClickHouse/ClickHouse/issues/7744). [#11655](https://github.com/ClickHouse/ClickHouse/pull/11655) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* ON CLUSTER 支持系统 {FLUSH DISTRIBUTED,STOP/START DISTRIBUTED SEND}. [#11415](https://github.com/ClickHouse/ClickHouse/pull/11415) ([Azat Khuzhin](https://github.com/azat)). -* 添加 system.distribution_queue 表. [#11394](https://github.com/ClickHouse/ClickHouse/pull/11394) ([Azat Khuzhin](https://github.com/azat)). -* 支持Kafka中的所有格式设置, 在表级别公开一些设置, 调整默认值以获得更好的性能. [#11388](https://github.com/ClickHouse/ClickHouse/pull/11388) ([filimonov](https://github.com/filimonov)). -* 添加 `port` 函数 (从 URL 中提取端口). [#11120](https://github.com/ClickHouse/ClickHouse/pull/11120) ([Azat Khuzhin](https://github.com/azat)). -* 现在 `dictGet*` 函数接受表名. [#11050](https://github.com/ClickHouse/ClickHouse/pull/11050) ([Vitaly Baranov](https://github.com/vitlibar)). -* 当使用 `-n` 参数时, `clickhouse-format` 工具现在能够格式化多个查询. [#10852](https://github.com/ClickHouse/ClickHouse/pull/10852) ([Darío](https://github.com/dgrr)). -* 可以为 DiskS3 配置代理解析器. [#10744](https://github.com/ClickHouse/ClickHouse/pull/10744) ([Pavel Kovalenko](https://github.com/Jokser)). -* 使 `pointInPolygon` 与非常量多边形一起工作. PointInPolygon 现在可以将 Array(Array(Tuple(..., ...))) 作为第二个参数, 多边形和孔的数组. [#10623](https://github.com/ClickHouse/ClickHouse/pull/10623) ([Alexey Ilyukhov](https://github.com/livace)) [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). -* 将 `move_ttl_info` 添加到 `system.parts` 以提供对移动 TTL 功能的内省. [#10591](https://github.com/ClickHouse/ClickHouse/pull/10591) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 可以通过代理使用 S3. [#10576](https://github.com/ClickHouse/ClickHouse/pull/10576) ([Pavel Kovalenko](https://github.com/Jokser)). -* 为数据类型添加 `NCHAR` 和 `NVARCHAR` 同义词. [#11025](https://github.com/ClickHouse/ClickHouse/pull/11025) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 已解决 [#7224](https://github.com/ClickHouse/ClickHouse/issues/7224): 将 `FailedQuery`、`FailedSelectQuery` 和 `FailedInsertQuery` 指标添加到 `system.events` 表. [#11151](https://github.com/ClickHouse/ClickHouse/pull/11151) ([Nikita Orlov](https://github.com/naorlov)). -* 向 `system.asynchronous_metrics` 添加更多 `jemalloc` 统计信息, 并确保我们看到它们的最新值. [#11748](https://github.com/ClickHouse/ClickHouse/pull/11748) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 允许指定默认 S3 凭据和自定义身份验证标头. [#11134](https://github.com/ClickHouse/ClickHouse/pull/11134) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). -* 添加了以各种精度将 DateTime64 导入/导出为 Int64 的新函数: `to-/fromUnixTimestamp64Milli/-Micro/-Nano`. [#10923](https://github.com/ClickHouse/ClickHouse/pull/10923) ([Vasily Nemkov](https://github.com/Enmk)). -* 允许为 MongoDB 字典指定 `mongodb://` URI. [#10915](https://github.com/ClickHouse/ClickHouse/pull/10915) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 现在可以在没有附属 LIMIT 子句的情况下使用 OFFSET 关键字. [#10802](https://github.com/ClickHouse/ClickHouse/pull/10802) ([Guillaume Tassery](https://github.com/YiuRULE)). -* 添加了 `system.licenses` 表. 此表包含位于 `contrib` 目录中的第三方库的许可证. 这将关闭 [#2890](https://github.com/ClickHouse/ClickHouse/issues/2890). [#10795](https://github.com/ClickHouse/ClickHouse/pull/10795) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 新函数 toStartOfSecond(DateTime64) -> DateTime64 使 DateTime64 值的亚秒部分无效. [#10722](https://github.com/ClickHouse/ClickHouse/pull/10722) ([Vasily Nemkov](https://github.com/Enmk)). -* 添加新的输入格式 `JSONAsString` , 它接受由换行符、空格和/或逗号分隔的一系列 JSON 对象. [#10607](https://github.com/ClickHouse/ClickHouse/pull/10607) ([Kruglov Pavel](https://github.com/Avogar)). -* 允许以比 4 MiB 更细的粒度步长分析内存. 添加了采样内存分析器以捕获随机分配/解除分配. [#10598](https://github.com/ClickHouse/ClickHouse/pull/10598) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* `SimpleAggregateFunction` 现在也支持 `sumMap`. [#10000](https://github.com/ClickHouse/ClickHouse/pull/10000) ([Ildus Kurbangaliev](https://github.com/ildus)). -* 分布式表引擎支持 `ALTER RENAME COLUMN` . 继续 [#10727](https://github.com/ClickHouse/ClickHouse/issues/10727). 修复 [#10747](https://github.com/ClickHouse/ClickHouse/issues/10747). [#10887](https://github.com/ClickHouse/ClickHouse/pull/10887) ([alesapin](https://github.com/alesapin)). - -#### Bug 修复 - -* 修复十进制解析中的 UBSan 报告. 这修复了 [#7540](https://github.com/ClickHouse/ClickHouse/issues/7540). [#10512](https://github.com/ClickHouse/ClickHouse/pull/10512) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 解析 DateTime64 时修复潜在的浮点异常. 这修复了 [#11374](https://github.com/ClickHouse/ClickHouse/issues/11374). [#11875](https://github.com/ClickHouse/ClickHouse/pull/11875) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复在 prewhere 条件下使用 `Nullable` 列导致的罕见崩溃. [#11895](https://github.com/ClickHouse/ClickHouse/pull/11895) [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608) [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 不允许在高阶函数中使用 arrayJoin. 它导致协议同步中断. 这将关闭 [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 FixedString 与常量 String 比较的错误结果. 这修复了 [#11393](https://github.com/ClickHouse/ClickHouse/issues/11393). 这个bug出现在20.4版本. [#11828](https://github.com/ClickHouse/ClickHouse/pull/11828) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复条件为 NULL 的 `if` 的错误结果. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复使用过多线程进行查询. [#11788](https://github.com/ClickHouse/ClickHouse/pull/11788) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了在 `SELECT ... FROM merge_tree_table ...` 中使用 `WITH ...` 时的 `Scalar does not exist` 异常 [#11621](https://github.com/ClickHouse/ClickHouse/issues/11621). [#11767](https://github.com/ClickHouse/ClickHouse/pull/11767) ([Amos Bird](https://github.com/amosbird)). -* 修复像 `SELECT *, xyz.*` 这样的查询的意外行为, 这些查询在预期错误时成功. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). -* 现在, 在修改元数据期间, 复制的取数据将被取消. [#11744](https://github.com/ClickHouse/ClickHouse/pull/11744) ([alesapin](https://github.com/alesapin)). -* 在检查相等性之前解析存储在 zookeeper 中的元数据. [#11739](https://github.com/ClickHouse/ClickHouse/pull/11739) ([Azat Khuzhin](https://github.com/azat)). -* 修复了由 Values 输入格式中复杂文字的错误类型推导导致的 LOGICAL_ERROR. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). -* 修复 `ORDER BY ... WITH FILL` 在 const 列上. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). -* 复 SYSTEM SYNC REPLICA 中非常罕见的竞争条件. 如果创建了复制表, 同时另一个客户端从单独的连接中对该表发出 `SYSTEM SYNC REPLICA` 命令 (这不太可能, 因为另一个客户端应该知道该表已创建), 则有可能获得 nullptr 取消引用. [#11691](https://github.com/ClickHouse/ClickHouse/pull/11691) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 与 XDBC 桥通信时传递适当的超时. 最近在检查桥接活性和接收元信息时没有遵守超时. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 将 `LIMIT n WITH TIES` 与包含别名的 `ORDER BY` 语句一起使用. [#11689](https://github.com/ClickHouse/ClickHouse/pull/11689) ([Anton Popov](https://github.com/CurtizJ)). -* 修复带有并行 `FINAL` 的选择的可能的 `Pipeline stuck` . 修复 [#11636](https://github.com/ClickHouse/ClickHouse/issues/11636). [#11682](https://github.com/ClickHouse/ClickHouse/pull/11682) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复导致 `system.mutations` 状态不正确的错误. 它可能表明整个突变已经完成, 但服务器在复制队列中仍有 `MUTATE_PART` 任务并尝试执行它们. 这修复了 [#11611](https://github.com/ClickHouse/ClickHouse/issues/11611). [#11681](https://github.com/ClickHouse/ClickHouse/pull/11681) ([alesapin](https://github.com/alesapin)). -* 修复 CREATE USER 查询中的语法 hilite. [#11664](https://github.com/ClickHouse/ClickHouse/pull/11664) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加对带有不区分大小写标志的正则表达式的支持. This fixes [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) 并修复 [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果设置了行级安全性, 则删除琐碎的计数查询优化. 在以前的版本中, 用户获取表中记录的总数而不是过滤。 这修复了 [#11352](https://github.com/ClickHouse/ClickHouse/issues/11352). [#11644](https://github.com/ClickHouse/ClickHouse/pull/11644) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复字符串的布隆过滤器 (数据跳过索引). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). -* 如果没有 `-q` 选项, 数据库不会在启动时创建. [#11604](https://github.com/ClickHouse/ClickHouse/pull/11604) ([giordyb](https://github.com/giordyb)). -* 修复错误 `Block structure mismatch`, 用于从“缓冲区”表中采样读取的查询. [#11602](https://github.com/ClickHouse/ClickHouse/pull/11602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 clickhouse-client 错误的退出代码, 当 `exception.code() % 256 == 0`. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). -* 修复 ReplicatedMergeTree 的不同副本的 CREATE/DROP 中的竞争条件. 如果表未从 ZooKeeper 中完全删除或未成功创建, 则继续工作. 这修复了 [#11432](https://github.com/ClickHouse/ClickHouse/issues/11432). [#11592](https://github.com/ClickHouse/ClickHouse/pull/11592) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复服务器启动时有关 `Mark cache size was lowered` 的日志消息中的小错误. 这将关闭 [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复错误 `Size of offsets does not match size of column` , 用于查询中的 `PREWHERE column in (subquery)` 和 `ARRAY JOIN` . [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 `SHOW CREATE TABLE` 中罕见的段错误. 修复 [#11490](https://github.com/ClickHouse/ClickHouse/issues/11490). [#11579](https://github.com/ClickHouse/ClickHouse/pull/11579) ([tavplubix](https://github.com/tavplubix)). -* HTTP 会话中的所有查询都具有相同的 query_id. 它是固定的. [#11578](https://github.com/ClickHouse/ClickHouse/pull/11578) ([tavplubix](https://github.com/tavplubix)). -* 现在 clickhouse-server docker 容器将更喜欢 IPv6 检查服务器活动性. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). -* 修复了在启用 `min_bytes_to_use_direct_io` 且 PREWHERE 处于活动状态并使用 SAMPLE 或大量线程时可能发生的 `Data compressed with different methods` 错误. 这修复了 [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `` 的 shard_num/replica_num (破坏 use_compact_format_in_distributed_parts_names). [#11528](https://github.com/ClickHouse/ClickHouse/pull/11528) ([Azat Khuzhin](https://github.com/azat)). -* 将异步 INSERT 修复到分布式中, 以用于 prefer_localhost_replica=0 和 w/o internal_replication. [#11527](https://github.com/ClickHouse/ClickHouse/pull/11527) ([Azat Khuzhin](https://github.com/azat)). -* 使用 `-State` 函数在聚合过程中抛出异常时修复内存泄漏. 这修复了 [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `INSERT SELECT FINAL` 的 `Pipeline stuck` 异常, 其中 `SELECT` (`max_threads`> 1)有多个流, 而` INSERT` 只有一个 (`max_insert_threads`==0). [#11455](https://github.com/ClickHouse/ClickHouse/pull/11455) ([Azat Khuzhin](https://github.com/azat)). -* 修复查询中的错误结果, 例如 `select count() from t, u`. [#11454](https://github.com/ClickHouse/ClickHouse/pull/11454) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复编解码器的返回压缩大小. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当列具有带有非文字参数的压缩编解码器时修复服务器崩溃. 修复 [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). -* 修复了当表没有成功创建时, 在合并树关闭时可能出现的未初始化内存读取问题. [#11420](https://github.com/ClickHouse/ClickHouse/pull/11420) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 JOIN 在 `LowCarinality(T)` 和 `Nullable(T)` 上的崩溃. [#11380](https://github.com/ClickHouse/ClickHouse/issues/11380). [#11414](https://github.com/ClickHouse/ClickHouse/pull/11414) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复错误 `USING` 键的错误代码. [#11373](https://github.com/ClickHouse/ClickHouse/issues/11373). [#11404](https://github.com/ClickHouse/ClickHouse/pull/11404) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了参数超出纬度/经度范围的 `geohashesInBox`. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). -* `joinGet()` 函数更好的错误. [#11389](https://github.com/ClickHouse/ClickHouse/pull/11389) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复具有外部排序和限制的查询可能出现的 `Pipeline stuck` 错误. 修复 [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 在 ReplicatedMergeTree 中发送零件期间删除冗余锁. [#11354](https://github.com/ClickHouse/ClickHouse/pull/11354) ([alesapin](https://github.com/alesapin)). -* 修复了多行模式下 clickhouse-client 对 `\G`(垂直输出)的支持. 这将关闭 [#9933](https://github.com/ClickHouse/ClickHouse/issues/9933). [#11350](https://github.com/ClickHouse/ClickHouse/pull/11350) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复使用 `Lazy` 数据库时潜在的段错误. [#11348](https://github.com/ClickHouse/ClickHouse/pull/11348) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复从 `Join` 表引擎 (没有 JOIN) 直接选择的崩溃和错误的可空性. [#11340](https://github.com/ClickHouse/ClickHouse/pull/11340) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复 `quantilesExactWeightedArray` 中的崩溃问题. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 现在合并在 `ALTER` 查询中更改元数据之前停止. [#11335](https://github.com/ClickHouse/ClickHouse/pull/11335) ([alesapin](https://github.com/alesapin)). -* Make writing to `MATERIALIZED VIEW` with setting `parallel_view_processing = 1` parallel again. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当提取的 JSON 具有不平衡的 { 或 [ 字符串时,修复 `visitParamExtractRaw`. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). -* 修复 ThreadPool 中非常罕见的竞争条件. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `clickhouse-copier` 中无关紧要的数据竞争. 通过集成测试发现. [#11313](https://github.com/ClickHouse/ClickHouse/pull/11313) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复转换中潜在的未初始化内存. 示例: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了如果表的主键中有 Array 列并且查询正在使用 `empty` 或 `notEmpty` 函数按此列过滤时索引分析无法工作的问题. 这修复了 [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复当查询速度估计可能不正确时的错误, 并且如果查询受到 `max_network_bandwidth`、`max_execution_speed` 或 `priority` 设置的限制, `min_execution_speed` 的限制可能无法工作或无法正常工作。 将 `timeout_before_checking_execution_speed` 的默认值更改为非零值, 否则设置 `min_execution_speed` 和 `max_execution_speed` 无效/ 这修复了 [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). 这修复了 [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). 这修复了 [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). 可用性改进: 避免在 `clickhouse-client` 中将异常消息与进度条串联. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了使用错误参数调用 `SET DEFAULT ROLE` 时的崩溃. 这修复了 [#10586](https://github.com/ClickHouse/ClickHouse/issues/10586). [#11278](https://github.com/ClickHouse/ClickHouse/pull/11278) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复在以 `Protobuf` 格式读取格式错误的数据时崩溃的问题. 这修复了 [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复了 `cache` 字典可以返回默认值而不是正常值 (只有过期键时) 的错误. 这仅影响字符串字段. [#11233](https://github.com/ClickHouse/ClickHouse/pull/11233) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复错误 `Block structure mismatch in QueryPipeline` , 同时从内部查询中的常量读取 `VIEW`. 修复 [#11181](https://github.com/ClickHouse/ClickHouse/issues/11181). [#11205](https://github.com/ClickHouse/ClickHouse/pull/11205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复可能的异常 `Invalid status for associated output` . [#11200](https://github.com/ClickHouse/ClickHouse/pull/11200) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 现在将检查 `primary.idx` 是否在 `CREATE` 查询中定义. [#11199](https://github.com/ClickHouse/ClickHouse/pull/11199) ([alesapin](https://github.com/alesapin)). -* 使用 `Array(Array(LowCardinality))` 捕获参数修复高阶函数的可能错误 `Cannot capture column` . [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了在超过 1000 个键和一些后端的情况下可能会失败的 `S3` 通配符. [#11179](https://github.com/ClickHouse/ClickHouse/pull/11179) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 如果数据跳过索引依赖于将在后台合并期间修改的列 (对于 SummingMergeTree、AggregatingMergeTree 以及 TTL GROUP BY), 则计算错误. 此问题已通过合并后移动索引计算得到修复, 因此索引是在合并数据上计算的. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). -* 修复了在表引擎 = Kafka 的 DROP 期间 (或在服务器重新启动期间) 有时发生的挂起. [#11145](https://github.com/ClickHouse/ClickHouse/pull/11145) ([filimonov](https://github.com/filimonov)). -* 修复简单查询过多的线程预留 (优化减少线程数量, 在管道更改后部分中断). [#11114](https://github.com/ClickHouse/ClickHouse/pull/11114) ([Azat Khuzhin](https://github.com/azat)). -* 如果没有最终确定, 则从突变终止任务中删除日志记录. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). -* 修复了更新后服务器启动过程中的死锁, 系统日志表的结构发生了变化. [#11106](https://github.com/ClickHouse/ClickHouse/pull/11106) ([alesapin](https://github.com/alesapin)). -* 修复了 registerDiskS3 中的内存泄漏. [#11074](https://github.com/ClickHouse/ClickHouse/pull/11074) ([Pavel Kovalenko](https://github.com/Jokser)). -* 当 JOIN 出现在 PREWHERE 或 `optimize_move_to_prewhere` 使 PREWHERE from WHERE 出现时, 修复错误 `No such name in Block::erase()`. [#11051](https://github.com/ClickHouse/ClickHouse/pull/11051) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复 Kafka 引擎表终止期间可能丢失的数据. [#11048](https://github.com/ClickHouse/ClickHouse/pull/11048) ([filimonov](https://github.com/filimonov)). -* 修复了 parseDateTime64BestEffort 参数解析错误. [#10925](https://github.com/ClickHouse/ClickHouse/issues/10925). [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). -* 现在可以在单个 `ALTER` 查询中对同一列进行 `ADD/DROP` 和 `RENAME`. 同时 `MODIFY` 和 `RENAME` 的异常信息变得更加清晰. 部分修复 [#10669](https://github.com/ClickHouse/ClickHouse/issues/10669). [#11037](https://github.com/ClickHouse/ClickHouse/pull/11037) ([alesapin](https://github.com/alesapin)). -* 修复了 S3 URL 的解析. [#11036](https://github.com/ClickHouse/ClickHouse/pull/11036) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 修复存在 `LIMIT` 时两级 `GROUP BY` 的内存跟踪. [#11022](https://github.com/ClickHouse/ClickHouse/pull/11022) ([Azat Khuzhin](https://github.com/azat)). -* 如果表未成功创建,则修复 MergeTree 中非常罕见的潜在释放后使用错误. [#10986](https://github.com/ClickHouse/ClickHouse/pull/10986) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复原子数据库的元数据 (重命名的相对路径) 和数据 (符号链接的相对路径) 处理. [#10980](https://github.com/ClickHouse/ClickHouse/pull/10980) ([Azat Khuzhin](https://github.com/azat)). -* 使用 `Atomic` 数据库引擎修复并发 `ALTER` 和 `DROP DATABASE` 查询时的服务器崩溃. [#10968](https://github.com/ClickHouse/ClickHouse/pull/10968) ([tavplubix](https://github.com/tavplubix)). -* 修复方法 getRawData() 中不正确的原始数据大小. [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). -* 修复了 20.1 及更早版本之间两级聚合的不兼容性. 当在发起节点和远程节点上使用不同版本的 ClickHouse 并且 GROUP BY 结果的大小很大并且由单个 String 字段执行聚合时, 就会发生这种不兼容. 结果导致单个键的多个未合并的行. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 避免通过 DistributedBlockOutputStream 发送部分写入的文件. [#10940](https://github.com/ClickHouse/ClickHouse/pull/10940) ([Azat Khuzhin](https://github.com/azat)). -* 复 `SELECT count(notNullIn(NULL, []))` 中的崩溃. [#10920](https://github.com/ClickHouse/ClickHouse/pull/10920) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了在表引擎 = Kafka 的 DROP 期间 (或在服务器重新启动期间) 有时发生的挂起. [#10910](https://github.com/ClickHouse/ClickHouse/pull/10910) ([filimonov](https://github.com/filimonov)). -* 现在可以像 `a TO b, c TO a` 那样执行多个 `ALTER RENAME`. [#10895](https://github.com/ClickHouse/ClickHouse/pull/10895) ([alesapin](https://github.com/alesapin)). -* 修复当您从同一列的多个线程的聚合函数状态获得结果时可能发生的竞争. 唯一可能发生的方法 (我发现) 是当您使用 `finalizeAggregation` 函数同时使用 `Memory` 引擎从表中读取时, 该引擎为 `quanite*` 函数存储 `AggregateFunction` 状态. [#10890](https://github.com/ClickHouse/ClickHouse/pull/10890) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复与分布式表中元组的向后兼容性. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). -* 修复 StringHashTable 中的 SIGSEGV (如果这样的键不存在). [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). -* 修复了在使用 `Atomic` 引擎从数据库中删除 `LiveView` 表后, `WATCH` 挂起的问题. [#10859](https://github.com/ClickHouse/ClickHouse/pull/10859) ([tavplubix](https://github.com/tavplubix)). -* 修复了 `ReplicatedMergeTree` 中的错误, 该错误可能导致 `OPTIMIZE` 查询上的某些 `ALTER` 在它变为非活动状态后挂起等待某些副本. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). -* 现在,如果参与 `CONSTRAINT` 表达式的列被重命名, 则约束会更新. 修复 [#10844](https://github.com/ClickHouse/ClickHouse/issues/10844). [#10847](https://github.com/ClickHouse/ClickHouse/pull/10847) ([alesapin](https://github.com/alesapin)). -* 修复缓存字典中未初始化内存的潜在读取. [#10834](https://github.com/ClickHouse/ClickHouse/pull/10834) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 Block::sortColumns() 之后修复列顺序 (还添加了一个测试, 表明它会影响一些实际用例 - 缓冲区引擎). [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). -* 修复 ODBC 桥在不要求引用标识符时的问题. 这修复了 [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 DateLUT 中的 UBSan 和 MSan 报告. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在关键条件下使用 `src_type` 进行正确的类型转换. 修复 [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)). -* 摆脱旧的 libunwind 补丁. https://github.com/ClickHouse-Extras/libunwind/commit/500aa227911bd185a94bfc071d68f4d3b03cb3b1#r39048012 这允许在 `clang` 中禁用 `-fno-omit-frame-pointer` 至少 1% 的平均构建性能. [#10761](https://github.com/ClickHouse/ClickHouse/pull/10761) ([Amos Bird](https://github.com/amosbird)). -* 修复了在多个分片上使用浮点权重时的avgWeighted问题. [#10758](https://github.com/ClickHouse/ClickHouse/pull/10758) ([Baudouin Giard](https://github.com/bgiard)). -* 修复 `parallel_view_processing` 行为. 现在, 如果发生异常, 所有对 `MATERIALIZED VIEW` 的插入都应该无一例外地完成. 修复 [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 与 -State 结合时修复组合器 -OrNull 和 -OrDefault. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). -* 使用嵌套类型修复 `generateRandom` 中的崩溃. 修复 [#10583](https://github.com/ClickHouse/ClickHouse/issues/10583). [#10734](https://github.com/ClickHouse/ClickHouse/pull/10734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复合并后可能发生的 `SummingMergeTree` 中 `LowCardinality(FixedString)` 键列的数据损坏. 修复 [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复使用 `FINAL` 修饰符和 `ORDER BY` 优化包装成函数的主键的使用. [#10715](https://github.com/ClickHouse/ClickHouse/pull/10715) ([Anton Popov](https://github.com/CurtizJ)). -* 修复函数 `h3EdgeAngle` 中可能的缓冲区溢出. [#10711](https://github.com/ClickHouse/ClickHouse/pull/10711) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复消失的总数. 如果查询具有带有外部 where 条件的连接或子查询, 则总计可能已被过滤. 修复 [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674). [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 HTTP 插入的原子性. 这修复了 [#9666](https://github.com/ClickHouse/ClickHouse/issues/9666). [#10687](https://github.com/ClickHouse/ClickHouse/pull/10687) ([Andrew Onyshchuk](https://github.com/oandrew)). -* 在一个查询中使用相同的集合修复 `IN` 运算符的多次使用. [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了当 `readonly=2` 和 `cancel_http_readonly_queries_on_client_close=1` 时导致 http 请求卡在客户端关闭的错误. 修复 [#7939](https://github.com/ClickHouse/ClickHouse/issues/7939), [#7019](https://github.com/ClickHouse/ClickHouse/issues/7019), [#7736](https://github.com/ClickHouse/ClickHouse/issues/7736), [#7091](https://github.com/ClickHouse/ClickHouse/issues/7091). [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)). -* 修复 AggregateTransform 构造函数中参数的顺序. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)). -* 修复启用了 `distributed_aggregation_memory_efficient` 的远程查询缺乏并行执行的问题。 修复 [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655). [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 `LIMIT` 修复查询的可能不正确的行数. 修复[#10566](https://github.com/ClickHouse/ClickHouse/issues/10566), [#10709](https://github.com/ClickHouse/ClickHouse/issues/10709). [#10660](https://github.com/ClickHouse/ClickHouse/pull/10660) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复当表有很多部分时锁定并发更改的错误. [#10659](https://github.com/ClickHouse/ClickHouse/pull/10659) ([alesapin](https://github.com/alesapin)). -* 如果服务器在表启动之前关闭,则修复 StorageBuffer 中的 nullptr 取消引用. [#10641](https://github.com/ClickHouse/ClickHouse/pull/10641) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复分布式查询的谓词优化 (`enable_optimize_predicate_expression=1`) 对于带有 `HAVING` 部分的查询 (即需要在服务器启动器上进行过滤时), 通过保留表达式的顺序 (这足以修复), 并且还强制 聚合器在索引上使用列名. 修复: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). -* 使用 LowCardinality 修复 optimize_skip_unused_shards. [#10611](https://github.com/ClickHouse/ClickHouse/pull/10611) ([Azat Khuzhin](https://github.com/azat)). -* 修复服务器启动异常时 StorageBuffer 中的段错误. 修复 [#10550](https://github.com/ClickHouse/ClickHouse/issues/10550). [#10609](https://github.com/ClickHouse/ClickHouse/pull/10609) ([tavplubix](https://github.com/tavplubix)). -* 在 `SYSTEM DROP DNS CACHE` 查询中还会删除缓存, 用于检查是否允许用户从某些 IP 地址进行连接. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)). -* 修复了 `MATERIALIZED VIEW` 内部查询中不正确的标量结果, 以防该查询包含相关表. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了同步突变的处理条件变量. 在某些情况下, 该条件变量的信号可能会丢失. [#10588](https://github.com/ClickHouse/ClickHouse/pull/10588) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 修复了在 `loadStoredObject()` 完成之前调用 `createDictionary()` 可能导致的崩溃. [#10587](https://github.com/ClickHouse/ClickHouse/pull/10587) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复错误 `the BloomFilter false positive must be a double number between 0 and 1` [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). -* 修复 SELECT 列 ALIAS 的默认表达式类型与列类型不同. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). -* 实现了 DateTime64 和 String 值之间的比较 (就像 DateTime 一样). [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). -* 修复索引损坏,在某些情况下将合并部分合并到另一个合并部分后可能会发生. [#10531](https://github.com/ClickHouse/ClickHouse/pull/10531) ([Anton Popov](https://github.com/CurtizJ)). -* 默认禁用GROUP BY sharding_key优化 (`optimize_distributed_group_by_sharding_key` 已被引入并默认关闭, 由于sharding_key分析的技巧, 简单的例子是分片键中的 `if` ) 并修复 WITH ROLLUP/CUBE/TOTALS. [#10516](https://github.com/ClickHouse/ClickHouse/pull/10516) ([Azat Khuzhin](https://github.com/azat)). -* 修复: [#10263](https://github.com/ClickHouse/ClickHouse/issues/10263) (之后通过 INSERT 发送的 PR dist 在每个 INSERT 上被推迟) 修复: [#8756](https://github.com/ClickHouse/ClickHouse/issues/8756) (that PR breaks distributed sends with all of the following conditions met (unlikely setup for now I guess): `internal_replication == false`, multiple local shards (activates the hardlinking code) and `distributed_storage_policy` (makes `link(2)` fails on `EXDEV`)). [#10486](https://github.com/ClickHouse/ClickHouse/pull/10486) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `max_rows_to_sort` 限制的错误. [#10268](https://github.com/ClickHouse/ClickHouse/pull/10268) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 每次调用读取外部字典的任何函数时, 仅获取一次字典并检查访问权限. [#10928](https://github.com/ClickHouse/ClickHouse/pull/10928) ([Vitaly Baranov](https://github.com/vitlibar)). - -#### 改进 - -* 在 `ALTER MODIFY TTL` 查询之后, 对旧数据应用 `TTL` . 这个行为是通过设置 `materialize_ttl_after_modify` 来控制的, 默认是启用的. [#11042](https://github.com/ClickHouse/ClickHouse/pull/11042) ([Anton Popov](https://github.com/CurtizJ)). -* 在解析字符串文字、VALUES 和各种文本格式中的 C 样式反斜杠转义时 (这是对 ClickHouse 和 MySQL 特有的 SQL 标准的扩展), 如果发现未知的转义序列 (例如`\%` 或 `\ w`), 这将使 `LIKE` 和`match` 正则表达式的使用更加方便 (写` name LIKE 'used\_cars'` 而不是 `name LIKE 'used\\_cars'` 就足够了) 同时更兼容. 这修复了 [#10922](https://github.com/ClickHouse/ClickHouse/issues/10922). [#11208](https://github.com/ClickHouse/ClickHouse/pull/11208) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 读取 Decimal 值时, 在点后切掉多余的数字. 此行为与 MySQL 和 PostgreSQL 更兼容. 这修复了 [#10202](https://github.com/ClickHouse/ClickHouse/issues/10202). [#11831](https://github.com/ClickHouse/ClickHouse/pull/11831) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果 ZooKeeper 中的元数据已经被删除并且不存在, 则允许 DROP 复制表 (这也是使用 TestKeeper 进行测试并重新启动服务器时的情况). 即使与 ZooKeeper 通信出现错误, 也允许重命名复制表. 这修复了 [#10720](https://github.com/ClickHouse/ClickHouse/issues/10720). [#11652](https://github.com/ClickHouse/ClickHouse/pull/11652) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 稍微改进从字符串中读取十进制的诊断. 这将关闭 [#10202](https://github.com/ClickHouse/ClickHouse/issues/10202). [#11829](https://github.com/ClickHouse/ClickHouse/pull/11829) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复信号处理程序中的睡眠调用. 它的睡眠时间比预期的要少. [#11825](https://github.com/ClickHouse/ClickHouse/pull/11825) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* (仅限 Linux) 操作系统相关的性能指标 (针对 CPU 和 I/O) 即使没有 `CAP_NET_ADMIN` 功能也能正常工作. [#10544](https://github.com/ClickHouse/ClickHouse/pull/10544) ([Alexander Kazakov](https://github.com/Akazz)). -* 添加了 `hostname` 作为函数 `hostName` 的别名. 此功能由 Yandex.Metrica 的 Victor Tarnavskiy 提出. [#11821](https://github.com/ClickHouse/ClickHouse/pull/11821) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了对跨复制集群上分布式 `DDL` (更新/删除/删除分区) 的支持. [#11703](https://github.com/ClickHouse/ClickHouse/pull/11703) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 如果我们无法侦听侦听地址之一 (例如,在 Docker 中 IPv6 不可用), 则在启动时在服务器日志中发出警告而不是错误. 请注意,如果服务器未能侦听所有列出的地址, 它将像以前一样拒绝启动. 这修复了 [#4406](https://github.com/ClickHouse/ClickHouse/issues/4406). [#11687](https://github.com/ClickHouse/ClickHouse/pull/11687) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 docker 映像启动时创建默认用户和数据库. [#10637](https://github.com/ClickHouse/ClickHouse/pull/10637) ([Paramtamtam](https://github.com/tarampampam)). -* 当多行查询打印到服务器日志时, 这些行被连接起来. 使其在多行字符串文字、标识符和单行注释的情况下正常工作. 这修复了 [#3853](https://github.com/ClickHouse/ClickHouse/issues/3853). [#11686](https://github.com/ClickHouse/ClickHouse/pull/11686) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在允许在命令中使用多个名称: CREATE USER、CREATE ROLE、ALTER USER、SHOW CREATE USER、SHOW GRANTS 等. [#11670](https://github.com/ClickHouse/ClickHouse/pull/11670) ([Vitaly Baranov](https://github.com/vitlibar)). -* 在跨复制集群上添加对分布式 DDL (`UPDATE/DELETE/DROP PARTITION`) 的支持. [#11508](https://github.com/ClickHouse/ClickHouse/pull/11508) ([frank lee](https://github.com/etah000)). -* 如果用户已使用显式值指定密码, 则从命令行中的 `clickhouse-client` 和 `clickhouse-benchmark` 清除密码. 这可以防止 `ps` 和类似工具暴露密码. [#11665](https://github.com/ClickHouse/ClickHouse/pull/11665) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果 ELF 文件与正在运行的二进制文件不对应, 请不要使用调试信息. 需要避免在堆栈跟踪中打印错误的函数名称和源位置. 这修复了 [#7514](https://github.com/ClickHouse/ClickHouse/issues/7514). [#11657](https://github.com/ClickHouse/ClickHouse/pull/11657) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当在 parseDateTimeBestEffortOrNull/Zero 函数中没有完全解析值时, 返回 NULL/零. 这修复了 [#7876](https://github.com/ClickHouse/ClickHouse/issues/7876). [#11653](https://github.com/ClickHouse/ClickHouse/pull/11653) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 跳过请求的 URL 中的空参数. 当你写 `http://localhost:8123/?&a=b` 或 `http://localhost:8123/?a=b&&c=d` 时, 它们可能会出现. 这将关闭 [#10749](https://github.com/ClickHouse/ClickHouse/issues/10749). [#11651](https://github.com/ClickHouse/ClickHouse/pull/11651) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 允许使用 `groupArrayArray` 和 `groupUniqArrayArray` 作为 `SimpleAggregateFunction`. [#11650](https://github.com/ClickHouse/ClickHouse/pull/11650) ([Volodymyr Kuznetsov](https://github.com/ksvladimir)). -* 在分析其他类型的索引条件时, 允许通过隐式转换与常量字符串进行比较. 这可能会关闭 [#11630](https://github.com/ClickHouse/ClickHouse/issues/11630). [#11648](https://github.com/ClickHouse/ClickHouse/pull/11648) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* https://github.com/ClickHouse/ClickHouse/pull/7572#issuecomment-642815377 支持配置默认 HTTPHandlers. [#11628](https://github.com/ClickHouse/ClickHouse/pull/11628) ([Winter Zhang](https://github.com/zhang2014)). -* 制作更多输入格式以与 Kafka 引擎配合使用. 解决过早冲洗的问题. 修复 `kafka_num_consumers` 大于主题分区数时的性能问题. [#11599](https://github.com/ClickHouse/ClickHouse/pull/11599) ([filimonov](https://github.com/filimonov)). -* 改进 `multiple_joins_rewriter_version=2` 逻辑. 修复 lambda 别名的未知列错误. [#11587](https://github.com/ClickHouse/ClickHouse/pull/11587) ([Artem Zuikov](https://github.com/4ertus2)). -* 无法解析列声明列表时更好的异常消息. 这将关闭 [#10403](https://github.com/ClickHouse/ClickHouse/issues/10403). [#11537](https://github.com/ClickHouse/ClickHouse/pull/11537) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 改进 VIEW 的 `enable_optimize_predicate_expression=1` 逻辑. [#11513](https://github.com/ClickHouse/ClickHouse/pull/11513) ([Artem Zuikov](https://github.com/4ertus2)). -* 在实时视图表中添加对 PREWHERE 的支持. [#11495](https://github.com/ClickHouse/ClickHouse/pull/11495) ([vzakaznikov](https://github.com/vzakaznikov)). -* 自动更新 DNS 缓存, 用于检查是否允许用户从某个地址连接. [#11487](https://github.com/ClickHouse/ClickHouse/pull/11487) ([tavplubix](https://github.com/tavplubix)). -* 即使执行并发合并, OPTIMIZE FINAL 也会强制合并. 这将关闭 [#11309](https://github.com/ClickHouse/ClickHouse/issues/11309) 并关闭 [#11322](https://github.com/ClickHouse/ClickHouse/issues/11322). [#11346](https://github.com/ClickHouse/ClickHouse/pull/11346) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 抑制 clickhouse-client 中取消查询的输出. 在以前的版本中, 即使按 Ctrl+C 取消查询, 结果也可能会继续在终端中打印. 这将关闭 [#9473](https://github.com/ClickHouse/ClickHouse/issues/9473). [#11342](https://github.com/ClickHouse/ClickHouse/pull/11342) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在历史文件会在每次查询后更新, 如果多个客户端使用一个历史文件, 则不会出现竞争条件. 这修复了 [#9897](https://github.com/ClickHouse/ClickHouse/issues/9897). [#11453](https://github.com/ClickHouse/ClickHouse/pull/11453) ([Tagir Kuskarov](https://github.com/kuskarov)). -* 重新加载配置时更好地记录消息. [#11341](https://github.com/ClickHouse/ClickHouse/pull/11341) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在某些情况下,从 `clickhouse-client` 或 `clickhouse-format` 中的格式化查询中删除尾随空格. [#11325](https://github.com/ClickHouse/ClickHouse/pull/11325) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加设置 `output_format_pretty_max_value_width` . 如果 value 较长, 则将其剪切以避免在终端中输出过大的 value. 这将关闭. [#11324](https://github.com/ClickHouse/ClickHouse/pull/11324) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在内存映射不足的情况下更好的异常消息. 这将关闭 [#11027](https://github.com/ClickHouse/ClickHouse/issues/11027). [#11316](https://github.com/ClickHouse/ClickHouse/pull/11316) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 支持 (U)Int8、(U)Int16、ASOF JOIN 中的日期. [#11301](https://github.com/ClickHouse/ClickHouse/pull/11301) ([Artem Zuikov](https://github.com/4ertus2)). -* 支持 Kafka 表的 kafka_client_id 参数. 它还将 ClickHouse 在与 Kafka 通信时使用的默认 `client.id` 更改为更加详细和可用. [#11252](https://github.com/ClickHouse/ClickHouse/pull/11252) ([filimonov](https://github.com/filimonov)). -* 将 `DistributedFilesToInsert` 指标的值保留在异常上. 在以前的版本中, 该值是在我们要发送一些文件时设置的, 但如果出现异常并且一些文件仍处于待处理状态, 则该值为零. 现在它对应于文件系统中待处理文件的数量. [#11220](https://github.com/ClickHouse/ClickHouse/pull/11220) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加对多字数据类型名称的支持 (例如 `DOUBLE PRECISION` and `CHAR VARYING` ) 以获得更好的 SQL 兼容性. [#11214](https://github.com/ClickHouse/ClickHouse/pull/11214) ([Павел Потемкин](https://github.com/Potya)). -* 为某些数据类型提供同义词. [#10856](https://github.com/ClickHouse/ClickHouse/pull/10856) ([Павел Потемкин](https://github.com/Potya)). -* 现在默认启用查询日志. [#11184](https://github.com/ClickHouse/ClickHouse/pull/11184) ([Ivan Blinkov](https://github.com/blinkov)). -* 在表 system.users 和执行 SHOW CREATE USER 查询时显示身份验证类型. [#11080](https://github.com/ClickHouse/ClickHouse/pull/11080) ([Vitaly Baranov](https://github.com/vitlibar)). -* 删除 `Memory` 数据库引擎的显式 `DROP DATABASE` 上的数据. 修复 [#10557](https://github.com/ClickHouse/ClickHouse/issues/10557). [#11021](https://github.com/ClickHouse/ClickHouse/pull/11021) ([tavplubix](https://github.com/tavplubix)). -* 为 rdkafka 库的内部线程设置线程名称. 使来自 rdkafka 的日志在服务器日志中可用. [#10983](https://github.com/ClickHouse/ClickHouse/pull/10983) ([Azat Khuzhin](https://github.com/azat)). -* 支持查询中的 unicode 空格. 这有助于从 Word 或网页复制粘贴查询. 这修复了 [#10896](https://github.com/ClickHouse/ClickHouse/issues/10896). [#10903](https://github.com/ClickHouse/ClickHouse/pull/10903) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 允许大型 UInt 类型作为函数 `tupleElement` 中的索引. [#10874](https://github.com/ClickHouse/ClickHouse/pull/10874) ([hcz](https://github.com/hczhcz)). -* 尊重在 INSERT 到分布式上的prefer_localhost_replica/load_balancing. [#10867](https://github.com/ClickHouse/ClickHouse/pull/10867) ([Azat Khuzhin](https://github.com/azat)). -* 介绍 `min_insert_block_size_rows_for_materialized_views`、`min_insert_block_size_bytes_for_materialized_views` 设置. 此设置类似于 `min_insert_block_size_rows` 和 `min_insert_block_size_bytes`, 但仅适用于插入到 `MATERIALIZED VIEW` 中的块. 它有助于在推送到 MV 时控制块挤压并避免过多的内存使用. [#10858](https://github.com/ClickHouse/ClickHouse/pull/10858) ([Azat Khuzhin](https://github.com/azat)). -* 在服务器关闭期间摆脱复制队列中的异常. 修复 [#10819](https://github.com/ClickHouse/ClickHouse/issues/10819). [#10841](https://github.com/ClickHouse/ClickHouse/pull/10841) ([alesapin](https://github.com/alesapin)). -* 确保 `varSamp`、`varPop` 不能因数值错误返回负结果, 并且不能从负方差计算 `stddevSamp`、`stddevPop`. 这修复了 [#10532](https://github.com/ClickHouse/ClickHouse/issues/10532). [#10829](https://github.com/ClickHouse/ClickHouse/pull/10829) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 更好的 DNS 异常消息. 这修复了 [#10813](https://github.com/ClickHouse/ClickHouse/issues/10813). [#10828](https://github.com/ClickHouse/ClickHouse/pull/10828) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 将某些解析错误的 HTTP 响应代码更改为 400 Bad Request. 这个修复 [#10636](https://github.com/ClickHouse/ClickHouse/issues/10636). [#10640](https://github.com/ClickHouse/ClickHouse/pull/10640) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果 clickhouse-client 比 clickhouse-server 新, 则打印一条消息. [#10627](https://github.com/ClickHouse/ClickHouse/pull/10627) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加对 `INSERT INTO [db.]table WATCH` 查询的支持. [#10498](https://github.com/ClickHouse/ClickHouse/pull/10498) ([vzakaznikov](https://github.com/vzakaznikov)). -* 允许在 clickhouse-client 中传递 quota_key. 这将关闭 [#10227](https://github.com/ClickHouse/ClickHouse/issues/10227). [#10270](https://github.com/ClickHouse/ClickHouse/pull/10270) ([alexey-milovidov](https://github.com/alexey-milovidov)). - -#### 性能改进 - -* 允许多个副本同时分配合并、突变、分区删除、移动和替换. 这将关闭 [#10367](https://github.com/ClickHouse/ClickHouse/issues/10367). [#11639](https://github.com/ClickHouse/ClickHouse/pull/11639) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#11795](https://github.com/ClickHouse/ClickHouse/pull/11795) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 关于表排序键的 GROUP BY 优化, 通过 `optimize_aggregation_in_order` 设置启用. [#9113](https://github.com/ClickHouse/ClickHouse/pull/9113) ([dimarub2000](https://github.com/dimarub2000)). -* 带有 final 的选择是并行执行的. 添加设置 `max_final_threads` 以限制使用的线程数. [#10463](https://github.com/ClickHouse/ClickHouse/pull/10463) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当生成小块时, 通过 `INSERT SELECT` 或 INSERT with clickhouse-client 提高 INSERT 查询的性能 (并行解析的典型情况). 这修复了 [#11275](https://github.com/ClickHouse/ClickHouse/issues/11275). 修复 CONSTRAINT 不适用于 DEFAULT 字段的问题. 这修复了 [#11273](https://github.com/ClickHouse/ClickHouse/issues/11273). 修复 TEMPORARY 表忽略 CONSTRAINTS 的问题. 这修复了 [#11274](https://github.com/ClickHouse/ClickHouse/issues/11274). [#11276](https://github.com/ClickHouse/ClickHouse/pull/11276) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 消除 SELECT 部分中 GROUP BY 键的最小/最大/任何聚合器的优化, 通过 `optimize_aggregators_of_group_by_keys` 设置启用. [#11667](https://github.com/ClickHouse/ClickHouse/pull/11667) ([xPoSx](https://github.com/xPoSx)). [#11806](https://github.com/ClickHouse/ClickHouse/pull/11806) ([Azat Khuzhin](https://github.com/azat)). -* 使用 `optimize_move_functions_out_of_any` 启用的新优化, 可从 `any` 函数中删除所有操作 [#11529](https://github.com/ClickHouse/ClickHouse/pull/11529) ([Ruslan](https://github.com/kamalov-ruslan)). -* 当使用 Pretty 格式时, 提高交互模式下 `clickhouse-client` 的性能. 在以前的版本中, 计算 UTF-8 字符串的可见宽度可能会花费大量时间. 这将关闭 [#11323](https://github.com/ClickHouse/ClickHouse/issues/11323). [#11323](https://github.com/ClickHouse/ClickHouse/pull/11323) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使用 `ORDER BY` 和小的 `LIMIT` 提高查询的性能 (小于, 然后是 `max_block_size`). [#11171](https://github.com/ClickHouse/ClickHouse/pull/11171) ([Albert Kidrachev](https://github.com/Provet)). -* 添加运行时 CPU 检测以选择和调度最佳功能实现. 添加对多个目标的代码生成的支持. 这将关闭 [#1017](https://github.com/ClickHouse/ClickHouse/issues/1017). [#10058](https://github.com/ClickHouse/ClickHouse/pull/10058) ([DimasKovas](https://github.com/DimasKovas)). -* 默认启用 clickhouse 二进制文件的 `mlock`. 它将防止 clickhouse 可执行文件在高 IO 负载下被分页. [#11139](https://github.com/ClickHouse/ClickHouse/pull/11139) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使用 `sum` 聚合函数进行查询而不使用 GROUP BY 键以更快地运行多次. [#10992](https://github.com/ClickHouse/ClickHouse/pull/10992) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 通过删除一些冗余数据移动来改进基数排序 (在带有简单键的 `ORDER BY` 中使用). [#10981](https://github.com/ClickHouse/ClickHouse/pull/10981) ([Arslan Gumerov](https://github.com/g-arslan)). -* 在 MergeJoin 中对左表的较大部分进行排序. 缓冲内存中的剩余块. 添加 `partial_merge_join_left_table_buffer_bytes` 设置来管理左侧块缓冲区大小. [#10601](https://github.com/ClickHouse/ClickHouse/pull/10601) ([Artem Zuikov](https://github.com/4ertus2)). -* 从子查询中删除重复的 ORDER BY 和 DISTINCT, 此优化通过 `optimize_duplicate_order_by_and_distinct` 启用 [#10067](https://github.com/ClickHouse/ClickHouse/pull/10067) ([Mikhail Malafeev](https://github.com/demo-99)). -* 此功能消除了 GROUP BY 部分中其他键的功能, 通过 `optimize_group_by_function_keys` 启用 [#10051](https://github.com/ClickHouse/ClickHouse/pull/10051) ([xPoSx](https://github.com/xPoSx)). -* 使用 `optimize_arithmetic_operations_in_aggregate_functions` 启用从聚合函数中提取算术运算的新优化 [#10047](https://github.com/ClickHouse/ClickHouse/pull/10047) ([Ruslan](https://github.com/kamalov-ruslan)). -* 使用基于 Poco 而不是 curl 的 S3 的 HTTP 客户端. 这将提高性能并降低 s3 存储和表函数的内存使用量. [#11230](https://github.com/ClickHouse/ClickHouse/pull/11230) ([Pavel Kovalenko](https://github.com/Jokser)). -* 修复与基于限制重新安排相关的 Kafka 性能问题, 这些限制总是被应用. [#11149](https://github.com/ClickHouse/ClickHouse/pull/11149) ([filimonov](https://github.com/filimonov)). -* 为 jemalloc 启用 percpu_arena:percpu (这将减少由于线程池造成的内存碎片). [#11084](https://github.com/ClickHouse/ClickHouse/pull/11084) ([Azat Khuzhin](https://github.com/azat)). -* 从 S3 HTTP 客户端读取响应时优化内存使用. [#11561](https://github.com/ClickHouse/ClickHouse/pull/11561) ([Pavel Kovalenko](https://github.com/Jokser)). -* 调整默认的 Kafka 设置以获得更好的性能. [#11388](https://github.com/ClickHouse/ClickHouse/pull/11388) ([filimonov](https://github.com/filimonov)). - -#### 实验功能 - -* 添加数据类型 `Point` (Tuple(Float64, Float64)) 和 `Polygon` (Array(Array(Tuple(Float64, Float64))). [#10678](https://github.com/ClickHouse/ClickHouse/pull/10678) ([Alexey Ilyukhov](https://github.com/livace)). -* 添加一个 `hasSubstr` 函数, 允许在数组中查找子序列. 注: 此功能可能会更名, 恕不另行通知. [#11071](https://github.com/ClickHouse/ClickHouse/pull/11071) ([Ryad Zenine](https://github.com/r-zenine)). -* 添加了 OpenCL 支持和双音排序算法, 可用于对单列中的整数类型数据进行排序. 需要使用标志 `-DENABLE_OPENCL=1` 构建. 要使用双音排序算法而不是其他算法, 您需要为设置选项 `special_sort` 设置 `bitonic_sort`, 并确保 OpenCL 可用. 此功能不会提高性能或其他任何东西, 仅作为示例和演示目的提供. 如果在这个方向上没有进一步的发展, 它可能会在不久的将来被移除. [#10232](https://github.com/ClickHouse/ClickHouse/pull/10232) ([Ri](https://github.com/margaritiko)). - -#### 构建/测试/打包改进 - -* 为程序和实用程序启用 clang-tidy. [#10991](https://github.com/ClickHouse/ClickHouse/pull/10991) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 删除对 `tzdata` 的依赖: 如果 `/usr/share/zoneinfo` 目录不存在, 则不会失败. 请注意, 即使系统中没有安装 tzdata,所有时区都可以在 ClickHouse 中使用. [#11827](https://github.com/ClickHouse/ClickHouse/pull/11827) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了 MSan 和 UBSan 压力测试. 请注意, 我们已经有了用于功能测试的 MSan、UBSan, 而 "stress" 测试是另一种测试. [#10871](https://github.com/ClickHouse/ClickHouse/pull/10871) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在崩溃消息中打印编译器构建 ID. 这将使我们更加确定哪个二进制文件崩溃了. 添加了新函数 `buildId`. [#11824](https://github.com/ClickHouse/ClickHouse/pull/11824) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了一个测试以确保在 FREEZE 查询后突变继续工作. [#11820](https://github.com/ClickHouse/ClickHouse/pull/11820) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 不允许在名称中包含 "fail" 子字符串的测试, 因为当您键入 Ctrl+F 并搜索 "fail" 时, 这会使在浏览器中查看测试结果变得不那么方便. [#11817](https://github.com/ClickHouse/ClickHouse/pull/11817) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 从 HTTPHandlerFactory 中删除未使用的导入. [#11660](https://github.com/ClickHouse/ClickHouse/pull/11660) ([Bharat Nallan](https://github.com/bharatnc)). -* 添加了对执行复制程序的实例的随机抽样. 需要避免 `Too many simultaneous queries` 错误. 还增加了超时时间并降低了故障概率. [#11573](https://github.com/ClickHouse/ClickHouse/pull/11573) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复遗漏的 include. [#11525](https://github.com/ClickHouse/ClickHouse/pull/11525) ([Matwey V. Kornilov](https://github.com/matwey)). -* 通过删除旧的示例程序来加速构建。 还发现了一些孤儿功能测试. [#11486](https://github.com/ClickHouse/ClickHouse/pull/11486) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 增加 CI 中构建的 ccache 大小. [#11450](https://github.com/ClickHouse/ClickHouse/pull/11450) ([alesapin](https://github.com/alesapin)). -* 在 deb 构建中只保留 unit_tests_dbms. [#11429](https://github.com/ClickHouse/ClickHouse/pull/11429) ([Ilya Yatsishin](https://github.com/qoega)). -* 将 librdkafka 更新到版本 [1.4.2](https://github.com/edenhill/librdkafka/releases/tag/v1.4.2). [#11256](https://github.com/ClickHouse/ClickHouse/pull/11256) ([filimonov](https://github.com/filimonov)). -* 重构 CMake 构建文件. [#11390](https://github.com/ClickHouse/ClickHouse/pull/11390) ([Ivan](https://github.com/abyss7)). -* 修复几个不稳定的集成测试. [#11355](https://github.com/ClickHouse/ClickHouse/pull/11355) ([alesapin](https://github.com/alesapin)). -* 添加对使用 UBSan 运行的单元测试的支持. [#11345](https://github.com/ClickHouse/ClickHouse/pull/11345) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 从集成测试 `test_insertion_sync_fails_with_timeout` 中删除冗余超时. [#11343](https://github.com/ClickHouse/ClickHouse/pull/11343) ([alesapin](https://github.com/alesapin)). -* 更好地检查 clickhouse-test 中的挂起查询. [#11321](https://github.com/ClickHouse/ClickHouse/pull/11321) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果服务器是在调试中构建或使用消毒剂构建的, 则发出警告. [#11304](https://github.com/ClickHouse/ClickHouse/pull/11304) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在 clickhouse-test 在测试运行之前检查服务器的活动性. [#11285](https://github.com/ClickHouse/ClickHouse/pull/11285) ([alesapin](https://github.com/alesapin)). -* 修复可能不稳定的测试 `00731_long_merge_tree_select_opened_files.sh`. 它不会经常失败, 但我们在试验 ThreadFuzzer 时发现了这个测试中潜在的竞争条件: [#9814](https://github.com/ClickHouse/ClickHouse/issues/9814) 见 [link](https://clickhouse-test-reports.s3.yandex.net/9814/40e3023e215df22985d275bf85f4d2290897b76b/functional_stateless_tests_(unbundled).html#fail1) for the example. [#11270](https://github.com/ClickHouse/ClickHouse/pull/11270) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果 `curl` 调用超时, 则在 CI 中重复测试. 由于系统挂断超过 10 秒, 这在我们的 CI 基础设施中很常见. 这修复了 [#11267](https://github.com/ClickHouse/ClickHouse/issues/11267). [#11268](https://github.com/ClickHouse/ClickHouse/pull/11268) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 从@donmikel 添加对连接表引擎的测试. 这将关闭 [#9158](https://github.com/ClickHouse/ClickHouse/issues/9158). [#11265](https://github.com/ClickHouse/ClickHouse/pull/11265) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复单元测试中的几个非重大错误. [#11262](https://github.com/ClickHouse/ClickHouse/pull/11262) ([alesapin](https://github.com/alesapin)). -* 现在, `cctz` 库的部分链接器命令将不会与其他库混在一起. [#11213](https://github.com/ClickHouse/ClickHouse/pull/11213) ([alesapin](https://github.com/alesapin)). -* 将 /programs/server 拆分为实际的程序和库. [#11186](https://github.com/ClickHouse/ClickHouse/pull/11186) ([Ivan](https://github.com/abyss7)). -* 改进 protobuf 和 gRPC 的构建脚本. [#11172](https://github.com/ClickHouse/ClickHouse/pull/11172) ([Vitaly Baranov](https://github.com/vitlibar)). -* 启用不起作用的性能测试. [#11158](https://github.com/ClickHouse/ClickHouse/pull/11158) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在启动任何 CH 实例之前为测试创建根 S3 存储桶. [#11142](https://github.com/ClickHouse/ClickHouse/pull/11142) ([Pavel Kovalenko](https://github.com/Jokser)). -* 添加非恒定多边形的性能测试. [#11141](https://github.com/ClickHouse/ClickHouse/pull/11141) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `00979_live_view_watch_continuous_aggregates` 测试. [#11024](https://github.com/ClickHouse/ClickHouse/pull/11024) ([vzakaznikov](https://github.com/vzakaznikov)). -* 添加在 tmpfs 上的集成测试中运行 zookeeper 的功能. [#11002](https://github.com/ClickHouse/ClickHouse/pull/11002) ([alesapin](https://github.com/alesapin)). -* 等待具有指数退避的 odbc-bridge. 在我们的 CI 环境中, 之前 200 毫秒的等待时间是不够的. [#10990](https://github.com/ClickHouse/ClickHouse/pull/10990) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复非确定性测试. [#10989](https://github.com/ClickHouse/ClickHouse/pull/10989) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了对空外部数据的测试. [#10926](https://github.com/ClickHouse/ClickHouse/pull/10926) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 每次测试都会重新创建数据库. 这改进了测试的分离. [#10902](https://github.com/ClickHouse/ClickHouse/pull/10902) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在列代码中添加了更多断言. [#10833](https://github.com/ClickHouse/ClickHouse/pull/10833) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 与清除系统更好的合作. 在清除失败的消息中打印有关 query_id 的信息. [#10832](https://github.com/ClickHouse/ClickHouse/pull/10832) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 "Split build smoke test" 检查中修复明显的竞争条件. [#10820](https://github.com/ClickHouse/ClickHouse/pull/10820) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 MergeTreeIndexFullText 中修复 (false) MSan 报告. 该问题首次出现在 [#9968](https://github.com/ClickHouse/ClickHouse/issues/9968) 中. [#10801](https://github.com/ClickHouse/ClickHouse/pull/10801) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 为 MariaDB 客户端库添加 MSan 抑制. [#10800](https://github.com/ClickHouse/ClickHouse/pull/10800) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* GRPC make 找不到 protobuf 文件, 通过添加正确的链接来更改 make 文件. [#10794](https://github.com/ClickHouse/ClickHouse/pull/10794) ([mnkonkova](https://github.com/mnkonkova)). -* 为 base、utils、programs 启用额外警告 (`-Weverything`). 请注意, 我们已经为大部分代码提供了它. [#10779](https://github.com/ClickHouse/ClickHouse/pull/10779) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在 [#10396](https://github.com/ClickHouse/ClickHouse/issues/10396) 中, 对图书馆警告的抑制被错误地声明为公开. [#10776](https://github.com/ClickHouse/ClickHouse/pull/10776) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 恢复在 [#10396](https://github.com/ClickHouse/ClickHouse/issues/10396) 中意外删除的补丁. [#10774](https://github.com/ClickHouse/ClickHouse/pull/10774) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复性能测试错误, 第 2 部分. [#10773](https://github.com/ClickHouse/ClickHouse/pull/10773) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复性能测试错误. [#10766](https://github.com/ClickHouse/ClickHouse/pull/10766) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 更新交叉构建以使用 clang-10 编译器. [#10724](https://github.com/ClickHouse/ClickHouse/pull/10724) ([Ivan](https://github.com/abyss7)). -* 更新安装 RPM 包的说明. 这是由 Denis (TG login @ldviolet) 建议并由 Arkady Shejn 实施的. [#10707](https://github.com/ClickHouse/ClickHouse/pull/10707) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 试图修复 `tests/queries/0_stateless/01246_insert_into_watch_live_view.py` 测试. [#10670](https://github.com/ClickHouse/ClickHouse/pull/10670) ([vzakaznikov](https://github.com/vzakaznikov)). -* 修复和重新启用 00979_live_view_watch_continuous_aggregates.py 测试. [#10658](https://github.com/ClickHouse/ClickHouse/pull/10658) ([vzakaznikov](https://github.com/vzakaznikov)). -* 修复 ASan 压力测试中的 OOM. [#10646](https://github.com/ClickHouse/ClickHouse/pull/10646) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复迁移到 clang-10 后出现的 HashTable 中的 UBSan 报告 (向 nullptr 添加零). [#10638](https://github.com/ClickHouse/ClickHouse/pull/10638) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在编译时的 tzdata 处理期间删除对 `ld` (bfd) 链接器的外部调用. [#10634](https://github.com/ClickHouse/ClickHouse/pull/10634) ([alesapin](https://github.com/alesapin)). -* 允许使用 `lld` 来链接 blob (资源). [#10632](https://github.com/ClickHouse/ClickHouse/pull/10632) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `LZ4` 库中的UBSan报告. [#10631](https://github.com/ClickHouse/ClickHouse/pull/10631) ([alexey-milovidov](https://github.com/alexey-milovidov)). See also [https://github.com/lz4/lz4/issues/857](https://github.com/lz4/lz4/issues/857) -* 将 LZ4 更新到最新的 dev 分支. [#10630](https://github.com/ClickHouse/ClickHouse/pull/10630) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了自动生成的机器可读文件与稳定版本的列表. [#10628](https://github.com/ClickHouse/ClickHouse/pull/10628) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `capnp::UnalignedFlatArrayMessageReader` 的 `capnproto` 版本检查. [#10618](https://github.com/ClickHouse/ClickHouse/pull/10618) ([Matwey V. Kornilov](https://github.com/matwey)). -* 测试中的内存使用率较低. [#10617](https://github.com/ClickHouse/ClickHouse/pull/10617) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在新的实时视图测试中修复硬编码超时. [#10604](https://github.com/ClickHouse/ClickHouse/pull/10604) ([vzakaznikov](https://github.com/vzakaznikov)). -* 在 tests/queries/0_stateless/helpers/client.py 中打开客户端时增加超时. [#10599](https://github.com/ClickHouse/ClickHouse/pull/10599) ([vzakaznikov](https://github.com/vzakaznikov)). -* 为 clang 构建启用 ThinLTO, 继续 [#10435](https://github.com/ClickHouse/ClickHouse/pull/10435). [#10585](https://github.com/ClickHouse/ClickHouse/pull/10585) ([Amos Bird](https://github.com/amosbird)). -* 添加模糊器并准备 oss-fuzz 集成. [#10546](https://github.com/ClickHouse/ClickHouse/pull/10546) ([kyprizel](https://github.com/kyprizel)). -* 修复 FreeBSD 构建. [#10150](https://github.com/ClickHouse/ClickHouse/pull/10150) ([Ivan](https://github.com/abyss7)). -* 使用 pytest 框架为查询测试添加新版本. [#10039](https://github.com/ClickHouse/ClickHouse/pull/10039) ([Ivan](https://github.com/abyss7)). - - -## ClickHouse 版本 v20.4 - -### ClickHouse 版本 v20.4.8.99-stable 2020-08-10 - -#### Bug 修复 - -* 修复了当 unix 时间戳作为参数传递时 `parseDateTimeBestEffort` 函数中的错误. 这修复了 [#13362](https://github.com/ClickHouse/ClickHouse/issues/13362). [#13441](https://github.com/ClickHouse/ClickHouse/pull/13441) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在具有 NaN 值的 Float 类型上调用的 `uniqExact`、`topK`、`sumDistinct` 和类似聚合函数的潜在低性能和稍微不正确的结果. 它还在调试版本中触发断言. 这修复了 [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果将可空 constexpr 作为不是文字 NULL 的 cond 的固定函数. 修复 [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在数组元素为 Nullable 且数组下标也可为 Null 的情况下, 修复了 `arrayElement` 函数中的断言. 这修复了 [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 用函数修正了错误的索引分析. 在从 `MergeTree` 表中读取时, 它可能会导致修剪错误的部分. 修复 [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了对从本地副本进行选择的线程数的不必要限制. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了查询 `WITH TOTALS` 时可能出现的数据中可能出现的额外溢出行. [#12747](https://github.com/ClickHouse/ClickHouse/pull/12747) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了大元组的性能, 这些元组在 `IN` 部分被解释为函数. 当用户出于某种晦涩的原因编写 `WHERE x IN tuple(1, 2, ...)` 而不是 `WHERE x IN (1, 2, ...)` 时的情况. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了`input_format_parallel_parsing` 的内存跟踪(通过将线程附加到组). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 [#12293](https://github.com/ClickHouse/ClickHouse/issues/12293) 当子查询包含 with 子句时允许推送谓词. [#12663](https://github.com/ClickHouse/ClickHouse/pull/12663) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了 [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572) 使用 const 表达式修复布隆过滤器索引. [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了当 Broker 不可用时 (不仅如此) 在 `StorageKafka` 中的 `SIGSEGV`. [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). -* 添加了对带有 `Array(UUID)` 参数的函数 `if` 的支持. 这修复了 [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了带有缓存布局的外部字典中的竞争条件, 这可能导致服务器崩溃. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). -* 删除了 DROP TABLE 上分布式表 (来自异步插入的块) 的数据. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). -* 修复了当 `enable_mixed_granularity_parts=1` 时, 在 `ALTER DELETE` 查询后导致旧部件损坏的错误。 修复 [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). -* 参数数目无效的函数 `in` 的更好例外. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了性能问题, 同时读取紧凑部件. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了当我们通过字典键的表达式加入时, JOIN 与字典中的崩溃: `t JOIN dict ON expr(dict.id) = t.id`. 在这种情况下禁用字典连接优化. [#12458](https://github.com/ClickHouse/ClickHouse/pull/12458) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了 StorageMerge 时可能出现的段错误. 关闭 [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). -* 修复了 `WITH FILL` 修饰符中列的顺序. 以前不遵守 `ORDER BY` 语句的列顺序. [#12306](https://github.com/ClickHouse/ClickHouse/pull/12306) ([Anton Popov](https://github.com/CurtizJ)). -* 当存在按虚拟列 (如 `Merge` 表中的`_table`) 或系统表中的 "index" 列过滤数据 (例如从 `system.tables` 查询时按数据库名称过滤) 时, 避免 "bad cast" 异常, 并且这个表达式返回 `Nullable` 类型. 这修复了 [#12166](https://github.com/ClickHouse/ClickHouse/issues/12166). [#12305](https://github.com/ClickHouse/ClickHouse/pull/12305) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* TrieDictionary 加载失败后显示错误. [#12290](https://github.com/ClickHouse/ClickHouse/pull/12290) ([Vitaly Baranov](https://github.com/vitlibar)). -* 对于可能导致崩溃的空数组, 函数 `arrayFill` 工作不正确. 这修复了 [#12263](https://github.com/ClickHouse/ClickHouse/issues/12263). [#12279](https://github.com/ClickHouse/ClickHouse/pull/12279) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 实现了到 `LowCardinality` 类型的通用类型的转换. 这允许对具有 LowCardinality 列和其他列的表执行 UNION ALL. 这修复了[#8212](https://github.com/ClickHouse/ClickHouse/issues/8212). 这修复了 [#4342](https://github.com/ClickHouse/ClickHouse/issues/4342). [#12275](https://github.com/ClickHouse/ClickHouse/pull/12275) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在某些特殊类型的 `StorageFile` 标头中多次连续插入期间多次写入时的行为. 这个修复了 [#6155](https://github.com/ClickHouse/ClickHouse/issues/6155). [#12197](https://github.com/ClickHouse/ClickHouse/pull/12197) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复了 UInt8 值不等于 0 或 1 时的逻辑函数. [#12196](https://github.com/ClickHouse/ClickHouse/pull/12196) ([Alexander Kazakov](https://github.com/Akazz)). -* 上限 max_memory_usage* 对进程驻留内存的限制. [#12182](https://github.com/ClickHouse/ClickHouse/pull/12182) ([Azat Khuzhin](https://github.com/azat)). -* 在 GROUP BY 内射函数消除期间修复了 `dictGet` 参数检查. [#12179](https://github.com/ClickHouse/ClickHouse/pull/12179) ([Azat Khuzhin](https://github.com/azat)). -* 如果 ODBC 连接不支持架构,则不要将字典源的表名拆分为架构和表名本身. [#12165](https://github.com/ClickHouse/ClickHouse/pull/12165) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复了 `ALTER DELETE` 中的错误逻辑, 当条件评估为 NULL 时会导致删除记录. 这修复了 [#9088](https://github.com/ClickHouse/ClickHouse/issues/9088). This closes [#12106](https://github.com/ClickHouse/ClickHouse/issues/12106). [#12153](https://github.com/ClickHouse/ClickHouse/pull/12153) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在存在别名的情况下发送到外部 DBMS (例如 MySQL、ODBC) 的查询转换. 这修复了[#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了整数除法中的潜在溢出. 这修复了 [#12119](https://github.com/ClickHouse/ClickHouse/issues/12119). [#12140](https://github.com/ClickHouse/ClickHouse/pull/12140) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `greatCircleDistance`、`geoDistance` 中潜在的无限循环. 这修复了 [#12117](https://github.com/ClickHouse/ClickHouse/issues/12117). [#12137](https://github.com/ClickHouse/ClickHouse/pull/12137) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 规范化 `pid` 文件处理. 在以前的版本中, 如果服务器在没有正确关闭的情况下被杀死, 并且有另一个进程与以前运行的服务器具有相同的 pid, 则服务器可能会拒绝启动. 即使有另一台服务器正在运行, pid 文件也可能在服务器启动失败时被删除. 这修复了 [#3501](https://github.com/ClickHouse/ClickHouse/issues/3501). [#12133](https://github.com/ClickHouse/ClickHouse/pull/12133) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了对字典的 ENGINE=Dictionary 表的处理依赖性. 这修复了[#10994](https://github.com/ClickHouse/ClickHouse/issues/10994). This fixes [#10397](https://github.com/ClickHouse/ClickHouse/issues/10397). [#12116](https://github.com/ClickHouse/ClickHouse/pull/12116) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复了由于线程总数限制错误导致的带有 `UNION` 的选择的性能. 修复 [#12030](https://github.com/ClickHouse/ClickHouse/issues/12030). [#12103](https://github.com/ClickHouse/ClickHouse/pull/12103) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 `-StateResample` 组合器修复了段错误. [#12092](https://github.com/ClickHouse/ClickHouse/pull/12092) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 `system.quey_log` 中选择的空 `result_rows` 和 `result_bytes` 指标. 修复 [#11595](https://github.com/ClickHouse/ClickHouse/issues/11595). [#12089](https://github.com/ClickHouse/ClickHouse/pull/12089) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了从 `VIEW` 中选择的不必要的线程数限制. 修复 [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了使用错误类型 `PREWHERE` 时可能发生的崩溃. 修复 [#12053](https://github.com/ClickHouse/ClickHouse/issues/12053), [#12060](https://github.com/ClickHouse/ClickHouse/issues/12060). [#12060](https://github.com/ClickHouse/ClickHouse/pull/12060) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了具有 `LowCardinality` 类型的函数 `defaultValueOfArgumentType` 的 `Expected single dictionary argument for function` 错误. 修复 [#11808](https://github.com/ClickHouse/ClickHouse/issues/11808). [#12056](https://github.com/ClickHouse/ClickHouse/pull/12056) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了带有 `Tuple(LowCardinality)` 参数的高阶函数的错误 `Cannot capture column`. 修复 [#9766](https://github.com/ClickHouse/ClickHouse/issues/9766). [#12055](https://github.com/ClickHouse/ClickHouse/pull/12055) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 加载数据库时并行解析表元数据. 这修复了有大量表时服务器启动缓慢的问题. [#12045](https://github.com/ClickHouse/ClickHouse/pull/12045) ([tavplubix](https://github.com/tavplubix)). -* 使 `topK` 聚合函数为 Enum 类型返回 Enum. 这修复了 [#3740](https://github.com/ClickHouse/ClickHouse/issues/3740). [#12043](https://github.com/ClickHouse/ClickHouse/pull/12043) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了是否为常量表达式的约束检查. 这修复了 [#11360](https://github.com/ClickHouse/ClickHouse/issues/11360). [#12042](https://github.com/ClickHouse/ClickHouse/pull/12042) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了元组与 `Nullable` 列的不正确比较. 修复 [#11985](https://github.com/ClickHouse/ClickHouse/issues/11985). [#12039](https://github.com/ClickHouse/ClickHouse/pull/12039) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 allow_introspection_functions=0 时访问权限的计算. [#12031](https://github.com/ClickHouse/ClickHouse/pull/12031) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复了在调用具有不同大小的 `FixedString` 类型参数的函数 `if` 时出现错误结果和潜在崩溃的问题. 这修复了 [#11362](https://github.com/ClickHouse/ClickHouse/issues/11362). [#12021](https://github.com/ClickHouse/ClickHouse/pull/12021) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果使用偏移量 `-9223372036854775808` 调用函数, 则以函数 `neighbor` 作为唯一返回表达式的查询可能会返回空结果. 这修复了 [#11367](https://github.com/ClickHouse/ClickHouse/issues/11367). [#12019](https://github.com/ClickHouse/ClickHouse/pull/12019) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 allow_ddl=0 时访问权限的计算. [#12015](https://github.com/ClickHouse/ClickHouse/pull/12015) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复了 generateRandom 中可能导致崩溃的潜在数组大小溢出. 这修复了 [#11371](https://github.com/ClickHouse/ClickHouse/issues/11371). [#12013](https://github.com/ClickHouse/ClickHouse/pull/12013) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了潜在的浮点异常. 这将关闭 [#11378](https://github.com/ClickHouse/ClickHouse/issues/11378). [#12005](https://github.com/ClickHouse/ClickHouse/pull/12005) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了服务器启动时日志消息中错误的设置名称. [#11997](https://github.com/ClickHouse/ClickHouse/pull/11997) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `Values` 格式中的 `Query parameter was not set` 问题. 修复 [#11918](https://github.com/ClickHouse/ClickHouse/issues/11918). [#11936](https://github.com/ClickHouse/ClickHouse/pull/11936) ([tavplubix](https://github.com/tavplubix)). -* 在查询 (参数化查询) 中保留替换的别名. 这修复了 [#11914](https://github.com/ClickHouse/ClickHouse/issues/11914). [#11916](https://github.com/ClickHouse/ClickHouse/pull/11916) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了从默认存储策略更改存储策略时没有移动的错误. [#11893](https://github.com/ClickHouse/ClickHouse/pull/11893) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 修复了解析 `DateTime64` 时潜在的浮点异常. 这修复了 [#11374](https://github.com/ClickHouse/ClickHouse/issues/11374). [#11875](https://github.com/ClickHouse/ClickHouse/pull/11875) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 通过 HTTP 接口固定内存记帐 (使用 `wait_end_of_query=1` 可能很重要). [#11840](https://github.com/ClickHouse/ClickHouse/pull/11840) ([Azat Khuzhin](https://github.com/azat)). -* 在检查相等性之前解析存储在 zookeeper 中的元数据. [#11739](https://github.com/ClickHouse/ClickHouse/pull/11739) ([Azat Khuzhin](https://github.com/azat)). - -#### 性能改进 - -* 索引不用于带文字的 IN 运算符, 在 v19.3 前后引入了性能回归. 这修复了 [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). - -#### 构建/测试/打包改进 - -* 在 Dockerfile 中的第一个 `apt-get update` 之前安装 `ca-certificates`. [#12095](https://github.com/ClickHouse/ClickHouse/pull/12095) ([Ivan Blinkov](https://github.com/blinkov)). - - -### ClickHouse 版本 v20.4.6.53-stable 2020-06-25 - -#### Bug 修复 - -* 修复在 prewhere 条件下使用 `Nullable` 列导致的罕见崩溃. 续 [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608). [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 不允许在高阶函数中使用 arrayJoin. 它导致协议同步中断. 这将关闭 [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 FixedString 与常量 String 比较的错误结果. 这修复了. [#11828](https://github.com/ClickHouse/ClickHouse/pull/11828) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复条件为 NULL 的 `if()` 的错误结果. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复使用过多线程进行查询. [#11788](https://github.com/ClickHouse/ClickHouse/pull/11788) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复像 `SELECT *, xyz.*` 这样的查询的意外行为, 这些查询在预期错误时成功. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). -* 现在复制的提取将在元数据更改期间取消. [#11744](https://github.com/ClickHouse/ClickHouse/pull/11744) ([alesapin](https://github.com/alesapin)). -* 修复了由 Values 输入格式中复杂文字的错误类型推导导致的 LOGICAL_ERROR. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). -* 修复 在 const 列上的 `ORDER BY ... WITH FILL` . [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). -* 与 XDBC 桥通信时传递适当的超时. 最近在检查桥接活性和接收元信息时没有遵守超时. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 将 `LIMIT n WITH TIES` 与包含别名的 `ORDER BY` 语句一起使用. [#11689](https://github.com/ClickHouse/ClickHouse/pull/11689) ([Anton Popov](https://github.com/CurtizJ)). -* 修复导致 `system.mutations` 状态不正确的错误. 它可能表明整个突变已经完成, 但服务器在复制队列中仍有 `MUTATE_PART` 任务并尝试执行它们. 这修复了 [#11611](https://github.com/ClickHouse/ClickHouse/issues/11611). [#11681](https://github.com/ClickHouse/ClickHouse/pull/11681) ([alesapin](https://github.com/alesapin)). -* 添加对带有不区分大小写标志的正则表达式的支持. 这修复了 [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果设置了行级安全性, 则删除琐碎的计数查询优化. 在以前的版本中, 用户获取表中记录的总数而不是过滤. 这修复了[#11352](https://github.com/ClickHouse/ClickHouse/issues/11352). [#11644](https://github.com/ClickHouse/ClickHouse/pull/11644) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复字符串的布隆过滤器 (数据跳过索引). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). -* 修复在 prewhere 条件下使用 `Nullable` 列导致的罕见崩溃. (可能它以某种方式与 [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572) 相关联). [#11608](https://github.com/ClickHouse/ClickHouse/pull/11608) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复错误 `Block structure mismatch` , 用于从 `Buffer` 表中采样读取的查询. [#11602](https://github.com/ClickHouse/ClickHouse/pull/11602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 clickhouse-client 的错误退出代码, 当 exception.code() % 256 = 0 时. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). -* 修复服务器启动时有关 `Mark cache size was lowered` 的日志消息中的小错误. 这将关闭 [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复错误 `Size of offsets does not match size of column` , 用于查询中的 `PREWHERE column in (subquery)` 和 `ARRAY JOIN` . [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 `SHOW CREATE TABLE` 中罕见的段错误. 修复 [#11490](https://github.com/ClickHouse/ClickHouse/issues/11490). [#11579](https://github.com/ClickHouse/ClickHouse/pull/11579) ([tavplubix](https://github.com/tavplubix)). -* HTTP 会话中的所有查询都具有相同的 query_id. 它是固定的. [#11578](https://github.com/ClickHouse/ClickHouse/pull/11578) ([tavplubix](https://github.com/tavplubix)). -* 现在 clickhouse-server docker 容器将更喜欢 IPv6 检查服务器活动性. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). -* 修复 `` 的 shard_num/replica_num (破坏 use_compact_format_in_distributed_parts_names). [#11528](https://github.com/ClickHouse/ClickHouse/pull/11528) ([Azat Khuzhin](https://github.com/azat)). -* 修复可能导致表删除期间异常的竞争条件. 这有点棘手, 一点也不危险. 如果你想要解释, 请在电报中通知我. [#11523](https://github.com/ClickHouse/ClickHouse/pull/11523) ([alesapin](https://github.com/alesapin)). -* 使用 -State 函数在聚合过程中抛出异常时修复内存泄漏. 这修复了 [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果数据跳过索引依赖于将在后台合并期间修改的列 (对于 SummingMergeTree、AggregatingMergeTree 以及 TTL GROUP BY) , 则计算错误. 此问题已通过合并后移动索引计算得到修复, 因此索引是在合并数据上计算的. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). -* 摆脱旧的 libunwind 补丁. https://github.com/ClickHouse-Extras/libunwind/commit/500aa227911bd185a94bfc071d68f4d3b03cb3b1#r39048012 这允许在 `clang` 中禁用 `-fno-omit-frame-pointer` 至少 1% 的平均构建性能. [#10761](https://github.com/ClickHouse/ClickHouse/pull/10761) ([Amos Bird](https://github.com/amosbird)). -* 使用 `FINAL` 修饰符和 `ORDER BY` 优化来修复包装到函数中的主键的使用. [#10715](https://github.com/ClickHouse/ClickHouse/pull/10715) ([Anton Popov](https://github.com/CurtizJ)). - -#### 构建/测试/打包改进 - -* 修复单元测试中的几个非重大错误. [#11262](https://github.com/ClickHouse/ClickHouse/pull/11262) ([alesapin](https://github.com/alesapin)). -* 在 MergeTreeIndexFullText 中修复 (false) MSan 报告. 该问题首先出现在 [#9968](https://github.com/ClickHouse/ClickHouse/issues/9968). [#10801](https://github.com/ClickHouse/ClickHouse/pull/10801) ([alexey-milovidov](https://github.com/alexey-milovidov)). - - -### ClickHouse 版本 v20.4.5.36-stable 2020-06-10 - -#### Bug 修复 - -* 修复了在启用 `min_bytes_to_use_direct_io` 且 PREWHERE 处于活动状态并使用 SAMPLE 或大量线程时可能发生的 `Data compressed with different methods` 错误. 这修复了 [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复编解码器的返回压缩大小. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当列具有带有非文字参数的压缩编解码器时修复服务器崩溃. 修复 [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). -* 以 nan 为点修复 pointInPolygon. 修复 [#11375](https://github.com/ClickHouse/ClickHouse/issues/11375). [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). -* 如果表未成功创建, 则修复 MergeTree 关闭时潜在的未初始化内存读取. [#11420](https://github.com/ClickHouse/ClickHouse/pull/11420) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了带有纬度/经度范围之外的参数的 geohashesInBox. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). -* 修复具有外部排序和限制的查询可能出现的 `Pipeline stuck` 错误. 修复 [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 在 ReplicatedMergeTree 中发送零件期间删除冗余锁. [#11354](https://github.com/ClickHouse/ClickHouse/pull/11354) ([alesapin](https://github.com/alesapin)). -* 修复了多行模式下 clickhouse-client 对 `\G`(垂直输出)的支持. 这将关闭 [#9933](https://github.com/ClickHouse/ClickHouse/issues/9933). [#11350](https://github.com/ClickHouse/ClickHouse/pull/11350) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复使用 `Lazy` 数据库时潜在的段错误. [#11348](https://github.com/ClickHouse/ClickHouse/pull/11348) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `quantilesExactWeightedArray` 中的崩溃问题. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 现在合并在 `ALTER` 查询中更改元数据之前停止. [#11335](https://github.com/ClickHouse/ClickHouse/pull/11335) ([alesapin](https://github.com/alesapin)). -* 通过再次设置 `parallel_view_processing = 1` 并行写入 `MATERIALIZED VIEW` . 修复 [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当提取的 JSON 具有不平衡的 { 或 [ 字符串时, 修复visitParamExtractRaw. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). -* 修复 ThreadPool 中非常罕见的竞争条件. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 clickhouse-copier 中无关紧要的数据竞争. 通过集成测试发现. [#11313](https://github.com/ClickHouse/ClickHouse/pull/11313) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复转换中潜在的未初始化内存. 示例: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了如果表的主键中有 Array 列并且查询正在使用 `empty` 或 `notEmpty` 函数按此列过滤时索引分析无法工作的问题. 这修复了 [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复当查询速度估计可能不正确时的错误, 并且如果查询受到 `max_network_bandwidth`、`max_execution_speed` 或 `priority` 设置的限制, `min_execution_speed` 的限制可能无法工作或无法正常工作. 将 `timeout_before_checking_execution_speed` 的默认值更改为非零值, 否则设置 `min_execution_speed` 和 `max_execution_speed` 无效. 这修复了 [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). 这修复了 [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732)。 这修复了 [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). 可用性改进:避免在“clickhouse-client”中将异常消息与进度条串联. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复使用错误参数调用 SET DEFAULT ROLE 时的崩溃. 这修复了[#10586](https://github.com/ClickHouse/ClickHouse/issues/10586). [#11278](https://github.com/ClickHouse/ClickHouse/pull/11278) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复读取 Protobuf 格式错误数据时崩溃的问题. 这修复了 [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复了缓存字典可以返回默认值而不是正常值 (只有过期键时) 的错误. 这仅影响字符串字段. [#11233](https://github.com/ClickHouse/ClickHouse/pull/11233) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复错误 `Block structure mismatch in QueryPipeline`, 同时从内部查询中的常量读取 `VIEW` . 修复 [#11181](https://github.com/ClickHouse/ClickHouse/issues/11181). [#11205](https://github.com/ClickHouse/ClickHouse/pull/11205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复可能的异常 `Invalid status for associated output`. [#11200](https://github.com/ClickHouse/ClickHouse/pull/11200) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 `Array(Array(LowCardinality))` 捕获参数修复高阶函数的可能错误 `Cannot capture column` . [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 S3 globbing 在超过 1000 个密钥和一些后端的情况下可能会失败的问题. [#11179](https://github.com/ClickHouse/ClickHouse/pull/11179) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 如果数据跳过索引依赖于将在后台合并期间修改的列 (对于 SummingMergeTree、AggregatingMergeTree 以及 TTL GROUP BY), 则计算错误. 此问题已通过合并后移动索引计算得到修复, 因此索引是在合并数据上计算的. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). -* 修复与基于限制重新安排相关的 Kafka 性能问题, 这些限制总是被应用. [#11149](https://github.com/ClickHouse/ClickHouse/pull/11149) ([filimonov](https://github.com/filimonov)). -* 修复了在表引擎 = Kafka 的 DROP 期间 (或在服务器重新启动期间) 有时发生的挂起. [#11145](https://github.com/ClickHouse/ClickHouse/pull/11145) ([filimonov](https://github.com/filimonov)). -* 修复简单查询过多的线程预留 (优化减少线程数量, 在管道更改后部分中断). [#11114](https://github.com/ClickHouse/ClickHouse/pull/11114) ([Azat Khuzhin](https://github.com/azat)). -* 修复分布式查询的谓词优化 (`enable_optimize_predicate_expression=1`) 对于带有 `HAVING` 部分的查询 (即需要在服务器启动器上进行过滤时), 通过保留表达式的顺序 (这足以修复), 并且还强制 聚合器在索引上使用列名. 修复: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). - -#### 构建/测试/打包改进 - -* 修复几个不稳定的集成测试. [#11355](https://github.com/ClickHouse/ClickHouse/pull/11355) ([alesapin](https://github.com/alesapin)). - -### ClickHouse 版本 v20.4.4.18-stable 2020-05-26 - -与 v20.4.3.16 稳定版相比没有变化. - -### ClickHouse 版本 v20.4.3.16-stable 2020-05-23 - -#### Bug 修复 - -* 如果没有最终确定, 则从突变终止任务中删除日志记录. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). -* 修复了 registerDiskS3 中的内存泄漏. [#11074](https://github.com/ClickHouse/ClickHouse/pull/11074) ([Pavel Kovalenko](https://github.com/Jokser)). -* 修复 Kafka 引擎表终止时可能丢失的数据. [#11048](https://github.com/ClickHouse/ClickHouse/pull/11048) ([filimonov](https://github.com/filimonov)). -* 复了 `parseDateTime64BestEffort` 参数解析错误. [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). -* 如果表未成功创建, 则修复了 `MergeTree` 中非常罕见的潜在释放后使用错误. [#10986](https://github.com/ClickHouse/ClickHouse/pull/10986), [#10970](https://github.com/ClickHouse/ClickHouse/pull/10970) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了原子数据库的元数据 (重命名的相对路径) 和数据 (符号链接的相对路径) 处理. [#10980](https://github.com/ClickHouse/ClickHouse/pull/10980) ([Azat Khuzhin](https://github.com/azat)). -* 修复了使用 `Atomic` 数据库引擎并发 `ALTER` 和 `DROP DATABASE` 查询时服务器崩溃的问题. [#10968](https://github.com/ClickHouse/ClickHouse/pull/10968) ([tavplubix](https://github.com/tavplubix)). -* 修复了 `getRawData()` 方法中不正确的原始数据大小. [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). -* 修复了 20.1 及更早版本之间两级聚合的不兼容问题. 当在发起节点和远程节点上使用不同版本的 ClickHouse 并且 GROUP BY 结果的大小很大并且由单个 String 字段执行聚合时, 就会发生这种不兼容. 结果导致单个键的多个未合并的行. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了通过 `DistributedBlockOutputStream` 发送部分写入的文件. [#10940](https://github.com/ClickHouse/ClickHouse/pull/10940) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `SELECT count(notNullIn(NULL, []))` 中的崩溃. [#10920](https://github.com/ClickHouse/ClickHouse/pull/10920) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了在 `Kafka` 表引擎的 `DROP` 期间有时发生的挂起. (或在服务器重新启动期间). [#10910](https://github.com/ClickHouse/ClickHouse/pull/10910) ([filimonov](https://github.com/filimonov)). -* 修复了无法像 `a TO b, c TO a` 那样执行多个 `ALTER RENAME` 的问题. [#10895](https://github.com/ClickHouse/ClickHouse/pull/10895) ([alesapin](https://github.com/alesapin)). -* 修复了当您从同一列的多个线程的聚合函数状态获得结果时可能发生的竞争. 它可能发生的唯一方法是当您使用 `finalizeAggregation` 函数同时使用 `Memory` 引擎从表中读取时, 该引擎为 `quantile*` 函数存储 `AggregateFunction` 状态. [#10890](https://github.com/ClickHouse/ClickHouse/pull/10890) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了与分布式表中元组的向后兼容性. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). -* 如果这样的键不存在, 则修复了 `StringHashTable` 中的 `SIGSEGV`. [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). -* 修复了在使用 `Atomic` 引擎从数据库中删除 `LiveView` 表后, `WATCH` 挂起的问题. [#10859](https://github.com/ClickHouse/ClickHouse/pull/10859) ([tavplubix](https://github.com/tavplubix)). -* 修复了 `ReplicatedMergeTree` 中的错误, 该错误可能导致 `OPTIMIZE` 查询上的某些 `ALTER` 在它变为非活动状态后挂起等待某些副本. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). -* 现在, 如果参与 `CONSTRAINT` 表达式的列被重命名, 则约束会更新. 修复 [#10844](https://github.com/ClickHouse/ClickHouse/issues/10844). [#10847](https://github.com/ClickHouse/ClickHouse/pull/10847) ([alesapin](https://github.com/alesapin)). -* 修复了缓存字典中未初始化内存的潜在读取. [#10834](https://github.com/ClickHouse/ClickHouse/pull/10834) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `Block::sortColumns()` 之后的列顺序. [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). -* 修复了当不要求引用标识符时 `ODBC` 桥的问题. 修复 [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `DateLUT` 中的 `UBSan` 和 `MSan` 报告. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了关键条件下错误的类型转换. 修复 [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)). -* 修复了 `parallel_view_processing` 行为. 现在, 如果发生异常, 所有对 `MATERIALIZED VIEW` 的插入都应该无一例外地完成. 修复 [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 固定组合器 `-OrNull` 和 `-OrDefault` 与 `-State` 结合使用. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). -* 修复了函数 `h3EdgeAngle` 中可能出现的缓冲区溢出. [#10711](https://github.com/ClickHouse/ClickHouse/pull/10711) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了当表有很多部分时锁定并发更改的错误. [#10659](https://github.com/ClickHouse/ClickHouse/pull/10659) ([alesapin](https://github.com/alesapin)). -* 如果服务器在表启动前关闭, 则修复了 `StorageBuffer` 中的 `nullptr` 取消引用. [#10641](https://github.com/ClickHouse/ClickHouse/pull/10641) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 使用 `LowCardinality` 修复了 `optimize_skip_unused_shards` . [#10611](https://github.com/ClickHouse/ClickHouse/pull/10611) ([Azat Khuzhin](https://github.com/azat)). -* 修复了同步突变的处理条件变量. 在某些情况下, 该条件变量的信号可能会丢失. [#10588](https://github.com/ClickHouse/ClickHouse/pull/10588) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 修复了在 `loadStoredObject()` 完成之前调用 `createDictionary()` 时可能发生的崩溃. [#10587](https://github.com/ClickHouse/ClickHouse/pull/10587) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复了列 `ALIAS` 的 `SELECT`, 它的默认表达式类型与列类型不同. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). -* 实现了 DateTime64 和 String 值之间的比较. [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). -* 默认禁用 `GROUP BY` sharding_key优化 ( `optimize_distributed_group_by_sharding_key` 已经被引入并默认关闭, 由于 sharding_key 分析的技巧, 简单的例子是 sharding key 中的 `if`) 并修复它为 `WITH ROLLUP/CUBE/TOTALS`. [#10516](https://github.com/ClickHouse/ClickHouse/pull/10516) ([Azat Khuzhin](https://github.com/azat)). -* 已修复 [#10263](https://github.com/ClickHouse/ClickHouse/issues/10263). [#10486](https://github.com/ClickHouse/ClickHouse/pull/10486) ([Azat Khuzhin](https://github.com/azat)). -* 添加了关于 `max_rows_to_sort` 设置的测试. [#10268](https://github.com/ClickHouse/ClickHouse/pull/10268) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了创建布隆过滤器索引的向后兼容性. [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). - -### ClickHouse 版本 v20.4.2.9, 2020-05-12 - -#### 向后不兼容变更 -* 系统表 (例如 system.query_log、system.trace_log、system.metric_log) 对小于 10 MiB 的部分使用合并数据部分格式. 自 20.3 版起支持压缩数据部分格式. 如果你打算降级到20.3以下的版本, 你应该手动删除 `/var/lib/clickhouse/data/system/` 中系统日志的表数据. -* 当字符串比较涉及 FixedString 并且比较的参数大小不同时, 将较小的字符串填充到较大的字符串的长度进行比较. 如果我们想象 FixedString 数据类型对应于 SQL CHAR,这是为了 SQL 兼容性. 这将关闭 [#9272](https://github.com/ClickHouse/ClickHouse/issues/9272). [#10363](https://github.com/ClickHouse/ClickHouse/pull/10363) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 使 SHOW CREATE TABLE 多行. 现在它更具可读性, 更像 MySQL. [#10049](https://github.com/ClickHouse/ClickHouse/pull/10049) ([Azat Khuzhin](https://github.com/azat)) -* 添加了在 `pointInPolygon` 函数中使用并默认启用的设置 `validate_polygons`. [#9857](https://github.com/ClickHouse/ClickHouse/pull/9857) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 新特征 -* 添加对从 ClickHouse 到 Zookeeper 的安全连接的支持 [#10184](https://github.com/ClickHouse/ClickHouse/pull/10184) ([Konstantin Lebedev](https://github.com/xzkostyan)) -* 支持自定义 HTTP 处理程序。 参见 [#5436](https://github.com/ClickHouse/ClickHouse/issues/5436) 的描述. [#7572](https://github.com/ClickHouse/ClickHouse/pull/7572) ([Winter Zhang](https://github.com/zhang2014)) -* 添加 MessagePack 输入/输出格式. [#9889](https://github.com/ClickHouse/ClickHouse/pull/9889) ([Kruglov Pavel](https://github.com/Avogar)) -* 添加正则表达式输入格式. [#9196](https://github.com/ClickHouse/ClickHouse/pull/9196) ([Kruglov Pavel](https://github.com/Avogar)) -* 添加了输出格式 `Markdown`, 用于在 Markdown 文档中嵌入表格. [#10317](https://github.com/ClickHouse/ClickHouse/pull/10317) ([Kruglov Pavel](https://github.com/Avogar)) -* 添加了对字典中自定义设置部分的支持. 还修复了问题 [#2829](https://github.com/ClickHouse/ClickHouse/issues/2829). [#10137](https://github.com/ClickHouse/ClickHouse/pull/10137) ([Artem Streltsov](https://github.com/kekekekule)) -* 在 DDL 查询中为 `CREATE DICTIONARY` 添加了自定义设置支持. [#10465](https://github.com/ClickHouse/ClickHouse/pull/10465) ([Artem Streltsov](https://github.com/kekekekule)) -* 添加简单的服务器范围内存分析器, 当服务器内存使用率高于下一个分配阈值时, 它将收集分配上下文. [#10444](https://github.com/ClickHouse/ClickHouse/pull/10444) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加设置 `always_fetch_merged_part` 限制副本自己合并部分, 并且总是喜欢从其他副本下载. [#10379](https://github.com/ClickHouse/ClickHouse/pull/10379) ([alesapin](https://github.com/alesapin)) -* 添加函数 `JSONExtractKeysAndValuesRaw`, 它从JSON对象中提取原始数据. [#10378](https://github.com/ClickHouse/ClickHouse/pull/10378) ([hcz](https://github.com/hczhcz)) -* 将操作系统的内存使用添加到 `system.asynchronous_metrics`. [#10361](https://github.com/ClickHouse/ClickHouse/pull/10361) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加了函数 `least` 和 `greatest` 的通用变体. 现在它们可以处理任意数量的任意类型的参数. 这修复了 [#4767](https://github.com/ClickHouse/ClickHouse/issues/4767) [#10318](https://github.com/ClickHouse/ClickHouse/pull/10318) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 现在, ClickHouse 在其一侧控制字典源的超时. 缓存字典配置中添加了两个新设置: `strict_max_lifetime_seconds`,默认为 `max_lifetime`,以及 `query_wait_timeout_milliseconds`, 默认为一分钟. 第一个设置对于 `allow_read_expired_keys` 设置也很有用 (禁止读取非常过期的键). [#10337](https://github.com/ClickHouse/ClickHouse/pull/10337) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 添加 log_queries_min_type 以过滤哪些条目将写入 query_log. [#10053](https://github.com/ClickHouse/ClickHouse/pull/10053) ([Azat Khuzhin](https://github.com/azat)) -* 添加函数 `isConstant`. 此函数检查其参数是否为常量表达式并返回 1 或 0. 用于开发、调试和演示目的. [#10198](https://github.com/ClickHouse/ClickHouse/pull/10198) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加 joinGetOrNull 以在 key 丢失时返回 NULL 而不是返回默认值. [#10094](https://github.com/ClickHouse/ClickHouse/pull/10094) ([Amos Bird](https://github.com/amosbird)) -* 如果设置了选项 `transform_null_in`, 则认为 `NULL` 等于 `IN` 运算符中的 `NULL`. [#10085](https://github.com/ClickHouse/ClickHouse/pull/10085) ([achimbab](https://github.com/achimbab)) -* 为 MergeTree 表引擎系列添加 `ALTER TABLE ... RENAME COLUMN`. [#9948](https://github.com/ClickHouse/ClickHouse/pull/9948) ([alesapin](https://github.com/alesapin)) -* 支持并行分布式 INSERT SELECT. [#9759](https://github.com/ClickHouse/ClickHouse/pull/9759) ([vxider](https://github.com/Vxider)) -* 添加在分布式上查询分布式的能力 (不带 `distributed_group_by_no_merge`) ... [#9923](https://github.com/ClickHouse/ClickHouse/pull/9923) ([Azat Khuzhin](https://github.com/azat)) -* 添加函数 `arrayReduceInRanges` , 它聚合给定范围内的数组元素. [#9598](https://github.com/ClickHouse/ClickHouse/pull/9598) ([hcz](https://github.com/hczhcz)) -* 在 prometheus 导出器上添加字典状态. [#9622](https://github.com/ClickHouse/ClickHouse/pull/9622) ([Guillaume Tassery](https://github.com/YiuRULE)) -* 添加函数 `arrayAUC`. [#8698](https://github.com/ClickHouse/ClickHouse/pull/8698) ([taiyang-li](https://github.com/taiyang-li)) -* 支持 `DROP VIEW` 语句以获得更好的TPC-H兼容性. [#9831](https://github.com/ClickHouse/ClickHouse/pull/9831) ([Amos Bird](https://github.com/amosbird)) -* 将 `strict_order` 选项添加到 windowFunnel(). [#9773](https://github.com/ClickHouse/ClickHouse/pull/9773) ([achimbab](https://github.com/achimbab)) -* 支持 `DATE` 和 `TIMESTAMP` SQL 操作符, 例如 `选择日期'2001-01-01'`. [#9691](https://github.com/ClickHouse/ClickHouse/pull/9691) ([Artem Zuikov](https://github.com/4ertus2)) - -#### 实验功能 -* 添加了实验性数据库引擎 Atomic. 它支持非阻塞 `DROP` 和 `RENAME TABLE` 查询以及原子 `EXCHANGE TABLES t1 AND t2` 查询. [#7512](https://github.com/ClickHouse/ClickHouse/pull/7512) ([tavplubix](https://github.com/tavplubix)) -* 对 S3 上的 ReplicatedMergeTree 的初始支持 (它以次优方式工作). [#10126](https://github.com/ClickHouse/ClickHouse/pull/10126) ([Pavel Kovalenko](https://github.com/Jokser)) - -#### Bug 修复 -* 修复了 `MATERIALIZED VIEW` 内部查询中不正确的标量结果, 以防该查询包含相关表. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复了当 `readonly=2` 和 `cancel_http_readonly_queries_on_client_close=1` 时导致 HTTP 请求卡在客户端关闭连接上的错误. [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)) -* 在服务器启动时抛出异常时修复 StorageBuffer 中的段错误. 修复 [#10550](https://github.com/ClickHouse/ClickHouse/issues/10550) [#10609](https://github.com/ClickHouse/ClickHouse/pull/10609) ([tavplubix](https://github.com/tavplubix)) -* 查询 `SYSTEM DROP DNS CACHE` 现在还删除用于检查是否允许用户从某些 IP 地址连接的缓存. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)) -* 修复在一个查询中使用多个具有相同集合的 `IN` 运算符. 修复 [#10539](https://github.com/ClickHouse/ClickHouse/issues/10539) [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)) -* 使用嵌套类型修复 `generateRandom` 中的崩溃. 修复 [#10583](https://github.com/ClickHouse/ClickHouse/issues/10583). [#10734](https://github.com/ClickHouse/ClickHouse/pull/10734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复合并后可能发生的 `SummingMergeTree` 中 `LowCardinality(FixedString)` 键列的数据损坏. 修复 [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复 aggregation_memory_efficient_merge_threads 设置的逻辑. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)) -* 修复消失的总数. 如果查询具有 `JOIN` 或带有外部 `WHERE` 条件的子查询, 则总计可能被过滤。 修复[#10674](https://github.com/ClickHouse/ClickHouse/issues/10674) [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复启用了 `distributed_aggregation_memory_efficient` 的远程查询缺乏并行执行的问题. 修复 [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655) [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 使用 `LIMIT` 修复查询的可能不正确的行数. 修复 [#10566](https://github.com/ClickHouse/ClickHouse/issues/10566), [#10709](https://github.com/ClickHouse/ClickHouse/issues/10709) [#10660](https://github.com/ClickHouse/ClickHouse/pull/10660) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复索引损坏, 在某些情况下将合并部分合并到另一个合并部分后可能会发生这种情况. [#10531](https://github.com/ClickHouse/ClickHouse/pull/10531) ([Anton Popov](https://github.com/CurtizJ)) -* 修复当mutation完成所有部分, 但在 `is_done=0` 中挂掉的情况. [#10526](https://github.com/ClickHouse/ClickHouse/pull/10526) ([alesapin](https://github.com/alesapin)) -* 修复 unix 纪元开始时与 UTC 有小数偏移的时区的溢出. 修复 [#9335](https://github.com/ClickHouse/ClickHouse/issues/9335). [#10513](https://github.com/ClickHouse/ClickHouse/pull/10513) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 更好的输入格式诊断. 修复 [#10204](https://github.com/ClickHouse/ClickHouse/issues/10204) [#10418](https://github.com/ClickHouse/ClickHouse/pull/10418) ([tavplubix](https://github.com/tavplubix)) -* 修复 `simpleLinearRegression()` 中大整数上的数字溢出. [#10474](https://github.com/ClickHouse/ClickHouse/pull/10474) ([hcz](https://github.com/hczhcz)) -* 修复分布式关闭中的use-after-free, 避免等待发送所有批次 [#10491](https://github.com/ClickHouse/ClickHouse/pull/10491) ([Azat Khuzhin](https://github.com/azat)) -* 将 CA 证书添加到 clickhouse-server docker 镜像. [#10476](https://github.com/ClickHouse/ClickHouse/pull/10476) ([filimonov](https://github.com/filimonov)) -* 修复使用 `addressToLine` 函数或 AggregateFunctionState 列时可能发生的罕见无限循环. [#10466](https://github.com/ClickHouse/ClickHouse/pull/10466) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 在分布式查询期间处理zookeeper `no node error`. [#10050](https://github.com/ClickHouse/ClickHouse/pull/10050) ([Daniel Chen](https://github.com/Phantomape)) -* 修复更改列的默认值后服务器无法附加表的错误. [#10441](https://github.com/ClickHouse/ClickHouse/pull/10441) ([alesapin](https://github.com/alesapin)) -* 将默认表达式类型隐式转换为 ALIAS 列的列类型. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)) -* 如果 `ATTACH DATABASE` 失败, 不要删除元数据目录. [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014)) -* 避免依赖系统 tzdata. 修复了在 CentOS 8 上加载 `Africa/Casablanca` 时区的问题. [#10211](https://github.com/ClickHouse/ClickHouse/issues/10211) [#10425](https://github.com/ClickHouse/ClickHouse/pull/10425) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 如果数据以仲裁插入然后被删除 (DROP PARTITION、TTL 等), 则修复一些问题. 它导致在 SELECT 中卡住 INSERT 或误报异常. 修复 [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946) [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 创建 BloomFilter 索引时检查参数的数量和类型 [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623) [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014)) -* 更喜欢 `fallback_to_stale_replicas` 而不是 `skip_unavailable_shards` , 否则当两个设置都指定并且没有最新的副本时, 查询将失败 (来自@alex-zaitsev的补丁 ). [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat)) -* 修复带有 ARRAY JOIN、ORDER BY 和 LIMIT 的查询可能返回不完整结果的问题. 修复 [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([Vadim Plakhtinskiy](https://github.com/VadimPlh)) -* 在 DETACH/ATTACH 之后将数据库名称添加到字典名称. 修复 system.dictionaries 表和 `SYSTEM RELOAD` 查询. [#10415](https://github.com/ClickHouse/ClickHouse/pull/10415) ([Azat Khuzhin](https://github.com/azat)) -* 修复处理器管道中极端情况可能导致的错误结果. [#10131](https://github.com/ClickHouse/ClickHouse/pull/10131) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复启用设置 `distributed_group_by_no_merge` 时可能出现的段错误 (在 20.3.7.46 中由 [#10131](https://github.com/ClickHouse/ClickHouse/issues/10131) 引入). [#10399](https://github.com/ClickHouse/ClickHouse/pull/10399) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复 `Array(Tuple(...))` 数据类型的错误扁平化. 修复 [#10259](https://github.com/ClickHouse/ClickHouse/issues/10259) [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复 JOIN 内的常量列名可能与 JOIN 外的常量名冲突. [#9950](https://github.com/ClickHouse/ClickHouse/pull/9950) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 在 Block::sortColumns() 之后修复列的顺序. [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)) -* 修复 `ConcatProcessor` 中可能发生的 `Pipeline stuck` 错误,该错误可能在远程查询中发生. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 不要为聚合预留磁盘. 修复 [#9241](https://github.com/ClickHouse/ClickHouse/issues/9241) [#10375](https://github.com/ClickHouse/ClickHouse/pull/10375) ([Azat Khuzhin](https://github.com/azat)) -* 修复了时区的日期时间函数的错误行为, 这些时区在 UTC 的正负偏移量之间发生了变化 (例如 Pacific/Kiritimati). 修复 [#7202](https://github.com/ClickHouse/ClickHouse/issues/7202) [#10369](https://github.com/ClickHouse/ClickHouse/pull/10369) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 避免在 `dictIsIn` 函数中出现无限循环. 修复 #515. [#10365](https://github.com/ClickHouse/ClickHouse/pull/10365) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 默认禁用 GROUP BY sharding_key 优化并修复 WITH ROLLUP/CUBE/TOTALS. [#10516](https://github.com/ClickHouse/ClickHouse/pull/10516) ([Azat Khuzhin](https://github.com/azat)) -* 检查零件时检查错误代码, 如果错误类似于 `not enough memory`, 请不要将零件标记为损坏. 修复 [#6269](https://github.com/ClickHouse/ClickHouse/issues/6269) [#10364](https://github.com/ClickHouse/ClickHouse/pull/10364) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在系统表中显示有关未加载词典的信息. [#10234](https://github.com/ClickHouse/ClickHouse/pull/10234) ([Vitaly Baranov](https://github.com/vitlibar)) -* 如果服务器在表启动前关闭, 则修复 StorageBuffer 中的 nullptr 取消引用. [#10641](https://github.com/ClickHouse/ClickHouse/pull/10641) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了 `ReplicatedMergeTree` 中的 `DROP` 与 `OPTIMIZE` 竞赛. 如果存在并发的 OPTIMIZE 查询, 则 DROP 可能会在 ZooKeeper 的副本路径中留下一些垃圾. [#10312](https://github.com/ClickHouse/ClickHouse/pull/10312) ([tavplubix](https://github.com/tavplubix)) -* 修复 `Logical error: CROSS JOIN has expressions` 错误, 用于使用逗号和名称连接混合的查询. 修复 [#9910](https://github.com/ClickHouse/ClickHouse/issues/9910) [#10311](https://github.com/ClickHouse/ClickHouse/pull/10311) ([Artem Zuikov](https://github.com/4ertus2)) -* 使用 `max_bytes_before_external_group_by` 修复查询. [#10302](https://github.com/ClickHouse/ClickHouse/pull/10302) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复在某些情况下限制解析器中最大递归深度的问题. 此修复 [#10283](https://github.com/ClickHouse/ClickHouse/issues/10283) 此修复可能会引入轻微的不兼容性: 通过 clickhouse-client 进行长时间和深度查询可能会拒绝工作, 您应该调整设置 `max_query_size ` 和 `max_parser_depth` 相应. [#10295](https://github.com/ClickHouse/ClickHouse/pull/10295) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 允许对多个 JOIN 使用 `count(*)`. 修复 [#9853](https://github.com/ClickHouse/ClickHouse/issues/9853) [#10291](https://github.com/ClickHouse/ClickHouse/pull/10291) ([Artem Zuikov](https://github.com/4ertus2)) -* 使用 `max_rows_to_group_by` 和 `group_by_overflow_mode = 'break'` 修复错误 `Pipeline stuck`. [#10279](https://github.com/ClickHouse/ClickHouse/pull/10279) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复使用 DDL 查询创建 `range_hashed` 字典时出现的 `Cannot add column` 错误. 修复 [#10093](https://github.com/ClickHouse/ClickHouse/issues/10093). [#10235](https://github.com/ClickHouse/ClickHouse/pull/10235) ([alesapin](https://github.com/alesapin)) -* 修复罕见的可能异常 `Cannot drain connections: cancel first`. [#10239](https://github.com/ClickHouse/ClickHouse/pull/10239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复了 ClickHouse 会抛出 `Unknown function lambda` 的错误. 当用户尝试在 ENGINE = Replicated* 的表上运行 ALTER UPDATE/DELETE 时出现错误消息. 检查非确定性函数现在可以正确处理 lambda 表达式. [#10237](https://github.com/ClickHouse/ClickHouse/pull/10237) ([Alexander Kazakov](https://github.com/Akazz)) -* 修复了当 SELECT ... FROM system.tables 在具有惰性引擎的数据库上运行时发生的 StorageSystemTables 中相当罕见的段错误. [#10209](https://github.com/ClickHouse/ClickHouse/pull/10209) ([Alexander Kazakov](https://github.com/Akazz)) -* 当查询实际上应该在 LIMIT 停止时, 修复可能的无限查询执行, 同时从无限源 (如 `system.numbers` 或 `system.zeros` )读取. [#10206](https://github.com/ClickHouse/ClickHouse/pull/10206) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复了 Date 类型的 `generateRandom` 函数. 这修复了 [#9973](https://github.com/ClickHouse/ClickHouse/issues/9973). 修复了将 2106 年的日期插入到使用旧式分区的 MergeTree 表但分区以 1970 年命名的边缘情况. [#10218](https://github.com/ClickHouse/ClickHouse/pull/10218) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 如果 View 的表定义与 SELECT 查询不对应, 则转换类型. 这修复了 [#10180](https://github.com/ClickHouse/ClickHouse/issues/10180) and [#10022](https://github.com/ClickHouse/ClickHouse/issues/10022) [#10217](https://github.com/ClickHouse/ClickHouse/pull/10217) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复 RFC-2822 中字符串的 `parseDateTimeBestEffort`, 当一周中的某一天是星期二或星期四时. 这修复了 [#10082](https://github.com/ClickHouse/ClickHouse/issues/10082) [#10214](https://github.com/ClickHouse/ClickHouse/pull/10214) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复 JOIN 内的常量列名可能与 JOIN 外的常量名冲突. [#10207](https://github.com/ClickHouse/ClickHouse/pull/10207) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在存在数组连接函数的情况下修复移动到前置位置优化 (在某些情况下). 这修复了[#10092](https://github.com/ClickHouse/ClickHouse/issues/10092) [#10195](https://github.com/ClickHouse/ClickHouse/pull/10195) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复本机 mysql-connector-java (JDBC) 的 SCRAMBLE 中出现分隔符的问题. [#10140](https://github.com/ClickHouse/ClickHouse/pull/10140) ([BohuTANG](https://github.com/BohuTANG)) -* 修复未指定数据库时使用当前数据库进行访问检查的问题. [#10192](https://github.com/ClickHouse/ClickHouse/pull/10192) ([Vitaly Baranov](https://github.com/vitlibar)) -* 用合并部分修复表的 ALTER. [#10130](https://github.com/ClickHouse/ClickHouse/pull/10130) ([Anton Popov](https://github.com/CurtizJ)) -* 添加了通过 `allow_nondeterministic_mutations` 设置放宽对突变中非确定性函数使用限制的能力. [#10186](https://github.com/ClickHouse/ClickHouse/pull/10186) ([filimonov](https://github.com/filimonov)) -* 修复字典调用 `DROP TABLE` 的问题. [#10165](https://github.com/ClickHouse/ClickHouse/pull/10165) ([Azat Khuzhin](https://github.com/azat)) -* 如果在将 `INSERT` 插入分布式表时结构不匹配, 则转换块. [#10135](https://github.com/ClickHouse/ClickHouse/pull/10135) ([Azat Khuzhin](https://github.com/azat)) -* 当插入的块被带有分区键的部分分割时,记录的行数不正确 (作为所有部分的总和). [#10138](https://github.com/ClickHouse/ClickHouse/pull/10138) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为 MySQL 数据库引擎添加一些参数检查和支持标识符参数. [#10077](https://github.com/ClickHouse/ClickHouse/pull/10077) ([Winter Zhang](https://github.com/zhang2014)) -* 在创建新副本时修复不正确的 `index_granularity_bytes` 检查. 修复 [#10098](https://github.com/ClickHouse/ClickHouse/issues/10098). [#10121](https://github.com/ClickHouse/ClickHouse/pull/10121) ([alesapin](https://github.com/alesapin)) -* 当表包含跳过索引时, 修复 `CHECK TABLE` 查询中的错误. [#10068](https://github.com/ClickHouse/ClickHouse/pull/10068) ([alesapin](https://github.com/alesapin)) -* 修复嵌套表中只有一个分片的 Distributed-over-Distributed 问题. [#9997](https://github.com/ClickHouse/ClickHouse/pull/9997) ([Azat Khuzhin](https://github.com/azat)) -* 使用 `JOIN` 和 `UNION ALL` 修复查询可能丢失的行. 修复 [#9826](https://github.com/ClickHouse/ClickHouse/issues/9826), [#10113](https://github.com/ClickHouse/ClickHouse/issues/10113). ... [#10099](https://github.com/ClickHouse/ClickHouse/pull/10099) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复使用本地 clickhouse 服务器作为源时字典中的错误. 如果字典和源中的类型不兼容, 可能会导致内存损坏. [#10071](https://github.com/ClickHouse/ClickHouse/pull/10071) ([alesapin](https://github.com/alesapin)) -* 修复了从不存在 `/table/replicas/replica_name/metadata` 节点的旧 ClickHouse 版本更新时复制表启动的问题. 修复 [#10037](https://github.com/ClickHouse/ClickHouse/issues/10037). [#10095](https://github.com/ClickHouse/ClickHouse/pull/10095) ([alesapin](https://github.com/alesapin)) -* 修复错误 `Cannot clone block with columns because block has 0 columns ... While executing GroupingAggregatedTransform` . 当设置 `distributed_aggregation_memory_efficient` 被启用, 并且分布式查询从不同分片读取混合单级和二级聚合的聚合数据时发生这种情况. [#10063](https://github.com/ClickHouse/ClickHouse/pull/10063) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复具有实体化视图的数据库在启动时附加失败时的死锁. [#10054](https://github.com/ClickHouse/ClickHouse/pull/10054) ([Azat Khuzhin](https://github.com/azat)) -* 修复 GROUP BY 中可能发生的分段错误,该错误是包含尾随零字节的字符串键 ([#8636](https://github.com/ClickHouse/ClickHouse/issues/8636), [#8925](https://github.com/ClickHouse/ClickHouse/issues/8925)). ... [#10025](https://github.com/ClickHouse/ClickHouse/pull/10025) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 当别名可以覆盖限定的列名时, 修复分布式查询的错误结果. 修复 [#9672](https://github.com/ClickHouse/ClickHouse/issues/9672) [#9714](https://github.com/ClickHouse/ClickHouse/issues/9714) [#9972](https://github.com/ClickHouse/ClickHouse/pull/9972) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复 `SYSTEM RESTART REPLICAS` 中可能出现的死锁. [#9955](https://github.com/ClickHouse/ClickHouse/pull/9955) ([tavplubix](https://github.com/tavplubix)) -* 修复用于远程查询执行的线程数 (性能回归, 自 20.3 起). 当来自 `Distributed` 表的查询在本地和远程分片上同时执行时, 就会发生这种情况. 修复 [#9965](https://github.com/ClickHouse/ClickHouse/issues/9965) [#9971](https://github.com/ClickHouse/ClickHouse/pull/9971) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复了 `ATTACH PART` 中的 `DeleteOnDestroy` 逻辑, 这可能导致自动删除附加部分并添加了一些测试. [#9410](https://github.com/ClickHouse/ClickHouse/pull/9410) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 修复 `ON CLUSTER` DDL 查询在服务器启动时冻结的错误. [#9927](https://github.com/ClickHouse/ClickHouse/pull/9927) ([Gagan Arneja](https://github.com/garneja)) -* 修复了在某些数据库查询的处理阶段之一未检索到必要表的错误. 修复 [#9699](https://github.com/ClickHouse/ClickHouse/issues/9699). [#9949](https://github.com/ClickHouse/ClickHouse/pull/9949) ([achulkov2](https://github.com/achulkov2)) -* 修复 `JOIN` 与 `TOTALS` 一起出现时 Not found column in block 错误. 修复 [#9839](https://github.com/ClickHouse/ClickHouse/issues/9839) [#9939](https://github.com/ClickHouse/ClickHouse/pull/9939) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复解析 CREATE USER 命令中设置的多个主机. [#9924](https://github.com/ClickHouse/ClickHouse/pull/9924) ([Vitaly Baranov](https://github.com/vitlibar)) -* 修复连接表引擎的 `TRUNCATE`. ([#9917](https://github.com/ClickHouse/ClickHouse/issues/9917)). [#9920](https://github.com/ClickHouse/ClickHouse/pull/9920) ([Amos Bird](https://github.com/amosbird)) -* 修复 `ReplicatedMergeTree` 中删除和优化之间的竞争条件. [#9901](https://github.com/ClickHouse/ClickHouse/pull/9901) ([alesapin](https://github.com/alesapin)) -* 当设置了 `optimize_skip_unused_shards` 时, 修复分布式的 `DISTINCT`. [#9808](https://github.com/ClickHouse/ClickHouse/pull/9808) ([Azat Khuzhin](https://github.com/azat)) -* 修复 ALTER 中的 `scalar does not exist` 错误 ([#9878](https://github.com/ClickHouse/ClickHouse/issues/9878)). ... [#9904](https://github.com/ClickHouse/ClickHouse/pull/9904) ([Amos Bird](https://github.com/amosbird)) -* 修复 `distributed_product_mode=\'local\'` 中的限定名称错误. 修复 [#4756](https://github.com/ClickHouse/ClickHouse/issues/4756) [#9891](https://github.com/ClickHouse/ClickHouse/pull/9891) ([Artem Zuikov](https://github.com/4ertus2)) -* 对于 INSERT 查询, 分片现在确实将启动器的设置限制到它们的约束, 而不是抛出异常. 此修复允许将 INSERT 查询发送到具有其他约束的分片. 此更改改进了修复 [#9447](https://github.com/ClickHouse/ClickHouse/issues/9447). [#9852](https://github.com/ClickHouse/ClickHouse/pull/9852) ([Vitaly Baranov](https://github.com/vitlibar)) -* 在向 Kafka 代理提交偏移量时添加一些重试, 因为如果在 `offsets.commit.timeout.ms` 期间没有足够的副本可用于 `__consumer_offsets` 主题, 它可以拒绝提交. [#9884](https://github.com/ClickHouse/ClickHouse/pull/9884) ([filimonov](https://github.com/filimonov)) -* 修复在 `WHERE` 中使用基础表的虚拟列时的分布式引擎行为. [#9847](https://github.com/ClickHouse/ClickHouse/pull/9847) ([Azat Khuzhin](https://github.com/azat)) -* 修复了函数参数的时区使用不正确的一些情况. [#9574](https://github.com/ClickHouse/ClickHouse/pull/9574) ([Vasily Nemkov](https://github.com/Enmk)) -* 当查询在分布式表上具有 PREWHERE 和 WHERE 并且 `SET分布式产品模式 = 'local'` 时, 修复 `Different expressions with the same alias` 错误. [#9871](https://github.com/ClickHouse/ClickHouse/pull/9871) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复具有复合主键的表的突变过多的内存消耗. 这修复了 [#9850](https://github.com/ClickHouse/ClickHouse/issues/9850). [#9860](https://github.com/ClickHouse/ClickHouse/pull/9860) ([alesapin](https://github.com/alesapin)) -* 修复了从设置 `allow_introspection_functions` 计算内省函数的授权. [#9840](https://github.com/ClickHouse/ClickHouse/pull/9840) ([Vitaly Baranov](https://github.com/vitlibar)) -* 修复 max_distributed_connections (带和不带处理器) [#9673](https://github.com/ClickHouse/ClickHouse/pull/9673) ([Azat Khuzhin](https://github.com/azat)) -* 修复客户端上可能出现的异常 `Got 0 in totals chunk, expected 1` . 如果右连接表有零行, 则使用 `JOIN` 进行查询时会发生这种情况. 示例: `select * from system.one t1 join system.one t2 on t1.dummy = t2.dummy limit 0 FORMAT TabSeparated;`. 修复 [#9777](https://github.com/ClickHouse/ClickHouse/issues/9777). ... [#9823](https://github.com/ClickHouse/ClickHouse/pull/9823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复 `COMMA to CROSS JOIN rewriter is not enabled or cannot rewrite query` 错误, 以防在表列表中使用 COMMA JOIN 进行子查询 (即在 WHERE 中). 修复 [#9782](https://github.com/ClickHouse/ClickHouse/issues/9782) [#9830](https://github.com/ClickHouse/ClickHouse/pull/9830) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复了设置 `optimize_skip_unused_shards` 时服务器崩溃并且键的表达式无法转换为其字段类型的问题. [#9804](https://github.com/ClickHouse/ClickHouse/pull/9804) ([Azat Khuzhin](https://github.com/azat)) -* 修复 `splitByString` 中的空字符串处理. [#9767](https://github.com/ClickHouse/ClickHouse/pull/9767) ([hcz](https://github.com/hczhcz)) -* 修复损坏的 `ALTER TABLE DELETE COLUMN` 查询合并部分. [#9779](https://github.com/ClickHouse/ClickHouse/pull/9779) ([alesapin](https://github.com/alesapin)) -* 修复了通过 http (使用处理器管道) 查询时缺少的 `rows_before_limit_at_least`. 修复 [#9730](https://github.com/ClickHouse/ClickHouse/issues/9730) [#9757](https://github.com/ClickHouse/ClickHouse/pull/9757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复 `ALTER` 查询 (突变) 中的过多内存消耗. 这修复了 [#9533](https://github.com/ClickHouse/ClickHouse/issues/9533) and [#9670](https://github.com/ClickHouse/ClickHouse/issues/9670). [#9754](https://github.com/ClickHouse/ClickHouse/pull/9754) ([alesapin](https://github.com/alesapin)) -* 修复可能的永久性 `Cannot schedule a task` 错误. [#9154](https://github.com/ClickHouse/ClickHouse/pull/9154) ([Azat Khuzhin](https://github.com/azat)) -* 修复外部字典 DDL 中反引号的错误. 修复 [#9619](https://github.com/ClickHouse/ClickHouse/issues/9619). [#9734](https://github.com/ClickHouse/ClickHouse/pull/9734) ([alesapin](https://github.com/alesapin)) -* 修复了 `text_log` 中的数据竞争. 它不对应任何真正的错误. [#9726](https://github.com/ClickHouse/ClickHouse/pull/9726) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复复制中的错误, 如果用户在以前的版本上执行了更改, 则不允许复制工作. 这修复了 [#9645](https://github.com/ClickHouse/ClickHouse/issues/9645). [#9652](https://github.com/ClickHouse/ClickHouse/pull/9652) ([alesapin](https://github.com/alesapin)) -* 修复了 `sumKahan` 和 `sumWithOverflow` 不正确的内部函数名称. 在远程查询中使用此函数时导致异常. [#9636](https://github.com/ClickHouse/ClickHouse/pull/9636) ([Azat Khuzhin](https://github.com/azat)) -* 添加设置 `use_compact_format_in_distributed_parts_names`, 它允许将`INSERT` 查询的文件以更紧凑的格式写入 `Distributed` 表. 这修复了 [#9647](https://github.com/ClickHouse/ClickHouse/issues/9647). [#9653](https://github.com/ClickHouse/ClickHouse/pull/9653) ([alesapin](https://github.com/alesapin)) -* 在 JOIN 键中使用低基数修复 RIGHT 和 FULL JOIN. [#9610](https://github.com/ClickHouse/ClickHouse/pull/9610) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复 `MergeTreeRangeReader` 中可能出现的异常 `Size of filter does not match size of column` and `Invalid number of rows in Chunk` 和 `Invalid number of rows in Chunk`. 在某些情况下, 它们可能会在执行 `PREWHERE` 时出现. [#9612](https://github.com/ClickHouse/ClickHouse/pull/9612) ([Anton Popov](https://github.com/CurtizJ)) -* 允许具有内部复制的分布式表的 `ALTER ON CLUSTER`. 这修复了 [#3268](https://github.com/ClickHouse/ClickHouse/issues/3268) [#9617](https://github.com/ClickHouse/ClickHouse/pull/9617) ([shinoi2](https://github.com/shinoi2)) -* 如果您编写像 `time + 1` 这样的简单算术表达式 (与像 `time + INTERVAL 1 SECOND` 这样的表达式相反), 则修复了未保留时区的问题. 这修复了 [#5743](https://github.com/ClickHouse/ClickHouse/issues/5743) [#9323](https://github.com/ClickHouse/ClickHouse/pull/9323) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 改进 -* 将 DateTime 与字符串文字进行比较时使用时区. 这修复了 [#5206](https://github.com/ClickHouse/ClickHouse/issues/5206). [#10515](https://github.com/ClickHouse/ClickHouse/pull/10515) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 如果无法从文本输入格式解析 Decimal 值, 则打印详细的诊断信息. [#10205](https://github.com/ClickHouse/ClickHouse/pull/10205) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为分布式/缓冲调度池添加任务/内存指标. [#10449](https://github.com/ClickHouse/ClickHouse/pull/10449) ([Azat Khuzhin](https://github.com/azat)) -* 一旦准备好在 clickhouse-local 和 HTTP 接口中进行 SELECT DISTINCT 查询, 就立即显示结果. 这修复了 [#8951](https://github.com/ClickHouse/ClickHouse/issues/8951) [#9559](https://github.com/ClickHouse/ClickHouse/pull/9559) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 允许使用 `SAMPLE OFFSET` 查询代替 `cityHash64(PRIMARY KEY) % N == n` 在 `clickhouse-copier` 中进行拆分. 要使用此功能, 请将 `--experimental-use-sample-offset 1` 作为命令行参数传递. [#10414](https://github.com/ClickHouse/ClickHouse/pull/10414) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 如果第一列的值中不能包含 BOM, 则允许在 TSV 中解析 BOM. 这修复了 [#10301](https://github.com/ClickHouse/ClickHouse/issues/10301) [#10424](https://github.com/ClickHouse/ClickHouse/pull/10424) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加 Avro 嵌套字段插入支持. [#10354](https://github.com/ClickHouse/ClickHouse/pull/10354) ([Andrew Onyshchuk](https://github.com/oandrew)) -* 指定相同类型时, 允许在非修改数据模式下更改列. [#10382](https://github.com/ClickHouse/ClickHouse/pull/10382) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 在 GROUP BY 分片键上自动 `distributed_group_by_no_merge` (如果设置了 `optimize_skip_unused_shards`). [#10341](https://github.com/ClickHouse/ClickHouse/pull/10341) ([Azat Khuzhin](https://github.com/azat)) -* 使用 LIMIT/LIMIT BY/ORDER BY 优化查询以使用 GROUP BY sharding_key 进行分布式. [#10373](https://github.com/ClickHouse/ClickHouse/pull/10373) ([Azat Khuzhin](https://github.com/azat)) -* 添加了设置 `max_server_memory_usage` 以限制服务器的总内存使用量. 现在计算指标 `MemoryTracking` 没有漂移. 设置 `max_memory_usage_for_all_queries` 现在已经过时并且什么都不做. 这将关闭 [#10293](https://github.com/ClickHouse/ClickHouse/issues/10293). [#10362](https://github.com/ClickHouse/ClickHouse/pull/10362) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加配置选项 `system_tables_lazy_load`. 如果设置为 false, 则在服务器启动时加载带有日志的系统表. [Alexander Burmak](https://github.com/Alex-Burmak), [Svyatoslav Tkhon Il Pak](https://github.com/DeifyTheGod), [#9642](https://github.com/ClickHouse/ClickHouse/pull/9642) [#10359](https://github.com/ClickHouse/ClickHouse/pull/10359) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 使用后台线程池 (background_schedule_pool_size) 进行分布式发送. [#10263](https://github.com/ClickHouse/ClickHouse/pull/10263) ([Azat Khuzhin](https://github.com/azat)) -* 使用后台线程池进行后台缓冲区刷新. [#10315](https://github.com/ClickHouse/ClickHouse/pull/10315) ([Azat Khuzhin](https://github.com/azat)) -* 支持删除不完整写入部分的一种特殊情况. 这修复了[#9940](https://github.com/ClickHouse/ClickHouse/issues/9940). [#10221](https://github.com/ClickHouse/ClickHouse/pull/10221) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 使用 isInjective() 在此类函数的手动列表上进行 GROUP BY 优化. [#10342](https://github.com/ClickHouse/ClickHouse/pull/10342) ([Azat Khuzhin](https://github.com/azat)) -* 如果客户端在连接时立即发送 RST 数据包, 请避免在日志中打印错误消息. 这是具有 keepalived 和 VRRP 的 IPVS 平衡器的典型行为. 这修复了 [#1851](https://github.com/ClickHouse/ClickHouse/issues/1851) [#10274](https://github.com/ClickHouse/ClickHouse/pull/10274) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 允许为浮点类型解析 `+inf`. 这将关闭 [#1839](https://github.com/ClickHouse/ClickHouse/issues/1839) [#10272](https://github.com/ClickHouse/ClickHouse/pull/10272) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为嵌套类型实现了 `generateRandom` 表函数. 这将关闭 [#9903](https://github.com/ClickHouse/ClickHouse/issues/9903) [#10219](https://github.com/ClickHouse/ClickHouse/pull/10219) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在 MySQL 兼容接口中提供 `max_allowed_packed` 将帮助一些客户端通过 MySQL 协议与 ClickHouse 通信. [#10199](https://github.com/ClickHouse/ClickHouse/pull/10199) ([BohuTANG](https://github.com/BohuTANG)) -* 允许 GLOBAL IN 的文字 (即`SELECT * FROM remote('localhost', system.one) WHERE dummy global in (0)`). [#10196](https://github.com/ClickHouse/ClickHouse/pull/10196) ([Azat Khuzhin](https://github.com/azat)) -* 修复 clickhouse-client 交互模式下的各种小问题. [#10194](https://github.com/ClickHouse/ClickHouse/pull/10194) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 避免多余的字典加载 (system.tables, DROP/SHOW CREATE TABLE). [#10164](https://github.com/ClickHouse/ClickHouse/pull/10164) ([Azat Khuzhin](https://github.com/azat)) -* 更新到 RWLock:getLock() + 实现的超时参数重新设计为阶段公平. [#10073](https://github.com/ClickHouse/ClickHouse/pull/10073) ([Alexander Kazakov](https://github.com/Akazz)) -* 增强与本机 mysql-connector-java(JDBC) 的兼容性. [#10021](https://github.com/ClickHouse/ClickHouse/pull/10021) ([BohuTANG](https://github.com/BohuTANG)) -* `toString` 函数被认为是单调的, 即使在使用 String 或 LowCardinality(String) 参数的重言式情况下也可以用于索引分析. [#10110](https://github.com/ClickHouse/ClickHouse/pull/10110) ([Amos Bird](https://github.com/amosbird)) -* 向命令 `{CREATE|DROP} USER/ROLE/ROW POLICY/SETTINGS PROFILE/QUOTA`、`GRANT` 添加 `ON CLUSTER` 子句支持. [#9811](https://github.com/ClickHouse/ClickHouse/pull/9811) ([Vitaly Baranov](https://github.com/vitlibar)) -* 对 S3 URI 的虚拟托管式支持. [#9998](https://github.com/ClickHouse/ClickHouse/pull/9998) ([Pavel Kovalenko](https://github.com/Jokser)) -* 现在可以在字典 DDL 查询中不用圆括号指定没有参数的字典的布局类型. 修复 [#10057](https://github.com/ClickHouse/ClickHouse/issues/10057). [#10064](https://github.com/ClickHouse/ClickHouse/pull/10064) ([alesapin](https://github.com/alesapin)) -* 添加在文件路径中使用带前导零的数字范围的功能. [#9989](https://github.com/ClickHouse/ClickHouse/pull/9989) ([Olga Khvostikova](https://github.com/stavrolia)) -* CROSS JOIN 中更好的内存使用. [#10029](https://github.com/ClickHouse/ClickHouse/pull/10029) ([Artem Zuikov](https://github.com/4ertus2)) -* 获取远程表的结构并设置 skip_unavailable_shards 时尝试连接到集群中的所有分片. [#7278](https://github.com/ClickHouse/ClickHouse/pull/7278) ([nvartolomei](https://github.com/nvartolomei)) -* 将 `total_rows`/`total_bytes` 添加到 `system.tables` 表中. [#9919](https://github.com/ClickHouse/ClickHouse/pull/9919) ([Azat Khuzhin](https://github.com/azat)) -* 系统日志表现在默认使用多态部分. [#9905](https://github.com/ClickHouse/ClickHouse/pull/9905) ([Anton Popov](https://github.com/CurtizJ)) -* 将类型列添加到 system.settings/merge_tree_settings. [#9909](https://github.com/ClickHouse/ClickHouse/pull/9909) ([Azat Khuzhin](https://github.com/azat)) -* 尽早在服务器启动时检查可用的 CPU 指令. [#9888](https://github.com/ClickHouse/ClickHouse/pull/9888) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 从突变中移除 `ORDER BY` 阶段, 因为我们从单个线程中的单个有序部分读取. 还添加检查突变中的行是否按排序键排序并且不违反此顺序. [#9886](https://github.com/ClickHouse/ClickHouse/pull/9886) ([alesapin](https://github.com/alesapin)) -* 在左侧为 FixedString 实现运算符 LIKE. 这是更好地支持 TPC-DS 查询所必需的. [#9890](https://github.com/ClickHouse/ClickHouse/pull/9890) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加 `force_optimize_skip_unused_shards_no_nested` 将禁用嵌套分布式表的 `force_optimize_skip_unused_shards`. [#9812](https://github.com/ClickHouse/ClickHouse/pull/9812) ([Azat Khuzhin](https://github.com/azat)) -* 现在, 对于 MergeTree 数据部分, 列大小只计算一次. [#9827](https://github.com/ClickHouse/ClickHouse/pull/9827) ([alesapin](https://github.com/alesapin)) -* 评估`optimize_skip_unused_shards` 的常量表达式 (即`SELECT * FROM foo_dist WHERE key=xxHash32(0)`).[#8846](https://github.com/ClickHouse/ClickHouse/pull/8846) ([Azat Khuzhin](https://github.com/azat)) -* 删除了从 TTL 表达式中检查使用 `Date` 或 `DateTime` 列的方法. [#9967](https://github.com/ClickHouse/ClickHouse/pull/9967) ([Vladimir Chebotarev](https://github.com/excitoon)) -* DiskS3硬链接优化实现. [#9760](https://github.com/ClickHouse/ClickHouse/pull/9760) ([Pavel Kovalenko](https://github.com/Jokser)) -* 如果 `set multiple_joins_rewriter_version = 2` 启用多个 JOIN 重写的第二个版本, 以保持列名不冲突. 它支持多个带有 `USING` 的JOIN, 并允许 `select *` 用于带有子查询的JOIN. [#9739](https://github.com/ClickHouse/ClickHouse/pull/9739) ([Artem Zuikov](https://github.com/4ertus2)) -* StorageMergeTree 的 `non-blocking` 更改的实现. [#9606](https://github.com/ClickHouse/ClickHouse/pull/9606) ([alesapin](https://github.com/alesapin)) -* 添加 MergeTree 对 DiskS3 的全面支持. [#9646](https://github.com/ClickHouse/ClickHouse/pull/9646) ([Pavel Kovalenko](https://github.com/Jokser)) -* 扩展 `splitByString` 以支持空字符串作为分隔符. [#9742](https://github.com/ClickHouse/ClickHouse/pull/9742) ([hcz](https://github.com/hczhcz)) -* 将 `timestamp_ns` 列添加到 `system.trace_log` . 它包含跟踪事件的高清时间戳, 并允许构建线程配置文件的时间线 ("火焰图"). [#9696](https://github.com/ClickHouse/ClickHouse/pull/9696) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 启用设置 `send_logs_level` 时, 避免日志消息和查询进度混淆. [#9634](https://github.com/ClickHouse/ClickHouse/pull/9634) ([Azat Khuzhin](https://github.com/azat)) -* 添加了对`MATERIALIZE TTL IN PARTITION`的支持. [#9581](https://github.com/ClickHouse/ClickHouse/pull/9581) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 支持 Avro 嵌套字段内的复杂类型. [#10502](https://github.com/ClickHouse/ClickHouse/pull/10502) ([Andrew Onyshchuk](https://github.com/oandrew)) - -#### 性能改进 -* 为 Partial MergeJoin 的右表提供更好的插入逻辑. [#10467](https://github.com/ClickHouse/ClickHouse/pull/10467) ([Artem Zuikov](https://github.com/4ertus2)) -* 改进了面向行的格式的性能 (CSV 超过 10%,Avro 超过 35%, 在窄表的情况下). [#10503](https://github.com/ClickHouse/ClickHouse/pull/10503) ([Andrew Onyshchuk](https://github.com/oandrew)) -* 使用 IN 运算符右侧显式定义的集合和左侧的元组提高查询的性能. [#10385](https://github.com/ClickHouse/ClickHouse/pull/10385) ([Anton Popov](https://github.com/CurtizJ)) -* 在 HashJoin 中为哈希表使用更少的内存. [#10416](https://github.com/ClickHouse/ClickHouse/pull/10416) ([Artem Zuikov](https://github.com/4ertus2)) -* StorageDictionary 上的特殊 HashJoin. 允许使用 JOIN 重写 `dictGet()` 函数. 它本身并不是向后不兼容的, 但可能会在某些安装中发现 [#8400](https://github.com/ClickHouse/ClickHouse/issues/8400). [#10133](https://github.com/ClickHouse/ClickHouse/pull/10133) ([Artem Zuikov](https://github.com/4ertus2)) -* 当目标表支持时启用物化视图的并行插入. [#10052](https://github.com/ClickHouse/ClickHouse/pull/10052) ([vxider](https://github.com/Vxider)) -* 使用单调函数改进指数分析的性能. [#9607](https://github.com/ClickHouse/ClickHouse/pull/9607)[#10026](https://github.com/ClickHouse/ClickHouse/pull/10026) ([Anton Popov](https://github.com/CurtizJ)) -* 使用 SSE2 或 SSE4.2 SIMD 内在函数来加速布隆过滤器中的标记化. [#9968](https://github.com/ClickHouse/ClickHouse/pull/9968) ([Vasily Nemkov](https://github.com/Enmk)) -* 在 `IN` 运算符的右侧使用显式定义的集合提高查询的性能. 这修复了 20.3 版中的性能回归. [#9740](https://github.com/ClickHouse/ClickHouse/pull/9740) ([Anton Popov](https://github.com/CurtizJ)) -* 现在, clickhouse-copier 将每个分区分成几部分并独立复制. [#9075](https://github.com/ClickHouse/ClickHouse/pull/9075) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 添加更多聚合方法. 例如,TPC-H 查询 1 现在将选择 `FixedHashMap` 并获得 25% 的性能提升 [#9829](https://github.com/ClickHouse/ClickHouse/pull/9829) ([Amos Bird](https://github.com/amosbird)) -* 在预限制转换中对多个流使用单行计数器. 这有助于避免在带有 `limit` 但没有 `order by` 的查询中联合管道流 (如 `select f(x) from (select x from t limit 1000000000)`) 并使用多个线程进行进一步处理. [#9602](https://github.com/ClickHouse/ClickHouse/pull/9602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) - -#### 构建/测试/打包改进 -* 使用来自 ClickHouse-Extras 的 AWS SDK 库的分支. [#10527](https://github.com/ClickHouse/ClickHouse/pull/10527) ([Pavel Kovalenko](https://github.com/Jokser)) -* 为新的 ALTER RENAME COLUMN 查询添加集成测试. [#10654](https://github.com/ClickHouse/ClickHouse/pull/10654) ([vzakaznikov](https://github.com/vzakaznikov)) -* 在使用错误参数调用函数 `now64` 时修复可能的有符号整数溢出. 这修复了 [#8973](https://github.com/ClickHouse/ClickHouse/issues/8973) [#10511](https://github.com/ClickHouse/ClickHouse/pull/10511) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 拆分 fuzzer 和 sanitizer 配置, 使构建配置与 Oss-fuzz 兼容. [#10494](https://github.com/ClickHouse/ClickHouse/pull/10494) ([kyprizel](https://github.com/kyprizel)) -* 修复了 clang-10 上的 clang-tidy. [#10420](https://github.com/ClickHouse/ClickHouse/pull/10420) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在错误消息中显示绝对路径. 否则 KDevelop 无法导航到正确的文件, 而是打开一个新文件. [#10434](https://github.com/ClickHouse/ClickHouse/pull/10434) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加了 `ASAN_OPTIONS` 环境变量以使用 Address sanitizer 调查 CI 压力测试中的错误. [#10440](https://github.com/ClickHouse/ClickHouse/pull/10440) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 为 clang 构建启用 ThinLTO (实验性). [#10435](https://github.com/ClickHouse/ClickHouse/pull/10435) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 删除系统安装 Z3 求解器时可能引入的对 Z3 的意外依赖. [#10426](https://github.com/ClickHouse/ClickHouse/pull/10426) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将集成测试 docker 文件移动到 docker/ 目录. [#10335](https://github.com/ClickHouse/ClickHouse/pull/10335) ([Ilya Yatsishin](https://github.com/qoega)) -* 允许在 CI 中使用 `clang-10`. 它确保 [#10238](https://github.com/ClickHouse/ClickHouse/issues/10238) 是已修复的. [#10384](https://github.com/ClickHouse/ClickHouse/pull/10384) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将 OpenSSL 更新为上游主服务器. 修复了 TLS 连接可能失败并显示消息 `OpenSSL SSL_read: error:14094438:SSLroutines:ssl3_read_bytes:tlsv1 alert internal error` 和 `SSL Exception: error:2400006E:random number generator::error retrieving entropy` 时的问题. 该问题存在于 20.1 版中. [#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复 clang-10 构建. [#10238](https://github.com/ClickHouse/ClickHouse/issues/10238) [#10370](https://github.com/ClickHouse/ClickHouse/pull/10370) ([Amos Bird](https://github.com/amosbird)) -* 为[Parallel INSERT for materialized view] (https://github.com/ClickHouse/ClickHouse/pull/10052)添加性能测试. [#10345](https://github.com/ClickHouse/ClickHouse/pull/10345) ([vxider](https://github.com/Vxider)) -* 修复片状测试 `test_settings_constraints_distributed.test_insert_clamps_settings`. [#10346](https://github.com/ClickHouse/ClickHouse/pull/10346) ([Vitaly Baranov](https://github.com/vitlibar)) -* 添加 util 以在 CI ClickHouse 中上传测试结果. [#10330](https://github.com/ClickHouse/ClickHouse/pull/10330) ([Ilya Yatsishin](https://github.com/qoega)) -* 在 junit_to_html 工具中将测试结果转换为 JSONEachRow 格式. [#10323](https://github.com/ClickHouse/ClickHouse/pull/10323) ([Ilya Yatsishin](https://github.com/qoega)) -* 更新 cctz. [#10215](https://github.com/ClickHouse/ClickHouse/pull/10215) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 允许从最纯粹的 JUnit XML 报告创建 HTML 报告. [#10247](https://github.com/ClickHouse/ClickHouse/pull/10247) ([Ilya Yatsishin](https://github.com/qoega)) -* 更新对最小编译器版本的检查. 修复问题的根本原因 [#10250](https://github.com/ClickHouse/ClickHouse/issues/10250) [#10256](https://github.com/ClickHouse/ClickHouse/pull/10256) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 对分布式实时视图表的初始支持. [#10179](https://github.com/ClickHouse/ClickHouse/pull/10179) ([vzakaznikov](https://github.com/vzakaznikov)) -* 在 MergeTreeIndexFullText 中修复 (false) MSan 报告. 该问题首先出现在 [#9968](https://github.com/ClickHouse/ClickHouse/issues/9968). [#10801](https://github.com/ClickHouse/ClickHouse/pull/10801) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* clickhouse-docker-util. [#10151](https://github.com/ClickHouse/ClickHouse/pull/10151) ([filimonov](https://github.com/filimonov)) -* 将 pdqsort 更新到最新版本. [#10171](https://github.com/ClickHouse/ClickHouse/pull/10171) ([Ivan](https://github.com/abyss7)) -* 将 libdivide 更新至 v3.0. [#10169](https://github.com/ClickHouse/ClickHouse/pull/10169) ([Ivan](https://github.com/abyss7)) -* 使用启用的多态部分添加检查. [#10086](https://github.com/ClickHouse/ClickHouse/pull/10086) ([Anton Popov](https://github.com/CurtizJ)) -* 为 FreeBSD 添加交叉编译构建. 这修复了 [#9465](https://github.com/ClickHouse/ClickHouse/issues/9465) [#9643](https://github.com/ClickHouse/ClickHouse/pull/9643) ([Ivan](https://github.com/abyss7)) -* 添加性能测试. [#6924](https://github.com/ClickHouse/ClickHouse/issues/6924) [#6980](https://github.com/ClickHouse/ClickHouse/pull/6980) ([filimonov](https://github.com/filimonov)) -* 在 `File` 引擎中添加对 `/dev/null` 的支持以进行更好的性能测试. [#8455](https://github.com/ClickHouse/ClickHouse/pull/8455) ([Amos Bird](https://github.com/amosbird)) -* 将 /dbms 中的所有文件夹向上移动一级. [#9974](https://github.com/ClickHouse/ClickHouse/pull/9974) ([Ivan](https://github.com/abyss7)) -* 添加一个测试, 检查从 MergeTree 中读取的单线程是否按顺序执行. 添加到 [#9670](https://github.com/ClickHouse/ClickHouse/issues/9670) [#9762](https://github.com/ClickHouse/ClickHouse/pull/9762) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复 `00964_live_view_watch_events_heartbeat.py` 测试以避免竞争条件. [#9944](https://github.com/ClickHouse/ClickHouse/pull/9944) ([vzakaznikov](https://github.com/vzakaznikov)) -* 修复集成测试 `test_settings_constraints`. [#9962](https://github.com/ClickHouse/ClickHouse/pull/9962) ([Vitaly Baranov](https://github.com/vitlibar)) -* 每个函数都在自己的文件中, 第 12 部分. [#9922](https://github.com/ClickHouse/ClickHouse/pull/9922) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 增加了对元组数组分析速度极慢的情况的性能测试. [#9872](https://github.com/ClickHouse/ClickHouse/pull/9872) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将 zstd 更新到 1.4.4. 它在性能和压缩比方面有一些小的改进. 如果您使用不同版本的 ClickHouse 运行副本, 您可能会看到合理的错误消息 `Data after merge is not byte-identical to data on another replicas.` 并附有说明. 这些消息没问题, 您不必担心. [#10663](https://github.com/ClickHouse/ClickHouse/pull/10663) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复 `system.stack_trace` 中的 TSan 报告. [#9832](https://github.com/ClickHouse/ClickHouse/pull/9832) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 删除了对 `clock_getres` 的依赖. [#9833](https://github.com/ClickHouse/ClickHouse/pull/9833) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加了使用 clang-tidy 的标识符名称检查. [#9799](https://github.com/ClickHouse/ClickHouse/pull/9799) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 更新 `builder` docker 镜像. 此镜像未在 CI 中使用, 但对开发人员有用. [#9809](https://github.com/ClickHouse/ClickHouse/pull/9809) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 删除 CI 中不再使用的旧的 `performance-test` 工具. `clickhouse-performance-test` 很棒, 但现在我们正在使用更高级的工具, 该工具通过复杂的统计公式进行比较测试, 无论环境如何变化, 都能获得可靠的结果. [#9796](https://github.com/ClickHouse/ClickHouse/pull/9796) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加了大部分 clang-static-analyzer 检查. [#9765](https://github.com/ClickHouse/ClickHouse/pull/9765) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将 Poco 更新到 1.9.3, 为 MongoDB URI 支持做准备. [#6892](https://github.com/ClickHouse/ClickHouse/pull/6892) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 使用 `-DUSE_STATIC_LIBRARIES=0 -DENABLE_JEMALLOC=0` 修复构建. [#9651](https://github.com/ClickHouse/ClickHouse/pull/9651) ([Artem Zuikov](https://github.com/4ertus2)) -* 对于变更日志脚本, 如果合并提交被挑选到发布分支, 则从提交描述中获取 PR 名称. [#9708](https://github.com/ClickHouse/ClickHouse/pull/9708) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 在 backport 脚本中支持 `vX.X-conflicts` 标签. [#9705](https://github.com/ClickHouse/ClickHouse/pull/9705) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复用于向后移植脚本的 `auto-label` . [#9685](https://github.com/ClickHouse/ClickHouse/pull/9685) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 在 Darwin 交叉构建中使用 libc++ 使其与原生构建一致. [#9665](https://github.com/ClickHouse/ClickHouse/pull/9665) ([Hui Wang](https://github.com/huiwang)) -* 修复不稳定的测试 `01017_uniqCombined_memory_usage`. 续 [#7236](https://github.com/ClickHouse/ClickHouse/issues/7236). [#9667](https://github.com/ClickHouse/ClickHouse/pull/9667) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复原生 MacOS Clang 编译器的构建. [#9649](https://github.com/ClickHouse/ClickHouse/pull/9649) ([Ivan](https://github.com/abyss7)) -* 允许在 `pthread_mutex_lock`、`pthread_mutex_unlock` 函数周围添加各种故障. [#9635](https://github.com/ClickHouse/ClickHouse/pull/9635) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在 `packager` 脚本中添加对 `clang-tidy` 的支持. [#9625](https://github.com/ClickHouse/ClickHouse/pull/9625) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加使用未捆绑的 msgpack 的能力. [#10168](https://github.com/ClickHouse/ClickHouse/pull/10168) ([Azat Khuzhin](https://github.com/azat)) - - -## ClickHouse 版本 v20.3 - - -### ClickHouse 版本 v20.3.21.2-lts, 2020-11-02 - -#### Bug 修复 - -* 修复 sharding_key 中的 dictGet (以及类似的地方, 即当函数上下文被永久存储时). [#16205](https://github.com/ClickHouse/ClickHouse/pull/16205) ([Azat Khuzhin](https://github.com/azat)). -* 如果查询具有`WHERE`、`PREWHERE` 和`GLOBAL IN`, 则修复来自`Distributed` 表的查询的错误空结果. 修复 [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 `TSV/CSVWithNames` 格式中缺失或过多的标题. 这修复了 [#12504](https://github.com/ClickHouse/ClickHouse/issues/12504). [#13343](https://github.com/ClickHouse/ClickHouse/pull/13343) ([Azat Khuzhin](https://github.com/azat)). - - -### ClickHouse 版本 v20.3.20.6-lts, 2020-10-09 - -#### Bug 修复 - -* Mutation 可能会在 `MOVE` 或 `REPLACE PARTITION` 之后等待一些不存在的部分, 或者在极少数情况下, 在 `DETACH` 或 `DROP PARTITION` 之后挂起。 已修复. [#15724](https://github.com/ClickHouse/ClickHouse/pull/15724), [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). -* 修复带有大量子查询的查询挂起到 `MySQL` 引擎的同一个表. 以前, 如果查询中有超过 16 个子查询到同一个 `MySQL` 表, 它会永远挂起. [#15299](https://github.com/ClickHouse/ClickHouse/pull/15299) ([Anton Popov](https://github.com/CurtizJ)). -* 当查询在 Merge 表上有 JOIN 时,修复 GROUP BY 中的 `Unknown identifier` . [#15242](https://github.com/ClickHouse/ClickHouse/pull/15242) ([Artem Zuikov](https://github.com/4ertus2)). -* 当子查询包含 finalizeAggregation 函数时, 修复使谓词下推工作. 修复 [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). -* 并发 `ALTER ... REPLACE/MOVE PARTITION ...` 查询可能会导致死锁. 已修复. [#13626](https://github.com/ClickHouse/ClickHouse/pull/13626) ([tavplubix](https://github.com/tavplubix)). - - -### ClickHouse 版本 v20.3.19.4-lts, 2020-09-18 - -#### Bug 修复 - -* 当被查询的列具有 `DEFAULT` 表达式时, 修复 `SELECT` 查询中的罕见错误, 该表达式依赖于另一列, 该列也具有 `DEFAULT` 并且不存在于选择查询中且不存在于磁盘上. 部分修复 [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). -* 修复了在赋值表达式和常量值 (如 `UPDATE x = 42`) 中使用 Nullable 列的 `ALTER UPDATE` 突变导致列或段错误中的值不正确时的错误. 修复 [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). -* 修复错误的十进制乘法结果导致结果列小数位数错误. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). - -#### 改进 - -* 支持合并部分的自定义编解码器. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). - - -### ClickHouse 版本 v20.3.18.10-lts, 2020-09-08 - -#### Bug 修复 - -* 如果 `PipelineExecutor` 本身发生异常, 则停止查询执行. 这可以防止罕见的查询挂起. 续 [#14334](https://github.com/ClickHouse/ClickHouse/issues/14334). [#14402](https://github.com/ClickHouse/ClickHouse/pull/14402) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了有时缓存字典从源返回默认值而不是当前值时的行为. [#13624](https://github.com/ClickHouse/ClickHouse/pull/13624) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 当数据库或表的名称包含点时, 修复从 users.xml 解析行策略. 这修复了[#5779](https://github.com/ClickHouse/ClickHouse/issues/5779), [#12527](https://github.com/ClickHouse/ClickHouse/issues/12527). [#13199](https://github.com/ClickHouse/ClickHouse/pull/13199) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复 CAST(Nullable(String), Enum()). [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `text_log` 中的数据竞争. 它不对应任何真正的错误. [#9726](https://github.com/ClickHouse/ClickHouse/pull/9726) ([alexey-milovidov](https://github.com/alexey-milovidov)). - -#### 改进 - -* 修复长查询的错误错误. 为了正确查询, 可能会出现除 `Max query size exceeded` 之外的语法错误. [#13928](https://github.com/ClickHouse/ClickHouse/pull/13928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当在 parseDateTimeBestEffortOrNull/Zero 函数中没有完全解析值时, 返回 NULL/零. 这修复了 [#7876](https://github.com/ClickHouse/ClickHouse/issues/7876). [#11653](https://github.com/ClickHouse/ClickHouse/pull/11653) ([alexey-milovidov](https://github.com/alexey-milovidov)). - -#### 性能改进 - -* 使用 LowCardinality 稍微优化非常短的查询. [#14129](https://github.com/ClickHouse/ClickHouse/pull/14129) ([Anton Popov](https://github.com/CurtizJ)). - -#### 构建/测试/打包改进 - -* 修复迁移到 clang-10 后出现的 HashTable 中的 UBSan 报告 (向 nullptr 添加零). [#10638](https://github.com/ClickHouse/ClickHouse/pull/10638) ([alexey-milovidov](https://github.com/alexey-milovidov)). - - -### ClickHouse 版本 v20.3.17.173-lts, 2020-08-15 - -#### Bug 修复 - -* 使用 StorageMerge 和 `set enable_optimize_predicate_expression=1` 修复 JOIN 中的崩溃. [#13679](https://github.com/ClickHouse/ClickHouse/pull/13679) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复无效的返回类型, 用于将元组与 `NULL` 元素进行比较. 修复[#12461](https://github.com/ClickHouse/ClickHouse/issues/12461). [#13420](https://github.com/ClickHouse/ClickHouse/pull/13420) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用常量列和主键的 `ORDER BY` 前缀修复查询. [#13396](https://github.com/ClickHouse/ClickHouse/pull/13396) ([Anton Popov](https://github.com/CurtizJ)). -* 返回在 roundUpToPowerOfTwoOrZero() 中设置 MSB 的数字的传递数字. [#13234](https://github.com/ClickHouse/ClickHouse/pull/13234) ([Azat Khuzhin](https://github.com/azat)). - - -### ClickHouse 版本 v20.3.16.165-lts 2020-08-10 - -#### Bug 修复 - -* 修复了当 unix 时间戳作为参数传递时 `parseDateTimeBestEffort` 函数中的错误. 这修复了 [#13362](https://github.com/ClickHouse/ClickHouse/issues/13362). [#13441](https://github.com/ClickHouse/ClickHouse/pull/13441) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在具有 NaN 值的 Float 类型上调用的 `uniqExact`、`topK`、`sumDistinct` 和类似聚合函数的潜在低性能和稍微不正确的结果. 它还在调试版本中触发断言. 这修复了 [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果将可空 constexpr 作为不是文字 NULL 的 cond 的固定函数. 修复 [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 在数组元素为 Nullable 且数组下标也可为 Null 的情况下, 修复了 `arrayElement` 函数中的断言. 这修复了 [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了对从本地副本进行选择的线程数的不必要限制. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了查询 `WITH TOTALS` 时可能出现的数据中可能出现的额外溢出行. [#12747](https://github.com/ClickHouse/ClickHouse/pull/12747) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了大元组的性能, 这些元组在 `IN` 部分被解释为函数. 当用户出于某种晦涩的原因编写 `WHERE x IN tuple(1, 2, ...)` 而不是 `WHERE x IN (1, 2, ...)` 的情况. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了 input_format_parallel_parsing 的内存跟踪 (通过将线程附加到组). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 [#12293](https://github.com/ClickHouse/ClickHouse/issues/12293) 当子查询包含 with 子句时允许推送谓词. [#12663](https://github.com/ClickHouse/ClickHouse/pull/12663) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了 [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572) 使用 const 表达式修复布隆过滤器索引. [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). -* 当代理不可用时 (不仅如此) 修复了 StorageKafka 中的 SIGSEGV. [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). -* 修复了带有缓存布局的外部字典中的竞争条件, 这可能导致服务器崩溃. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). -* 修复了当 `enable_mixed_granularity_parts=1` 时, 在 `ALTER DELETE` 查询后导致旧部件损坏的错误. 修复 [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). -* 对于参数数目无效的函数 `in` 更好的异常信息. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了性能问题,同时读取合并部分. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了启用 `text_log` 时的死锁. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 StorageMerge 时可能出现的段错误. 关闭 [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). -* 修复了带有 `-State` 和 `Nullable` 参数的聚合函数的 `TOTALS/ROLLUP/CUBE`. 这修复了 [#12163](https://github.com/ClickHouse/ClickHouse/issues/12163). [#12376](https://github.com/ClickHouse/ClickHouse/pull/12376) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `WITH FILL` 修饰符中列的顺序. 以前不遵守 `ORDER BY` 语句的列顺序. [#12306](https://github.com/ClickHouse/ClickHouse/pull/12306) ([Anton Popov](https://github.com/CurtizJ)). -* 当存在按虚拟列 (如 `Merge`表中的`_table`) 或系统表中的 `index` 列过滤数据 (例如从 `system.tables` 查询时按数据库名称过滤) 时, 避免 `bad cast` 异常, 并且这个表达式返回 `Nullable` 类型. 这修复了 [#12166](https://github.com/ClickHouse/ClickHouse/issues/12166). [#12305](https://github.com/ClickHouse/ClickHouse/pull/12305) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* `TrieDictionary` 加载失败后显示错误. [#12290](https://github.com/ClickHouse/ClickHouse/pull/12290) ([Vitaly Baranov](https://github.com/vitlibar)). -* 对于可能导致崩溃的空数组, 函数 `arrayFill` 工作不正确. 这修复了 [#12263](https://github.com/ClickHouse/ClickHouse/issues/12263). [#12279](https://github.com/ClickHouse/ClickHouse/pull/12279) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 实现到 `LowCardinality` 类型的通用类型的转换. 这允许对具有 LowCardinality 列和其他列的表执行 UNION ALL. 这修复了 [#8212](https://github.com/ClickHouse/ClickHouse/issues/8212). This fixes [#4342](https://github.com/ClickHouse/ClickHouse/issues/4342). [#12275](https://github.com/ClickHouse/ClickHouse/pull/12275) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在某些特殊类型的 `StorageFile` 标头中多次连续插入期间多次写入时的行为. 这已修复 [#6155](https://github.com/ClickHouse/ClickHouse/issues/6155). [#12197](https://github.com/ClickHouse/ClickHouse/pull/12197) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复了 UInt8 值不等于 0 或 1 时的逻辑函数. [#12196](https://github.com/ClickHouse/ClickHouse/pull/12196) ([Alexander Kazakov](https://github.com/Akazz)). -* 在 GROUP BY 内射函数消除期间修复了 `dictGet` 参数检查. [#12179](https://github.com/ClickHouse/ClickHouse/pull/12179) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `ALTER DELETE` 中的错误逻辑, 当条件评估为 NULL 时会导致删除记录. 这修复了 [#9088](https://github.com/ClickHouse/ClickHouse/issues/9088). This closes [#12106](https://github.com/ClickHouse/ClickHouse/issues/12106). [#12153](https://github.com/ClickHouse/ClickHouse/pull/12153) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在存在别名的情况下发送到外部 DBMS (例如 MySQL、ODBC) 的查询转换. 这修复了 [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了整数除法中的潜在溢出. 这修复了 [#12119](https://github.com/ClickHouse/ClickHouse/issues/12119). [#12140](https://github.com/ClickHouse/ClickHouse/pull/12140) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `greatCircleDistance`、`geoDistance` 中潜在的无限循环. 这修复了 [#12117](https://github.com/ClickHouse/ClickHouse/issues/12117). [#12137](https://github.com/ClickHouse/ClickHouse/pull/12137) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 对于带有连接或附加到系统日志 (ystem.query_log、metric_log 等) 或 engine=Buffer 基础表的子查询的物化视图, 避免 `There is no query` 异常. [#12120](https://github.com/ClickHouse/ClickHouse/pull/12120) ([filimonov](https://github.com/filimonov)). -* 修复了由于线程总数限制错误导致的带有 `UNION` 的选择的性能. 修复 [#12030](https://github.com/ClickHouse/ClickHouse/issues/12030). [#12103](https://github.com/ClickHouse/ClickHouse/pull/12103) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 `-StateResample` 组合器修复了段错误. [#12092](https://github.com/ClickHouse/ClickHouse/pull/12092) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了不必要的限制从 `VIEW` 中选择的线程数. 修复 [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了使用错误类型 `PREWHERE` 时可能发生的崩溃. 修复[#12053](https://github.com/ClickHouse/ClickHouse/issues/12053), [#12060](https://github.com/ClickHouse/ClickHouse/issues/12060). [#12060](https://github.com/ClickHouse/ClickHouse/pull/12060) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了具有 `LowCardinality` 类型的函数 `defaultValueOfArgumentType` 的 `Expected single dictionary argument for function` 错误. 修复 [#11808](https://github.com/ClickHouse/ClickHouse/issues/11808). [#12056](https://github.com/ClickHouse/ClickHouse/pull/12056) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了带有 `Tuple(LowCardinality)` 参数的高阶函数的错误 `Cannot capture column`. 修复 [#9766](https://github.com/ClickHouse/ClickHouse/issues/9766). [#12055](https://github.com/ClickHouse/ClickHouse/pull/12055) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 加载数据库时并行解析表元数据. 这修复了有大量表时服务器启动缓慢的问题. [#12045](https://github.com/ClickHouse/ClickHouse/pull/12045) ([tavplubix](https://github.com/tavplubix)). -* 使 `topK` 聚合函数为 Enum 类型返回 Enum. 这修复了 [#3740](https://github.com/ClickHouse/ClickHouse/issues/3740). [#12043](https://github.com/ClickHouse/ClickHouse/pull/12043) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了否为常量表达式的约束检查. 这修复了 [#11360](https://github.com/ClickHouse/ClickHouse/issues/11360). [#12042](https://github.com/ClickHouse/ClickHouse/pull/12042) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了元组与 `Nullable` 列的不正确比较. 修复 [#11985](https://github.com/ClickHouse/ClickHouse/issues/11985). [#12039](https://github.com/ClickHouse/ClickHouse/pull/12039) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了在调用具有不同大小的 `FixedString` 类型参数的函数 `if` 时出现错误结果和潜在崩溃的问题. 这修复了[#11362](https://github.com/ClickHouse/ClickHouse/issues/11362). [#12021](https://github.com/ClickHouse/ClickHouse/pull/12021) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果使用偏移量 `-9223372036854775808` 调用函数, 则以函数 `neighbor` 作为唯一返回表达式的查询可能会返回空结果. 这修复了 [#11367](https://github.com/ClickHouse/ClickHouse/issues/11367). [#12019](https://github.com/ClickHouse/ClickHouse/pull/12019) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 generateRandom 中可能导致崩溃的潜在数组大小溢出. 这修复了 [#11371](https://github.com/ClickHouse/ClickHouse/issues/11371). [#12013](https://github.com/ClickHouse/ClickHouse/pull/12013) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了潜在的浮点异常. 这将关闭 [#11378](https://github.com/ClickHouse/ClickHouse/issues/11378). [#12005](https://github.com/ClickHouse/ClickHouse/pull/12005) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了服务器启动时日志消息中错误的设置名称. [#11997](https://github.com/ClickHouse/ClickHouse/pull/11997) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `Values` 格式中的 `Query parameter was not set` 问题. 修复 [#11918](https://github.com/ClickHouse/ClickHouse/issues/11918). [#11936](https://github.com/ClickHouse/ClickHouse/pull/11936) ([tavplubix](https://github.com/tavplubix)). -* 在查询 (参数化查询) 中保留替换的别名. 这修复了 [#11914](https://github.com/ClickHouse/ClickHouse/issues/11914). [#11916](https://github.com/ClickHouse/ClickHouse/pull/11916) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了解析 DateTime64 时潜在的浮点异常. 这修复了 [#11374](https://github.com/ClickHouse/ClickHouse/issues/11374). [#11875](https://github.com/ClickHouse/ClickHouse/pull/11875) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 通过 `HTTP` 接口修复内存记帐 (对于 `wait_end_of_query=1` 可能很重要). [#11840](https://github.com/ClickHouse/ClickHouse/pull/11840) ([Azat Khuzhin](https://github.com/azat)). -* 修复了条件为 NULL 的 `if()` 的错误结果. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). -* 在检查相等性之前解析存储在 zookeeper 中的元数据. [#11739](https://github.com/ClickHouse/ClickHouse/pull/11739) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `LIMIT n WITH TIES` 与 `ORDER BY` 语句一起使用的问题, 该语句包含别名. [#11689](https://github.com/ClickHouse/ClickHouse/pull/11689) ([Anton Popov](https://github.com/CurtizJ)). -* 修复缓存字典中未初始化内存的潜在读取. [#10834](https://github.com/ClickHouse/ClickHouse/pull/10834) ([alexey-milovidov](https://github.com/alexey-milovidov)). - -#### 性能改进 - -* 索引不用于带文字的 IN 运算符, 在 v19.3 前后引入了性能回归. 这修复了 [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). - - -### ClickHouse 版本 v20.3.12.112-lts 2020-06-25 - -#### Bug 修复 - -* 修复在 prewhere 条件下使用 `Nullable` 列导致的罕见崩溃. 续 [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608). [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 不允许在高阶函数中使用 arrayJoin. 它导致协议同步中断. 这关闭了 [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复使用过多线程进行查询. [#11788](https://github.com/ClickHouse/ClickHouse/pull/11788) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复像 `SELECT *, xyz.*` 这样的查询的意外行为, 这些查询在预期错误时成功. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). -* 现在复制的提取将在元数据更改期间取消. [#11744](https://github.com/ClickHouse/ClickHouse/pull/11744) ([alesapin](https://github.com/alesapin)). -* 修复了由 Values 输入格式中复杂文字的错误类型推导导致的 LOGICAL_ERROR. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). -* 修复 `ORDER BY ... WITH FILL` 在 const 列上. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). -* 与 XDBC 桥通信时传递适当的超时. 最近在检查桥接活性和接收元信息时没有遵守超时. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复导致 `system.mutations` 状态不正确的错误. 它可能表明整个突变已经完成, 但服务器在复制队列中仍有 `MUTATE_PART` 任务并尝试执行它们. 这修复了 [#11611](https://github.com/ClickHouse/ClickHouse/issues/11611). [#11681](https://github.com/ClickHouse/ClickHouse/pull/11681) ([alesapin](https://github.com/alesapin)). -* 添加对带有不区分大小写标志的正则表达式的支持. 这修复了 [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果设置了行级安全性,则删除琐碎的计数查询优化. 在以前的版本中, 用户获取表中记录的总数而不是过滤. 这修复了[#11352](https://github.com/ClickHouse/ClickHouse/issues/11352). [#11644](https://github.com/ClickHouse/ClickHouse/pull/11644) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复字符串的布隆过滤器 (数据跳过索引). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). -* 修复在 prewhere 条件下使用 `Nullable` 列导致的罕见崩溃. (可能它以某种方式与 [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572) somehow). [#11608](https://github.com/ClickHouse/ClickHouse/pull/11608) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复错误 `Block structure mismatch` , 用于从 `Buffer` 表中采样读取的查询. [#11602](https://github.com/ClickHouse/ClickHouse/pull/11602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 clickhouse-client 的错误退出代码, 当 exception.code() % 256 = 0 时. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). -* 修复服务器启动时有关 `Mark cache size was lowered` 的日志消息中的小错误. 这将关闭 [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复错误 `Size of offsets does not match size of column` , 用于查询中的 `PREWHERE column in (subquery)` 和 `ARRAY JOIN` . [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* HTTP 会话中的所有查询都具有相同的 query_id. 已修复. [#11578](https://github.com/ClickHouse/ClickHouse/pull/11578) ([tavplubix](https://github.com/tavplubix)). -* 现在 clickhouse-server docker 容器将更喜欢 IPv6 检查服务器活动性. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). -* 修复 `` 的 shard_num/replica_num (破坏 use_compact_format_in_distributed_parts_names). [#11528](https://github.com/ClickHouse/ClickHouse/pull/11528) ([Azat Khuzhin](https://github.com/azat)). -* 使用 -State 函数在聚合过程中抛出异常时修复内存泄漏. 这修复了 [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当别名可以覆盖限定的列名, 修复分布式查询的错误结果. 修复 [#9672](https://github.com/ClickHouse/ClickHouse/issues/9672) [#9714](https://github.com/ClickHouse/ClickHouse/issues/9714). [#9972](https://github.com/ClickHouse/ClickHouse/pull/9972) ([Artem Zuikov](https://github.com/4ertus2)). - - -### ClickHouse 版本 v20.3.11.97-lts 2020-06-10 - -#### 新特征 - -* 现在, ClickHouse 在其一侧控制字典源的超时. 缓存字典配置中添加了两个新设置: `strict_max_lifetime_seconds`, 默认为 `max_lifetime` 和 `query_wait_timeout_milliseconds`, 默认为一分钟. 第一个设置对于 `allow_read_expired_keys` 设置也很有用 (禁止读取非常过期的键). [#10337](https://github.com/ClickHouse/ClickHouse/pull/10337) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). - -#### Bug 修复 - -* 修复了在启用 `min_bytes_to_use_direct_io` 且 PREWHERE 处于活动状态并使用 SAMPLE 或大量线程时可能发生的 `Data compressed with different methods` 错误. 这修复了 [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复编解码器的返回压缩大小. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当列具有带有非文字参数的压缩编解码器时修复服务器崩溃. 修复 [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). -* 以 nan 为点修复 pointInPolygon. 修复 [#11375](https://github.com/ClickHouse/ClickHouse/issues/11375). [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). -* 修复 JOIN 在 LowCarinality(T) 和 Nullable(T) 上的崩溃. [#11380](https://github.com/ClickHouse/ClickHouse/issues/11380). [#11414](https://github.com/ClickHouse/ClickHouse/pull/11414) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复错误 `USING` 键的错误代码. [#11373](https://github.com/ClickHouse/ClickHouse/issues/11373). [#11404](https://github.com/ClickHouse/ClickHouse/pull/11404) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了带有纬度/经度范围之外的参数的 geohashesInBox. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). -* `joinGet()` 函数更好的错误. [#11389](https://github.com/ClickHouse/ClickHouse/pull/11389) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复具有外部排序和限制的查询可能出现的 `Pipeline stuck` 错误. 修复 [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 在 ReplicatedMergeTree 中发送零件期间删除冗余锁. [#11354](https://github.com/ClickHouse/ClickHouse/pull/11354) ([alesapin](https://github.com/alesapin)). -* 修复了多行模式下 clickhouse-client 对 `\G`(垂直输出)的支持. 这将关闭 [#9933](https://github.com/ClickHouse/ClickHouse/issues/9933). [#11350](https://github.com/ClickHouse/ClickHouse/pull/11350) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复直接从 StorageJoin 选择 (没有 JOIN) 时的崩溃和错误的可空性. [#11340](https://github.com/ClickHouse/ClickHouse/pull/11340) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复 `quantilesExactWeightedArray` 中的崩溃问题. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 现在合并在 `ALTER` 查询中更改元数据之前停止. [#11335](https://github.com/ClickHouse/ClickHouse/pull/11335) ([alesapin](https://github.com/alesapin)). -* 通过再次设置 `parallel_view_processing = 1` 并行写入 `MATERIALIZED VIEW` . 修复 [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当提取的 JSON 具有不平衡的 { 或 [ 字符串时, 修复visitParamExtractRaw. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). -* 修复 ThreadPool 中非常罕见的竞争条件. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复转换中潜在的未初始化内存. 示例: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了如果表的主键中有 Array 列并且查询正在使用 `empty` 或 `notEmpty` 函数按此列过滤时索引分析无法工作的问题. 这修复了 [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复当查询速度估计可能不正确时的错误, 并且如果查询受到 `max_network_bandwidth`、`max_execution_speed` 或 `priority` 设置的限制, `min_execution_speed` 的限制可能无法工作或无法正常工作. 将 `timeout_before_checking_execution_speed` 的默认值更改为非零值, 否则设置 `min_execution_speed` 和 `max_execution_speed` 无效. 这修复了 [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). 这修复了 [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). 这修复了 [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). 可用性改进:避免在 `clickhouse-client` 中将异常消息与进度条串联. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复读取 Protobuf 格式错误数据时崩溃的问题. 这修复了 [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复了缓存字典可以返回默认值而不是正常值 (只有过期键时) 的错误. 这仅影响字符串字段. [#11233](https://github.com/ClickHouse/ClickHouse/pull/11233) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复错误 `Block structure mismatch in QueryPipeline` , 同时从内部查询中的常量读取 `VIEW` . 修复 [#11181](https://github.com/ClickHouse/ClickHouse/issues/11181). [#11205](https://github.com/ClickHouse/ClickHouse/pull/11205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复可能的异常 `Invalid status for associated output`. [#11200](https://github.com/ClickHouse/ClickHouse/pull/11200) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 `Array(Array(LowCardinality))` 捕获参数修复高阶函数的可能错误 `Cannot capture column` . [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 S3 globbing 在超过 1000 个密钥和一些后端的情况下可能会失败的问题. [#11179](https://github.com/ClickHouse/ClickHouse/pull/11179) ([Vladimir Chebotarev](https://github.com/excitoon)). -* 如果数据跳过索引依赖于将在后台合并期间修改的列 (对于 SummingMergeTree、AggregatingMergeTree 以及 TTL GROUP BY), 则计算错误. 此问题已通过合并后移动索引计算得到修复, 因此索引是在合并数据上计算的. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). -* 修复简单查询过多的线程预留 (优化减少线程数量, 在管道更改后部分中断). [#11114](https://github.com/ClickHouse/ClickHouse/pull/11114) ([Azat Khuzhin](https://github.com/azat)). -* 修复分布式查询的谓词优化 (`enable_optimize_predicate_expression=1`) 对于带有 `HAVING` 部分的查询 (即需要在服务器启动器上进行过滤时), 通过保留表达式的顺序 (这足以修复), 并且还强制 聚合器在索引上使用列名. 修复: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). -* 引入提交重试逻辑, 以减少在极少数情况下, 偏移提交失败时从 Kafka 获取重复项的可能性. [#9884](https://github.com/ClickHouse/ClickHouse/pull/9884) ([filimonov](https://github.com/filimonov)). - -#### 性能改进 - -* 每次调用读取外部字典的任何函数时, 仅获取一次字典并检查访问权限. [#10928](https://github.com/ClickHouse/ClickHouse/pull/10928) ([Vitaly Baranov](https://github.com/vitlibar)). - -#### 构建/测试/打包改进 - -* 修复几个不稳定的集成测试. [#11355](https://github.com/ClickHouse/ClickHouse/pull/11355) ([alesapin](https://github.com/alesapin)). - -### ClickHouse 版本 v20.3.10.75-lts 2020-05-23 - -#### Bug 修复 - -* 如果没有最终确定, 则从突变终止任务中删除日志记录. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). -* 修复了 `parseDateTime64BestEffort` 参数解析错误. [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). -* 修复了方法 `getRawData()` 中不正确的原始数据大小. [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). -* 修复了 20.1 及更早版本之间两级聚合的不兼容问题. 当在启动器节点和远程节点上使用不同版本的 ClickHouse 并且 `GROUP BY` 结果的大小很大并且聚合由单个 `String` 字段执行时, 就会发生这种不兼容性. 结果导致单个键的多个未合并的行. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了与 `Distributed` 表中元组的向后兼容性. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). -* 如果这样的键不存在, 则修复了 `StringHashTable` 中的 `SIGSEGV`. [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `ReplicatedMergeTree` 中的错误, 该错误可能导致 `OPTIMIZE` 查询上的某些 `ALTER` 在它变为非活动状态后挂起等待某些副本. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). -* 修复 `Block::sortColumns()` 之后的列顺序. [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). -* 修复了当不要求引用标识符时 `ODBC` 桥的问题. 修复 [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `DateLUT` 中的 `UBSan` 和 `MSan` 报告. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了关键条件下错误的类型转换. 修复[#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)) -* 修复了 `parallel_view_processing` 行为. 现在, 如果发生异常, 所有对 `MATERIALIZED VIEW` 的插入都应该无一例外地完成. 修复 [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了组合符 `-OrNull` 和 `-OrDefault` 与 `-State` 组合时的问题. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). -* 修复了带有嵌套类型的 `generateRandom` 中的崩溃. 修复 [#10583](https://github.com/ClickHouse/ClickHouse/issues/10583). [#10734](https://github.com/ClickHouse/ClickHouse/pull/10734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了合并后可能发生的 `SummingMergeTree` 中 `LowCardinality(FixedString)` 键列的数据损坏. 修复 [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了函数 `h3EdgeAngle` 中可能出现的缓冲区溢出. [#10711](https://github.com/ClickHouse/ClickHouse/pull/10711) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了消失的总数. 如果查询具有连接或具有外部 where 条件的子查询, 则总计可能已被过滤. 修复 [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674). [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了在一个查询中具有相同集合的 `IN` 运算符的多次使用. [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了当 `readonly=2` 和 `cancel_http_readonly_queries_on_client_close=1` 时导致 http 请求卡在客户端关闭的错误. 修复 [#7939](https://github.com/ClickHouse/ClickHouse/issues/7939), [#7019](https://github.com/ClickHouse/ClickHouse/issues/7019), [#7736](https://github.com/ClickHouse/ClickHouse/issues/7736), [#7091](https://github.com/ClickHouse/ClickHouse/issues/7091). [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)). -* 修复了 `AggregateTransform` 构造函数中参数的顺序. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)). -* 修复了启用 `distributed_aggregation_memory_efficient` 时远程查询缺乏并行执行的问题. 修复[#10655](https://github.com/ClickHouse/ClickHouse/issues/10655). [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了使用 `LIMIT` 的查询可能不正确的行数. 修复 [#10566](https://github.com/ClickHouse/ClickHouse/issues/10566), [#10709](https://github.com/ClickHouse/ClickHouse/issues/10709). [#10660](https://github.com/ClickHouse/ClickHouse/pull/10660) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了当表有很多部分时锁定并发更改的错误. [#10659](https://github.com/ClickHouse/ClickHouse/pull/10659) ([alesapin](https://github.com/alesapin)). -* 修复了在 `SYSTEM DROP DNS CACHE` 查询也删除缓存时的错误, 用于检查是否允许用户从某些 IP 地址连接. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)). -* 修复了 `MATERIALIZED VIEW` 内部查询中不正确的标量结果, 以防该查询包含相关表. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了列 `ALIAS` 的 `SELECT`, 它的默认表达式类型与列类型不同. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). -* 实现了 DateTime64 和 String 值之间的比较. [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). -* 修复索引损坏, 在某些情况下将紧凑部分合并到另一个紧凑部分后可能会发生. [#10531](https://github.com/ClickHouse/ClickHouse/pull/10531) ([Anton Popov](https://github.com/CurtizJ)). -* 修复了所有部分mutation完成后, 在 `is_done=0` 中挂掉的情况. [#10526](https://github.com/ClickHouse/ClickHouse/pull/10526) ([alesapin](https://github.com/alesapin)). -* 修复了 unix 纪元开始时与 `UTC` 有小数偏移的时区溢出. 这修复了 [#9335](https://github.com/ClickHouse/ClickHouse/issues/9335). [#10513](https://github.com/ClickHouse/ClickHouse/pull/10513) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了 `Distributed` 存储的不当关闭. [#10491](https://github.com/ClickHouse/ClickHouse/pull/10491) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `simpleLinearRegression` 中大整数上的数字溢出. [#10474](https://github.com/ClickHouse/ClickHouse/pull/10474) ([hcz](https://github.com/hczhcz)). - - -#### 构建/测试/打包改进 - -* 修复 LZ4 库中的 UBSan 报告. [#10631](https://github.com/ClickHouse/ClickHouse/pull/10631) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 clang-10 构建. [#10238](https://github.com/ClickHouse/ClickHouse/issues/10238). [#10370](https://github.com/ClickHouse/ClickHouse/pull/10370) ([Amos Bird](https://github.com/amosbird)). -* 添加了关于 `max_rows_to_sort` 设置的失败测试. [#10268](https://github.com/ClickHouse/ClickHouse/pull/10268) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加了在输入格式中打印诊断信息的一些改进. 修复 [#10204](https://github.com/ClickHouse/ClickHouse/issues/10204). [#10418](https://github.com/ClickHouse/ClickHouse/pull/10418) ([tavplubix](https://github.com/tavplubix)). -* 将 CA 证书添加到 clickhouse-server docker 镜像. [#10476](https://github.com/ClickHouse/ClickHouse/pull/10476) ([filimonov](https://github.com/filimonov)). - -#### Bug 修复 - -* 修复错误 `the BloomFilter false positive must be a double number between 0 and 1` [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). - - -### ClickHouse 版本 v20.3.8.53, 2020-04-23 - -#### Bug 修复 -* 修复了时区的日期时间函数的错误行为, 这些时区在 UTC 的正负偏移量之间发生了变化 (例如 Pacific/Kiritimati). 这修复了[#7202](https://github.com/ClickHouse/ClickHouse/issues/7202) [#10369](https://github.com/ClickHouse/ClickHouse/pull/10369) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复启用 `distributed_group_by_no_merge` 时可能出现的段错误 (在 20.3.7.46 中由 [#10131](https://github.com/ClickHouse/ClickHouse/issues/10131) 引入). [#10399](https://github.com/ClickHouse/ClickHouse/pull/10399) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复 `Array(Tuple(...))` 数据类型的错误扁平化. 这修复了 [#10259](https://github.com/ClickHouse/ClickHouse/issues/10259) [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在聚合器中删除磁盘预留. 这修复了磁盘空间预留的错误, 该错误可能导致大型外部聚合即使成功完成也可能失败. [#10375](https://github.com/ClickHouse/ClickHouse/pull/10375) ([Azat Khuzhin](https://github.com/azat)) -* 修复了 `ReplicatedMergeTree` 中的 `DROP` 与 `OPTIMIZE` 竞赛. 如果存在并发的 OPTIMIZE 查询, 则 DROP 可能会在 ZooKeeper 的副本路径中留下一些垃圾. [#10312](https://github.com/ClickHouse/ClickHouse/pull/10312) ([tavplubix](https://github.com/tavplubix)) -* 修复更改列默认值后服务器无法附加表的错误. [#10441](https://github.com/ClickHouse/ClickHouse/pull/10441) ([alesapin](https://github.com/alesapin)) -* 在加载表之前附加数据库失败时不要删除元数据目录. [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014)) -* 修复了一些错误, 当某些数据以法定人数插入, 然后以某种方式删除 (DROP PARTITION, TTL) 时, 这会导致插入卡住或 SELECT 中的误报异常. 这修复了 [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946) [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 修复 `ConcatProcessor` 中可能发生的 `Pipeline stuck` 错误,该错误可能发生在远程查询中. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复了 HashTable 中尝试从缓冲区读取 HashMap 时导致编译错误的错误行为. [#10386](https://github.com/ClickHouse/ClickHouse/pull/10386) ([palasonic1](https://github.com/palasonic1)) -* 允许对多个 JOIN 使用 `count(*)`. 修复 [#9853](https://github.com/ClickHouse/ClickHouse/issues/9853) [#10291](https://github.com/ClickHouse/ClickHouse/pull/10291) ([Artem Zuikov](https://github.com/4ertus2)) -* 更喜欢 `fallback_to_stale_replicas` 而不是 `skip_unavailable_shards`, 否则当两个设置都指定并且没有最新的副本时, 查询将失败 (来自@alex-zaitsev的补丁). 修复: [#2564](https://github.com/ClickHouse/ClickHouse/issues/2564). [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat)) -* 修复带有 ARRAY JOIN、ORDER BY 和 LIMIT 的查询可能返回不完整结果的问题. 这修复了 [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). 作者: [Vadim Plakhtinskiy](https://github.com/VadimPlh). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 创建 BloomFilter 索引时检查参数的数量和类型. [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623) [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014)) - -#### 性能改进 -* 在 `IN` 运算符的右侧显式定义的集合和左侧的元组提高了查询的性能. 这修复了 20.3 版中的性能回归. [#9740](https://github.com/ClickHouse/ClickHouse/pull/9740), [#10385](https://github.com/ClickHouse/ClickHouse/pull/10385) ([Anton Popov](https://github.com/CurtizJ)) - -### ClickHouse 版本 v20.3.7.46, 2020-04-17 - -#### Bug 修复 - -* 修复 `Logical error: CROSS JOIN has expressions` 错误, 用于使用逗号和名称连接混合的查询. [#10311](https://github.com/ClickHouse/ClickHouse/pull/10311) ([Artem Zuikov](https://github.com/4ertus2)). -* 使用 `max_bytes_before_external_group_by` 修复查询. [#10302](https://github.com/ClickHouse/ClickHouse/pull/10302) ([Artem Zuikov](https://github.com/4ertus2)). -* 在存在数组连接函数的情况下修复移动到前置位置优化 (在某些情况下). 这修复了[#10092](https://github.com/ClickHouse/ClickHouse/issues/10092). [#10195](https://github.com/ClickHouse/ClickHouse/pull/10195) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加放宽对使用 `allow_nondeterministic_mutations` 设置的突变中非确定性函数使用限制的能力. [#10186](https://github.com/ClickHouse/ClickHouse/pull/10186) ([filimonov](https://github.com/filimonov)). - -### ClickHouse 版本 v20.3.6.40, 2020-04-16 - -#### 新特征 - -* 添加函数 `isConstant`. 此函数检查其参数是否为常量表达式并返回 1 或 0. 用于开发、调试和演示目的. [#10198](https://github.com/ClickHouse/ClickHouse/pull/10198) ([alexey-milovidov](https://github.com/alexey-milovidov)). - -#### Bug 修复 - -* 使用 `max_rows_to_group_by` 和 `group_by_overflow_mode = 'break'` 修复错误 `Pipeline stuck`. [#10279](https://github.com/ClickHouse/ClickHouse/pull/10279) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复罕见的可能异常 `Cannot drain connections: cancel first`. [#10239](https://github.com/ClickHouse/ClickHouse/pull/10239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了 ClickHouse 会抛出 `Unknown function lambda.` 的错误. 当用户尝试在 ENGINE = Replicated* 的表上运行 ALTER UPDATE/DELETE 时出现错误消息. 检查非确定性函数现在可以正确处理 lambda 表达式. [#10237](https://github.com/ClickHouse/ClickHouse/pull/10237) ([Alexander Kazakov](https://github.com/Akazz)). -* 修复了 Date 类型的 `generateRandom` 函数. 这修复了 [#9973](https://github.com/ClickHouse/ClickHouse/issues/9973). 修复了将 2106 年的日期插入到使用旧式分区的 MergeTree 表但分区以 1970 年命名的边缘情况. [#10218](https://github.com/ClickHouse/ClickHouse/pull/10218) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 如果 View 的表定义与 SELECT 查询不对应,则转换类型. 这修复了 [#10180](https://github.com/ClickHouse/ClickHouse/issues/10180) and [#10022](https://github.com/ClickHouse/ClickHouse/issues/10022). [#10217](https://github.com/ClickHouse/ClickHouse/pull/10217) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 RFC-2822 中字符串的 `parseDateTimeBestEffort`, 当一周中的某一天是星期二或星期四时. 这修复了[#10082](https://github.com/ClickHouse/ClickHouse/issues/10082). [#10214](https://github.com/ClickHouse/ClickHouse/pull/10214) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 JOIN 内的常量列名可能与 JOIN 外的常量名冲突. [#10207](https://github.com/ClickHouse/ClickHouse/pull/10207) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 当查询实际上应该在 LIMIT 停止时, 修复可能的无限查询执行, 同时从无限源 (如 `system.numbers` 或 `system.zeros` ) 读取. [#10206](https://github.com/ClickHouse/ClickHouse/pull/10206) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复未指定数据库时使用当前数据库进行访问检查的问题. [#10192](https://github.com/ClickHouse/ClickHouse/pull/10192) ([Vitaly Baranov](https://github.com/vitlibar)). -* 如果结构在 INSERT 中不匹配, 则将块转换为 Distributed(). [#10135](https://github.com/ClickHouse/ClickHouse/pull/10135) ([Azat Khuzhin](https://github.com/azat)). -* 修复处理器管道中极端情况可能导致的错误结果. [#10131](https://github.com/ClickHouse/ClickHouse/pull/10131) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 用合并部分修复某些类型的改动. [#10130](https://github.com/ClickHouse/ClickHouse/pull/10130) ([Anton Popov](https://github.com/CurtizJ)). -* 在创建新副本时修复不正确的 `index_granularity_bytes` 检查. 修复 [#10098](https://github.com/ClickHouse/ClickHouse/issues/10098). [#10121](https://github.com/ClickHouse/ClickHouse/pull/10121) ([alesapin](https://github.com/alesapin)). -* 当其结构与基础表不同时, 修复 INSERT 上的 SIGSEGV 到分布式表中. [#10105](https://github.com/ClickHouse/ClickHouse/pull/10105) ([Azat Khuzhin](https://github.com/azat)). -* 使用 `JOIN` 和 `UNION ALL` 修复查询可能丢失的行. 修复 [#9826](https://github.com/ClickHouse/ClickHouse/issues/9826), [#10113](https://github.com/ClickHouse/ClickHouse/issues/10113). [#10099](https://github.com/ClickHouse/ClickHouse/pull/10099) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了从不存在 `/table/replicas/replica_name/metadata` 节点的旧 ClickHouse 版本更新时复制表启动的问题. 修复 [#10037](https://github.com/ClickHouse/ClickHouse/issues/10037). [#10095](https://github.com/ClickHouse/ClickHouse/pull/10095) ([alesapin](https://github.com/alesapin)). -* 为 MySQL 数据库引擎添加一些参数检查和支持标识符参数. [#10077](https://github.com/ClickHouse/ClickHouse/pull/10077) ([Winter Zhang](https://github.com/zhang2014)). -* 修复来自 localhost clickhouse 服务器的 clickhouse 字典源中的错误. 如果字典和源中的类型不兼容, 该错误可能会导致内存损坏. [#10071](https://github.com/ClickHouse/ClickHouse/pull/10071) ([alesapin](https://github.com/alesapin)). -* 当表包含跳过索引时, 修复`CHECK TABLE`查询中的错误. [#10068](https://github.com/ClickHouse/ClickHouse/pull/10068) ([alesapin](https://github.com/alesapin)). -* 修复错误 `Cannot clone block with columns because block has 0 columns ... While executing GroupingAggregatedTransform`. 当设置 `distributed_aggregation_memory_efficient` 被启用, 并且分布式查询从不同分片读取不同级别的聚合数据时发生这种情况 (混合单级和二级聚合). [#10063](https://github.com/ClickHouse/ClickHouse/pull/10063) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 GROUP BY 中可能发生的分段错误, 该错误是包含尾随零字节的字符串键 ([#8636](https://github.com/ClickHouse/ClickHouse/issues/8636), [#8925](https://github.com/ClickHouse/ClickHouse/issues/8925)). [#10025](https://github.com/ClickHouse/ClickHouse/pull/10025) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 修复用于远程查询执行的线程数 (性能回归, 自 20.3 起). 当来自 `Distributed` 表的查询在本地和远程分片上同时执行时, 就会发生这种情况. 修复 [#9965](https://github.com/ClickHouse/ClickHouse/issues/9965). [#9971](https://github.com/ClickHouse/ClickHouse/pull/9971) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了在某些数据库查询的处理阶段之一未检索到必要表的错误. 修复 [#9699](https://github.com/ClickHouse/ClickHouse/issues/9699). [#9949](https://github.com/ClickHouse/ClickHouse/pull/9949) ([achulkov2](https://github.com/achulkov2)). -* 修复 `JOIN` 与 `TOTALS` 一起出现时 `Not found column in block` 错误. 修复 [#9839](https://github.com/ClickHouse/ClickHouse/issues/9839). [#9939](https://github.com/ClickHouse/ClickHouse/pull/9939) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复 `ON CLUSTER` DDL 查询在服务器启动时冻结的错误 [#9927](https://github.com/ClickHouse/ClickHouse/pull/9927) ([Gagan Arneja](https://github.com/garneja)). -* 修复解析 CREATE USER 命令中设置的多个主机, 例如 `CREATE USER user6 HOST NAME REGEXP 'lo.?*host', NAME REGEXP 'lo*host'`. [#9924](https://github.com/ClickHouse/ClickHouse/pull/9924) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复连接表引擎的 `TRUNCATE` ([#9917](https://github.com/ClickHouse/ClickHouse/issues/9917)). [#9920](https://github.com/ClickHouse/ClickHouse/pull/9920) ([Amos Bird](https://github.com/amosbird)). -* 修复 ALTER 中的 `scalar does not exist` 错误 ([#9878](https://github.com/ClickHouse/ClickHouse/issues/9878)). [#9904](https://github.com/ClickHouse/ClickHouse/pull/9904) ([Amos Bird](https://github.com/amosbird)). -* 修复 `ReplicatedMergeTree` 中删除和优化之间的竞争条件. [#9901](https://github.com/ClickHouse/ClickHouse/pull/9901) ([alesapin](https://github.com/alesapin)). -* 修复 `distributed_product_mode='local'` 中的限定名称错误. 修复 [#4756](https://github.com/ClickHouse/ClickHouse/issues/4756). [#9891](https://github.com/ClickHouse/ClickHouse/pull/9891) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复了设置 `allow_introspection_functions` 中内省函数的计算授权. [#9840](https://github.com/ClickHouse/ClickHouse/pull/9840) ([Vitaly Baranov](https://github.com/vitlibar)). - -#### 构建/测试/打包改进 - -* 修复集成测试`test_settings_constraints`. [#9962](https://github.com/ClickHouse/ClickHouse/pull/9962) ([Vitaly Baranov](https://github.com/vitlibar)). -* 删除了对 `clock_getres` 的依赖. [#9833](https://github.com/ClickHouse/ClickHouse/pull/9833) ([alexey-milovidov](https://github.com/alexey-milovidov)). - - -### ClickHouse 版本 v20.3.5.21, 2020-03-27 - -#### Bug 修复 - -* 当查询在分布式表上具有 PREWHERE 和 WHERE 并且 `SET distributed_product_mode = 'local'` 时, 修复 `Different expressions with the same alias` 错误. [#9871](https://github.com/ClickHouse/ClickHouse/pull/9871) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复具有复合主键的表的突变过多的内存消耗. 这修复了[#9850](https://github.com/ClickHouse/ClickHouse/issues/9850). [#9860](https://github.com/ClickHouse/ClickHouse/pull/9860) ([alesapin](https://github.com/alesapin)). -* 对于 INSERT 查询, 分片现在将从发起者获得的设置限制在分片的约束中, 而不是抛出异常. 此修复允许将 INSERT 查询发送到具有其他约束的分片. 此更改改进了修复 [#9447](https://github.com/ClickHouse/ClickHouse/issues/9447). [#9852](https://github.com/ClickHouse/ClickHouse/pull/9852) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复 `COMMA to CROSS JOIN rewriter is not enabled or cannot rewrite query` 错误, 以防在表列表中使用 COMMA JOIN 进行子查询 (即在 WHERE 中). 修复[#9782](https://github.com/ClickHouse/ClickHouse/issues/9782). [#9830](https://github.com/ClickHouse/ClickHouse/pull/9830) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复客户端上可能出现的异常 `Got 0 in totals chunk, expected 1` on client. 如果右连接表有零行, 则使用“JOIN”进行查询时会发生这种情况. 示例: `select * from system.one t1 join system.one t2 on t1.dummy = t2.dummy limit 0 FORMAT TabSeparated;`. 修复 [#9777](https://github.com/ClickHouse/ClickHouse/issues/9777). [#9823](https://github.com/ClickHouse/ClickHouse/pull/9823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 无法转换类型时使用 optimize_skip_unused_shards 修复 SIGSEGV. [#9804](https://github.com/ClickHouse/ClickHouse/pull/9804) ([Azat Khuzhin](https://github.com/azat)). -* 修复损坏的 `ALTER TABLE DELETE COLUMN` 查询合并部分. [#9779](https://github.com/ClickHouse/ClickHouse/pull/9779) ([alesapin](https://github.com/alesapin)). -* 修复 max_distributed_connections (带和不带处理器). [#9673](https://github.com/ClickHouse/ClickHouse/pull/9673) ([Azat Khuzhin](https://github.com/azat)). -* 修复了函数参数的时区使用不正确的一些情况. [#9574](https://github.com/ClickHouse/ClickHouse/pull/9574) ([Vasily Nemkov](https://github.com/Enmk)). - -#### 改进 - -* 由于我们从单个线程中的单个有序部分读取, 因此逐阶段从突变中删除顺序. 还添加检查突变中的行顺序是否按排序键顺序排序并且不违反此顺序. [#9886](https://github.com/ClickHouse/ClickHouse/pull/9886) ([alesapin](https://github.com/alesapin)). - - -### ClickHouse 版本 v20.3.4.10, 2020-03-20 - -#### Bug 修复 -* 此版本还包含 20.1.8.41 的所有错误修复. -* 修复丢失的 `rows_before_limit_at_least` 用于通过 http (使用处理器管道) 的查询. 这修复了 [#9730](https://github.com/ClickHouse/ClickHouse/issues/9730). [#9757](https://github.com/ClickHouse/ClickHouse/pull/9757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) - - -### ClickHouse 版本 v20.3.3.6, 2020-03-17 - -#### Bug 修复 -* 此版本还包含 20.1.7.38 的所有错误修复. -* 修复复制中的错误, 如果用户在以前的版本上执行了更改, 则不允许复制工作. 这修复了 [#9645](https://github.com/ClickHouse/ClickHouse/issues/9645). [#9652](https://github.com/ClickHouse/ClickHouse/pull/9652) ([alesapin](https://github.com/alesapin)). It makes version 20.3 backward compatible again. -* 添加设置 `use_compact_format_in_distributed_parts_names` , 它允许将 `INSERT` 查询的文件以更紧凑的格式写入 `Distributed` 表. 这修复了 [#9647](https://github.com/ClickHouse/ClickHouse/issues/9647). [#9653](https://github.com/ClickHouse/ClickHouse/pull/9653) ([alesapin](https://github.com/alesapin)). 它使 20.3 版再次向后兼容. - -### ClickHouse 版本 v20.3.2.1, 2020-03-12 - -#### 向后不兼容变更 - -* 修复了为大量副本的 `Distributed` 表发送数据时 `file name too long` 的问题. 修复了副本凭据在服务器日志中暴露的问题. 磁盘目录名格式改为 `[shard{shard_index}[_replica{replica_index}]]`. [#8911](https://github.com/ClickHouse/ClickHouse/pull/8911) ([Mikhail Korotov](https://github.com/millb)) 升级到新版本后, 您将不会无需人工干预即可降级, 因为旧服务器版本无法识别新目录格式. 如果要降级, 则必须手动将相应目录重命名为旧格式. 仅当您对 `Distributed` 表使用异步 `INSERT` 时, 此更改才相关. 在 20.3.3 版本中, 我们将引入一个设置, 允许您逐步启用新格式. -* 更改了突变命令的复制日志条目的格式. 在安装新版本之前, 您必须等待旧的突变处理. -* 实现简单的内存分析器, 在超过软分配限制 [#8765](https://github.com/ClickHouse/ClickHouse/pull/8765) ([Ivan](https:// github.com/abyss7)) [#9472](https://github.com/ClickHouse/ClickHouse/pull/9472) ([alexey-milovidov](https://github.com/alexey-milovidov)) 专栏 `system.trace_log` 的内容从 `timer_type` 重命名为 `trace_type`. 这将需要更改第三方性能分析和火焰图处理工具. -* 在任何地方使用 OS 线程 id 而不是内部线程号. 这修复了 [#7477](https://github.com/ClickHouse/ClickHouse/issues/7477) 当启用设置 `send_logs_level` 时, 旧的 `clickhouse-client` 无法接收从服务器发送的日志, 因为名称和结构化日志消息的类型已更改. 另一方面, 不同的服务器版本可以相互发送不同类型的日志. 当你不使用 `send_logs_level` 设置时, 你应该不在乎. [#8954](https://github.com/ClickHouse/ClickHouse/pull/8954) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 移除 `indexHint` 函数. [#9542](https://github.com/ClickHouse/ClickHouse/pull/9542) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 移除 `findClusterIndex`、`findClusterValue` 函数. 这修复了 [#8641](https://github.com/ClickHouse/ClickHouse/issues/8641). 如果您正在使用这些功能, 请发送电子邮件至 `clickhouse-feedback@yandex-team.com`. [#9543](https://github.com/ClickHouse/ClickHouse/pull/9543) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 现在不允许使用 `SELECT` 子查询作为默认表达式创建列或添加列. [#9481](https://github.com/ClickHouse/ClickHouse/pull/9481) ([alesapin](https://github.com/alesapin)) -* JOIN 中的子查询需要别名. [#9274](https://github.com/ClickHouse/ClickHouse/pull/9274) ([Artem Zuikov](https://github.com/4ertus2)) -* 改进了 `ALTER MODIFY/ADD` 查询逻辑. 现在你不能在没有类型的情况下 `ADD` 列, `MODIFY` 默认表达式不会改变列的类型, `MODIFY` 类型不会丢失默认表达式值. 修复 [#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). [#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) ([alesapin](https://github.com/alesapin)) -* 需要重新启动服务器以应用日志配置中的更改. 这是一个临时解决方法, 以避免服务器记录到已删除的日志文件的错误 (请参阅 [#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 默认情况下启用设置 `experimental_use_processors`. 此设置启用新查询管道的使用. 这是内部重构, 我们预计不会有明显的变化. 如果您会看到任何问题, 请将其设置为零. [#8768](https://github.com/ClickHouse/ClickHouse/pull/8768) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 新特征 -* 添加 `Avro` 和 `AvroConfluent` 输入/输出格式. [#8571](https://github.com/ClickHouse/ClickHouse/pull/8571) ([Andrew Onyshchuk](https://github.com/oandrew)) [#8957](https://github.com/ClickHouse/ClickHouse/pull/8957) ([Andrew Onyshchuk](https://github.com/oandrew)) [#8717](https://github.com/ClickHouse/ClickHouse/pull/8717) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* `cache` 字典中过期键的多线程和非阻塞更新 (具有读取旧键的可选权限). [#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 添加查询 `ALTER ... MATERIALIZE TTL`. 它运行突变, 强制通过 TTL 删除过期数据并重新计算有关 TTL 的所有部分的元信息. [#8775](https://github.com/ClickHouse/ClickHouse/pull/8775) ([Anton Popov](https://github.com/CurtizJ)) -* 如果需要, 从 HashJoin 切换到 MergeJoin (在磁盘上). [#9082](https://github.com/ClickHouse/ClickHouse/pull/9082) ([Artem Zuikov](https://github.com/4ertus2)) -* 为 `ALTER TABLE` 添加了 `MOVE PARTITION` 命令. [#4729](https://github.com/ClickHouse/ClickHouse/issues/4729) [#6168](https://github.com/ClickHouse/ClickHouse/pull/6168) ([Guillaume Tassery](https://github.com/YiuRULE)) -* 即时从配置文件重新加载存储配置. [#8594](https://github.com/ClickHouse/ClickHouse/pull/8594) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 允许将 `storage_policy` 更改为不那么丰富的一个. [#8107](https://github.com/ClickHouse/ClickHouse/pull/8107) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 添加了对 S3 存储和表功能的通配符/通配符的支持. [#8851](https://github.com/ClickHouse/ClickHouse/pull/8851) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 为 `FixedString(N)` 数据类型实现 `bitAnd`、`bitOr`、`bitXor`、`bitNot`. [#9091](https://github.com/ClickHouse/ClickHouse/pull/9091) ([Guillaume Tassery](https://github.com/YiuRULE)) -* 添加函数 `bitCount` . 这修复了 [#8702](https://github.com/ClickHouse/ClickHouse/issues/8702). [#8708](https://github.com/ClickHouse/ClickHouse/pull/8708) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#8749](https://github.com/ClickHouse/ClickHouse/pull/8749) ([ikopylov](https://github.com/ikopylov)) -* 添加 `generateRandom` 表函数以生成具有给定模式的随机行. 允许用数据填充任意测试表. [#8994](https://github.com/ClickHouse/ClickHouse/pull/8994) ([Ilya Yatsishin](https://github.com/qoega)) -* `JSONEachRowFormat`: 当对象包含在顶级数组中时支持特殊情况. [#8860](https://github.com/ClickHouse/ClickHouse/pull/8860) ([Kruglov Pavel](https://github.com/Avogar)) -* 现在可以使用 `DEFAULT` 表达式创建一个列, 该列依赖于具有默认 `ALIAS` 表达式的列. [#9489](https://github.com/ClickHouse/ClickHouse/pull/9489) ([alesapin](https://github.com/alesapin)) -* 允许在 `clickhouse-obfuscator` 中指定大于源数据大小的 `--limit`. 数据将用不同的随机种子重复. [#9155](https://github.com/ClickHouse/ClickHouse/pull/9155) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加了带有储层采样算法的 `groupArraySample` 函数 (类似于 `group Array` ). [#8286](https://github.com/ClickHouse/ClickHouse/pull/8286) ([Amos Bird](https://github.com/amosbird)) -* 现在您可以通过系统指标监控 `cache`/`complex_key_cache` 字典中更新队列的大小. [#9413](https://github.com/ClickHouse/ClickHouse/pull/9413) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 允许使用 CRLF 作为 CSV 输出格式的行分隔符, 并将 `output_format_csv_crlf_end_of_line` 设置为 1 [#8934](https://github.com/ClickHouse/ClickHouse/pull/8934) [#8935](https://github.com/ClickHouse/ClickHouse/pull/8935) [#8963](https://github.com/ClickHouse/ClickHouse/pull/8963) ([Mikhail Korotov](https://github.com/millb)) -* 实现[H3](https://github.com/uber/h3) API的更多功能: `h3GetBaseCell`、`h3HexAreaM2`、`h3IndexesAreNeighbors`、`h3ToChildren`、`h3ToString`和`stringToH3`. [#8938](https://github.com/ClickHouse/ClickHouse/pull/8938) ([Nico Mandery](https://github.com/nmandery)) -* 引入了新设置: `max_parser_depth` 以控制最大堆栈大小并允许大型复杂查询. 这修复了 [#6681](https://github.com/ClickHouse/ClickHouse/issues/6681) 和 [#7668](https://github.com/ClickHouse/ClickHouse/issues/7668). [#8647](https://github.com/ClickHouse/ClickHouse/pull/8647) ([Maxim Smirnov](https://github.com/qMBQx8GH)) -* 如果无法跳过未使用的分片, 则添加设置 `force_optimize_skip_unused_shards` 设置以抛出. [#8805](https://github.com/ClickHouse/ClickHouse/pull/8805) ([Azat Khuzhin](https://github.com/azat)) -* 允许配置多个磁盘/卷来存储数据以在 `Distributed` 引擎中发送. [#8756](https://github.com/ClickHouse/ClickHouse/pull/8756) ([Azat Khuzhin](https://github.com/azat)) -* 支持存储临时数据的存储策略 (``). [#8750](https://github.com/ClickHouse/ClickHouse/pull/8750) ([Azat Khuzhin](https://github.com/azat)) -* 添加了 `X-ClickHouse-Exception-Code` HTTP 标头, 如果在发送数据之前抛出异常, 则会设置该标头. 这实现了 [#4971](https://github.com/ClickHouse/ClickHouse/issues/4971). [#8786](https://github.com/ClickHouse/ClickHouse/pull/8786) ([Mikhail Korotov](https://github.com/millb)) -* 添加函数 `ifNotFinite`. 它只是一个语法糖: `ifNotFinite(x, y) = isFinite(x) ? x : y`. [#8710](https://github.com/ClickHouse/ClickHouse/pull/8710) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在 `system.dictionaries` 表中添加了 `last_successful_update_time` 列. [#9394](https://github.com/ClickHouse/ClickHouse/pull/9394) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 添加 `blockSerializedSize` 函数 (未压缩的磁盘大小). [#8952](https://github.com/ClickHouse/ClickHouse/pull/8952) ([Azat Khuzhin](https://github.com/azat)) -* 添加函数 `moduloOrZero`. [#9358](https://github.com/ClickHouse/ClickHouse/pull/9358) ([hcz](https://github.com/hczhcz)) -* 添加了系统表`system.zeros` 和`system.zeros_mt` 以及故事函数`zeros()` 和`zeros_mt()`. 表 (和表函数) 包含名称为 `zero` 且类型为 `UInt8` 的单列. 此列包含零. 出于测试目的需要它作为生成多行的最快方法. 这修复了 [#6604](https://github.com/ClickHouse/ClickHouse/issues/6604) [#9593](https://github.com/ClickHouse/ClickHouse/pull/9593) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) - -#### 实验功能 -* 在`MergeTree`-family 表中添加新的零件紧凑格式, 其中所有列都存储在一个文件中. 它有助于提高小而频繁的插入的性能. 旧格式 (每列一个文件) 现在称为宽格式. 数据存储格式由设置 `min_bytes_for_wide_part` 和 `min_rows_for_wide_part` 控制. [#8290](https://github.com/ClickHouse/ClickHouse/pull/8290) ([Anton Popov](https://github.com/CurtizJ)) -* 支持对 `Log`、`TinyLog` 和`StripeLog` 表的S3 存储. [#8862](https://github.com/ClickHouse/ClickHouse/pull/8862) ([Pavel Kovalenko](https://github.com/Jokser)) - -#### Bug 修复 -* 修复了日志消息中不一致的空格. [#9322](https://github.com/ClickHouse/ClickHouse/pull/9322) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复未命名元组数组在表创建时被展平为嵌套结构的错误. [#8866](https://github.com/ClickHouse/ClickHouse/pull/8866) ([achulkov2](https://github.com/achulkov2)) -* 修复了 `File` 表或 `file` 表函数中匹配 glob 模式的文件过多时, 可能会出现 `Too many open files` 错误的问题. 现在文件被懒惰地打开. 这修复了 [#8857](https://github.com/ClickHouse/ClickHouse/issues/8857) [#8861](https://github.com/ClickHouse/ClickHouse/pull/8861) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* DROP TEMPORARY TABLE 现在只删除临时表. [#8907](https://github.com/ClickHouse/ClickHouse/pull/8907) ([Vitaly Baranov](https://github.com/vitlibar)) -* 当我们关闭服务器或 DETACH/ATTACH 表时删除过时的分区. [#8602](https://github.com/ClickHouse/ClickHouse/pull/8602) ([Guillaume Tassery](https://github.com/YiuRULE)) -* 关于默认磁盘如何计算 `data` 子目录中的可用空间. 修复了如果将 `data` 目录安装到单独的设备 (罕见情况), 则无法正确计算可用空间量的问题. 这修复了 [#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) [#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) ([Mikhail Korotov](https://github.com/millb)) -* 允许逗号 (交叉) 与 IN() 内连接. [#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) ([Artem Zuikov](https://github.com/4ertus2)) -* 如果 WHERE 部分中有 [NOT] LIKE 运算符, 则允许将 CROSS 重写为 INNER JOIN. [#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) ([Artem Zuikov](https://github.com/4ertus2)) -* 在启用设置 `distributed_aggregation_memory_efficient` 的情况下修复` GROUP BY` 后可能出现的错误结果. 修复 [#9134](https://github.com/ClickHouse/ClickHouse/issues/9134). [#9289](https://github.com/ClickHouse/ClickHouse/pull/9289) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 找到的键在缓存字典的度量中被计为遗漏. [#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 修复 [#8598](https://github.com/ClickHouse/ClickHouse/issues/8598) 中引入的复制协议不兼容性. [#9412](https://github.com/ClickHouse/ClickHouse/pull/9412) ([alesapin](https://github.com/alesapin)) -* 修复了 `ReplicatedMergeTree` 表启动时 `queue_task_handle` 上的竞争条件. [#9552](https://github.com/ClickHouse/ClickHouse/pull/9552) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 令牌 `NOT` 在 `SHOW TABLES NOT LIKE` 查询中不起作用. [#8727](https://github.com/ClickHouse/ClickHouse/issues/8727) [#8940](https://github.com/ClickHouse/ClickHouse/pull/8940) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加范围检查功能 `h3EdgeLengthM`. 如果没有这个检查, 缓冲区溢出是可能的. [#8945](https://github.com/ClickHouse/ClickHouse/pull/8945) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了多个参数 (超过 10 个) 的三元逻辑 OP 的批量计算中的错误. [#8718](https://github.com/ClickHouse/ClickHouse/pull/8718) ([Alexander Kazakov](https://github.com/Akazz)) -* 修复 PREWHERE 优化错误,可能导致段错误或 `Inconsistent number of columns got from MergeTreeRangeReader` 异常. [#9024](https://github.com/ClickHouse/ClickHouse/pull/9024) ([Anton Popov](https://github.com/CurtizJ)) -* 修复意外的 `Timeout exceeded while reading from socket` 异常, 该异常在实际超过超时之前和启用查询分析器时在安全连接上随机发生. 同时添加 `connect_timeout_with_failover_secure_ms`设置 (默认100ms), 与 `connect_timeout_with_failover_ms` 类似, 但用于安全连接 (因为SSL握手比普通TCP连接慢). [#9026](https://github.com/ClickHouse/ClickHouse/pull/9026) ([tavplubix](https://github.com/tavplubix)) -* 修复突变终止的错误, 当突变可能挂在 `parts_to_do=0` 和 `is_done=0` 状态时. [#9022](https://github.com/ClickHouse/ClickHouse/pull/9022) ([alesapin](https://github.com/alesapin)) -* 使用带有 `partial_merge_join` 设置的新 ANY JOIN 逻辑. 现在可以使用 `partial_merge_join=1` 进行 `ANY|ALL|SEMI LEFT` 和 `ALL INNER` 连接. [#8932](https://github.com/ClickHouse/ClickHouse/pull/8932) ([Artem Zuikov](https://github.com/4ertus2)) -* 分片现在将从发起者获得的设置限制到分片的约束, 而不是抛出异常. 此修复允许将查询发送到具有其他约束的分片. [#9447](https://github.com/ClickHouse/ClickHouse/pull/9447) ([Vitaly Baranov](https://github.com/vitlibar)) -* 修复了 `MergeTreeReadPool` 中的内存管理问题. [#8791](https://github.com/ClickHouse/ClickHouse/pull/8791) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 使用字符串 `e` 调用时修复 `toDecimal*OrNull()` 函数族. 修复[#8312](https://github.com/ClickHouse/ClickHouse/issues/8312) [#8764](https://github.com/ClickHouse/ClickHouse/pull/8764) ([Artem Zuikov](https://github.com/4ertus2)) -* 确保 `FORMAT Null` 没有向客户端发送数据. [#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 修复 `LiveViewBlockInputStream` 中的时间戳不会更新的错误. `LIVE VIEW` 是一项实验性功能. [#8644](https://github.com/ClickHouse/ClickHouse/pull/8644) ([vxider](https://github.com/Vxider)) [#8625](https://github.com/ClickHouse/ClickHouse/pull/8625) ([vxider](https://github.com/Vxider)) -* 修复了不允许删除旧 TTL 表达式的 `ALTER MODIFY TTL` 错误行为. [#8422](https://github.com/ClickHouse/ClickHouse/pull/8422) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 修复了 MergeTreeIndexSet 中的 UBSan 报告. 这修复了 [#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) [#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了当 haystack 有零字节时 `match` 和 `extract` 函数的行为. 当 haystack 不变时, 行为是错误的. 这修复了 [#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) [#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#9345](https://github.com/ClickHouse/ClickHouse/pull/9345) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 避免从 Apache Avro 3rd 方库中的析构函数抛出. [#9066](https://github.com/ClickHouse/ClickHouse/pull/9066) ([Andrew Onyshchuk](https://github.com/oandrew)) -* 不要提交部分从 `Kafka` 轮询的批处理, 因为它可能导致数据漏洞. [#8876](https://github.com/ClickHouse/ClickHouse/pull/8876) ([filimonov](https://github.com/filimonov)) -* 使用可为空的返回类型修复 `joinGet`. [#8919](https://github.com/ClickHouse/ClickHouse/issues/8919) [#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) ([Amos Bird](https://github.com/amosbird)) -* 修复使用 `T64`编解码器压缩时数据不兼容的问题. [#9016](https://github.com/ClickHouse/ClickHouse/pull/9016) ([Artem Zuikov](https://github.com/4ertus2)) 修复`T64`压缩编解码器中导致的数据类型ID 在受影响的版本中错误 (解) 压缩 [#9033](https://github.com/ClickHouse/ClickHouse/pull/9033) ([Artem Zuikov](https://github.com/4ertus2)) -* 添加设置 `enable_early_constant_folding` 并在某些导致错误的情况下禁用它. [#9010](https://github.com/ClickHouse/ClickHouse/pull/9010) ([Artem Zuikov](https://github.com/4ertus2)) -* 使用 VIEW 修复下推谓词优化器并启用测试. [#9011](https://github.com/ClickHouse/ClickHouse/pull/9011) ([Winter Zhang](https://github.com/zhang2014)) -* 修复 `Merge` 表中的段错误, 这在从 `File` 存储读取时可能发生. [#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) ([tavplubix](https://github.com/tavplubix)) -* 在 `ATTACH PARTITION FROM`、`REPLACE PARTITION`、`MOVE TO TABLE`中添加了对存储策略的检查. 否则会导致重启后部分数据无法访问, 导致ClickHouse无法启动. [#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 如果为表设置了 TTL, 则修复更改. [#8800](https://github.com/ClickHouse/ClickHouse/pull/8800) ([Anton Popov](https://github.com/CurtizJ)) -* 修复在修改/添加/删除某些字典时执行 `SYSTEM RELOAD ALL DICTIONARIES` 时可能发生的竞争条件. [#8801](https://github.com/ClickHouse/ClickHouse/pull/8801) ([Vitaly Baranov](https://github.com/vitlibar)) -* 在以前的版本 `Memory` 数据库引擎使用空数据路径, 所以表在 `path `目录 (例如 `/var/lib/clickhouse/`) 中创建, 而不是在数据库的数据目录中 (例如. `/var/lib/clickhouse/db_name`). [#8753](https://github.com/ClickHouse/ClickHouse/pull/8753) ([tavplubix](https://github.com/tavplubix)) -* 修复了有关缺少默认磁盘或策略的错误日志消息. [#9530](https://github.com/ClickHouse/ClickHouse/pull/9530) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 修复 not(has()) 数组类型的bloom_filter索引. [#9407](https://github.com/ClickHouse/ClickHouse/pull/9407) ([achimbab](https://github.com/achimbab)) -* 允许带有 `Log` 引擎的表中的第一列作为别名 [#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) ([Ivan](https://github.com/abyss7)) -* 在一个线程中从 `MergeTree` 表读取时修复范围的顺序. 它可能导致 `MergeTreeRangeReader` 的异常或错误的查询结果. [#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) ([Anton Popov](https://github.com/CurtizJ)) -* 使 `reinterpretAsFixedString` 返回 `FixedString` 而不是 `String`. [#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) ([Andrew Onyshchuk](https://github.com/oandrew)) -* 避免极少数情况下用户可能会收到错误的错误消息 (`Success`而不是详细的错误描述). [#9457](https://github.com/ClickHouse/ClickHouse/pull/9457) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 使用带有空行模板的 `Template` 格式时不会崩溃. [#8785](https://github.com/ClickHouse/ClickHouse/pull/8785) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 系统表的元数据文件可能创建在错误的位置 [#8653](https://github.com/ClickHouse/ClickHouse/pull/8653) ([tavplubix](https://github.com/tavplubix)) Fixes [#8581](https://github.com/ClickHouse/ClickHouse/issues/8581). -* 修复缓存字典中 exception_ptr 的数据竞争 [#8303](https://github.com/ClickHouse/ClickHouse/issues/8303). [#9379](https://github.com/ClickHouse/ClickHouse/pull/9379) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 不要为查询 `ATTACH TABLE IF NOT EXISTS` 抛出异常. 以前, 如果表已经存在, 则抛出它, 尽管有 `IF NOT EXISTS` 子句. [#8967](https://github.com/ClickHouse/ClickHouse/pull/8967) ([Anton Popov](https://github.com/CurtizJ)) -* 修复了异常消息中缺少关闭括号的问题. [#8811](https://github.com/ClickHouse/ClickHouse/pull/8811) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在交互模式下启动 clickhouse-client 时避免消息 `Possible deadlock avoid` . [#9455](https://github.com/ClickHouse/ClickHouse/pull/9455) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了 base64 编码值末尾填充可能格式错误的问题. 更新 base64 库. 这修复了 [#9491](https://github.com/ClickHouse/ClickHouse/issues/9491), closes [#9492](https://github.com/ClickHouse/ClickHouse/issues/9492) [#9500](https://github.com/ClickHouse/ClickHouse/pull/9500) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在读取后缀之后但提交之前发生异常时, 在极少数情况下防止在 `Kafka` 中丢失数据. 修复 [#9378](https://github.com/ClickHouse/ClickHouse/issues/9378) [#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) ([filimonov](https://github.com/filimonov)) -* 修复了`DROP TABLE IF EXISTS` 中的异常. [#8663](https://github.com/ClickHouse/ClickHouse/pull/8663) ([Nikita Vasilev](https://github.com/nikvas0)) -* 修复当用户尝试为旧格式的 `MergeTree` 表引擎系列 `ALTER MODIFY SETTING` 时崩溃. [#9435](https://github.com/ClickHouse/ClickHouse/pull/9435) ([alesapin](https://github.com/alesapin)) -* 支持 JSON 相关函数中不适合 Int64 的 UInt64 数字. 将 SIMDJSON 更新为 master. 这修复了[#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) [#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了使用非严格单调函数索引时反向谓词的执行. [#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) ([Alexander Kazakov](https://github.com/Akazz)) -* 不要尝试在 `GROUP BY` 中折叠 `IN` 常量. [#8868](https://github.com/ClickHouse/ClickHouse/pull/8868) ([Amos Bird](https://github.com/amosbird)) -* 修复 `ALTER DELETE` 突变中导致索引损坏的错误. 这修复了 [#9019](https://github.com/ClickHouse/ClickHouse/issues/9019) and [#8982](https://github.com/ClickHouse/ClickHouse/issues/8982). Additionally fix extremely rare race conditions in `ReplicatedMergeTree` `ALTER` queries. [#9048](https://github.com/ClickHouse/ClickHouse/pull/9048) ([alesapin](https://github.com/alesapin)) -* 当设置 `compile_expressions` 启用时,当我们使用 `Nullable` 类型时,你会在 `LLVMExecutableFunction` 中得到 `unexpected column`. [#8910](https://github.com/ClickHouse/ClickHouse/pull/8910) ([Guillaume Tassery](https://github.com/YiuRULE)) -* `Kafka` 引擎的多项修复: 1) 修复在消费者组重新平衡期间出现的重复项. 2) 修复了当数据从多个分区轮询一次轮询并部分提交时出现的罕见 `holes` (现在我们总是处理/提交整个轮询的消息块). 3) 按块大小修复刷新 (在此之前, 只有超时刷新才能正常工作). 4) 更好的订阅程序 (带有分配反馈). 5) 使测试工作更快 (使用默认间隔和超时). 由于数据之前没有按块大小刷新 (根据文档应该如此), 该 PR 可能会导致默认设置的性能下降 (由于更频繁和更小的刷新不是最佳的). 如果您在更改后遇到性能问题 - 请将表中的 `kafka_max_block_size` 增加到更大的值 (例如 `CREATE TABLE ...Engine=Kafka ... SETTINGS ... kafka_max_block_size=524288`). 修复 [#7259](https://github.com/ClickHouse/ClickHouse/issues/7259) [#8917](https://github.com/ClickHouse/ClickHouse/pull/8917) ([filimonov](https://github.com/filimonov)) -* 修复 PREWHERE 优化后某些查询中的 `Parameter out of bound` 异常. [#8914](https://github.com/ClickHouse/ClickHouse/pull/8914) ([Baudouin Giard](https://github.com/bgiard)) -* 修复了函数 `arrayZip` 的参数混合常量的情况. [#8705](https://github.com/ClickHouse/ClickHouse/pull/8705) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 执行 `CREATE` 查询时,在存储引擎参数中折叠常量表达式. 用当前数据库替换空数据库名称. 修复 [#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [#3492](https://github.com/ClickHouse/ClickHouse/issues/3492) [#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) ([tavplubix](https://github.com/tavplubix)) -* 现在无法创建或添加具有简单循环别名的列, 例如 `a DEFAULT b, b DEFAULT a`. [#9603](https://github.com/ClickHouse/ClickHouse/pull/9603) ([alesapin](https://github.com/alesapin)) -* 修复了可能会损坏原始部分的双重移动错误。 如果您使用 `ALTER TABLE MOVE`, 这是相关的. [#8680](https://github.com/ClickHouse/ClickHouse/pull/8680) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 允许 `interval` 标识符正确解析而无需反引号. 修复了即使 `interval` 标识符包含在反引号或双引号中也无法执行查询的问题. 这修复了 [#9124](https://github.com/ClickHouse/ClickHouse/issues/9124). [#9142](https://github.com/ClickHouse/ClickHouse/pull/9142) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了 `bitTestAll`/`bitTestAny` 函数的模糊测试和错误行为. [#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 当有很多行等于第 n 行时, 修复 `LIMIT n WITH TIES` 中可能的崩溃/错误的行数. [#9464](https://github.com/ClickHouse/ClickHouse/pull/9464) ([tavplubix](https://github.com/tavplubix)) -* 修复使用启用的 `insert_quorum` 编写的部分的突变. [#9463](https://github.com/ClickHouse/ClickHouse/pull/9463) ([alesapin](https://github.com/alesapin)) -* 修复 `Poco::HTTPServer` 破坏时的数据竞争. 当服务器启动并立即关闭时可能会发生这种情况 [#9468](https://github.com/ClickHouse/ClickHouse/pull/9468) ([Anton Popov](https://github.com/CurtizJ)) -* 修复运行 `SHOW CREATE TABLE a_table_that_does_not_exist` 时显示误导性错误消息的错误. [#8899](https://github.com/ClickHouse/ClickHouse/pull/8899) ([achulkov2](https://github.com/achulkov2)) -* 当我们有一个 ORDER BY 和一个 LIMIT 子句时, 当我们在 SELECT 子句中有一个常量时, 在一些罕见的情况下修复了 `Parameters is out of bound` 异常. [#8892](https://github.com/ClickHouse/ClickHouse/pull/8892) ([Guillaume Tassery](https://github.com/YiuRULE)) -* 修复突变完成, 当已经完成突变时, 可以有状态`is_done=0`. [#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) ([alesapin](https://github.com/alesapin)) -* 防止使用旧语法对 MergeTree 表执行 `ALTER ADD INDEX` , 因为它不起作用. [#8822](https://github.com/ClickHouse/ClickHouse/pull/8822) ([Mikhail Korotov](https://github.com/millb)) -* 在服务器启动期间不要访问 `LIVE VIEW` 所依赖的表, 因此服务器将能够启动. 分离 `LIVE VIEW` 时也要删除 `LIVE VIEW` 依赖项. `LIVE VIEW` 是一项实验性功能. [#8824](https://github.com/ClickHouse/ClickHouse/pull/8824) ([tavplubix](https://github.com/tavplubix)) -* 修复了在执行 PREWHERE 时在 MergeTreeRangeReader 中可能出现的段错误. [#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) ([Anton Popov](https://github.com/CurtizJ)) -* 使用列 TTL 修复可能不匹配的校验和. [#9451](https://github.com/ClickHouse/ClickHouse/pull/9451) ([Anton Popov](https://github.com/CurtizJ)) -* 修复了在只有一个卷的情况下部件不会通过 TTL 规则在后台移动的错误. [#8672](https://github.com/ClickHouse/ClickHouse/pull/8672) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 修复了 `Method createColumn() is not implemented for data type Set` 实现的问题. 这修复了 [#7799](https://github.com/ClickHouse/ClickHouse/issues/7799). [#8674](https://github.com/ClickHouse/ClickHouse/pull/8674) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 现在我们将尝试更频繁地完成突变. [#9427](https://github.com/ClickHouse/ClickHouse/pull/9427) ([alesapin](https://github.com/alesapin)) -* 通过减去一个常量来修复 `intDiv`. [#9351](https://github.com/ClickHouse/ClickHouse/pull/9351) ([hcz](https://github.com/hczhcz)) -* 修复 `BlockIO` 中可能的竞争条件. [#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复在尝试使用/删除使用错误参数创建的 `Kafka` 表时导致服务器终止的错误. [#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) ([filimonov](https://github.com/filimonov)) -* 如果 OS 为 `timer_create` 函数返回错误结果, 则添加了解决方法. [#8837](https://github.com/ClickHouse/ClickHouse/pull/8837) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了使用 `min_marks_for_seek` 参数时的错误. 修复了分布式表中没有分片键并且我们尝试跳过未使用的分片时的错误消息. [#8908](https://github.com/ClickHouse/ClickHouse/pull/8908) ([Azat Khuzhin](https://github.com/azat)) - -#### 改进 -* 在 `ReplicatedMergeTree*` 引擎系列的突变之上实施 `ALTER MODIFY/DROP` 查询. 现在 ALTERS 仅在元数据更新阶段阻塞, 之后不再阻塞. [#8701](https://github.com/ClickHouse/ClickHouse/pull/8701) ([alesapin](https://github.com/alesapin)) -* 添加使用包含不合格名称的 `WHERE` 部分重写 CROSS 到 INNER JOIN 的能力. [#9512](https://github.com/ClickHouse/ClickHouse/pull/9512) ([Artem Zuikov](https://github.com/4ertus2)) -* 使 `SHOW TABLES` 和 `SHOW DATABASES` 查询支持 `WHERE` 表达式和`FROM`/`IN`. [#9076](https://github.com/ClickHouse/ClickHouse/pull/9076) ([sundyli](https://github.com/sundy-li)) -* 添加了一个设置 `deduplicate_blocks_in_dependent_materialized_views`. [#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) ([urykhy](https://github.com/urykhy)) -* 在最近的更改之后, MySQL 客户端开始以十六进制打印二进制字符串, 从而使它们不可读 ([#9032](https://github.com/ClickHouse/ClickHouse/issues/9032)). ClickHouse 中的解决方法是将字符串列标记为 UTF-8, 这并非总是如此, 但通常如此. [#9079](https://github.com/ClickHouse/ClickHouse/pull/9079) ([Yuriy Baranov](https://github.com/yurriy)) -* 添加对 `sumMap` 的 String 和 FixedString 键的支持. [#8903](https://github.com/ClickHouse/ClickHouse/pull/8903) ([Baudouin Giard](https://github.com/bgiard)) -* 支持 SummingMergeTree 映射中的字符串键. [#8933](https://github.com/ClickHouse/ClickHouse/pull/8933) ([Baudouin Giard](https://github.com/bgiard)) -* 即使线程抛出异常, 也会向线程池发出线程终止信号. [#8736](https://github.com/ClickHouse/ClickHouse/pull/8736) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) -* 允许在 `clickhouse-benchmark` 中设置 `query_id`. [#9416](https://github.com/ClickHouse/ClickHouse/pull/9416) ([Anton Popov](https://github.com/CurtizJ)) -* 不允许在 `ALTER TABLE ... PARTITION partition` 查询中出现奇怪的表达式. 这个地址 [#7192](https://github.com/ClickHouse/ClickHouse/issues/7192) [#8835](https://github.com/ClickHouse/ClickHouse/pull/8835) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 表 `system.table_engines` 现在提供有关功能支持的信息 (例如 `supports_ttl` 或 `supports_sort_order`). [#8830](https://github.com/ClickHouse/ClickHouse/pull/8830) ([Max Akhmedov](https://github.com/zlobober)) -* 默认启用 `system.metric_log`. 它将包含具有 ProfileEvents 值的行, CurrentMetrics 以 `collect_interval_milliseconds` 间隔 (默认为一秒) 收集. 表很小 (通常以兆字节为单位), 默认收集这些数据是合理的. [#9225](https://github.com/ClickHouse/ClickHouse/pull/9225) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* Initialize query profiler for all threads in a group, e.g. it allows to fully profile insert-queries. Fixes [#6964](https://github.com/ClickHouse/ClickHouse/issues/6964) [#8874](https://github.com/ClickHouse/ClickHouse/pull/8874) ([Ivan](https://github.com/abyss7)) -* 现在临时的 `LIVE VIEW` 是由 `CREATE LIVE VIEW name WITH TIMEOUT [42] ...` 创建的, 而不是 `CREATE TEMPORARY LIVE VIEW ...`, 因为之前的语法与 `CREATE TEMPORARY TABLE ...` 不一致. [#9131](https://github.com/ClickHouse/ClickHouse/pull/9131) ([tavplubix](https://github.com/tavplubix)) -* 添加 text_log.level 配置参数以限制进入 `system.text_log` 表的条目. [#8809](https://github.com/ClickHouse/ClickHouse/pull/8809) ([Azat Khuzhin](https://github.com/azat)) -* 允许根据 TTL 规则将下载的部分放入磁盘/卷. [#8598](https://github.com/ClickHouse/ClickHouse/pull/8598) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 对于外部 MySQL 字典, 允许相互化 MySQL 连接池以在字典之间 `share` 它们. 此选项显着减少了与 MySQL 服务器的连接数. [#9409](https://github.com/ClickHouse/ClickHouse/pull/9409) ([Clément Rodriguez](https://github.com/clemrodriguez)) -* 在 `clickhouse-benchmark` 输出中显示分位数的最近查询执行时间, 而不是内插值. 最好显示与某些查询的执行时间相对应的值. [#8712](https://github.com/ClickHouse/ClickHouse/pull/8712) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将数据插入 Kafka 时,可以为消息添加密钥和时间戳. 修复 [#7198](https://github.com/ClickHouse/ClickHouse/issues/7198) [#8969](https://github.com/ClickHouse/ClickHouse/pull/8969) ([filimonov](https://github.com/filimonov)) -* 如果服务器从终端运行, 则按颜色突出显示线程编号、查询 ID 和日志优先级. 这是为了提高开发人员对相关日志消息的可读性. [#8961](https://github.com/ClickHouse/ClickHouse/pull/8961) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 加载 `Ordinary` 数据库表时更好的异常消息. [#9527](https://github.com/ClickHouse/ClickHouse/pull/9527) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为具有聚合函数状态的数组实现 `arraySlice`. 这修复了 [#9388](https://github.com/ClickHouse/ClickHouse/issues/9388) [#9391](https://github.com/ClickHouse/ClickHouse/pull/9391) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 允许在 IN 运算符的右侧使用常量函数和常量数组. [#8813](https://github.com/ClickHouse/ClickHouse/pull/8813) ([Anton Popov](https://github.com/CurtizJ)) -* 如果在为 system.replicas 获取数据时发生 zookeeper 异常, 则将其显示在单独的列中. 这实现了 [#9137](https://github.com/ClickHouse/ClickHouse/issues/9137) [#9138](https://github.com/ClickHouse/ClickHouse/pull/9138) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在销毁时原子地删除 MergeTree 数据部分. [#8402](https://github.com/ClickHouse/ClickHouse/pull/8402) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 支持分布式表的行级安全. [#8926](https://github.com/ClickHouse/ClickHouse/pull/8926) ([Ivan](https://github.com/abyss7)) -* 现在我们在设置值中识别后缀 (如 KB、KiB...). [#8072](https://github.com/ClickHouse/ClickHouse/pull/8072) ([Mikhail Korotov](https://github.com/millb)) -* 在构建大型 JOIN 的结果时防止内存不足. [#8637](https://github.com/ClickHouse/ClickHouse/pull/8637) ([Artem Zuikov](https://github.com/4ertus2)) -* 在 `clickhouse-client` 中以交互模式向建议添加集群名称. [#8709](https://github.com/ClickHouse/ClickHouse/pull/8709) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为组中的所有线程初始化查询分析器, 例如它允许完全分析插入查询. [#8820](https://github.com/ClickHouse/ClickHouse/pull/8820) ([Ivan](https://github.com/abyss7)) -* 在 `system.query_log` 表中添加了列 `exception_code`. [#8770](https://github.com/ClickHouse/ClickHouse/pull/8770) ([Mikhail Korotov](https://github.com/millb)) -* 在默认服务器配置文件中的端口 `9004` 上启用 MySQL 兼容性服务器. 配置示例中的固定密码生成命令. [#8771](https://github.com/ClickHouse/ClickHouse/pull/8771) ([Yuriy Baranov](https://github.com/yurriy)) -* 如果文件系统是只读的,则防止在关机时中止. 这修复了 [#9094](https://github.com/ClickHouse/ClickHouse/issues/9094) [#9100](https://github.com/ClickHouse/ClickHouse/pull/9100) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在 HTTP POST 查询中需要长度时更好的异常消息. [#9453](https://github.com/ClickHouse/ClickHouse/pull/9453) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将 `_path` 和 `_file` 虚拟列添加到 `HDFS` 和 `File` 引擎以及 `hdfs` 和 `file` 表函数. [#8489](https://github.com/ClickHouse/ClickHouse/pull/8489) ([Olga Khvostikova](https://github.com/stavrolia)) -* 如果将新列添加到视图的内部表中,则在插入到 `MATERIALIZED VIEW` 时修复错误 `Cannot find column` . [#8766](https://github.com/ClickHouse/ClickHouse/pull/8766) [#8788](https://github.com/ClickHouse/ClickHouse/pull/8788) ([vzakaznikov](https://github.com/vzakaznikov)) [#8788](https://github.com/ClickHouse/ClickHouse/issues/8788) [#8806](https://github.com/ClickHouse/ClickHouse/pull/8806) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [#8803](https://github.com/ClickHouse/ClickHouse/pull/8803) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 通过在最终更新 (如日志) 后发送进度来修复本地客户端 - 服务器协议的进度. 这可能仅与某些使用本机协议的第三方工具相关. [#9495](https://github.com/ClickHouse/ClickHouse/pull/9495) ([Azat Khuzhin](https://github.com/azat)) -* 添加使用 MySQL 协议跟踪客户端连接数的系统指标. ([#9013](https://github.com/ClickHouse/ClickHouse/issues/9013)). [#9015](https://github.com/ClickHouse/ClickHouse/pull/9015) ([Eugene Klimov](https://github.com/Slach)) -* 从现在开始, HTTP 响应将把 `X-ClickHouse-Timezone` 标头设置为 `SELECT timezone()` 将报告的相同时区值. [#9493](https://github.com/ClickHouse/ClickHouse/pull/9493) ([Denis Glazachev](https://github.com/traceon)) - -#### 性能改进 -* 提高使用 IN 分析索引的性能. [#9261](https://github.com/ClickHouse/ClickHouse/pull/9261) ([Anton Popov](https://github.com/CurtizJ)) -* 逻辑函数 + 代码清理中更简单、更高效的代码. [#8718](https://github.com/ClickHouse/ClickHouse/issues/8718) [#8728](https://github.com/ClickHouse/ClickHouse/pull/8728) ([Alexander Kazakov](https://github.com/Akazz)) -* 通过使用 C++20 功能确保更严格的别名, 整体性能改进 (受影响查询的范围为 5%..200%). [#9304](https://github.com/ClickHouse/ClickHouse/pull/9304) ([Amos Bird](https://github.com/amosbird)) -* 比较函数的内部循环更严格的别名. [#9327](https://github.com/ClickHouse/ClickHouse/pull/9327) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 算术函数的内部循环更严格的别名. [#9325](https://github.com/ClickHouse/ClickHouse/pull/9325) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* ColumnVector::replicate() 的实现速度提高了约 3 倍, 通过它实现了 ColumnConst::convertToFullColumn(). 在实现常量的测试中也很有用. [#9293](https://github.com/ClickHouse/ClickHouse/pull/9293) ([Alexander Kazakov](https://github.com/Akazz)) -* `ColumnVector::replicate()` 的另一个小性能改进 (这加速了 `materialize` 函数和高阶函数) . 进一步改进了 [#9293](https://github.com/ClickHouse/ClickHouse/issues/9293) [#9442](https://github.com/ClickHouse/ClickHouse/pull/9442) ([Alexander Kazakov](https://github.com/Akazz)) -* 改进了 `stochasticLinearRegression` 聚合函数的性能. 此补丁由英特尔提供. [#8652](https://github.com/ClickHouse/ClickHouse/pull/8652) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 提高 `reinterpretAsFixedString` 函数的性能. [#9342](https://github.com/ClickHouse/ClickHouse/pull/9342) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* Do not send blocks to client for `Null` format in processors pipeline. [#8797](https://github.com/ClickHouse/ClickHouse/pull/8797) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alexander Kuzmenkov](https://github.com/akuzm)) - -#### 构建/测试/打包改进 -* 异常处理现在可以在适用于 Linux 的 Windows 子系统上正常工作. 参见 https://github.com/ClickHouse-Extras/libunwind/pull/3 . 这修复了 [#6480](https://github.com/ClickHouse/ClickHouse/issues/6480) [#9564](https://github.com/ClickHouse/ClickHouse/pull/9564) ([sobolevsv](https://github.com/sobolevsv)) -* 将 `readline` 替换为 `replxx` 以在 `clickhouse-client` 中进行交互式行编辑. [#8416](https://github.com/ClickHouse/ClickHouse/pull/8416) ([Ivan](https://github.com/abyss7)) -* FunctionsComparison 中更好的构建时间和更少的模板实例化. [#9324](https://github.com/ClickHouse/ClickHouse/pull/9324) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在 CI 中添加了与 `clang-tidy` 的集成. 另见 [#6044](https://github.com/ClickHouse/ClickHouse/issues/6044) [#9566](https://github.com/ClickHouse/ClickHouse/pull/9566) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 现在我们在 CI 中使用 `lld` 链接 ClickHouse, 即使对于 `gcc`. [#9049](https://github.com/ClickHouse/ClickHouse/pull/9049) ([alesapin](https://github.com/alesapin)) -* 允许在设置 `THREAD_FUZZER_*` 环境变量时随机化线程调度并插入故障. 这有助于测试. [#9459](https://github.com/ClickHouse/ClickHouse/pull/9459) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在无状态测试中启用安全套接字. [#9288](https://github.com/ClickHouse/ClickHouse/pull/9288) ([tavplubix](https://github.com/tavplubix)) -* 使 SPLIT_SHARED_LIBRARIES=OFF 更健壮. [#9156](https://github.com/ClickHouse/ClickHouse/pull/9156) ([Azat Khuzhin](https://github.com/azat)) -* 使 `performance_introspection_and_logging` 测试对随机服务器卡住是可靠的. 这可能发生在 CI 环境中. 另见 [#9515](https://github.com/ClickHouse/ClickHouse/issues/9515) [#9528](https://github.com/ClickHouse/ClickHouse/pull/9528) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在样式检查中验证 XML. [#9550](https://github.com/ClickHouse/ClickHouse/pull/9550) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了测试 `00738_lock_for_inner_table` 中的竞争条件. 这个测试依赖于睡眠. [#9555](https://github.com/ClickHouse/ClickHouse/pull/9555) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 删除类型为 `once` 的性能测试. 这是在统计比较模式下运行所有性能测试所必需的 (更可靠). [#9557](https://github.com/ClickHouse/ClickHouse/pull/9557) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加了算术函数的性能测试. [#9326](https://github.com/ClickHouse/ClickHouse/pull/9326) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 增加了 `sumMap` 和 `summapwithverflow` 聚合函数的性能测试. 后续的 [#8933](https://github.com/ClickHouse/ClickHouse/issues/8933) [#8947](https://github.com/ClickHouse/ClickHouse/pull/8947) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 通过样式检查确保错误代码的样式. [#9370](https://github.com/ClickHouse/ClickHouse/pull/9370) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为测试历史添加脚本. [#8796](https://github.com/ClickHouse/ClickHouse/pull/8796) ([alesapin](https://github.com/alesapin)) -* 添加 GCC 警告 `-Wsuggest-override` 以定位和修复所有必须使用 `override` 关键字的地方. [#8760](https://github.com/ClickHouse/ClickHouse/pull/8760) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) -* 忽略 Mac OS X 下的弱符号,因为它必须被定义. [#9538](https://github.com/ClickHouse/ClickHouse/pull/9538) ([Deleted user](https://github.com/ghost)) -* 在性能测试中规范一些查询的运行时间. 这样做是为了准备在比较模式下运行所有性能测试. [#9565](https://github.com/ClickHouse/ClickHouse/pull/9565) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复一些测试以支持 pytest 与查询测试. [#9062](https://github.com/ClickHouse/ClickHouse/pull/9062) ([Ivan](https://github.com/abyss7)) -* 使用 MSan 在构建中启用 SSL, 因此在运行无状态测试时服务器不会在启动时失败. [#9531](https://github.com/ClickHouse/ClickHouse/pull/9531) ([tavplubix](https://github.com/tavplubix)) -* 修复测试结果中的数据库替换. [#9384](https://github.com/ClickHouse/ClickHouse/pull/9384) ([Ilya Yatsishin](https://github.com/qoega)) -* 为其他平台构建修复. [#9381](https://github.com/ClickHouse/ClickHouse/pull/9381) ([proller](https://github.com/proller)) [#8755](https://github.com/ClickHouse/ClickHouse/pull/8755) ([proller](https://github.com/proller)) [#8631](https://github.com/ClickHouse/ClickHouse/pull/8631) ([proller](https://github.com/proller)) -* 将磁盘部分添加到 stateless-with-coverage 测试 docker 映像. [#9213](https://github.com/ClickHouse/ClickHouse/pull/9213) ([Pavel Kovalenko](https://github.com/Jokser)) -* 使用 GRPC 构建时摆脱源代码树文件. [#9588](https://github.com/ClickHouse/ClickHouse/pull/9588) ([Amos Bird](https://github.com/amosbird)) -* 通过从上下文中删除 SessionCleaner, 可以稍微加快构建时间. 让SessionCleaner的代码更简单. [#9232](https://github.com/ClickHouse/ClickHouse/pull/9232) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 更新了对 clickhouse-test 脚本中挂起查询的检查. [#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([Alexander Kazakov](https://github.com/Akazz)) -* 从存储库中删除了一些无用的文件. [#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将数学性能测试的类型从 `once` 更改为 `loop` . [#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 添加 docker 图像,它允许为我们的代码库构建交互式代码浏览器 HTML 报告. [#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin)) See [Woboq Code Browser](https://clickhouse-test-reports.s3.yandex.net/codebrowser/ClickHouse/dbms/index.html) -* 抑制 MSan 下的一些测试失败. [#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 加速 `exception while insert` 测试. 此测试经常在 debug-with-coverage 构建中超时. [#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将 `libcxx` 和 `libcxxabi` 更新为 master. 准备 [#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复不稳定的测试 `00910_zookeeper_test_alter_compression_codecs`. [#9525](https://github.com/ClickHouse/ClickHouse/pull/9525) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 清理重复的链接器标志. 确保链接器不会查找意外的符号. [#9433](https://github.com/ClickHouse/ClickHouse/pull/9433) ([Amos Bird](https://github.com/amosbird)) -* 将 `clickhouse-odbc` 驱动程序添加到测试图像中. 这允许通过其自己的 ODBC 驱动程序测试 ClickHouse 与 ClickHouse 的交互. [#9348](https://github.com/ClickHouse/ClickHouse/pull/9348) ([filimonov](https://github.com/filimonov)) -* 修复单元测试中的几个错误. [#9047](https://github.com/ClickHouse/ClickHouse/pull/9047) ([alesapin](https://github.com/alesapin)) -* 启用 `-Wmissing-include-dirs` GCC 警告以消除所有不存在的包含 - 主要是由于 CMake 脚本错误. [#8704](https://github.com/ClickHouse/ClickHouse/pull/8704) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) -* 如果查询分析器无法工作, 请描述原因. 这适用于 [#9049](https://github.com/ClickHouse/ClickHouse/issues/9049) [#9144](https://github.com/ClickHouse/ClickHouse/pull/9144) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将 OpenSSL 更新为上游主服务器. 修复了 TLS 连接可能失败并显示消息 `OpenSSL SSL_read: error:14094438:SSLroutines:ssl3_read_bytes:tlsv1 alert internal error` 和 `SSL Exception: error:2400006E:random number generator::error retrieving entropy` 的问题. 该问题存在于 20.1 版中. [#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 更新服务器的 Dockerfile. [#8893](https://github.com/ClickHouse/ClickHouse/pull/8893) ([Ilya Mazaev](https://github.com/ne-ray)) -* build-gcc-from-sources 脚本中的小修复. [#8774](https://github.com/ClickHouse/ClickHouse/pull/8774) ([Michael Nacharov](https://github.com/mnach)) -* 在不使用 `number` 列的性能测试中, 将 `numbers` 替换为 `zeros`. 这将导致更干净的测试结果. [#9600](https://github.com/ClickHouse/ClickHouse/pull/9600) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复在 Column 构造函数中使用 initializer_list 时的堆栈溢出问题. [#9367](https://github.com/ClickHouse/ClickHouse/pull/9367) ([Deleted user](https://github.com/ghost)) -* 将 librdkafka 升级到 v1.3.0。 在 Mac OS X 上启用捆绑的 `rdkafka` 和 `gsasl` 库. [#9000](https://github.com/ClickHouse/ClickHouse/pull/9000) ([Andrew Onyshchuk](https://github.com/oandrew)) -* 在 GCC 9.2.0 上构建修复. [#9306](https://github.com/ClickHouse/ClickHouse/pull/9306) ([vxider](https://github.com/Vxider)) - - -## ClickHouse 版本 v20.1 - -### ClickHouse 版本 v20.1.16.120-stable 2020-60-26 - -#### Bug 修复 - -* 修复在 prewhere 条件下使用 `Nullable` 列导致的罕见崩溃. 续 [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608). [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 不允许在高阶函数中使用 arrayJoin. 它导致协议同步中断. 这关闭了 [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复像 `SELECT *, xyz.*` 这样的查询的意外行为, 这些查询在预期错误时成功. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). -* 修复了由 Values 输入格式中复杂文字的错误类型推导导致的 LOGICAL_ERROR. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). -* 修复 `ORDER BY ... WITH FILL` 在 const 列上. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). -* 与 XDBC 桥通信时传递适当的超时. 最近在检查桥接活性和接收元信息时没有遵守超时. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加对带有不区分大小写标志的正则表达式的支持. 这修复了 [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复字符串的布隆过滤器 (数据跳过索引). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). -* 修复在 prewhere 条件下使用 `Nullable` 列导致的罕见崩溃. (可能它以某种方式与 [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572) 相关联). [#11608](https://github.com/ClickHouse/ClickHouse/pull/11608) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 clickhouse-client 的错误退出代码, 当 exception.code() % 256 = 0 时. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). -* 修复服务器启动时有关 `Mark cache size was lowered` 的日志消息中的小错误. 这将关闭 [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 现在 clickhouse-server docker 容器将更喜欢 IPv6 检查服务器活动性. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). -* 使用 -State 函数在聚合过程中抛出异常时修复内存泄漏. 这修复了 [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了使用 `FINAL` 修饰符和 `ORDER BY` 优化包装到函数中的主键的使用. [#10715](https://github.com/ClickHouse/ClickHouse/pull/10715) ([Anton Popov](https://github.com/CurtizJ)). - - -### ClickHouse 版本 v20.1.15.109-stable 2020-06-19 - -#### Bug 修复 - -* 在更改期间修复结构的多余锁定. [#11790](https://github.com/ClickHouse/ClickHouse/pull/11790) ([alesapin](https://github.com/alesapin)). - - -### ClickHouse 版本 v20.1.14.107-stable 2020-06-11 - -#### Bug 修复 - -* 修复错误 `Size of offsets does not match size of column` , 用于查询中的 `PREWHERE column in (subquery)` 和 `ARRAY JOIN` . [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). - - -### ClickHouse 版本 v20.1.13.105-stable 2020-06-10 - -#### Bug 修复 - -* 修复了在启用 `min_bytes_to_use_direct_io` 且 PREWHERE 处于活动状态并使用 SAMPLE 或大量线程时可能发生的 `Data compressed with different methods` 错误. 这修复了 [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复编解码器的返回压缩大小. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了当列具有非文字参数的压缩编解码器时服务器崩溃的问题.修复 [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). -* 以 nan 为点修复 pointInPolygon. 修复 [#11375](https://github.com/ClickHouse/ClickHouse/issues/11375). [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). -* 修复了带有纬度/经度范围之外的参数的 geohashesInBox. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). -* 修复具有外部排序和限制的查询可能出现的 `Pipeline stuck` 错误. 修复 [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复 `quantilesExactWeightedArray` 中的崩溃问题. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 通过再次设置 `parallel_view_processing = 1` 并行写入 `MATERIALIZED VIEW` . 修复 [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当提取的 JSON 具有不平衡的 { 或 [ 字符串时, 修复visitParamExtractRaw. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). -* 修复 ThreadPool 中非常罕见的竞争条件. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复转换中潜在的未初始化内存. 示例: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了如果表的主键中有 Array 列并且查询正在使用 `empty` 或 `notEmpty` 函数按此列过滤时索引分析无法工作的问题. 这修复了 [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复当查询速度估计可能不正确时的错误, 并且如果查询受到 `max_network_bandwidth`、`max_execution_speed` 或 `priority` 设置的限制,`min_execution_speed` 的限制可能无法工作或无法正常工作. 将 `timeout_before_checking_execution_speed` 的默认值更改为非零值, 否则设置 `min_execution_speed` 和 `max_execution_speed` 无效. 这修复了 [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). 这修复了 [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). 这修复了 [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). 可用性改进: 避免在 `clickhouse-client` 中将异常消息与进度条串联. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复读取 Protobuf 格式错误数据时崩溃的问题. 这修复了 [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), 修复了 [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). -* 使用 `Array(Array(LowCardinality))` 捕获参数修复高阶函数的可能错误 `Cannot capture column` . [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 如果数据跳过索引依赖于将在后台合并期间修改的列 (对于 SummingMergeTree、AggregatingMergeTree 以及 TTL GROUP BY), 则计算错误. 此问题已通过合并后移动索引计算得到修复, 因此索引是在合并数据上计算的. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). -* 如果没有最终确定,则从突变终止任务中删除日志记录. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). -* 修复了 parseDateTime64BestEffort 参数解析错误. [#10925](https://github.com/ClickHouse/ClickHouse/issues/10925). [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). -* 修复方法 getRawData() 中不正确的原始数据大小. [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). -* 修复与分布式表中元组的向后兼容性. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). -* 修复 StringHashTable 中的 SIGSEGV (如果这样的键不存在). [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `ReplicatedMergeTree` 中的错误, 该错误可能导致 `OPTIMIZE` 查询上的某些 `ALTER` 在它变为非活动状态后挂起等待某些副本. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). -* 在 Block::sortColumns() 之后修复列顺序 (还添加了一个测试,表明它会影响一些实际用例 - 缓冲区引擎). [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). -* 修复 ODBC 桥在不要求引用标识符时的问题. 这修复了[#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 DateLUT 中的 UBSan 和 MSan 报告. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* - 在关键条件下使用 `src_type` 进行正确的类型转换. 修复[#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)). -* 修复 `parallel_view_processing` 行为. 现在, 如果发生异常, 所有对 `MATERIALIZED VIEW` 的插入都应该无一例外地完成. 修复 [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 与 -State 结合时修复组合器 -OrNull 和 -OrDefault. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). -* 修复消失的总数. 如果查询具有连接或具有外部 where 条件的子查询, 则总计可能已被过滤. 修复 [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674). [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 在一个查询中使用相同的集合修复 `IN` 运算符的多次使用. [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)). -* 修复 AggregateTransform 构造函数中参数的顺序. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)). -* 修复启用了 `distributed_aggregation_memory_efficient` 的远程查询缺乏并行执行的问题. 修复[#10655](https://github.com/ClickHouse/ClickHouse/issues/10655). [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复分布式查询的谓词优化 (`enable_optimize_predicate_expression=1`) 对于带有 `HAVING` 部分的查询 (即需要在服务器启动器上进行过滤时), 通过保留表达式的顺序 (这足以修复), 并且还强制 聚合器在索引上使用列名. 修复: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). -* 修复错误 `the BloomFilter false positive must be a double number between 0 and 1`. [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). -* 修复 SELECT 列 ALIAS 的默认表达式类型与列类型不同. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). -* 实现了 DateTime64 和 String 值之间的比较 (就像 DateTime 一样). [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). - - -### ClickHouse 版本 v20.1.12.86, 2020-05-26 - -#### Bug 修复 - -* 修复了 20.1 及更早版本之间两级聚合的不兼容问题. 当在发起节点和远程节点上使用不同版本的 ClickHouse 并且 GROUP BY 结果的大小很大并且由单个 String 字段执行聚合时, 就会发生这种不兼容. 结果导致单个键的多个未合并的行. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了合并后可能发生的 `SummingMergeTree` 中 `LowCardinality(FixedString)` 键列的数据损坏. 修复[#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了当 `readonly=2` 和 `cancel_http_readonly_queries_on_client_close=1` 时导致 http 请求卡在客户端关闭的错误. 修复 [#7939](https://github.com/ClickHouse/ClickHouse/issues/7939), [#7019](https://github.com/ClickHouse/ClickHouse/issues/7019), [#7736](https://github.com/ClickHouse/ClickHouse/issues/7736), [#7091](https://github.com/ClickHouse/ClickHouse/issues/7091). [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)). -* 修复了在 `SYSTEM DROP DNS CACHE` 查询也删除缓存时的错误, 用于检查是否允许用户从某些 IP 地址连接. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)). -* 修复了 `MATERIALIZED VIEW` 内部查询中不正确的标量结果, 以防该查询包含相关表. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复所有部分 mutation 完成, 但是在 `is_done=0` 中挂掉的情况. [#10526](https://github.com/ClickHouse/ClickHouse/pull/10526) ([alesapin](https://github.com/alesapin)). -* 修复了 unix 纪元开始时与 UTC 有小数偏移的时区的溢出. 这修复了 [#9335](https://github.com/ClickHouse/ClickHouse/issues/9335). [#10513](https://github.com/ClickHouse/ClickHouse/pull/10513) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了分布式存储的不当关闭. [#10491](https://github.com/ClickHouse/ClickHouse/pull/10491) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `simpleLinearRegression` 中大整数上的数字溢出. [#10474](https://github.com/ClickHouse/ClickHouse/pull/10474) ([hcz](https://github.com/hczhcz)). -* 修复了附加数据库失败时删除元数据目录的问题. [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014)). -* 在创建 `BloomFilter` 索引时添加了对参数数量和类型的检查 [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623). [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014)). -* 修复了使用 `ARRAY JOIN`、`ORDER BY` 和 `LIMIT` 的查询可能返回不完整结果的问题. 这修复了 [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 更喜欢 `fallback_to_stale_replicas` 而不是 `skip_unavailable_shards`. [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat)). -* 修复了 `Array(Tuple(...))` 数据类型的错误扁平化. 这修复了[#10259](https://github.com/ClickHouse/ClickHouse/issues/10259). [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了在尝试从缓冲区读取 HashMap 时导致编译错误的 `HashTable` 中的错误行为. [#10386](https://github.com/ClickHouse/ClickHouse/pull/10386) ([palasonic1](https://github.com/palasonic1)). -* 修复了 `ConcatProcessor` 中可能发生的 `Pipeline stuck` 错误, 该错误可能发生在远程查询中. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 使用 `max_rows_to_group_by` 和 `group_by_overflow_mode = 'break'` 修复了错误 `Pipeline stuck`. [#10279](https://github.com/ClickHouse/ClickHouse/pull/10279) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了一些错误, 当某些数据以法定人数插入, 然后以某种方式删除 (DROP PARTITION, TTL) 时, 这会导致插入卡住或 SELECT 中的误报异常. 这修复了 [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946). [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). -* 修复了在远程服务器上使用 18.12.17 之前的版本而在启动服务器上使用较新版本时不兼容的问题, 以及 GROUP BY 固定和非固定键, 以及激活两级分组方法时. [#3254](https://github.com/ClickHouse/ClickHouse/pull/3254) ([alexey-milovidov](https://github.com/alexey-milovidov)). - -#### 构建/测试/打包改进 - -* 将 CA 证书添加到 clickhouse-server docker 镜像. [#10476](https://github.com/ClickHouse/ClickHouse/pull/10476) ([filimonov](https://github.com/filimonov)). - - -### ClickHouse 版本 v20.1.10.70, 2020-04-17 - -#### Bug 修复 - -* 修复罕见的可能异常 `Cannot drain connections: cancel first`. [#10239](https://github.com/ClickHouse/ClickHouse/pull/10239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复了当用户尝试在带有 `ENGINE = Replicated*` 的表上运行 `ALTER UPDATE/DELETE` 时, ClickHouse 会抛出 `Unknown function lambda.` 错误消息的错误. 检查非确定性函数现在可以正确处理 lambda 表达式. [#10237](https://github.com/ClickHouse/ClickHouse/pull/10237) ([Alexander Kazakov](https://github.com/Akazz)). -* 修复 RFC-2822 中字符串的 `parseDateTimeBestEffort`, 当一周中的某一天是星期二或星期四时. 这修复了 [#10082](https://github.com/ClickHouse/ClickHouse/issues/10082). [#10214](https://github.com/ClickHouse/ClickHouse/pull/10214) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复 `JOIN` 内的常量列名可能与 `JOIN` 外的常量名冲突. [#10207](https://github.com/ClickHouse/ClickHouse/pull/10207) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 修复了可能的无限查询执行, 当查询实际上应该在LIMIT上停止, 而从无限源读取, 如 `system.numbers` 或 `system.zeros`. [#10206](https://github.com/ClickHouse/ClickHouse/pull/10206) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 在存在`array Join`函数的情况下修复移动到prewhere优化 (在某些情况下). 这修复了[#10092](https://github.com/ClickHouse/ClickHouse/issues/10092). [#10195](https://github.com/ClickHouse/ClickHouse/pull/10195) ([alexey-milovidov](https://github.com/alexey-milovidov)). -* 添加放宽对使用 `allow_nondeterministic_mutations` 设置的突变中非确定性函数使用限制的能力. [#10186](https://github.com/ClickHouse/ClickHouse/pull/10186) ([filimonov](https://github.com/filimonov)). -* 如果结构在 `INSERT` 上不匹配,则将块转换为带有 `Distributed` 引擎的表. [#10135](https://github.com/ClickHouse/ClickHouse/pull/10135) ([Azat Khuzhin](https://github.com/azat)). -* 当其结构与底层表不同时, 将 `INSERT` 上的 `SIGSEGV` 修复到 `Distributed` 表中. [#10105](https://github.com/ClickHouse/ClickHouse/pull/10105) ([Azat Khuzhin](https://github.com/azat)). -* 使用 `JOIN` 和 `UNION ALL` 修复查询可能丢失的行. 修复 [#9826](https://github.com/ClickHouse/ClickHouse/issues/9826), [#10113](https://github.com/ClickHouse/ClickHouse/issues/10113). [#10099](https://github.com/ClickHouse/ClickHouse/pull/10099) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 为 MySQL 数据库引擎添加参数检查和支持标识符参数. [#10077](https://github.com/ClickHouse/ClickHouse/pull/10077) ([Winter Zhang](https://github.com/zhang2014)). -* 修复来自 localhost clickhouse 服务器的 clickhouse 字典源中的错误. 如果字典和源中的类型不兼容, 该错误可能会导致内存损坏. [#10071](https://github.com/ClickHouse/ClickHouse/pull/10071) ([alesapin](https://github.com/alesapin)). -* 修复错误 `Cannot clone block with columns because block has 0 columns ... While executing GroupingAggregatedTransform`. 当设置 `distributed_aggregation_memory_efficient` 被启用, 并且分布式查询从不同分片读取不同级别的聚合数据时发生这种情况 (混合单级和二级聚合). [#10063](https://github.com/ClickHouse/ClickHouse/pull/10063) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 修复在包含尾随零字节的字符串键上的 `GROUP BY` 中可能发生的分段错误 ([#8636](https://github.com/ClickHouse/ClickHouse/issues/8636), [#8925](https://github.com/ClickHouse/ClickHouse/issues/8925)). [#10025](https://github.com/ClickHouse/ClickHouse/pull/10025) ([Alexander Kuzmenkov](https://github.com/akuzm)). -* 修复了在某些数据库查询的处理阶段之一未检索到必要表的错误. 修复 [#9699](https://github.com/ClickHouse/ClickHouse/issues/9699). [#9949](https://github.com/ClickHouse/ClickHouse/pull/9949) ([achulkov2](https://github.com/achulkov2)). -* 修复 `JOIN` 与 `TOTALS` 一起出现时的 `Not found column in block` 错误. 修复 [#9839](https://github.com/ClickHouse/ClickHouse/issues/9839). [#9939](https://github.com/ClickHouse/ClickHouse/pull/9939) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复 `ON CLUSTER` DDL 查询在服务器启动时冻结的错误. [#9927](https://github.com/ClickHouse/ClickHouse/pull/9927) ([Gagan Arneja](https://github.com/garneja)). -* 修复连接表引擎的 `TRUNCATE` ([#9917](https://github.com/ClickHouse/ClickHouse/issues/9917)). [#9920](https://github.com/ClickHouse/ClickHouse/pull/9920) ([Amos Bird](https://github.com/amosbird)). -* 修复 ALTER 查询中的 `scalar does not exist` 错误 ([#9878](https://github.com/ClickHouse/ClickHouse/issues/9878)). [#9904](https://github.com/ClickHouse/ClickHouse/pull/9904) ([Amos Bird](https://github.com/amosbird)). -* 修复 `ReplicatedMergeTree` 中删除和优化之间的竞争条件. [#9901](https://github.com/ClickHouse/ClickHouse/pull/9901) ([alesapin](https://github.com/alesapin)). -* 修复了 `ATTACH PART` 中的 `DeleteOnDestroy` 逻辑, 这可能导致自动删除附加部分并添加了一些测试. [#9410](https://github.com/ClickHouse/ClickHouse/pull/9410) ([Vladimir Chebotarev](https://github.com/excitoon)). - -#### 构建/测试/打包改进 - -* 修复单元测试 `collapsing_sorted_stream`. [#9367](https://github.com/ClickHouse/ClickHouse/pull/9367) ([Deleted user](https://github.com/ghost)). - -### ClickHouse 版本 v20.1.9.54, 2020-03-28 - -#### Bug 修复 - -* 修正了在分布式表上有 `PREWHERE` 和 `WHERE` 以及 `SET distributed_product_mode = 'local'` 时出现的 `Different expressions with the same alias` 错误. [#9871](https://github.com/ClickHouse/ClickHouse/pull/9871) ([Artem Zuikov](https://github.com/4ertus2)). -* 修复具有复合主键的表的突变过多的内存消耗. 这修复了 [#9850](https://github.com/ClickHouse/ClickHouse/issues/9850). [#9860](https://github.com/ClickHouse/ClickHouse/pull/9860) ([alesapin](https://github.com/alesapin)). -* 对于 INSERT 查询, 分片现在将从发起者获得的设置限制在分片的约束中, 而不是抛出异常. 此修复允许将 `INSERT` 查询发送到具有另一个约束的分片. 此更改改进了修复 [#9447](https://github.com/ClickHouse/ClickHouse/issues/9447). [#9852](https://github.com/ClickHouse/ClickHouse/pull/9852) ([Vitaly Baranov](https://github.com/vitlibar)). -* 修复客户端上可能出现的异常 `Got 0 in totals chunk, expected 1` on client. 如果右连接表有零行, 则使用“JOIN”进行查询时会发生这种情况. 示例: `select * from system.one t1 join system.one t2 on t1.dummy = t2.dummy limit 0 FORMAT TabSeparated;`. 修复 [#9777](https://github.com/ClickHouse/ClickHouse/issues/9777). [#9823](https://github.com/ClickHouse/ClickHouse/pull/9823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -* 当类型无法转换时, 使用 `optimize_skip_unused_shards` 修复 `SIGSEGV`. [#9804](https://github.com/ClickHouse/ClickHouse/pull/9804) ([Azat Khuzhin](https://github.com/azat)). -* 修复了函数参数的时区使用不正确的一些情况. [#9574](https://github.com/ClickHouse/ClickHouse/pull/9574) ([Vasily Nemkov](https://github.com/Enmk)). - -#### 改进 - -* 从突变中移除 `ORDER BY` 阶段, 因为我们从单个线程中的单个有序部分读取. 还添加检查突变中的行顺序是否按排序键顺序排序并且不违反此顺序. [#9886](https://github.com/ClickHouse/ClickHouse/pull/9886) ([alesapin](https://github.com/alesapin)). - -#### 构建/测试/打包改进 - -* 清理重复的链接器标志. 确保链接器不会查找意外的符号. [#9433](https://github.com/ClickHouse/ClickHouse/pull/9433) ([Amos Bird](https://github.com/amosbird)). - -### ClickHouse 版本 v20.1.8.41, 2020-03-20 - -#### Bug 修复 -* 修复可能的永久性 `Cannot schedule a task` 错误 (由于 `ParallelAggregatingBlockInputStream::Handler::onFinish/onFinishThread` 中的未处理异常). 这修复了 [#6833](https://github.com/ClickHouse/ClickHouse/issues/6833). [#9154](https://github.com/ClickHouse/ClickHouse/pull/9154) ([Azat Khuzhin](https://github.com/azat)) -* 修复 `ALTER` 查询 (突变) 中的过多内存消耗. 这修复了 [#9533](https://github.com/ClickHouse/ClickHouse/issues/9533) and [#9670](https://github.com/ClickHouse/ClickHouse/issues/9670). [#9754](https://github.com/ClickHouse/ClickHouse/pull/9754) ([alesapin](https://github.com/alesapin)) -* 修复外部字典 DDL 中反引号的错误. 这修复了 [#9619](https://github.com/ClickHouse/ClickHouse/issues/9619). [#9734](https://github.com/ClickHouse/ClickHouse/pull/9734) ([alesapin](https://github.com/alesapin)) - -### ClickHouse 版本 v20.1.7.38, 2020-03-18 - -#### Bug 修复 -* 修复了 `sumKahan` 和 `sumWithOverflow` 不正确的内部函数名称. 在远程查询中使用此函数时导致异常. [#9636](https://github.com/ClickHouse/ClickHouse/pull/9636) ([Azat Khuzhin](https://github.com/azat)). This issue was in all ClickHouse releases. -* 允许具有内部复制的 `Distributed` 表的 `ALTER ON CLUSTER` . 这修复了[#3268](https://github.com/ClickHouse/ClickHouse/issues/3268). [#9617](https://github.com/ClickHouse/ClickHouse/pull/9617) ([shinoi2](https://github.com/shinoi2)). This issue was in all ClickHouse releases. -* 修复 `MergeTreeRangeReader` 中可能出现的异常 `Size of filter does not match size of column` 和 `Invalid number of rows in Chunk` . 在某些情况下, 它们可能会在执行 `PREWHERE` 时出现. 修复 [#9132](https://github.com/ClickHouse/ClickHouse/issues/9132). [#9612](https://github.com/ClickHouse/ClickHouse/pull/9612) ([Anton Popov](https://github.com/CurtizJ)) -* 修正了这个问题: 如果你写一个简单的算术表达式, 比如 `time + 1` (与像 `time + INTERVAL 1 SECOND` 这样的表达式相反), 时区不会被保留. 这修复了 [#5743](https://github.com/ClickHouse/ClickHouse/issues/5743). [#9323](https://github.com/ClickHouse/ClickHouse/pull/9323) ([alexey-milovidov](https://github.com/alexey-milovidov))。 此问题存在于所有 ClickHouse 版本中. -* 现在无法创建或添加具有简单循环别名的列, 例如 `a DEFAULT b, b DEFAULT a`. [#9603](https://github.com/ClickHouse/ClickHouse/pull/9603) ([alesapin](https://github.com/alesapin)) -* 修复了 base64 编码值末尾填充可能格式错误的问题. 更新 base64 库. 这修复了 [#9491](https://github.com/ClickHouse/ClickHouse/issues/9491), closes [#9492](https://github.com/ClickHouse/ClickHouse/issues/9492) [#9500](https://github.com/ClickHouse/ClickHouse/pull/9500) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复 `Poco::HTTPServer` 破坏时的数据竞争. 服务器启动并立即关闭时可能会发生这种情况. [#9468](https://github.com/ClickHouse/ClickHouse/pull/9468) ([Anton Popov](https://github.com/CurtizJ)) -* 当有很多行等于第 n 行时, 修复 `LIMIT n WITH TIES` 中可能的崩溃/错误的行数. [#9464](https://github.com/ClickHouse/ClickHouse/pull/9464) ([tavplubix](https://github.com/tavplubix)) -* 使用列 TTL 修复可能不匹配的校验和. [#9451](https://github.com/ClickHouse/ClickHouse/pull/9451) ([Anton Popov](https://github.com/CurtizJ)) -* 修复当用户尝试为旧格式的 `MergeTree` 表引擎系列 `ALTER MODIFY SETTING` 时崩溃. [#9435](https://github.com/ClickHouse/ClickHouse/pull/9435) ([alesapin](https://github.com/alesapin)) -* 现在我们将尝试更频繁地完成突变. [#9427](https://github.com/ClickHouse/ClickHouse/pull/9427) ([alesapin](https://github.com/alesapin)) -* 修复 [#8598](https://github.com/ClickHouse/ClickHouse/issues/8598) 中引入的复制协议不兼容问题. [#9412](https://github.com/ClickHouse/ClickHouse/pull/9412) ([alesapin](https://github.com/alesapin)) -* 修复 not(has()) 数组类型的bloom_filter索引. [#9407](https://github.com/ClickHouse/ClickHouse/pull/9407) ([achimbab](https://github.com/achimbab)) -* 修复了当 haystack 有零字节时`match` 和`extract` 函数的行为. 当 haystack 不变时, 行为是错误的. 这修复了 [#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) [#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#9345](https://github.com/ClickHouse/ClickHouse/pull/9345) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 构建/测试/打包改进 - -* 异常处理现在可以在适用于 Linux 的 Windows 子系统上正常工作. 参见 https://github.com/ClickHouse-Extras/libunwind/pull/3 这修复了 [#6480](https://github.com/ClickHouse/ClickHouse/issues/6480) [#9564](https://github.com/ClickHouse/ClickHouse/pull/9564) ([sobolevsv](https://github.com/sobolevsv)) - - -### ClickHouse 版本 v20.1.6.30, 2020-03-05 - -#### Bug 修复 - -* 修复使用 `T64` 编解码器压缩时数据不兼容的问题. -[#9039](https://github.com/ClickHouse/ClickHouse/pull/9039) [(abyss7)](https://github.com/abyss7) -* 在一个线程中从 MergeTree 表读取时修复范围的顺序. 修复 [#8964](https://github.com/ClickHouse/ClickHouse/issues/8964). -[#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) [(CurtizJ)](https://github.com/CurtizJ) -* 修复在执行 `PREWHERE` 时在 `MergeTreeRangeReader` 中可能出现的段错误. 修复[#9064](https://github.com/ClickHouse/ClickHouse/issues/9064). -[#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) [(CurtizJ)](https://github.com/CurtizJ) -* 修复 `reinterpretAsFixedString` 以返回 `FixedString` 而不是 `String`. -[#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) [(oandrew)](https://github.com/oandrew) -* 使用可为空的返回类型修复 `joinGet`. 修复 [#8919](https://github.com/ClickHouse/ClickHouse/issues/8919) -[#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) [(amosbird)](https://github.com/amosbird) -* 修复模糊测试和 bitTestAll/bitTestAny 函数的错误行为. -[#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) [(alexey-milovidov)](https://github.com/alexey-milovidov) -* 修复 haystack 为零字节时匹配和提取函数的行为. 当 haystack 不变时, 行为是错误的. 修复 [#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) -[#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) [(alexey-milovidov)](https://github.com/alexey-milovidov) -* 修复了使用非严格单调函数索引时反向谓词的执行. 修复 [#9034](https://github.com/ClickHouse/ClickHouse/issues/9034) -[#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) [(Akazz)](https://github.com/Akazz) -* 如果 `WHERE` 部分中有 `[NOT] LIKE` 运算符, 则允许将 `CROSS` 重写为 `INNER JOIN`. 修复 [#9191](https://github.com/ClickHouse/ClickHouse/issues/9191) -[#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) [(4ertus2)](https://github.com/4ertus2) -* 允许带有日志引擎的表中的第一列作为别名. -[#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) [(abyss7)](https://github.com/abyss7) -* 允许在内部使用逗号连接 `IN()`. 修复 [#7314](https://github.com/ClickHouse/ClickHouse/issues/7314). -[#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) [(4ertus2)](https://github.com/4ertus2) -* 改进`ALTER MODIFY/ADD`查询逻辑. 现在你不能在没有类型的情况下 `ADD` 列, `MODIFY` 默认表达式不会改变列的类型, `MODIFY` 类型不会丢失默认表达式值. 修复 [#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). -[#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) [(alesapin)](https://github.com/alesapin) -* 修复突变完成, 当已经完成突变时, 状态可以为 is_done=0. -[#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) [(alesapin)](https://github.com/alesapin) -* 支持 system.numbers 和 system.numbers_mt 的 `Processors` 管道. 这也修复了不遵守 `max_execution_time` 时的错误. -[#7796](https://github.com/ClickHouse/ClickHouse/pull/7796) [(KochetovNicolai)](https://github.com/KochetovNicolai) -* 修复 `DictCacheKeysRequestedFound` 指标的错误计数. -[#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) [(nikitamikhaylov)](https://github.com/nikitamikhaylov) -* 在`ATTACH PARTITION FROM`、`REPLACE PARTITION`、`MOVE TO TABLE` 中添加了对存储策略的检查, 否则可能会使重启后部分数据无法访问并阻止ClickHouse启动. -[#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) [(excitoon)](https://github.com/excitoon) -* 修复了 `MergeTreeIndexSet` 中的 UBSan 报告. 这修复了 [#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) -[#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) [(alexey-milovidov)](https://github.com/alexey-milovidov) -* 修复 BlockIO 中可能的数据竞争. -[#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) [(KochetovNicolai)](https://github.com/KochetovNicolai) -* 支持在 JSON 相关函数中不适合 Int64 的 `UInt64` 数字. 将 `SIMDJSON` 更新为 master. 这修复了 [#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) -[#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) [(alexey-milovidov)](https://github.com/alexey-milovidov) -* 修复了如果数据目录安装到单独的设备时无法正确计算可用空间量的问题. 对于默认磁盘, 从数据子目录计算可用空间. 这修复了 [#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) -[#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) [(millb)](https://github.com/millb) -* 修复 TLS 连接可能失败并显示消息 `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error and SSL Exception: error:2400006E:random number generator::error retrieving entropy.` . 更新 OpenSSL 到上游掌握. -[#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) [(alexey-milovidov)](https://github.com/alexey-milovidov) -* 执行 `CREATE` 查询时, 在存储引擎参数中折叠常量表达式. 用当前数据库替换空数据库名称. 修复 [#6508](https://github.com/ClickHouse/ClickHouse/issues/6508)、[#3492](https://github.com/ClickHouse/ClickHouse/issues/3492). 还修复了 ClickHouseDictionarySource 中本地地址的检查. -[#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) [(tabplubix)](https://github.com/tavplubix) -* 修复 `StorageMerge` 中的段错误, 这在从 StorageFile 读取时可能发生 -[#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) [(tabplubix)](https://github.com/tavplubix) -* 在读取后缀之后但提交之前发生异常时, 在极少数情况下防止在 `Kafka` 中丢失数据. 修复[#9378](https://github.com/ClickHouse/ClickHouse/issues/9378). Related: [#7175](https://github.com/ClickHouse/ClickHouse/issues/7175) -[#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) [(filimonov)](https://github.com/filimonov) -* 修复在尝试使用/删除使用错误参数创建的 `Kafka` 表时导致服务器终止的错误. 修复 [#9494](https://github.com/ClickHouse/ClickHouse/issues/9494). Incorporates [#9507](https://github.com/ClickHouse/ClickHouse/issues/9507). -[#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) [(filimonov)](https://github.com/filimonov) - -#### 新特征 -* 添加 `deduplicate_blocks_in_dependent_materialized_views` 选项以控制幂等插入到具有物化视图的表中的行为. 应 Altinity 的特殊要求, 此新功能已添加到错误修复版本中. -[#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) [(urykhy)](https://github.com/urykhy) - -### ClickHouse 版本 v20.1.2.4, 2020-01-22 - -#### 向后不兼容变更 -* 使设置 `merge_tree_uniform_read_distribution` 过时. 服务器仍然可以识别此设置, 但没有效果. [#8308](https://github.com/ClickHouse/ClickHouse/pull/8308) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将函数 `greatCircleDistance` 的返回类型更改为 `Float32` , 因为现在计算的结果是 `Float32` . [#7993](https://github.com/ClickHouse/ClickHouse/pull/7993) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 现在预计查询参数以 `escaped` 格式表示. 例如, 要传递字符串 `ab` , 您必须在URL 中分别写入 `a\tb` 或 `a\b` 以及 `a%5Ctb` 或 `a%5C%09b`. 这需要添加将 NULL 作为 `\N` 传递的可能性. 这修复了 [#7488](https://github.com/ClickHouse/ClickHouse/issues/7488). [#8517](https://github.com/ClickHouse/ClickHouse/pull/8517) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 默认情况下为 `ReplicatedMergeTree` 启用 `use_minimalistic_part_header_in_zookeeper` 设置. 这将显着减少存储在 ZooKeeper 中的数据量. 从 19.1 版开始支持此设置, 我们已经在多个服务的生产中使用它半年多没有任何问题. 如果您有机会降级到 19.1 之前的版本, 请禁用此设置. [#6850](https://github.com/ClickHouse/ClickHouse/pull/6850) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 数据跳过索引已准备好生产并默认启用. 设置 `allow_experimental_data_skipping_indices`、`allow_experimental_cross_to_join_conversion` 和 `allow_experimental_multiple_joins_emulation` 现在已经过时并且什么都不做. [#7974](https://github.com/ClickHouse/ClickHouse/pull/7974) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为与 `JOIN` 操作一致的 `StorageJoin` 添加新的 `ANY JOIN` 逻辑. 要在不改变行为的情况下进行升级, 您需要将 `SETTINGS any_join_distinct_right_table_keys = 1` 添加到引擎连接表元数据或在升级后重新创建这些表. [#8400](https://github.com/ClickHouse/ClickHouse/pull/8400) ([Artem Zuikov](https://github.com/4ertus2)) -* 需要重新启动服务器以应用日志配置中的更改. 这是一个临时解决方法, 以避免服务器记录到已删除的日志文件的错误 (请参阅 [#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alexander Kuzmenkov](https://github.com/akuzm)) - -#### 新特征 -* 向 `system.merges` 添加了有关部件路径的信息. [#8043](https://github.com/ClickHouse/ClickHouse/pull/8043) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 添加在 `ON CLUSTER` 模式下执行 `SYSTEM RELOAD DICTIONARY` 查询的能力. [#8288](https://github.com/ClickHouse/ClickHouse/pull/8288) ([Guillaume Tassery](https://github.com/YiuRULE)) -* 添加在 `ON CLUSTER` 模式下执行 `CREATE DICTIONARY` 查询的能力. [#8163](https://github.com/ClickHouse/ClickHouse/pull/8163) ([alesapin](https://github.com/alesapin)) -* 现在用户在 `users.xml` 中的配置文件可以继承多个配置文件. [#8343](https://github.com/ClickHouse/ClickHouse/pull/8343) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) -* 添加了 `system.stack_trace` 表, 允许查看所有服务器线程的堆栈跟踪. 这对于开发人员自省服务器状态很有用. 这修复了[#7576](https://github.com/ClickHouse/ClickHouse/issues/7576). [#8344](https://github.com/ClickHouse/ClickHouse/pull/8344) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加具有可配置亚秒级精度的 `DateTime64` 数据类型. [#7170](https://github.com/ClickHouse/ClickHouse/pull/7170) ([Vasily Nemkov](https://github.com/Enmk)) -* 添加表函数 `clusterAllReplicas`, 允许查询集群中的所有节点. [#8493](https://github.com/ClickHouse/ClickHouse/pull/8493) ([kiran sunkari](https://github.com/kiransunkari)) -* 添加聚合函数 `categoricalInformationValue`, 用于计算离散特征的信息值. [#8117](https://github.com/ClickHouse/ClickHouse/pull/8117) ([hcz](https://github.com/hczhcz)) -* 通过并行执行来加速对 `CSV`、`TSV` 和 `JSONEachRow` 格式的数据文件的解析. [#7780](https://github.com/ClickHouse/ClickHouse/pull/7780) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 添加执行银行家舍入的函数`bankerRound`. [#8112](https://github.com/ClickHouse/ClickHouse/pull/8112) ([hcz](https://github.com/hczhcz)) -* 在区域名称的嵌入式字典中支持更多语言: 'ru', 'en', 'ua', 'uk', 'by', 'kz', 'tr', 'de', 'uz', 'lv', 'lt', 'et', 'pt', 'he', 'vi'. [#8189](https://github.com/ClickHouse/ClickHouse/pull/8189) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 改进了 `ANY JOIN` 逻辑的一致性. 现在 `t1 ANY LEFT JOIN t2` 等于 `t2 ANY RIGHT JOIN t1`. [#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) -* 添加设置 `any_join_distinct_right_table_keys` 以启用 `ANY INNER JOIN` 的旧行为. [#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) -* 添加新的 `SEMI` 和 `ANTI JOIN`. 旧的 `ANY INNER JOIN` 行为现在可用作 `SEMI LEFT JOIN` . [#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) -* 为 `File` 引擎和 `file` 表功能添加了 `Distributed` 格式, 允许从异步插入到 `Distributed `表中生成的 `.bin` 文件中读取. [#8535](https://github.com/ClickHouse/ClickHouse/pull/8535) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 为 `runningAccumulate` 添加可选的重置列参数, 允许重置每个新键值的聚合结果. [#8326](https://github.com/ClickHouse/ClickHouse/pull/8326) ([Sergey Kononenko](https://github.com/kononencheg)) -* 添加使用 ClickHouse 作为 Prometheus 端点的功能. [#7900](https://github.com/ClickHouse/ClickHouse/pull/7900) ([vdimir](https://github.com/Vdimir)) -* 在 `config.xml` 中添加 `` 部分, 限制远程表引擎和表函数 `URL`、`S3`、`HDFS`的允许主机. [#7154](https://github.com/ClickHouse/ClickHouse/pull/7154) ([Mikhail Korotov](https://github.com/millb)) -* 添加了函数 `greatCircleAngle`, 以度数计算球体上的距离. [#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 更改地球半径与 H3 库一致. [#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为输入和输出添加了 `JSONCompactEachRow` 和 `JSONCompactEachRowWithNamesAndTypes` 格式. [#7841](https://github.com/ClickHouse/ClickHouse/pull/7841) ([Mikhail Korotov](https://github.com/millb)) -* 添加了与文件相关的表引擎和表函数 (`File`、`S3`、`URL`、`HDFS`) 的功能, 允许根据附加引擎参数或文件扩展名读写 `gzip` 文件. [#7840](https://github.com/ClickHouse/ClickHouse/pull/7840) ([Andrey Bodrov](https://github.com/apbodrov)) -* 添加了 `randomASCII(length)` 函数, 生成一个带有随机 [ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters) 可打印字符集的字符串. [#8401](https://github.com/ClickHouse/ClickHouse/pull/8401) ([BayoNet](https://github.com/BayoNet)) -* 添加了函数 `JSONExtractArrayRaw`, 它从 `JSON` 字符串返回未解析的 json 数组元素的数组. [#8081](https://github.com/ClickHouse/ClickHouse/pull/8081) ([Oleg Matrokhin](https://github.com/errx)) -* 添加 `arrayZip` 函数, 该函数允许将多个长度相等的数组组合成一个元组数组. [#8149](https://github.com/ClickHouse/ClickHouse/pull/8149) ([Winter Zhang](https://github.com/zhang2014)) -* 添加根据为 `*MergeTree` 表引擎系列配置的 `TTL` 表达式在磁盘之间移动数据的能力. [#8140](https://github.com/ClickHouse/ClickHouse/pull/8140) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 添加了新的聚合函数 `avgWeighted`, 它允许计算加权平均值. [#7898](https://github.com/ClickHouse/ClickHouse/pull/7898) ([Andrey Bodrov](https://github.com/apbodrov)) -* 现在默认为 `TSV`、`TSKV`、`CSV` 和 `JSONEachRow` 格式启用并行解析. [#7894](https://github.com/ClickHouse/ClickHouse/pull/7894) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 从`H3` 库添加几个地理函数: `h3GetResolution`、`h3EdgeAngle`、`h3EdgeLength`、`h3IsValid` 和 `h3kRing`. [#8034](https://github.com/ClickHouse/ClickHouse/pull/8034) ([Konstantin Malanchev](https://github.com/hombit)) -* 在文件相关的存储和表函数中添加了对 brotli (`br`) 压缩的支持. 这修复了 [#8156](https://github.com/ClickHouse/ClickHouse/issues/8156). [#8526](https://github.com/ClickHouse/ClickHouse/pull/8526) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为 `SimpleAggregationFunction` 类型添加 `groupBit*` 函数. [#8485](https://github.com/ClickHouse/ClickHouse/pull/8485) ([Guillaume Tassery](https://github.com/YiuRULE)) - -#### Bug 修复 -* 使用 `Distributed` 引擎修复表的重命名. 修复问题 [#7868](https://github.com/ClickHouse/ClickHouse/issues/7868). [#8306](https://github.com/ClickHouse/ClickHouse/pull/8306) ([tavplubix](https://github.com/tavplubix)) -* 现在字典支持非 ClickHouse SQL 方言中任意字符串中的属性的 `EXPRESSION`. [#8098](https://github.com/ClickHouse/ClickHouse/pull/8098) ([alesapin](https://github.com/alesapin)) -* 修复损坏的 `INSERT SELECT FROM mysql(...)` 查询. 这修复了 [#8070](https://github.com/ClickHouse/ClickHouse/issues/8070) 和 [#7960](https://github.com/ClickHouse/ClickHouse/issues/7960). [#8234](https://github.com/ClickHouse/ClickHouse/pull/8234) ([tavplubix](https://github.com/tavplubix)) -* 修复从 `JSONEachRow` 插入默认 `Tuple` 时出现的错误 `Mismatch column sizes`. 这修复了[#5653](https://github.com/ClickHouse/ClickHouse/issues/5653). [#8606](https://github.com/ClickHouse/ClickHouse/pull/8606) ([tavplubix](https://github.com/tavplubix)) -* 现在,如果将 `WITH TIES` 与 `LIMIT BY` 一起使用, 则会引发异常. 还添加了将 `TOP` 与 `LIMIT BY` 一起使用的功能. 这修复了 [#7472](https://github.com/ClickHouse/ClickHouse/issues/7472). [#7637](https://github.com/ClickHouse/ClickHouse/pull/7637) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 在 `clickhouse-odbc-bridge` 二进制文件中修复来自新 glibc 版本的意外依赖. [#8046](https://github.com/ClickHouse/ClickHouse/pull/8046) ([Amos Bird](https://github.com/amosbird)) -* 修复 `*MergeTree` 引擎家族的检查功能错误. 现在, 如果我们在最后一个颗粒和最后一个标记 (非最终) 中有相同数量的行, 它不会失败. [#8047](https://github.com/ClickHouse/ClickHouse/pull/8047) ([alesapin](https://github.com/alesapin)) -* 当基础数字类型等于表指定类型时, 修复在 `ALTER` 查询后插入 `Enum*` 列. 这修复了 [#7836](https://github.com/ClickHouse/ClickHouse/issues/7836). [#7908](https://github.com/ClickHouse/ClickHouse/pull/7908) ([Anton Popov](https://github.com/CurtizJ)) -* 允许函数 `substring` 的非常量负 `size` 参数. 这是不允许的. 这修复了 [#4832](https://github.com/ClickHouse/ClickHouse/issues/4832). [#7703](https://github.com/ClickHouse/ClickHouse/pull/7703) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复传递给 `(O|J)DBC` 表引擎的参数数量错误时的解析错误. [#7709](https://github.com/ClickHouse/ClickHouse/pull/7709) ([alesapin](https://github.com/alesapin)) -* 将日志发送到 syslog 时使用正在运行的 clickhouse 进程的命令名称. 在以前的版本中, 使用空字符串代替命令名称. [#8460](https://github.com/ClickHouse/ClickHouse/pull/8460) ([Michael Nacharov](https://github.com/mnach)) -* 修复对 `localhost` 允许主机的检查. 此 PR 修复了 [#8241](https://github.com/ClickHouse/ClickHouse/pull/8241) 中提供的解决方案. [#8342](https://github.com/ClickHouse/ClickHouse/pull/8342) ([Vitaly Baranov](https://github.com/vitlibar)) -* 修复在 `argMin` 和 `argMax` 函数中, 当结果用于 `runningAccumulate` 函数时, 长字符串参数的罕见崩溃. 这修复了 [#8325](https://github.com/ClickHouse/ClickHouse/issues/8325) [#8341](https://github.com/ClickHouse/ClickHouse/pull/8341) ([dinosaur](https://github.com/769344359)) -* 使用 `Buffer` 引擎修复表的内存过量使用. [#8345](https://github.com/ClickHouse/ClickHouse/pull/8345) ([Azat Khuzhin](https://github.com/azat)) -* 修复了函数中可以将 `NULL` 作为参数之一并返回非 NULL 的潜在错误. [#8196](https://github.com/ClickHouse/ClickHouse/pull/8196) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 线程池中更好的度量计算, 用于 `MergeTree` 表引擎的后台进程. [#8194](https://github.com/ClickHouse/ClickHouse/pull/8194) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 当存在行级表过滤器时, 在 `WHERE` 语句中修复函数 `IN`. 修复 [#6687](https://github.com/ClickHouse/ClickHouse/issues/6687) [#8357](https://github.com/ClickHouse/ClickHouse/pull/8357) ([Ivan](https://github.com/abyss7)) -* 现在, 如果未完全解析设置值的整数值, 则会引发异常. [#7678](https://github.com/ClickHouse/ClickHouse/pull/7678) ([Mikhail Korotov](https://github.com/millb)) -* 修复使用聚合函数查询具有两个以上本地分片的分布式表时的异常. [#8164](https://github.com/ClickHouse/ClickHouse/pull/8164) ([小路](https://github.com/nicelulu)) -* 现在布隆过滤器可以处理零长度数组并且不执行冗余计算. [#8242](https://github.com/ClickHouse/ClickHouse/pull/8242) ([achimbab](https://github.com/achimbab)) -* 修复了通过将客户端主机与 `users.xml` 中指定的 `host_regexp` 匹配来检查是否允许客户端主机. [#8241](https://github.com/ClickHouse/ClickHouse/pull/8241) ([Vitaly Baranov](https://github.com/vitlibar)) -* 放宽不明确的列检查, 导致多个 `JOIN ON` 部分出现误报. [#8385](https://github.com/ClickHouse/ClickHouse/pull/8385) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复了当服务器无法以 `JSON` 或 `XML` 格式发送或写入数据为 `String` 数据类型 (需要 `UTF-8` 验证) 或压缩时可能出现的服务器崩溃 (`std::terminate`) Brotli 算法或其他一些罕见情况下的结果数据. 这修复了 [#7603](https://github.com/ClickHouse/ClickHouse/issues/7603) [#8384](https://github.com/ClickHouse/ClickHouse/pull/8384) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复 CI 发现的 `StorageDistributedDirectoryMonitor` 中的竞争条件. 这修复了 [#8364](https://github.com/ClickHouse/ClickHouse/issues/8364). [#8383](https://github.com/ClickHouse/ClickHouse/pull/8383) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 现在 `*MergeTree` 表引擎族中的后台合并更准确地保留存储策略卷顺序. [#8549](https://github.com/ClickHouse/ClickHouse/pull/8549) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 现在表引擎 `Kafka` 可以正常使用 `Native` 格式. 这修复了[#6731](https://github.com/ClickHouse/ClickHouse/issues/6731) [#7337](https://github.com/ClickHouse/ClickHouse/issues/7337) [#8003](https://github.com/ClickHouse/ClickHouse/issues/8003). [#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) -* 修复了带有标题的格式 (如 `CSVWithNames`), 这些格式会为表引擎 `Kafka` 抛出有关 EOF 的异常. [#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) -* 修复了从 `IN` 部分右侧的子查询进行设置的错误. 这修复了[#5767](https://github.com/ClickHouse/ClickHouse/issues/5767) and [#2542](https://github.com/ClickHouse/ClickHouse/issues/2542). [#7755](https://github.com/ClickHouse/ClickHouse/pull/7755) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 修复从存储 `File` 读取时可能发生的崩溃. [#7756](https://github.com/ClickHouse/ClickHouse/pull/7756) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 固定读取包含类型为 `list` 的列的 `arquet` 格式的文件. [#8334](https://github.com/ClickHouse/ClickHouse/pull/8334) ([maxulan](https://github.com/maxulan)) -* 如果`max_parallel_replicas > 1`, 则使用依赖于采样键的 `PREWHERE` 条件修复分布式查询的错误 `Not found column` . [#7913](https://github.com/ClickHouse/ClickHouse/pull/7913) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 如果查询使用依赖于表别名的 `PREWHERE`, 并且由于主键条件导致结果集为空, 则修复错误 `Not found column`. [#7911](https://github.com/ClickHouse/ClickHouse/pull/7911) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复了函数 `rand` 和 `randConstant` 在 `Nullable` 参数的情况下的返回类型. 现在函数总是返回 `UInt32` 而不是 `Nullable(UInt32)`. [#8204](https://github.com/ClickHouse/ClickHouse/pull/8204) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 禁用了`WITH FILL` 表达式的谓词下推. 这修复了[#7784](https://github.com/ClickHouse/ClickHouse/issues/7784). [#7789](https://github.com/ClickHouse/ClickHouse/pull/7789) ([Winter Zhang](https://github.com/zhang2014)) -* 修复了使用 `FINAL` 部分时 `SummingMergeTree` 的错误 `count()` 结果. [#3280](https://github.com/ClickHouse/ClickHouse/issues/3280) [#7786](https://github.com/ClickHouse/ClickHouse/pull/7786) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 修复来自远程服务器的常量函数可能的错误结果. 它发生在具有诸如 `version()`、`uptime()` 等函数的查询中, 这些函数为不同的服务器返回不同的常量值. 这修复了 [#7666](https://github.com/ClickHouse/ClickHouse/issues/7666). [#7689](https://github.com/ClickHouse/ClickHouse/pull/7689) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复下推谓词优化中导致错误结果的复杂错误. 这修复了很多关于下推谓词优化的问题. [#8503](https://github.com/ClickHouse/ClickHouse/pull/8503) ([Winter Zhang](https://github.com/zhang2014)) -* 修复 `CREATE TABLE .. AS dictionary` 查询中的崩溃. [#8508](https://github.com/ClickHouse/ClickHouse/pull/8508) ([Azat Khuzhin](https://github.com/azat)) -* `.g4` 文件中的多项改进 ClickHouse 语法. [#8294](https://github.com/ClickHouse/ClickHouse/pull/8294) ([taiyang-li](https://github.com/taiyang-li)) -* 修复导致带有引擎 `Join` 的表在 `JOIN` 中崩溃的错误. 这修复了 [#7556](https://github.com/ClickHouse/ClickHouse/issues/7556) [#8254](https://github.com/ClickHouse/ClickHouse/issues/8254) [#7915](https://github.com/ClickHouse/ClickHouse/issues/7915) [#8100](https://github.com/ClickHouse/ClickHouse/issues/8100). [#8298](https://github.com/ClickHouse/ClickHouse/pull/8298) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复冗余字典重新加载到 `CREATE DATABASE` . [#7916](https://github.com/ClickHouse/ClickHouse/pull/7916) ([Azat Khuzhin](https://github.com/azat)) -* 限制从 `StorageFile` 和 `StorageHDFS` 读取的最大流数。 修复 [#7650](https://github.com/ClickHouse/ClickHouse/issues/7650). [#7981](https://github.com/ClickHouse/ClickHouse/pull/7981) ([alesapin](https://github.com/alesapin)) -* 当用户同时指定默认表达式和编解码器时, 修复 `ALTER ... MODIFY ... CODEC` 查询中的错误. 修复 [8593](https://github.com/ClickHouse/ClickHouse/issues/8593). [#8614](https://github.com/ClickHouse/ClickHouse/pull/8614) ([alesapin](https://github.com/alesapin)) -* 修复具有 `SimpleAggregateFunction(LowCardinality)` 类型的列的后台合并错误 [#8613](https://github.com/ClickHouse/ClickHouse/pull/8613) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 固定类型检查函数 `toDateTime64`. [#8375](https://github.com/ClickHouse/ClickHouse/pull/8375) ([Vasily Nemkov](https://github.com/Enmk)) -* 现在服务器不会在 `LEFT` 或 `FULL JOIN` 和Join 引擎和不支持的 `join_use_nulls` 设置上崩溃. [#8479](https://github.com/ClickHouse/ClickHouse/pull/8479) ([Artem Zuikov](https://github.com/4ertus2)) -* 现在, 如果 `db` 不存在, `DROP DICTIONARY IF EXISTS db.dict` 查询不会抛出异常. [#8185](https://github.com/ClickHouse/ClickHouse/pull/8185) ([Vitaly Baranov](https://github.com/vitlibar)) -* 修复由于使用对已删除的 `IStorage` 对象的引用而导致的表函数 (`file`、`mysql`、`remote`)中可能的崩溃. 修复插入表函数时指定的列的错误解析. [#7762](https://github.com/ClickHouse/ClickHouse/pull/7762) ([tavplubix](https://github.com/tavplubix)) -* 在启动 `clickhouse-server` 之前确保网络已启动. 这修复了 [#7507](https://github.com/ClickHouse/ClickHouse/issues/7507). [#8570](https://github.com/ClickHouse/ClickHouse/pull/8570) ([Zhichang Yu](https://github.com/yuzhichang)) -* 修复安全连接的超时处理, 因此查询不会无限期挂起. 这修复了[#8126](https://github.com/ClickHouse/ClickHouse/issues/8126). [#8128](https://github.com/ClickHouse/ClickHouse/pull/8128) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复并发工作者之间的 `clickhouse-copier` 冗余争用. [#7816](https://github.com/ClickHouse/ClickHouse/pull/7816) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) -* 现在突变不会跳过附加的部分, 即使它们的突变版本大于当前的突变版本. [#7812](https://github.com/ClickHouse/ClickHouse/pull/7812) ([Zhichang Yu](https://github.com/yuzhichang)) [#8250](https://github.com/ClickHouse/ClickHouse/pull/8250) ([alesapin](https://github.com/alesapin)) -* 移动到另一个磁盘和服务器重启后, 忽略 `*MergeTree` 数据部分的冗余副本. [#7810](https://github.com/ClickHouse/ClickHouse/pull/7810) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 使用 `JOIN` 键中的 `Low Cardinality` 修复 `FULL JOIN` 中的崩溃. [#8252](https://github.com/ClickHouse/ClickHouse/pull/8252) ([Artem Zuikov](https://github.com/4ertus2)) -* 禁止在插入查询中多次使用列名, 例如 `INSERT INTO tbl (x, y, x)`. 这修复了[#5465](https://github.com/ClickHouse/ClickHouse/issues/5465), [#7681](https://github.com/ClickHouse/ClickHouse/issues/7681). [#7685](https://github.com/ClickHouse/ClickHouse/pull/7685) ([alesapin](https://github.com/alesapin)) -* 添加回退以检测未知 CPU 的物理 CPU 内核数 (使用逻辑 CPU 内核数) . 这修复了 [#5239](https://github.com/ClickHouse/ClickHouse/issues/5239). [#7726](https://github.com/ClickHouse/ClickHouse/pull/7726) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复物化列和别名列的 `There's no column` 错误. [#8210](https://github.com/ClickHouse/ClickHouse/pull/8210) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复了在没有 `TABLE` 或 `DICTIONARY` 限定符的情况下使用 `EXISTS` 查询时服务器崩溃的问题. 就像 `EXISTS t`。 这修复了 [#8172](https://github.com/ClickHouse/ClickHouse/issues/8172). 这个错误是在 19.17 版本中引入的. [#8213](https://github.com/ClickHouse/ClickHouse/pull/8213) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了使用 `SimpleAggregateFunction` 列时可能出现的带有错误 `"Sizes of columns not match"` 的罕见错误. [#7790](https://github.com/ClickHouse/ClickHouse/pull/7790) ([Boris Granveaud](https://github.com/bgranvea)) -* 修复具有空 `allow_databases` 的用户可以访问所有数据库的错误 (对于 `allow_dictionaries` 也是如此). [#7793](https://github.com/ClickHouse/ClickHouse/pull/7793) ([DeifyTheGod](https://github.com/DeifyTheGod)) -* 当服务器已经与客户端断开连接时修复客户端崩溃. [#8071](https://github.com/ClickHouse/ClickHouse/pull/8071) ([Azat Khuzhin](https://github.com/azat)) -* 在按主键前缀和非主键后缀排序的情况下修复 `ORDER BY` 行为. [#7759](https://github.com/ClickHouse/ClickHouse/pull/7759) ([Anton Popov](https://github.com/CurtizJ)) -* 检查表中是否存在合格的列. 这修复了 [#6836](https://github.com/ClickHouse/ClickHouse/issues/6836). [#7758](https://github.com/ClickHouse/ClickHouse/pull/7758) ([Artem Zuikov](https://github.com/4ertus2)) -* 修复了在合并完成移动指定的超部分后立即运行的 `ALTER MOVE` 行为. 修复 [#8103](https://github.com/ClickHouse/ClickHouse/issues/8103). [#8104](https://github.com/ClickHouse/ClickHouse/pull/8104) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 修复使用具有不同列数的 `UNION` 时可能出现的服务器崩溃. 修复 [#7279](https://github.com/ClickHouse/ClickHouse/issues/7279). [#7929](https://github.com/ClickHouse/ClickHouse/pull/7929) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 修复具有负大小的函数 `substr` 的结果子字符串的大小. [#8589](https://github.com/ClickHouse/ClickHouse/pull/8589) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 现在,如果后台池中没有足够的空闲线程, 服务器不会在 `MergeTree` 中执行部分突变. [#8588](https://github.com/ClickHouse/ClickHouse/pull/8588) ([tavplubix](https://github.com/tavplubix)) -* 修复格式化`UNION ALL` AST 时的一个小错误. [#7999](https://github.com/ClickHouse/ClickHouse/pull/7999) ([litao91](https://github.com/litao91)) -* 修复了负数的错误布隆过滤器结果. 这修复了 [#8317](https://github.com/ClickHouse/ClickHouse/issues/8317). [#8566](https://github.com/ClickHouse/ClickHouse/pull/8566) ([Winter Zhang](https://github.com/zhang2014)) -* 修复了解压缩中潜在的缓冲区溢出. 恶意用户可以传递伪造的压缩数据, 这将导致缓冲区后读取. 这个问题是由 Yandex 信息安全团队的 Eldar Zaitov 发现的. [#8404](https://github.com/ClickHouse/ClickHouse/pull/8404) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复由于 `arrayIntersect` 中整数溢出而导致的错误结果. [#7777](https://github.com/ClickHouse/ClickHouse/pull/7777) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 现在 `OPTIMIZE TABLE` 查询不会等待离线副本执行操作. [#8314](https://github.com/ClickHouse/ClickHouse/pull/8314) ([javi santana](https://github.com/javisantana)) -* 修复了 `Replicated*MergeTree` 表的 `ALTER TTL` 解析器. [#8318](https://github.com/ClickHouse/ClickHouse/pull/8318) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 修复服务器和客户端之间的通信, 以便服务器在查询失败后读取临时表信息. [#8084](https://github.com/ClickHouse/ClickHouse/pull/8084) ([Azat Khuzhin](https://github.com/azat)) -* 修复聚合位图和标量位图相交时的 `bitmapAnd` 函数错误. [#8082](https://github.com/ClickHouse/ClickHouse/pull/8082) ([Yue Huang](https://github.com/moon03432)) -* 根据修复了 `clickhouse-cluster-copier` 中的错误的 ZooKeeper 程序员指南细化 `ZXid` 的定义. [#8088](https://github.com/ClickHouse/ClickHouse/pull/8088) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) -* `odbc` 表函数现在尊重 `external_table_functions_use_nulls` 设置. [#7506](https://github.com/ClickHouse/ClickHouse/pull/7506) ([Vasily Nemkov](https://github.com/Enmk)) -* 修复了导致罕见数据竞争的错误. [#8143](https://github.com/ClickHouse/ClickHouse/pull/8143) ([Alexander Kazakov](https://github.com/Akazz)) -* 现在`SYSTEM RELOAD DICTIONARY` 完全重新加载字典, 忽略`update_field`. 这修复了 [#7440](https://github.com/ClickHouse/ClickHouse/issues/7440). [#8037](https://github.com/ClickHouse/ClickHouse/pull/8037) ([Vitaly Baranov](https://github.com/vitlibar)) -* 添加检查创建查询中是否存在字典的功能. [#8032](https://github.com/ClickHouse/ClickHouse/pull/8032) ([alesapin](https://github.com/alesapin)) -* 以 `Values` 格式修复 `Float*` 解析. 这修复了 [#7817](https://github.com/ClickHouse/ClickHouse/issues/7817). [#7870](https://github.com/ClickHouse/ClickHouse/pull/7870) ([tavplubix](https://github.com/tavplubix)) -* 修复当我们无法在 `*MergeTree` 表引擎系列的某些后台操作中保留空间时崩溃. [#7873](https://github.com/ClickHouse/ClickHouse/pull/7873) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 修复当表包含 `SimpleAggregateFunction(LowCardinality)` 列时合并操作的崩溃. 这修复了 [#8515](https://github.com/ClickHouse/ClickHouse/issues/8515). [#8522](https://github.com/ClickHouse/ClickHouse/pull/8522) ([Azat Khuzhin](https://github.com/azat)) -* 恢复对所有 ICU 语言环境的支持, 并添加对常量表达式应用排序规则的功能. 还将语言名称添加到 `system.collations` 表. [#8051](https://github.com/ClickHouse/ClickHouse/pull/8051) ([alesapin](https://github.com/alesapin)) -* 修复了最小生命周期为零 (`LIFETIME(MIN 0 MAX N)`, `LIFETIME(N)`) 的外部字典不在后台更新时的错误. [#7983](https://github.com/ClickHouse/ClickHouse/pull/7983) ([alesapin](https://github.com/alesapin)) -* 修复带有 ClickHouse 源的外部字典在查询中有子查询时崩溃. [#8351](https://github.com/ClickHouse/ClickHouse/pull/8351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 使用引擎 `URL` 修复表中文件扩展名的错误解析. 这修复了 [#8157](https://github.com/ClickHouse/ClickHouse/issues/8157). [#8419](https://github.com/ClickHouse/ClickHouse/pull/8419) ([Andrey Bodrov](https://github.com/apbodrov)) -* 修复没有键的 `*MergeTree` 表的 `CHECK TABLE` 查询. 修复[#7543](https://github.com/ClickHouse/ClickHouse/issues/7543). [#7979](https://github.com/ClickHouse/ClickHouse/pull/7979) ([alesapin](https://github.com/alesapin)) -* 修复了 `Float64` 到 MySQL 类型的转换. [#8079](https://github.com/ClickHouse/ClickHouse/pull/8079) ([Yuriy Baranov](https://github.com/yurriy)) -* 现在如果表因为服务器崩溃而没有完全删除, 服务器将尝试恢复并加载它. [#8176](https://github.com/ClickHouse/ClickHouse/pull/8176) ([tavplubix](https://github.com/tavplubix)) -* 修复了表函数 `file` 在插入不存在的文件时崩溃的问题. 现在在这种情况下将创建文件, 然后将处理插入. [#8177](https://github.com/ClickHouse/ClickHouse/pull/8177) ([Olga Khvostikova](https://github.com/stavrolia)) -* 修复启用 `trace_log` 时可能发生的罕见死锁. [#7838](https://github.com/ClickHouse/ClickHouse/pull/7838) ([filimonov](https://github.com/filimonov)) -* 在从 DDL 查询创建的 `RangeHashed` 外部字典中添加除 `Date` 之外的不同类型的处理能力. 修复 [7899](https://github.com/ClickHouse/ClickHouse/issues/7899). [#8275](https://github.com/ClickHouse/ClickHouse/pull/8275) ([alesapin](https://github.com/alesapin)) -* 修复了当使用另一个函数的结果调用 `now64()` 时崩溃的问题. [#8270](https://github.com/ClickHouse/ClickHouse/pull/8270) ([Vasily Nemkov](https://github.com/Enmk)) -* 修复了通过 mysql 线路协议检测连接的客户端 IP 的错误. [#7743](https://github.com/ClickHouse/ClickHouse/pull/7743) ([Dmitry Muzyka](https://github.com/dmitriy-myz)) -* 修复 `arraySplit` 函数中的空数组处理. 这修复了 [#7708](https://github.com/ClickHouse/ClickHouse/issues/7708). [#7747](https://github.com/ClickHouse/ClickHouse/pull/7747) ([hcz](https://github.com/hczhcz)) -* 修复了另一个正在运行的 `clickhouse-server` 的 `pid-file` 可能会被删除的问题. [#8487](https://github.com/ClickHouse/ClickHouse/pull/8487) ([Weiqing Xu](https://github.com/weiqxu)) -* 修复字典重新加载, 如果它有 `invalidate_query`,它会停止更新, 并且在之前的更新尝试中出现一些异常. [#8029](https://github.com/ClickHouse/ClickHouse/pull/8029) ([alesapin](https://github.com/alesapin)) -* 修复了函数 `arrayReduce` 中可能导致 `double free` 的错误和聚合函数组合器 `Resample` 中可能导致内存泄漏的错误. 添加了聚合函数 `aggThrow`. 此功能可用于测试目的. [#8446](https://github.com/ClickHouse/ClickHouse/pull/8446) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 改进 -* 使用 `S3` 表引擎时改进了日志记录. [#8251](https://github.com/ClickHouse/ClickHouse/pull/8251) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) -* 调用 `clickhouse-local` 时没有传递参数时打印帮助消息. 这修复了 [#5335](https://github.com/ClickHouse/ClickHouse/issues/5335). [#8230](https://github.com/ClickHouse/ClickHouse/pull/8230) ([Andrey Nagorny](https://github.com/Melancholic)) -* 添加设置 `mutations_sync` 允许同步等待 `ALTER UPDATE/DELETE` 查询. [#8237](https://github.com/ClickHouse/ClickHouse/pull/8237) ([alesapin](https://github.com/alesapin)) -* 允许在 `config.xml` 中设置相关的 `user_files_path` (类似于 `format_schema_path` ). [#7632](https://github.com/ClickHouse/ClickHouse/pull/7632) ([hcz](https://github.com/hczhcz)) -* 为带有 `-OrZero` 后缀的转换函数添加非法类型的例外. [#7880](https://github.com/ClickHouse/ClickHouse/pull/7880) ([Andrey Konyaev](https://github.com/akonyaev90)) -* 简化分布式查询中发送到分片的数据头格式. [#8044](https://github.com/ClickHouse/ClickHouse/pull/8044) ([Vitaly Baranov](https://github.com/vitlibar)) -* `Live View` 表引擎重构. [#8519](https://github.com/ClickHouse/ClickHouse/pull/8519) ([vzakaznikov](https://github.com/vzakaznikov)) -* 为从 DDL 查询创建的外部词典添加额外检查. [#8127](https://github.com/ClickHouse/ClickHouse/pull/8127) ([alesapin](https://github.com/alesapin)) -* 修复错误 `Column ... already exists` , 同时使用 `FINAL` 和 `SAMPLE`, 例如 `select count() from table final sample 1/2`. 修复 [#5186](https://github.com/ClickHouse/ClickHouse/issues/5186). [#7907](https://github.com/ClickHouse/ClickHouse/pull/7907) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 现在表 `joinGet` 函数的第一个参数可以是表标识符. [#7707](https://github.com/ClickHouse/ClickHouse/pull/7707) ([Amos Bird](https://github.com/amosbird)) -* 允许将 `MaterializedView` 与 `Kafka` 表上方的子查询一起使用. [#8197](https://github.com/ClickHouse/ClickHouse/pull/8197) ([filimonov](https://github.com/filimonov)) -* 现在磁盘之间的后台移动在单独的线程池中运行它. [#7670](https://github.com/ClickHouse/ClickHouse/pull/7670) ([Vladimir Chebotarev](https://github.com/excitoon)) -* `SYSTEM RELOAD DICTIONARY` 现在同步执行. [#8240](https://github.com/ClickHouse/ClickHouse/pull/8240) ([Vitaly Baranov](https://github.com/vitlibar)) -* 堆栈跟踪现在显示物理地址 (目标文件中的偏移量) 而不是虚拟内存地址 (加载目标文件的位置). 当二进制文件与位置无关且 ASLR 处于活动状态时, 这允许使用 `addr2line`. 这修复了[#8360](https://github.com/ClickHouse/ClickHouse/issues/8360). [#8387](https://github.com/ClickHouse/ClickHouse/pull/8387) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 支持行级安全过滤器的新语法: `
...
`. 修复 [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779). [#8381](https://github.com/ClickHouse/ClickHouse/pull/8381) ([Ivan](https://github.com/abyss7)) -* 现在 `cityHash` 函数可以处理 `Decimal` 和 `UUID` 类型. 修复 [#5184](https://github.com/ClickHouse/ClickHouse/issues/5184). [#7693](https://github.com/ClickHouse/ClickHouse/pull/7693) ([Mikhail Korotov](https://github.com/millb)) -* 从系统日志中删除了固定索引粒度 (它是 1024), 因为它在实现自适应粒度后已过时. [#7698](https://github.com/ClickHouse/ClickHouse/pull/7698) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在不使用 SSL 的情况下编译 ClickHouse 时启用 MySQL 兼容性服务器. [#7852](https://github.com/ClickHouse/ClickHouse/pull/7852) ([Yuriy Baranov](https://github.com/yurriy)) -* 现在服务器校验和分布式批处理, 这会在批处理损坏的数据的情况下提供更详细的错误. [#7914](https://github.com/ClickHouse/ClickHouse/pull/7914) ([Azat Khuzhin](https://github.com/azat)) -* 支持 `DROP DATABASE`、`DETACH TABLE`、`DROP TABLE`和 `ATTACH TABLE` 用于 `MySQL` 数据库引擎. [#8202](https://github.com/ClickHouse/ClickHouse/pull/8202) ([Winter Zhang](https://github.com/zhang2014)) -* 在 S3 表函数和表引擎中添加身份验证. [#7623](https://github.com/ClickHouse/ClickHouse/pull/7623) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 添加了对不同磁盘上 `MergeTree` 额外部分的检查, 以免遗漏未定义磁盘上的数据部分. [#8118](https://github.com/ClickHouse/ClickHouse/pull/8118) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 为 Mac 客户端和服务器启用 SSL 支持. [#8297](https://github.com/ClickHouse/ClickHouse/pull/8297) ([Ivan](https://github.com/abyss7)) -* 现在 ClickHouse 可以用作 MySQL 联合服务器 (请参阅 https://dev.mysql.com/doc/refman/5.7/en/federated-create-server.html). [#7717](https://github.com/ClickHouse/ClickHouse/pull/7717) ([Maxim Fedotov](https://github.com/MaxFedotov)) -* `clickhouse-client` 现在仅在开启多查询且关闭多行时启用 `bracketed-paste` . 这修复了 [#7757](https://github.com/ClickHouse/ClickHouse/issues/7757). [#7761](https://github.com/ClickHouse/ClickHouse/pull/7761) ([Amos Bird](https://github.com/amosbird)) -* 在 `if` 函数中支持 `Array(Decimal)`. [#7721](https://github.com/ClickHouse/ClickHouse/pull/7721) ([Artem Zuikov](https://github.com/4ertus2)) -* 在 `arrayDifference`、`arrayCumSum` 和 `arrayCumSumNegative` 函数中支持小数. [#7724](https://github.com/ClickHouse/ClickHouse/pull/7724) ([Artem Zuikov](https://github.com/4ertus2)) -* 向 `system.dictionaries` 表添加了 `lifetime` 列. [#6820](https://github.com/ClickHouse/ClickHouse/issues/6820) [#7727](https://github.com/ClickHouse/ClickHouse/pull/7727) ([kekekekule](https://github.com/kekekekule)) -* 改进了对 `*MergeTree` 表引擎不同磁盘上现有部分的检查. 地址 [#7660](https://github.com/ClickHouse/ClickHouse/issues/7660). [#8440](https://github.com/ClickHouse/ClickHouse/pull/8440) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 与用于 `S3` 交互的 `AWS SDK` 集成, 允许开箱即用地使用所有 S3 功能. [#8011](https://github.com/ClickHouse/ClickHouse/pull/8011) ([Pavel Kovalenko](https://github.com/Jokser)) -* 添加了对 `Live View` 表中子查询的支持. [#7792](https://github.com/ClickHouse/ClickHouse/pull/7792) ([vzakaznikov](https://github.com/vzakaznikov)) -* 删除了从 `TTL` 表达式中检查使用 `Date` 或 `DateTime` 列的情况. [#7920](https://github.com/ClickHouse/ClickHouse/pull/7920) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 有关磁盘的信息已添加到 `system.detached_parts` 表. [#7833](https://github.com/ClickHouse/ClickHouse/pull/7833) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 现在可以在不重启的情况下更改设置 `max_(table|partition)_size_to_drop`. [#7779](https://github.com/ClickHouse/ClickHouse/pull/7779) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) -* 错误消息的可用性略好. 要求用户不要删除 `Stack trace:` 下面的行. [#7897](https://github.com/ClickHouse/ClickHouse/pull/7897) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在 [#7935](https://github.com/ClickHouse/ClickHouse/issues/7935) 之后,更好地读取来自 `Kafka` 引擎的各种格式的消息. [#8035](https://github.com/ClickHouse/ClickHouse/pull/8035) ([Ivan](https://github.com/abyss7)) -* 更好地兼容不支持 `sha2_password` 认证插件的 MySQL 客户端. [#8036](https://github.com/ClickHouse/ClickHouse/pull/8036) ([Yuriy Baranov](https://github.com/yurriy)) -* 在 MySQL 兼容服务器中支持更多的列类型. [#7975](https://github.com/ClickHouse/ClickHouse/pull/7975) ([Yuriy Baranov](https://github.com/yurriy)) -* 为带有底层 `MergeTree` 表的 `Merge`、`Buffer` 和 `Materialized View` 存储实现 `ORDER BY` 优化. [#8130](https://github.com/ClickHouse/ClickHouse/pull/8130) ([Anton Popov](https://github.com/CurtizJ)) -* 现在我们总是使用 `getrandom` 的POSIX实现来更好地兼容旧内核 (< 3.17). [#7940](https://github.com/ClickHouse/ClickHouse/pull/7940) ([Amos Bird](https://github.com/amosbird)) -* 更好地检查移动 TTL 规则中的有效目的地. [#8410](https://github.com/ClickHouse/ClickHouse/pull/8410) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 更好地检查 `Distributed` 表引擎的损坏插入批次. [#7933](https://github.com/ClickHouse/ClickHouse/pull/7933) ([Azat Khuzhin](https://github.com/azat)) -* 将带有突变必须在未来处理的部分名称数组的列添加到 `system.mutations` 表. [#8179](https://github.com/ClickHouse/ClickHouse/pull/8179) ([alesapin](https://github.com/alesapin)) -* 处理器的并行归并排序优化. [#8552](https://github.com/ClickHouse/ClickHouse/pull/8552) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 设置 `mark_cache_min_lifetime` 现在已经过时并且什么都不做. 在以前的版本中, 标记缓存可以在大于 `mark_cache_size` 的内存中增长, 以在 `mark_cache_min_lifetime` 秒内容纳数据. 这导致混乱和比预期更高的内存使用量, 这在内存受限的系统上尤其糟糕. 如果您在安装此版本后发现性能下降, 您应该增加 `mark_cache_size`. [#8484](https://github.com/ClickHouse/ClickHouse/pull/8484) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 准备在任何地方使用 `tid`. 这是 [#7477](https://github.com/ClickHouse/ClickHouse/issues/7477) 所必需的. [#8276](https://github.com/ClickHouse/ClickHouse/pull/8276) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -#### 性能改进 -* 处理器管道中的性能优化. [#7988](https://github.com/ClickHouse/ClickHouse/pull/7988) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 缓存字典中过期键的非阻塞更新 (具有读取旧键的权限). [#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 全局编译不带 `-fno-omit-frame-pointer` 的 ClickHouse 以节省一个寄存器. [#8097](https://github.com/ClickHouse/ClickHouse/pull/8097) ([Amos Bird](https://github.com/amosbird)) -* 加速 `greatCircleDistance` 函数并为其添加性能测试. [#7307](https://github.com/ClickHouse/ClickHouse/pull/7307) ([Olga Khvostikova](https://github.com/stavrolia)) -* 改进功能 `roundDown` 的性能. [#8465](https://github.com/ClickHouse/ClickHouse/pull/8465) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 改进了 `DateTime64` 数据类型的 `max`、`min`、`argMin`、`argMax`的性能. [#8199](https://github.com/ClickHouse/ClickHouse/pull/8199) ([Vasily Nemkov](https://github.com/Enmk)) -* 改进了无限制或大限制和外部排序的排序性能. [#8545](https://github.com/ClickHouse/ClickHouse/pull/8545) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 格式化浮点数的性能提高了 6 倍. [#8542](https://github.com/ClickHouse/ClickHouse/pull/8542) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 改进了 `modulo` 函数的性能. [#7750](https://github.com/ClickHouse/ClickHouse/pull/7750) ([Amos Bird](https://github.com/amosbird)) -* 优化了`ORDER BY` 并与单列键合并. [#8335](https://github.com/ClickHouse/ClickHouse/pull/8335) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 更好地实现 `arrayReduce`、`-Array` 和 `-State` 组合器. [#7710](https://github.com/ClickHouse/ClickHouse/pull/7710) ([Amos Bird](https://github.com/amosbird)) -* 现在 `PREWHERE` 应该被优化为至少和 `WHERE` 一样有效. [#7769](https://github.com/ClickHouse/ClickHouse/pull/7769) ([Amos Bird](https://github.com/amosbird)) -* 改进 `round` 和 `roundBankers` 处理负数的方式. [#8229](https://github.com/ClickHouse/ClickHouse/pull/8229) ([hcz](https://github.com/hczhcz)) -* 将 `DoubleDelta` 和 `Gorilla` 编解码器的解码性能提高了大约 30-40%. 这修复了 [#7082](https://github.com/ClickHouse/ClickHouse/issues/7082). [#8019](https://github.com/ClickHouse/ClickHouse/pull/8019) ([Vasily Nemkov](https://github.com/Enmk)) -* 改进了 `base64` 相关功能的性能. [#8444](https://github.com/ClickHouse/ClickHouse/pull/8444) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 添加了一个功能`geoDistance`. 它类似于 `greatCircleDistance`, 但使用对 WGS-84 椭球模型的近似. 两种功能的性能几乎相同. [#8086](https://github.com/ClickHouse/ClickHouse/pull/8086) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* `Decimal` 数据类型的更快的 `min` 和 `max` 聚合函数. [#8144](https://github.com/ClickHouse/ClickHouse/pull/8144) ([Artem Zuikov](https://github.com/4ertus2)) -* 向量化处理`arrayReduce`. [#7608](https://github.com/ClickHouse/ClickHouse/pull/7608) ([Amos Bird](https://github.com/amosbird)) -* `if` 链现在优化为 `multiIf`. [#8355](https://github.com/ClickHouse/ClickHouse/pull/8355) ([kamalov-ruslan](https://github.com/kamalov-ruslan)) -* 修复了 19.15 中引入的 `Kafka` 表引擎的性能回归. 这修复了 [#7261](https://github.com/ClickHouse/ClickHouse/issues/7261). [#7935](https://github.com/ClickHouse/ClickHouse/pull/7935) ([filimonov](https://github.com/filimonov)) -* 删除了 Debian 软件包中的 `gcc` 偶尔会在默认情况下带来的 'pie' 代码生成. [#8483](https://github.com/ClickHouse/ClickHouse/pull/8483) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 并行解析数据格式. [#6553](https://github.com/ClickHouse/ClickHouse/pull/6553) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) -* 默认情况下启用带有表达式的“值”的优化解析器 (`input_format_values_deduce_templates_of_expressions=1`). [#8231](https://github.com/ClickHouse/ClickHouse/pull/8231) ([tavplubix](https://github.com/tavplubix)) - -#### 构建/测试/打包改进 -* 为 `ARM` 和最小模式构建修复. [#8304](https://github.com/ClickHouse/ClickHouse/pull/8304) ([proller](https://github.com/proller)) -* 未调用 std::atexit 时为 `clickhouse-server` 添加覆盖文件刷新. 还略微改进了具有覆盖率的无状态测试的日志记录. [#8267](https://github.com/ClickHouse/ClickHouse/pull/8267) ([alesapin](https://github.com/alesapin)) -* 在 contrib 中更新 LLVM 库. 避免使用 OS 包中的 LLVM. [#8258](https://github.com/ClickHouse/ClickHouse/pull/8258) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 使捆绑的 `curl` 构建完全安静. [#8232](https://github.com/ClickHouse/ClickHouse/pull/8232) [#8203](https://github.com/ClickHouse/ClickHouse/pull/8203) ([Pavel Kovalenko](https://github.com/Jokser)) -* 修复一些 `MemorySanitizer` 警告. [#8235](https://github.com/ClickHouse/ClickHouse/pull/8235) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 在 `CMakeLists.txt` 中使用 `add_warning` 和 `no_warning` 宏. [#8604](https://github.com/ClickHouse/ClickHouse/pull/8604) ([Ivan](https://github.com/abyss7)) -* 添加对 Minio S3 兼容对象 (https://min.io/) 的支持以进行更好的集成测试. [#7863](https://github.com/ClickHouse/ClickHouse/pull/7863) [#7875](https://github.com/ClickHouse/ClickHouse/pull/7875) ([Pavel Kovalenko](https://github.com/Jokser)) -* 将 `libc` 头文件导入到 contrib. 它允许在各种系统之间使构建更加一致 (仅适用于 `x86_64-linux-gnu`). [#5773](https://github.com/ClickHouse/ClickHouse/pull/5773) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 从某些库中删除 `-fPIC`. [#8464](https://github.com/ClickHouse/ClickHouse/pull/8464) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为 curl 清理 `CMakeLists.txt`. 见 https://github.com/ClickHouse/ClickHouse/pull/8011#issuecomment-569478910 [#8459](https://github.com/ClickHouse/ClickHouse/pull/8459) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* `CapNProto` 库中的静默警告. [#8220](https://github.com/ClickHouse/ClickHouse/pull/8220) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为短字符串优化哈希表添加性能测试. [#7679](https://github.com/ClickHouse/ClickHouse/pull/7679) ([Amos Bird](https://github.com/amosbird)) -* 现在, 即使 `MADV_FREE` 不可用, ClickHouse 也将构建在 `AArch64` 上. 这修复了 [#8027](https://github.com/ClickHouse/ClickHouse/issues/8027). [#8243](https://github.com/ClickHouse/ClickHouse/pull/8243) ([Amos Bird](https://github.com/amosbird)) -* 更新 `zlib-ng` 以修复内存清理器问题. [#7182](https://github.com/ClickHouse/ClickHouse/pull/7182) [#8206](https://github.com/ClickHouse/ClickHouse/pull/8206) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 在非 Linux 系统上启用内部 MySQL 库, 因为 OS 包的使用非常脆弱, 通常根本不起作用. 这修复了 [#5765](https://github.com/ClickHouse/ClickHouse/issues/5765). [#8426](https://github.com/ClickHouse/ClickHouse/pull/8426) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了启用 `libc++` 后在某些系统上的构建. 这取代了 [#8374](https://github.com/ClickHouse/ClickHouse/issues/8374). [#8380](https://github.com/ClickHouse/ClickHouse/pull/8380) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 使 `Field` 方法更加类型安全以查找更多错误. [#7386](https://github.com/ClickHouse/ClickHouse/pull/7386) [#8209](https://github.com/ClickHouse/ClickHouse/pull/8209) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 将缺失的文件添加到 `libc-headers` 子模块. [#8507](https://github.com/ClickHouse/ClickHouse/pull/8507) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复性能测试输出中错误的 `JSON` 引用. [#8497](https://github.com/ClickHouse/ClickHouse/pull/8497) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 现在为 `std::exception` 和 `Poco::Exception` 显示堆栈跟踪. 在以前的版本中, 它仅适用于`DB::Exception`. 这改进了诊断. [#8501](https://github.com/ClickHouse/ClickHouse/pull/8501) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 为新的 glibc 版本移植 `clock_gettime` 和 `clock_nanosleep`. [#8054](https://github.com/ClickHouse/ClickHouse/pull/8054) ([Amos Bird](https://github.com/amosbird)) -* 在示例配置中为开发人员启用`part_log`. [#8609](https://github.com/ClickHouse/ClickHouse/pull/8609) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复 `01036_no_superfluous_dict_reload_on_create_database*` 中重新加载的异步性质. [#8111](https://github.com/ClickHouse/ClickHouse/pull/8111) ([Azat Khuzhin](https://github.com/azat)) -* 修复编解码器性能测试. [#8615](https://github.com/ClickHouse/ClickHouse/pull/8615) ([Vasily Nemkov](https://github.com/Enmk)) -* 为 `.tgz` 构建和文档添加安装脚本. [#8612](https://github.com/ClickHouse/ClickHouse/pull/8612) [#8591](https://github.com/ClickHouse/ClickHouse/pull/8591) ([alesapin](https://github.com/alesapin)) -* 删除了旧的 `ZSTD` 测试 (它是在 2016 年创建的, 用于重现 ZSTD 1.0 版之前的错误). 这修复了 [#8618](https://github.com/ClickHouse/ClickHouse/issues/8618). [#8619](https://github.com/ClickHouse/ClickHouse/pull/8619) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了 Mac OS Catalina 上的构建. [#8600](https://github.com/ClickHouse/ClickHouse/pull/8600) ([meo](https://github.com/meob)) -* 增加编解码器性能测试中的行数, 使结果更显着. [#8574](https://github.com/ClickHouse/ClickHouse/pull/8574) ([Vasily Nemkov](https://github.com/Enmk)) -* 在调试版本中, 将 `LOGICAL_ERROR` 异常视为断言失败, 以便它们更容易被注意到. [#8475](https://github.com/ClickHouse/ClickHouse/pull/8475) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 使与格式相关的性能测试更具确定性. [#8477](https://github.com/ClickHouse/ClickHouse/pull/8477) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 更新 `lz4` 以修复 MemorySanitizer 故障. [#8181](https://github.com/ClickHouse/ClickHouse/pull/8181) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 在异常处理中抑制已知的 MemorySanitizer 误报. [#8182](https://github.com/ClickHouse/ClickHouse/pull/8182) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 将 `gcc` 和 `g++` 更新到 `build/docker/build.sh` 中的版本 9. [#7766](https://github.com/ClickHouse/ClickHouse/pull/7766) ([TLightSky](https://github.com/tlightsky)) -* 添加性能测试用例来测试 `PREWHERE` 比 `WHERE` 差. [#7768](https://github.com/ClickHouse/ClickHouse/pull/7768) ([Amos Bird](https://github.com/amosbird)) -* 修复一个不稳定的测试的进展. [#8621](https://github.com/ClickHouse/ClickHouse/pull/8621) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 避免对来自`libunwind` 的数据进行 MemorySanitizer 报告. [#8539](https://github.com/ClickHouse/ClickHouse/pull/8539) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 将 `libc++` 更新到最新版本. [#8324](https://github.com/ClickHouse/ClickHouse/pull/8324) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 从源代码构建 ICU 库. 这修复了 [#6460](https://github.com/ClickHouse/ClickHouse/issues/6460). [#8219](https://github.com/ClickHouse/ClickHouse/pull/8219) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 从 `libressl` 切换到 `openssl`. 在此更改后,ClickHouse 应支持 TLS 1.3 和 SNI. 这修复了[#8171](https://github.com/ClickHouse/ClickHouse/issues/8171). [#8218](https://github.com/ClickHouse/ClickHouse/pull/8218) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复了从 SSL 使用 `chacha20_poly1305` 时的 UBSan 报告 (发生在连接到 https://yandex.ru/ 时). [#8214](https://github.com/ClickHouse/ClickHouse/pull/8214) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复`.deb` linux 发行版的默认密码文件模式. [#8075](https://github.com/ClickHouse/ClickHouse/pull/8075) ([proller](https://github.com/proller)) -* 改进了在 `clickhouse-test` 中获取 `clickhouse-server` PID 的表达式. [#8063](https://github.com/ClickHouse/ClickHouse/pull/8063) ([Alexander Kazakov](https://github.com/Akazz)) -* 将 contrib/googletest 更新到 v1.10.0. [#8587](https://github.com/ClickHouse/ClickHouse/pull/8587) ([Alexander Burmak](https://github.com/Alex-Burmak)) -* 修复了 `base64` 库中的 ThreadSaninitizer 报告. 也把这个库更新到了最新版本, 不过没关系. 这修复了 [#8397](https://github.com/ClickHouse/ClickHouse/issues/8397). [#8403](https://github.com/ClickHouse/ClickHouse/pull/8403) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 修复处理器的 `00600_replace_running_query` . [#8272](https://github.com/ClickHouse/ClickHouse/pull/8272) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 删除对 `tcmalloc` 的支持, 使 `CMakeLists.txt` 更简单. [#8310](https://github.com/ClickHouse/ClickHouse/pull/8310) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 发布 gcc 构建现在使用 `libc++` 而不是 `libstdc++`. 最近 `libc++` 只与clang 一起使用. 这将提高构建配置和可移植性的一致性. [#8311](https://github.com/ClickHouse/ClickHouse/pull/8311) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 启用 ICU 库以使用 MemorySanitizer 进行构建. [#8222](https://github.com/ClickHouse/ClickHouse/pull/8222) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 抑制来自 `CapNProto` 库的警告. [#8224](https://github.com/ClickHouse/ClickHouse/pull/8224) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 删除了 `tcmalloc` 代码的特殊情况, 因为它不再受支持. [#8225](https://github.com/ClickHouse/ClickHouse/pull/8225) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在 CI 覆盖任务中, 优雅地杀死服务器以允许它保存覆盖报告. 这修复了我们最近看到的不完整的覆盖报告. [#8142](https://github.com/ClickHouse/ClickHouse/pull/8142) ([alesapin](https://github.com/alesapin)) -* 针对 `Float64` 和 `UInt64` 值对所有编解码器进行性能测试. [#8349](https://github.com/ClickHouse/ClickHouse/pull/8349) ([Vasily Nemkov](https://github.com/Enmk)) -* `termcap` 非常不推荐使用并导致各种问题 (例如, 缺少“up”cap 和回显 `^J` 而不是多行). 支持`terminfo` 或捆绑 `ncurses`. [#7737](https://github.com/ClickHouse/ClickHouse/pull/7737) ([Amos Bird](https://github.com/amosbird)) -* 修复 `test_storage_s3` 集成测试. [#7734](https://github.com/ClickHouse/ClickHouse/pull/7734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 支持 `StorageFile(, null)` 将块插入给定的格式文件而不实际写入磁盘. 这是性能测试所必需的. [#8455](https://github.com/ClickHouse/ClickHouse/pull/8455) ([Amos Bird](https://github.com/amosbird)) -* 向功能测试添加了参数 `--print-time`, 用于打印每个测试的执行时间. [#8001](https://github.com/ClickHouse/ClickHouse/pull/8001) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 在评估 RPN 时向 `KeyCondition` 添加断言. 这将修复来自 gcc-9 的警告. [#8279](https://github.com/ClickHouse/ClickHouse/pull/8279) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 在 CI 构建中转储 cmake 选项. [#8273](https://github.com/ClickHouse/ClickHouse/pull/8273) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 不要为某些胖库生成调试信息. [#8271](https://github.com/ClickHouse/ClickHouse/pull/8271) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 使 `log_to_console.xml` 始终登录到 stderr, 无论它是否交互. [#8395](https://github.com/ClickHouse/ClickHouse/pull/8395) ([Alexander Kuzmenkov](https://github.com/akuzm)) -* 从 `clickhouse-performance-test` 工具中删除了一些未使用的功能. [#8555](https://github.com/ClickHouse/ClickHouse/pull/8555) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 现在我们还将搜索带有相应 `clang-X` 版本的 `lld-X`. [#8092](https://github.com/ClickHouse/ClickHouse/pull/8092) ([alesapin](https://github.com/alesapin)) -* Parquet 构建改进. [#8421](https://github.com/ClickHouse/ClickHouse/pull/8421) ([maxulan](https://github.com/maxulan)) -* 更多 GCC 警告. [#8221](https://github.com/ClickHouse/ClickHouse/pull/8221) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) -* Arch Linux 软件包现在允许运行 ClickHouse 服务器, 而不仅仅是客户端. [#8534](https://github.com/ClickHouse/ClickHouse/pull/8534) ([Vladimir Chebotarev](https://github.com/excitoon)) -* 使用处理器修复测试. 微小的性能修复. [#7672](https://github.com/ClickHouse/ClickHouse/pull/7672) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) -* 更新 contrib/protobuf. [#8256](https://github.com/ClickHouse/ClickHouse/pull/8256) ([Matwey V. Kornilov](https://github.com/matwey)) -* 准备切换到 c++20 作为新年庆祝活动. "May the C++ force be with ClickHouse". [#8447](https://github.com/ClickHouse/ClickHouse/pull/8447) ([Amos Bird](https://github.com/amosbird)) - -#### 实验功能 -* 添加了实验设置 `min_bytes_to_use_mmap_io`. 它允许读取大文件而无需将数据从内核复制到用户空间. 默认情况下禁用该设置. 推荐的阈值大约是 64 MB, 因为 mmap/munmap 很慢. [#8520](https://github.com/ClickHouse/ClickHouse/pull/8520) ([alexey-milovidov](https://github.com/alexey-milovidov)) -* 重新设计配额作为访问控制系统的一部分. 添加了新表 `system.quotas`、新函数 `currentQuota`、`currentQuotaKey`、新SQL语法 `CREATE QUOTA`、`ALTER QUOTA`、`DROP QUOTA`、`SHOW QUOTA`. [#7257](https://github.com/ClickHouse/ClickHouse/pull/7257) ([Vitaly Baranov](https://github.com/vitlibar)) -* 允许跳过带有警告的未知设置而不是抛出异常. [#7653](https://github.com/ClickHouse/ClickHouse/pull/7653) ([Vitaly Baranov](https://github.com/vitlibar)) -* 重新设计行策略作为访问控制系统的一部分. 添加新表`system.row_policies`、新函数 `currentRowPolicies()`、新SQL语法 `CREATE POLICY`、`ALTER POLICY`、`DROP POLICY`、`SHOW CREATE POLICY`、`SHOW POLICIES`. [#7808](https://github.com/ClickHouse/ClickHouse/pull/7808) ([Vitaly Baranov](https://github.com/vitlibar)) - -#### Security Fix -* 修复了使用 `File` 表引擎读取表中目录结构的可能性. 这修复了 [#8536](https://github.com/ClickHouse/ClickHouse/issues/8536). [#8537](https://github.com/ClickHouse/ClickHouse/pull/8537) ([alexey-milovidov](https://github.com/alexey-milovidov)) - -## [Changelog for 2019](https://github.com/ClickHouse/ClickHouse/blob/master/docs/en/whats-new/changelog/2019.md) diff --git a/packages/clickhouse-client.yaml b/packages/clickhouse-client.yaml index 642d66f5475..459a09ee0b8 100644 --- a/packages/clickhouse-client.yaml +++ b/packages/clickhouse-client.yaml @@ -30,6 +30,10 @@ overrides: depends: - clickhouse-common-static = ${CLICKHOUSE_VERSION_STRING} +deb: + fields: + Source: clickhouse + contents: - src: root/etc/clickhouse-client/config.xml dst: /etc/clickhouse-client/config.xml diff --git a/packages/clickhouse-common-static-dbg.yaml b/packages/clickhouse-common-static-dbg.yaml index 12a1594bd30..b2d2b3aaf26 100644 --- a/packages/clickhouse-common-static-dbg.yaml +++ b/packages/clickhouse-common-static-dbg.yaml @@ -20,6 +20,10 @@ description: | debugging symbols for clickhouse-common-static This package contains the debugging symbols for clickhouse-common. +deb: + fields: + Source: clickhouse + contents: - src: root/usr/lib/debug/usr/bin/clickhouse.debug dst: /usr/lib/debug/usr/bin/clickhouse.debug diff --git a/packages/clickhouse-common-static.yaml b/packages/clickhouse-common-static.yaml index 527b6a24703..c77914d0d69 100644 --- a/packages/clickhouse-common-static.yaml +++ b/packages/clickhouse-common-static.yaml @@ -26,6 +26,10 @@ description: | that allows generating analytical data reports in real time. This package provides common files for both clickhouse server and client +deb: + fields: + Source: clickhouse + contents: - src: root/usr/bin/clickhouse dst: /usr/bin/clickhouse diff --git a/packages/clickhouse-keeper-dbg.yaml b/packages/clickhouse-keeper-dbg.yaml index 2c70b7ad4aa..a6be9ec9e97 100644 --- a/packages/clickhouse-keeper-dbg.yaml +++ b/packages/clickhouse-keeper-dbg.yaml @@ -14,6 +14,10 @@ description: | debugging symbols for clickhouse-keeper This package contains the debugging symbols for clickhouse-keeper. +deb: + fields: + Source: clickhouse + contents: - src: root/usr/lib/debug/usr/bin/clickhouse-keeper.debug dst: /usr/lib/debug/usr/bin/clickhouse-keeper.debug diff --git a/packages/clickhouse-keeper.yaml b/packages/clickhouse-keeper.yaml index e99ac30f944..7803729c469 100644 --- a/packages/clickhouse-keeper.yaml +++ b/packages/clickhouse-keeper.yaml @@ -22,6 +22,9 @@ description: | Static clickhouse-keeper binary A stand-alone clickhouse-keeper package +deb: + fields: + Source: clickhouse contents: - src: root/etc/clickhouse-keeper diff --git a/packages/clickhouse-server.init b/packages/clickhouse-server.init index 1695f6286b8..13aeffe13a7 100755 --- a/packages/clickhouse-server.init +++ b/packages/clickhouse-server.init @@ -47,9 +47,10 @@ CLICKHOUSE_PIDFILE="$CLICKHOUSE_PIDDIR/$PROGRAM.pid" # Some systems lack "flock" command -v flock >/dev/null && FLOCK=flock -# Override defaults from optional config file +# Override defaults from optional config file and export them automatically +set -a test -f /etc/default/clickhouse && . /etc/default/clickhouse - +set +a die() { diff --git a/packages/clickhouse-server.yaml b/packages/clickhouse-server.yaml index 28995689754..a94ad1e9169 100644 --- a/packages/clickhouse-server.yaml +++ b/packages/clickhouse-server.yaml @@ -37,6 +37,10 @@ overrides: depends: - clickhouse-common-static = ${CLICKHOUSE_VERSION_STRING} +deb: + fields: + Source: clickhouse + contents: - src: root/etc/clickhouse-server dst: /etc/clickhouse-server diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index 3c0c0781de6..9cf7cb2b624 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -54,7 +54,7 @@ else () endif () if (NOT USE_MUSL) - option (ENABLE_CLICKHOUSE_LIBRARY_BRIDGE "HTTP-server working like a proxy to Library dictionary source" ${ENABLE_CLICKHOUSE_ALL}) + option (ENABLE_CLICKHOUSE_LIBRARY_BRIDGE "HTTP-server working like a proxy to external dynamically loaded libraries" ${ENABLE_CLICKHOUSE_ALL}) endif () # https://presentations.clickhouse.com/matemarketing_2020/ diff --git a/programs/benchmark/clickhouse-benchmark.cpp b/programs/benchmark/clickhouse-benchmark.cpp index 6bcb6e19b88..d58dd4dfbe7 100644 --- a/programs/benchmark/clickhouse-benchmark.cpp +++ b/programs/benchmark/clickhouse-benchmark.cpp @@ -1,2 +1 @@ extern int mainEntryClickHouseBenchmark(int argc, char ** argv); -int main(int argc_, char ** argv_) { return mainEntryClickHouseBenchmark(argc_, argv_); } diff --git a/programs/client/Client.cpp b/programs/client/Client.cpp index 6506c23428a..5bd9d28d8e3 100644 --- a/programs/client/Client.cpp +++ b/programs/client/Client.cpp @@ -150,7 +150,7 @@ std::vector Client::loadWarningMessages() size_t rows = packet.block.rows(); for (size_t i = 0; i < rows; ++i) - messages.emplace_back(column.getDataAt(i).toString()); + messages.emplace_back(column[i].get()); } continue; diff --git a/programs/client/clickhouse-client.cpp b/programs/client/clickhouse-client.cpp index 8f7da31d617..3e489c5ff15 100644 --- a/programs/client/clickhouse-client.cpp +++ b/programs/client/clickhouse-client.cpp @@ -1,2 +1 @@ int mainEntryClickHouseClient(int argc, char ** argv); -int main(int argc_, char ** argv_) { return mainEntryClickHouseClient(argc_, argv_); } diff --git a/programs/compressor/clickhouse-compressor.cpp b/programs/compressor/clickhouse-compressor.cpp index f7d8611eac5..13a00ab6aff 100644 --- a/programs/compressor/clickhouse-compressor.cpp +++ b/programs/compressor/clickhouse-compressor.cpp @@ -1,2 +1 @@ int mainEntryClickHouseCompressor(int argc, char ** argv); -int main(int argc_, char ** argv_) { return mainEntryClickHouseCompressor(argc_, argv_); } diff --git a/programs/copier/clickhouse-copier.cpp b/programs/copier/clickhouse-copier.cpp index 653a0128aa4..4dabb01775b 100644 --- a/programs/copier/clickhouse-copier.cpp +++ b/programs/copier/clickhouse-copier.cpp @@ -1,2 +1 @@ int mainEntryClickHouseClusterCopier(int argc, char ** argv); -int main(int argc_, char ** argv_) { return mainEntryClickHouseClusterCopier(argc_, argv_); } diff --git a/programs/diagnostics/internal/platform/data/file_test.go b/programs/diagnostics/internal/platform/data/file_test.go index d273987d327..b93c4fc3350 100644 --- a/programs/diagnostics/internal/platform/data/file_test.go +++ b/programs/diagnostics/internal/platform/data/file_test.go @@ -133,11 +133,11 @@ func TestConfigFileFrameCopy(t *testing.T) { require.Empty(t, errs) i := 0 sizes := map[string]int64{ - "users.xml": int64(2039), + "users.xml": int64(2017), "default-password.xml": int64(188), - "config.xml": int64(61282), + "config.xml": int64(61260), "server-include.xml": int64(168), - "user-include.xml": int64(582), + "user-include.xml": int64(559), } var checkedFiles []string for { diff --git a/programs/diagnostics/testdata/configs/include/xml/user-include.xml b/programs/diagnostics/testdata/configs/include/xml/user-include.xml index 01dc5e2da19..b12b34a56bb 100644 --- a/programs/diagnostics/testdata/configs/include/xml/user-include.xml +++ b/programs/diagnostics/testdata/configs/include/xml/user-include.xml @@ -1,4 +1,3 @@ - diff --git a/programs/diagnostics/testdata/configs/xml/config.xml b/programs/diagnostics/testdata/configs/xml/config.xml index a41c3b8c04e..18997855955 100644 --- a/programs/diagnostics/testdata/configs/xml/config.xml +++ b/programs/diagnostics/testdata/configs/xml/config.xml @@ -1,4 +1,3 @@ - diff --git a/programs/diagnostics/testdata/configs/yandex_xml/config.xml b/programs/diagnostics/testdata/configs/yandex_xml/config.xml index 5133ce93ae5..8854754fc3c 100644 --- a/programs/diagnostics/testdata/configs/yandex_xml/config.xml +++ b/programs/diagnostics/testdata/configs/yandex_xml/config.xml @@ -1,4 +1,3 @@ - catboost library handler + std::unordered_map library_handlers TSA_GUARDED_BY(mutex); + std::mutex mutex; + Poco::Logger * log; +}; + +} diff --git a/programs/library-bridge/ExternalDictionaryLibraryHandler.h b/programs/library-bridge/ExternalDictionaryLibraryHandler.h index 7713e9a6830..77c9b9fdf39 100644 --- a/programs/library-bridge/ExternalDictionaryLibraryHandler.h +++ b/programs/library-bridge/ExternalDictionaryLibraryHandler.h @@ -1,6 +1,6 @@ #pragma once -#include +#include "SharedLibrary.h" #include #include "ExternalDictionaryLibraryUtils.h" @@ -50,6 +50,6 @@ private: void * lib_data; }; -using SharedLibraryHandlerPtr = std::shared_ptr; +using ExternalDictionaryLibraryHandlerPtr = std::shared_ptr; } diff --git a/programs/library-bridge/ExternalDictionaryLibraryHandlerFactory.cpp b/programs/library-bridge/ExternalDictionaryLibraryHandlerFactory.cpp index ffa5ff6f493..6acd9af20ed 100644 --- a/programs/library-bridge/ExternalDictionaryLibraryHandlerFactory.cpp +++ b/programs/library-bridge/ExternalDictionaryLibraryHandlerFactory.cpp @@ -1,37 +1,40 @@ #include "ExternalDictionaryLibraryHandlerFactory.h" +#include namespace DB { -SharedLibraryHandlerPtr ExternalDictionaryLibraryHandlerFactory::get(const std::string & dictionary_id) +ExternalDictionaryLibraryHandlerPtr ExternalDictionaryLibraryHandlerFactory::get(const String & dictionary_id) { std::lock_guard lock(mutex); - auto library_handler = library_handlers.find(dictionary_id); - - if (library_handler != library_handlers.end()) - return library_handler->second; + if (auto handler = library_handlers.find(dictionary_id); handler != library_handlers.end()) + return handler->second; return nullptr; } void ExternalDictionaryLibraryHandlerFactory::create( - const std::string & dictionary_id, - const std::string & library_path, - const std::vector & library_settings, + const String & dictionary_id, + const String & library_path, + const std::vector & library_settings, const Block & sample_block, - const std::vector & attributes_names) + const std::vector & attributes_names) { std::lock_guard lock(mutex); - if (!library_handlers.contains(dictionary_id)) - library_handlers.emplace(std::make_pair(dictionary_id, std::make_shared(library_path, library_settings, sample_block, attributes_names))); - else + + if (library_handlers.contains(dictionary_id)) + { LOG_WARNING(&Poco::Logger::get("ExternalDictionaryLibraryHandlerFactory"), "Library handler with dictionary id {} already exists", dictionary_id); + return; + } + + library_handlers.emplace(std::make_pair(dictionary_id, std::make_shared(library_path, library_settings, sample_block, attributes_names))); } -bool ExternalDictionaryLibraryHandlerFactory::clone(const std::string & from_dictionary_id, const std::string & to_dictionary_id) +bool ExternalDictionaryLibraryHandlerFactory::clone(const String & from_dictionary_id, const String & to_dictionary_id) { std::lock_guard lock(mutex); auto from_library_handler = library_handlers.find(from_dictionary_id); @@ -45,7 +48,7 @@ bool ExternalDictionaryLibraryHandlerFactory::clone(const std::string & from_dic } -bool ExternalDictionaryLibraryHandlerFactory::remove(const std::string & dictionary_id) +bool ExternalDictionaryLibraryHandlerFactory::remove(const String & dictionary_id) { std::lock_guard lock(mutex); /// extDict_libDelete is called in destructor. diff --git a/programs/library-bridge/ExternalDictionaryLibraryHandlerFactory.h b/programs/library-bridge/ExternalDictionaryLibraryHandlerFactory.h index d821270c474..3dfafd82a0f 100644 --- a/programs/library-bridge/ExternalDictionaryLibraryHandlerFactory.h +++ b/programs/library-bridge/ExternalDictionaryLibraryHandlerFactory.h @@ -17,22 +17,22 @@ class ExternalDictionaryLibraryHandlerFactory final : private boost::noncopyable public: static ExternalDictionaryLibraryHandlerFactory & instance(); - SharedLibraryHandlerPtr get(const std::string & dictionary_id); + ExternalDictionaryLibraryHandlerPtr get(const String & dictionary_id); void create( - const std::string & dictionary_id, - const std::string & library_path, - const std::vector & library_settings, + const String & dictionary_id, + const String & library_path, + const std::vector & library_settings, const Block & sample_block, - const std::vector & attributes_names); + const std::vector & attributes_names); - bool clone(const std::string & from_dictionary_id, const std::string & to_dictionary_id); + bool clone(const String & from_dictionary_id, const String & to_dictionary_id); - bool remove(const std::string & dictionary_id); + bool remove(const String & dictionary_id); private: /// map: dict_id -> sharedLibraryHandler - std::unordered_map library_handlers TSA_GUARDED_BY(mutex); + std::unordered_map library_handlers TSA_GUARDED_BY(mutex); std::mutex mutex; }; diff --git a/programs/library-bridge/LibraryBridgeHandlerFactory.cpp b/programs/library-bridge/LibraryBridgeHandlerFactory.cpp index f8f6a23e1be..4af1f8355e8 100644 --- a/programs/library-bridge/LibraryBridgeHandlerFactory.cpp +++ b/programs/library-bridge/LibraryBridgeHandlerFactory.cpp @@ -27,12 +27,16 @@ std::unique_ptr LibraryBridgeHandlerFactory::createRequestHa { if (uri.getPath() == "/extdict_ping") return std::make_unique(keep_alive_timeout, getContext()); + else if (uri.getPath() == "/catboost_ping") + return std::make_unique(keep_alive_timeout, getContext()); } if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST) { if (uri.getPath() == "/extdict_request") return std::make_unique(keep_alive_timeout, getContext()); + else if (uri.getPath() == "/catboost_request") + return std::make_unique(keep_alive_timeout, getContext()); } return nullptr; diff --git a/programs/library-bridge/LibraryBridgeHandlers.cpp b/programs/library-bridge/LibraryBridgeHandlers.cpp index a28148bd1f7..ab81472be88 100644 --- a/programs/library-bridge/LibraryBridgeHandlers.cpp +++ b/programs/library-bridge/LibraryBridgeHandlers.cpp @@ -1,24 +1,32 @@ #include "LibraryBridgeHandlers.h" + +#include "CatBoostLibraryHandler.h" +#include "CatBoostLibraryHandlerFactory.h" +#include "ExternalDictionaryLibraryHandler.h" #include "ExternalDictionaryLibraryHandlerFactory.h" #include -#include -#include +#include #include #include +#include +#include #include #include -#include #include -#include -#include -#include #include #include +#include +#include #include #include +#include #include -#include +#include +#include +#include +#include +#include namespace DB @@ -31,7 +39,7 @@ namespace ErrorCodes namespace { - void processError(HTTPServerResponse & response, const std::string & message) + void processError(HTTPServerResponse & response, const String & message) { response.setStatusAndReason(HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); @@ -41,7 +49,7 @@ namespace LOG_WARNING(&Poco::Logger::get("LibraryBridge"), fmt::runtime(message)); } - std::shared_ptr parseColumns(std::string && column_string) + std::shared_ptr parseColumns(String && column_string) { auto sample_block = std::make_shared(); auto names_and_types = NamesAndTypesList::parse(column_string); @@ -59,10 +67,10 @@ namespace return ids; } - std::vector parseNamesFromBinary(const std::string & names_string) + std::vector parseNamesFromBinary(const String & names_string) { ReadBufferFromString buf(names_string); - std::vector names; + std::vector names; readVectorBinary(names, buf); return names; } @@ -79,13 +87,15 @@ static void writeData(Block data, OutputFormatPtr format) executor.execute(); } + ExternalDictionaryLibraryBridgeRequestHandler::ExternalDictionaryLibraryBridgeRequestHandler(size_t keep_alive_timeout_, ContextPtr context_) : WithContext(context_) - , log(&Poco::Logger::get("ExternalDictionaryLibraryBridgeRequestHandler")) , keep_alive_timeout(keep_alive_timeout_) + , log(&Poco::Logger::get("ExternalDictionaryLibraryBridgeRequestHandler")) { } + void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response) { LOG_TRACE(log, "Request URI: {}", request.getURI()); @@ -97,7 +107,7 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ version = 0; /// assumed version for too old servers which do not send a version else { - String version_str = params.get("version"); + const String & version_str = params.get("version"); if (!tryParse(version, version_str)) { processError(response, "Unable to parse 'version' string in request URL: '" + version_str + "' Check if the server and library-bridge have the same version."); @@ -124,8 +134,8 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ return; } - std::string method = params.get("method"); - std::string dictionary_id = params.get("dictionary_id"); + const String & method = params.get("method"); + const String & dictionary_id = params.get("dictionary_id"); LOG_TRACE(log, "Library method: '{}', dictionary id: {}", method, dictionary_id); WriteBufferFromHTTPServerResponse out(response, request.getMethod() == Poco::Net::HTTPRequest::HTTP_HEAD, keep_alive_timeout); @@ -141,7 +151,7 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ return; } - std::string from_dictionary_id = params.get("from_dictionary_id"); + const String & from_dictionary_id = params.get("from_dictionary_id"); bool cloned = false; cloned = ExternalDictionaryLibraryHandlerFactory::instance().clone(from_dictionary_id, dictionary_id); @@ -166,7 +176,7 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ return; } - std::string library_path = params.get("library_path"); + const String & library_path = params.get("library_path"); if (!params.has("library_settings")) { @@ -174,10 +184,10 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ return; } - const auto & settings_string = params.get("library_settings"); + const String & settings_string = params.get("library_settings"); LOG_DEBUG(log, "Parsing library settings from binary string"); - std::vector library_settings = parseNamesFromBinary(settings_string); + std::vector library_settings = parseNamesFromBinary(settings_string); /// Needed for library dictionary if (!params.has("attributes_names")) @@ -186,10 +196,10 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ return; } - const auto & attributes_string = params.get("attributes_names"); + const String & attributes_string = params.get("attributes_names"); LOG_DEBUG(log, "Parsing attributes names from binary string"); - std::vector attributes_names = parseNamesFromBinary(attributes_string); + std::vector attributes_names = parseNamesFromBinary(attributes_string); /// Needed to parse block from binary string format if (!params.has("sample_block")) @@ -197,7 +207,7 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ processError(response, "No 'sample_block' in request URL"); return; } - std::string sample_block_string = params.get("sample_block"); + String sample_block_string = params.get("sample_block"); std::shared_ptr sample_block; try @@ -297,7 +307,7 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ return; } - std::string requested_block_string = params.get("requested_block_sample"); + String requested_block_string = params.get("requested_block_sample"); std::shared_ptr requested_sample_block; try @@ -332,7 +342,8 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ } else { - LOG_WARNING(log, "Unknown library method: '{}'", method); + processError(response, "Unknown library method '" + method + "'"); + LOG_ERROR(log, "Unknown library method: '{}'", method); } } catch (...) @@ -362,6 +373,7 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ } } + ExternalDictionaryLibraryBridgeExistsHandler::ExternalDictionaryLibraryBridgeExistsHandler(size_t keep_alive_timeout_, ContextPtr context_) : WithContext(context_) , keep_alive_timeout(keep_alive_timeout_) @@ -369,6 +381,7 @@ ExternalDictionaryLibraryBridgeExistsHandler::ExternalDictionaryLibraryBridgeExi { } + void ExternalDictionaryLibraryBridgeExistsHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response) { try @@ -382,7 +395,7 @@ void ExternalDictionaryLibraryBridgeExistsHandler::handleRequest(HTTPServerReque return; } - std::string dictionary_id = params.get("dictionary_id"); + const String & dictionary_id = params.get("dictionary_id"); auto library_handler = ExternalDictionaryLibraryHandlerFactory::instance().get(dictionary_id); @@ -399,4 +412,230 @@ void ExternalDictionaryLibraryBridgeExistsHandler::handleRequest(HTTPServerReque } +CatBoostLibraryBridgeRequestHandler::CatBoostLibraryBridgeRequestHandler( + size_t keep_alive_timeout_, ContextPtr context_) + : WithContext(context_) + , keep_alive_timeout(keep_alive_timeout_) + , log(&Poco::Logger::get("CatBoostLibraryBridgeRequestHandler")) +{ +} + + +void CatBoostLibraryBridgeRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response) +{ + LOG_TRACE(log, "Request URI: {}", request.getURI()); + HTMLForm params(getContext()->getSettingsRef(), request); + + size_t version; + + if (!params.has("version")) + version = 0; /// assumed version for too old servers which do not send a version + else + { + const String & version_str = params.get("version"); + if (!tryParse(version, version_str)) + { + processError(response, "Unable to parse 'version' string in request URL: '" + version_str + "' Check if the server and library-bridge have the same version."); + return; + } + } + + if (version != LIBRARY_BRIDGE_PROTOCOL_VERSION) + { + /// backwards compatibility is considered unnecessary for now, just let the user know that the server and the bridge must be upgraded together + processError(response, "Server and library-bridge have different versions: '" + std::to_string(version) + "' vs. '" + std::to_string(LIBRARY_BRIDGE_PROTOCOL_VERSION) + "'"); + return; + } + if (!params.has("method")) + { + processError(response, "No 'method' in request URL"); + return; + } + + const String & method = params.get("method"); + + LOG_TRACE(log, "Library method: '{}'", method); + WriteBufferFromHTTPServerResponse out(response, request.getMethod() == Poco::Net::HTTPRequest::HTTP_HEAD, keep_alive_timeout); + + try + { + if (method == "catboost_list") + { + ExternalModelInfos model_infos = CatBoostLibraryHandlerFactory::instance().getModelInfos(); + + writeIntBinary(static_cast(model_infos.size()), out); + + for (const auto & info : model_infos) + { + writeStringBinary(info.model_path, out); + writeStringBinary(info.model_type, out); + + UInt64 t = std::chrono::system_clock::to_time_t(info.loading_start_time); + writeIntBinary(t, out); + + t = info.loading_duration.count(); + writeIntBinary(t, out); + + } + } + else if (method == "catboost_removeModel") + { + auto & read_buf = request.getStream(); + params.read(read_buf); + + if (!params.has("model_path")) + { + processError(response, "No 'model_path' in request URL"); + return; + } + + const String & model_path = params.get("model_path"); + + CatBoostLibraryHandlerFactory::instance().removeModel(model_path); + + String res = "1"; + writeStringBinary(res, out); + } + else if (method == "catboost_removeAllModels") + { + CatBoostLibraryHandlerFactory::instance().removeAllModels(); + + String res = "1"; + writeStringBinary(res, out); + } + else if (method == "catboost_GetTreeCount") + { + auto & read_buf = request.getStream(); + params.read(read_buf); + + if (!params.has("library_path")) + { + processError(response, "No 'library_path' in request URL"); + return; + } + + const String & library_path = params.get("library_path"); + + if (!params.has("model_path")) + { + processError(response, "No 'model_path' in request URL"); + return; + } + + const String & model_path = params.get("model_path"); + + auto catboost_handler = CatBoostLibraryHandlerFactory::instance().tryGetModel(model_path, library_path, /*create_if_not_found*/ true); + size_t tree_count = catboost_handler->getTreeCount(); + writeIntBinary(tree_count, out); + } + else if (method == "catboost_libEvaluate") + { + auto & read_buf = request.getStream(); + params.read(read_buf); + + if (!params.has("model_path")) + { + processError(response, "No 'model_path' in request URL"); + return; + } + + const String & model_path = params.get("model_path"); + + if (!params.has("data")) + { + processError(response, "No 'data' in request URL"); + return; + } + + const String & data = params.get("data"); + + ReadBufferFromString string_read_buf(data); + NativeReader deserializer(string_read_buf, /*server_revision*/ 0); + Block block_read = deserializer.read(); + + Columns col_ptrs = block_read.getColumns(); + ColumnRawPtrs col_raw_ptrs; + for (const auto & p : col_ptrs) + col_raw_ptrs.push_back(&*p); + + auto catboost_handler = CatBoostLibraryHandlerFactory::instance().tryGetModel(model_path, "DummyLibraryPath", /*create_if_not_found*/ false); + + if (!catboost_handler) + { + processError(response, "CatBoost library is not loaded for model '" + model_path + "'. Please try again."); + return; + } + + ColumnPtr res_col = catboost_handler->evaluate(col_raw_ptrs); + + DataTypePtr res_col_type = std::make_shared(); + String res_col_name = "res_col"; + + ColumnsWithTypeAndName res_cols_with_type_and_name = {{res_col, res_col_type, res_col_name}}; + + Block block_write(res_cols_with_type_and_name); + NativeWriter serializer{out, /*client_revision*/ 0, block_write}; + serializer.write(block_write); + } + else + { + processError(response, "Unknown library method '" + method + "'"); + LOG_ERROR(log, "Unknown library method: '{}'", method); + } + } + catch (...) + { + auto message = getCurrentExceptionMessage(true); + LOG_ERROR(log, "Failed to process request. Error: {}", message); + + response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR, message); // can't call process_error, because of too soon response sending + try + { + writeStringBinary(message, out); + out.finalize(); + } + catch (...) + { + tryLogCurrentException(log); + } + } + + try + { + out.finalize(); + } + catch (...) + { + tryLogCurrentException(log); + } +} + + +CatBoostLibraryBridgeExistsHandler::CatBoostLibraryBridgeExistsHandler(size_t keep_alive_timeout_, ContextPtr context_) + : WithContext(context_) + , keep_alive_timeout(keep_alive_timeout_) + , log(&Poco::Logger::get("CatBoostLibraryBridgeExistsHandler")) +{ +} + + +void CatBoostLibraryBridgeExistsHandler::handleRequest(HTTPServerRequest & request, HTTPServerResponse & response) +{ + try + { + LOG_TRACE(log, "Request URI: {}", request.getURI()); + HTMLForm params(getContext()->getSettingsRef(), request); + + String res = "1"; + + setResponseDefaultHeaders(response, keep_alive_timeout); + LOG_TRACE(log, "Sending ping response: {}", res); + response.sendBuffer(res.data(), res.size()); + } + catch (...) + { + tryLogCurrentException("PingHandler"); + } +} + } diff --git a/programs/library-bridge/LibraryBridgeHandlers.h b/programs/library-bridge/LibraryBridgeHandlers.h index b20f40616ce..16815e84723 100644 --- a/programs/library-bridge/LibraryBridgeHandlers.h +++ b/programs/library-bridge/LibraryBridgeHandlers.h @@ -1,9 +1,8 @@ #pragma once +#include #include #include -#include -#include "ExternalDictionaryLibraryHandler.h" namespace DB @@ -26,11 +25,12 @@ public: private: static constexpr inline auto FORMAT = "RowBinary"; + const size_t keep_alive_timeout; Poco::Logger * log; - size_t keep_alive_timeout; }; +// Handler for checking if the external dictionary library is loaded (used for handshake) class ExternalDictionaryLibraryBridgeExistsHandler : public HTTPRequestHandler, WithContext { public: @@ -43,4 +43,47 @@ private: Poco::Logger * log; }; + +/// Handler for requests to catboost library. The call protocol is as follows: +/// (1) Send a "catboost_GetTreeCount" request from the server to the bridge. It contains a library path (e.g /home/user/libcatboost.so) and +/// a model path (e.g. /home/user/model.bin). This loads the catboost library handler associated with the model path, then executes +/// GetTreeCount() on the library handler and sends the result back to the server. +/// (2) Send "catboost_Evaluate" from the server to the bridge. It contains a model path and the features to run the interference on. Step +/// (2) is called multiple times (once per chunk) by the server. +/// +/// We would ideally like to have steps (1) and (2) in one atomic handler but can't because the evaluation on the server side is divided +/// into two dependent phases: FunctionCatBoostEvaluate::getReturnTypeImpl() and ::executeImpl(). So the model may in principle be unloaded +/// from the library-bridge between steps (1) and (2). Step (2) checks if that is the case and fails gracefully. This is okay because that +/// situation considered exceptional and rare. +/// +/// An update of a model is performed by unloading it. The first call to "catboost_GetTreeCount" brings it into memory again. +/// +/// Further handlers are provided for unloading a specific model, for unloading all models or for retrieving information about the loaded +/// models for display in a system view. +class CatBoostLibraryBridgeRequestHandler : public HTTPRequestHandler, WithContext +{ +public: + CatBoostLibraryBridgeRequestHandler(size_t keep_alive_timeout_, ContextPtr context_); + + void handleRequest(HTTPServerRequest & request, HTTPServerResponse & response) override; + +private: + const size_t keep_alive_timeout; + Poco::Logger * log; +}; + + +// Handler for pinging the library-bridge for catboost access (used for handshake) +class CatBoostLibraryBridgeExistsHandler : public HTTPRequestHandler, WithContext +{ +public: + CatBoostLibraryBridgeExistsHandler(size_t keep_alive_timeout_, ContextPtr context_); + + void handleRequest(HTTPServerRequest & request, HTTPServerResponse & response) override; + +private: + const size_t keep_alive_timeout; + Poco::Logger * log; +}; + } diff --git a/src/Common/SharedLibrary.cpp b/programs/library-bridge/SharedLibrary.cpp similarity index 95% rename from src/Common/SharedLibrary.cpp rename to programs/library-bridge/SharedLibrary.cpp index 6104c96676a..d70709474b5 100644 --- a/src/Common/SharedLibrary.cpp +++ b/programs/library-bridge/SharedLibrary.cpp @@ -1,8 +1,7 @@ #include "SharedLibrary.h" #include -#include #include -#include "Exception.h" +#include namespace DB diff --git a/src/Common/SharedLibrary.h b/programs/library-bridge/SharedLibrary.h similarity index 100% rename from src/Common/SharedLibrary.h rename to programs/library-bridge/SharedLibrary.h diff --git a/programs/local/LocalServer.cpp b/programs/local/LocalServer.cpp index ce31600642a..2b9d819f5eb 100644 --- a/programs/local/LocalServer.cpp +++ b/programs/local/LocalServer.cpp @@ -227,6 +227,8 @@ void LocalServer::cleanup() global_context.reset(); } + /// thread status should be destructed before shared context because it relies on process list. + status.reset(); // Delete the temporary directory if needed. @@ -366,7 +368,7 @@ int LocalServer::main(const std::vector & /*args*/) try { UseSSL use_ssl; - ThreadStatus thread_status; + thread_status.emplace(); StackTrace::setShowAddresses(config().getBool("show_addresses_in_stack_traces", true)); @@ -620,9 +622,13 @@ void LocalServer::processConfig() attachSystemTablesLocal(global_context, *createMemoryDatabaseIfNotExists(global_context, DatabaseCatalog::SYSTEM_DATABASE)); attachInformationSchema(global_context, *createMemoryDatabaseIfNotExists(global_context, DatabaseCatalog::INFORMATION_SCHEMA)); attachInformationSchema(global_context, *createMemoryDatabaseIfNotExists(global_context, DatabaseCatalog::INFORMATION_SCHEMA_UPPERCASE)); - loadMetadata(global_context); startupSystemTables(); - DatabaseCatalog::instance().loadDatabases(); + + if (!config().has("only-system-tables")) + { + loadMetadata(global_context); + DatabaseCatalog::instance().loadDatabases(); + } LOG_DEBUG(log, "Loaded metadata."); } @@ -713,6 +719,7 @@ void LocalServer::addOptions(OptionsDescription & options_description) ("no-system-tables", "do not attach system tables (better startup time)") ("path", po::value(), "Storage path") + ("only-system-tables", "attach only system tables from specified path") ("top_level_domains_path", po::value(), "Path to lists with custom TLDs") ; } @@ -741,6 +748,8 @@ void LocalServer::processOptions(const OptionsDescription &, const CommandLineOp config().setString("table-structure", options["structure"].as()); if (options.count("no-system-tables")) config().setBool("no-system-tables", true); + if (options.count("only-system-tables")) + config().setBool("only-system-tables", true); if (options.count("input-format")) config().setString("table-data-format", options["input-format"].as()); diff --git a/programs/local/clickhouse-local.cpp b/programs/local/clickhouse-local.cpp index 5cc98ab6067..4b17e89496d 100644 --- a/programs/local/clickhouse-local.cpp +++ b/programs/local/clickhouse-local.cpp @@ -1,2 +1 @@ int mainEntryClickHouseLocal(int argc, char ** argv); -int main(int argc_, char ** argv_) { return mainEntryClickHouseLocal(argc_, argv_); } diff --git a/programs/main.cpp b/programs/main.cpp index fef0ad688e2..9b0e890cd76 100644 --- a/programs/main.cpp +++ b/programs/main.cpp @@ -402,6 +402,36 @@ void checkHarmfulEnvironmentVariables(char ** argv) } +/// Don't allow dlopen in the main ClickHouse binary, because it is harmful and insecure. +/// We don't use it. But it can be used by some libraries for implementation of "plugins". +/// We absolutely discourage the ancient technique of loading +/// 3rd-party uncontrolled dangerous libraries into the process address space, +/// because it is insane. + +extern "C" +{ + void * dlopen(const char *, int) + { + return nullptr; + } + + void * dlmopen(long, const char *, int) // NOLINT + { + return nullptr; + } + + int dlclose(void *) + { + return 0; + } + + const char * dlerror() + { + return "ClickHouse does not allow dynamic library loading"; + } +} + + /// This allows to implement assert to forbid initialization of a class in static constructors. /// Usage: /// @@ -422,6 +452,7 @@ int main(int argc_, char ** argv_) /// PHDR cache is required for query profiler to work reliably /// It also speed up exception handling, but exceptions from dynamically loaded libraries (dlopen) /// will work only after additional call of this function. + /// Note: we forbid dlopen in our code. updatePHDRCache(); #ifndef DISABLE_HARMFUL_ENV_VAR_CHECK diff --git a/programs/obfuscator/Obfuscator.cpp b/programs/obfuscator/Obfuscator.cpp index 95bf89b0255..bdf26c9e730 100644 --- a/programs/obfuscator/Obfuscator.cpp +++ b/programs/obfuscator/Obfuscator.cpp @@ -833,7 +833,7 @@ public: } } - if (params.frequency_desaturate) + if (params.frequency_desaturate > 0.0) { for (auto & elem : table) { @@ -846,7 +846,7 @@ public: UInt64 new_total = 0; for (auto & bucket : histogram.buckets) { - bucket.second = bucket.second * (1.0 - params.frequency_desaturate) + average * params.frequency_desaturate; + bucket.second = static_cast(bucket.second * (1.0 - params.frequency_desaturate) + average * params.frequency_desaturate); new_total += bucket.second; } diff --git a/programs/obfuscator/clickhouse-obfuscator.cpp b/programs/obfuscator/clickhouse-obfuscator.cpp index e57fa6d1b54..1f494223150 100644 --- a/programs/obfuscator/clickhouse-obfuscator.cpp +++ b/programs/obfuscator/clickhouse-obfuscator.cpp @@ -1,3 +1 @@ int mainEntryClickHouseObfuscator(int argc, char ** argv); -int main(int argc_, char ** argv_) { return mainEntryClickHouseObfuscator(argc_, argv_); } - diff --git a/programs/server/Server.cpp b/programs/server/Server.cpp index 93df877ab8e..14f97923ce3 100644 --- a/programs/server/Server.cpp +++ b/programs/server/Server.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -50,7 +51,6 @@ #include #include #include -#include #include #include #include @@ -550,8 +550,9 @@ static void sanityChecks(Server & server) try { const char * filename = "/sys/devices/system/clocksource/clocksource0/current_clocksource"; - if (readString(filename).find("tsc") == std::string::npos) - server.context()->addWarningMessage("Linux is not using a fast TSC clock source. Performance can be degraded. Check " + String(filename)); + String clocksource = readString(filename); + if (clocksource.find("tsc") == std::string::npos && clocksource.find("kvm-clock") == std::string::npos) + server.context()->addWarningMessage("Linux is not using a fast clock source. Performance can be degraded. Check " + String(filename)); } catch (...) { @@ -1117,7 +1118,7 @@ int Server::main(const std::vector & /*args*/) size_t max_server_memory_usage = config->getUInt64("max_server_memory_usage", 0); double max_server_memory_usage_to_ram_ratio = config->getDouble("max_server_memory_usage_to_ram_ratio", 0.9); - size_t default_max_server_memory_usage = memory_amount * max_server_memory_usage_to_ram_ratio; + size_t default_max_server_memory_usage = static_cast(memory_amount * max_server_memory_usage_to_ram_ratio); if (max_server_memory_usage == 0) { @@ -1156,7 +1157,6 @@ int Server::main(const std::vector & /*args*/) global_context->setExternalAuthenticatorsConfig(*config); global_context->loadOrReloadDictionaries(*config); - global_context->loadOrReloadModels(*config); global_context->loadOrReloadUserDefinedExecutableFunctions(*config); global_context->setRemoteHostFilter(*config); @@ -1269,6 +1269,9 @@ int Server::main(const std::vector & /*args*/) CertificateReloader::instance().tryLoad(*config); #endif ProfileEvents::increment(ProfileEvents::MainConfigLoads); + + /// Must be the last. + latest_config = config; }, /* already_loaded = */ false); /// Reload it right now (initial loading) @@ -1378,7 +1381,7 @@ int Server::main(const std::vector & /*args*/) global_context->setConfigReloadCallback([&]() { main_config_reloader->reload(); - access_control.reload(); + access_control.reload(AccessControl::ReloadMode::USERS_CONFIG_ONLY); }); /// Limit on total number of concurrently executed queries. @@ -1388,7 +1391,7 @@ int Server::main(const std::vector & /*args*/) /// Lower cache size on low-memory systems. double cache_size_to_ram_max_ratio = config().getDouble("cache_size_to_ram_max_ratio", 0.5); - size_t max_cache_size = memory_amount * cache_size_to_ram_max_ratio; + size_t max_cache_size = static_cast(memory_amount * cache_size_to_ram_max_ratio); /// Size of cache for uncompressed blocks. Zero means disabled. String uncompressed_cache_policy = config().getString("uncompressed_cache_policy", ""); @@ -1527,6 +1530,27 @@ int Server::main(const std::vector & /*args*/) LOG_DEBUG(log, "Destroyed global context."); }); + /// DNSCacheUpdater uses BackgroundSchedulePool which lives in shared context + /// and thus this object must be created after the SCOPE_EXIT object where shared + /// context is destroyed. + /// In addition this object has to be created before the loading of the tables. + std::unique_ptr dns_cache_updater; + if (config().has("disable_internal_dns_cache") && config().getInt("disable_internal_dns_cache")) + { + /// Disable DNS caching at all + DNSResolver::instance().setDisableCacheFlag(); + LOG_DEBUG(log, "DNS caching disabled"); + } + else + { + /// Initialize a watcher periodically updating DNS cache + dns_cache_updater = std::make_unique( + global_context, config().getInt("dns_cache_update_period", 15), config().getUInt("dns_max_consecutive_failures", 5)); + } + + if (dns_cache_updater) + dns_cache_updater->start(); + /// Set current database name before loading tables and databases because /// system logs may copy global context. global_context->setCurrentDatabaseNameInGlobalContext(default_database); @@ -1594,7 +1618,7 @@ int Server::main(const std::vector & /*args*/) } double total_memory_tracker_sample_probability = config().getDouble("total_memory_tracker_sample_probability", 0); - if (total_memory_tracker_sample_probability) + if (total_memory_tracker_sample_probability > 0.0) { total_memory_tracker.setSampleProbability(total_memory_tracker_sample_probability); } @@ -1624,20 +1648,6 @@ int Server::main(const std::vector & /*args*/) LOG_INFO(log, "Query Profiler and TraceCollector are disabled because they require PHDR cache to be created" " (otherwise the function 'dl_iterate_phdr' is not lock free and not async-signal safe)."); - std::unique_ptr dns_cache_updater; - if (config().has("disable_internal_dns_cache") && config().getInt("disable_internal_dns_cache")) - { - /// Disable DNS caching at all - DNSResolver::instance().setDisableCacheFlag(); - LOG_DEBUG(log, "DNS caching disabled"); - } - else - { - /// Initialize a watcher periodically updating DNS cache - dns_cache_updater = std::make_unique( - global_context, config().getInt("dns_cache_update_period", 15), config().getUInt("dns_max_consecutive_failures", 5)); - } - #if defined(OS_LINUX) auto tasks_stats_provider = TasksStatsCounters::findBestAvailableProvider(); if (tasks_stats_provider == TasksStatsCounters::MetricsProvider::None) @@ -1702,8 +1712,6 @@ int Server::main(const std::vector & /*args*/) main_config_reloader->start(); access_control.startPeriodicReloading(); - if (dns_cache_updater) - dns_cache_updater->start(); { LOG_INFO(log, "Available RAM: {}; physical cores: {}; logical cores: {}.", @@ -1734,17 +1742,6 @@ int Server::main(const std::vector & /*args*/) throw; } - /// try to load models immediately, throw on error and die - try - { - global_context->loadOrReloadModels(config()); - } - catch (...) - { - tryLogCurrentException(log, "Caught exception while loading dictionaries."); - throw; - } - /// try to load user defined executable functions, throw on error and die try { @@ -1886,7 +1883,7 @@ void Server::createServers( port_name, "http://" + address.toString(), std::make_unique( - context(), createHandlerFactory(*this, async_metrics, "HTTPHandler-factory"), server_pool, socket, http_params)); + context(), createHandlerFactory(*this, config, async_metrics, "HTTPHandler-factory"), server_pool, socket, http_params)); }); /// HTTPS @@ -1903,7 +1900,7 @@ void Server::createServers( port_name, "https://" + address.toString(), std::make_unique( - context(), createHandlerFactory(*this, async_metrics, "HTTPSHandler-factory"), server_pool, socket, http_params)); + context(), createHandlerFactory(*this, config, async_metrics, "HTTPSHandler-factory"), server_pool, socket, http_params)); #else UNUSED(port); throw Exception{"HTTPS protocol is disabled because Poco library was built without NetSSL support.", @@ -2028,7 +2025,7 @@ void Server::createServers( port_name, "Prometheus: http://" + address.toString(), std::make_unique( - context(), createHandlerFactory(*this, async_metrics, "PrometheusHandler-factory"), server_pool, socket, http_params)); + context(), createHandlerFactory(*this, config, async_metrics, "PrometheusHandler-factory"), server_pool, socket, http_params)); }); } @@ -2049,7 +2046,7 @@ void Server::createServers( "replica communication (interserver): http://" + address.toString(), std::make_unique( context(), - createHandlerFactory(*this, async_metrics, "InterserverIOHTTPHandler-factory"), + createHandlerFactory(*this, config, async_metrics, "InterserverIOHTTPHandler-factory"), server_pool, socket, http_params)); @@ -2069,7 +2066,7 @@ void Server::createServers( "secure replica communication (interserver): https://" + address.toString(), std::make_unique( context(), - createHandlerFactory(*this, async_metrics, "InterserverIOHTTPSHandler-factory"), + createHandlerFactory(*this, config, async_metrics, "InterserverIOHTTPSHandler-factory"), server_pool, socket, http_params)); @@ -2111,13 +2108,24 @@ void Server::updateServers( std::erase_if(servers, std::bind_front(check_server, " (from one of previous reload)")); + Poco::Util::AbstractConfiguration & previous_config = latest_config ? *latest_config : this->config(); + for (auto & server : servers) { if (!server.isStopping()) { bool has_host = std::find(listen_hosts.begin(), listen_hosts.end(), server.getListenHost()) != listen_hosts.end(); bool has_port = !config.getString(server.getPortName(), "").empty(); - if (!has_host || !has_port || config.getInt(server.getPortName()) != server.portNumber()) + + /// NOTE: better to compare using getPortName() over using + /// dynamic_cast<> since HTTPServer is also used for prometheus and + /// internal replication communications. + bool is_http = server.getPortName() == "http_port" || server.getPortName() == "https_port"; + bool force_restart = is_http && !isSameConfiguration(previous_config, config, "http_handlers"); + if (force_restart) + LOG_TRACE(log, " had been changed, will reload {}", server.getDescription()); + + if (!has_host || !has_port || config.getInt(server.getPortName()) != server.portNumber() || force_restart) { server.stop(); LOG_INFO(log, "Stopped listening for {}", server.getDescription()); diff --git a/programs/server/Server.h b/programs/server/Server.h index 9b664b6213c..44a5a441e43 100644 --- a/programs/server/Server.h +++ b/programs/server/Server.h @@ -67,6 +67,9 @@ protected: private: ContextMutablePtr global_context; + /// Updated/recent config, to compare http_handlers + ConfigurationPtr latest_config; + Poco::Net::SocketAddress socketBindListen( const Poco::Util::AbstractConfiguration & config, Poco::Net::ServerSocket & socket, diff --git a/programs/server/clickhouse-server.cpp b/programs/server/clickhouse-server.cpp index f49dc21d9fe..a7a3d8f00e3 100644 --- a/programs/server/clickhouse-server.cpp +++ b/programs/server/clickhouse-server.cpp @@ -1,24 +1 @@ -#include - -#include - - int mainEntryClickHouseServer(int argc, char ** argv); - -/** - * This is the entry-point for the split build server. The initialization - * is copied from single-binary entry point in main.cpp. - */ -int main(int argc_, char ** argv_) -{ - /// Reset new handler to default (that throws std::bad_alloc) - /// It is needed because LLVM library clobbers it. - std::set_new_handler(nullptr); - - /// PHDR cache is required for query profiler to work reliably - /// It also speed up exception handling, but exceptions from dynamically loaded libraries (dlopen) - /// will work only after additional call of this function. - updatePHDRCache(); - - return mainEntryClickHouseServer(argc_, argv_); -} diff --git a/programs/server/config.d/legacy_geobase.xml b/programs/server/config.d/legacy_geobase.xml new file mode 100644 index 00000000000..3973c55cb86 --- /dev/null +++ b/programs/server/config.d/legacy_geobase.xml @@ -0,0 +1,4 @@ + + config.d/regions_hierarchy.txt + config.d/ + diff --git a/programs/server/config.d/regions_hierarchy.txt b/programs/server/config.d/regions_hierarchy.txt new file mode 120000 index 00000000000..7b48f46aa94 --- /dev/null +++ b/programs/server/config.d/regions_hierarchy.txt @@ -0,0 +1 @@ +../../../tests/config/regions_hierarchy.txt \ No newline at end of file diff --git a/programs/server/config.d/regions_names_en.txt b/programs/server/config.d/regions_names_en.txt new file mode 120000 index 00000000000..523a1077d9d --- /dev/null +++ b/programs/server/config.d/regions_names_en.txt @@ -0,0 +1 @@ +../../../tests/config/regions_names_en.txt \ No newline at end of file diff --git a/programs/server/config.xml b/programs/server/config.xml index 07d1b70d15a..dcb8ac0804c 100644 --- a/programs/server/config.xml +++ b/programs/server/config.xml @@ -1,4 +1,3 @@ - - - ` + 1 + 1 + 1 false + + + false @@ -1107,10 +1114,6 @@ system asynchronous_metric_log
- 7000
diff --git a/programs/server/dashboard.html b/programs/server/dashboard.html index e63a277497a..f013e3ac064 100644 --- a/programs/server/dashboard.html +++ b/programs/server/dashboard.html @@ -820,7 +820,7 @@ async function draw(idx, chart, url_params, query) { sync.sub(plots[idx]); /// Set title - const title = queries[idx].title.replaceAll(/\{(\w+)\}/g, (_, name) => params[name] ); + const title = queries[idx].title ? queries[idx].title.replaceAll(/\{(\w+)\}/g, (_, name) => params[name] ) : ''; chart.querySelector('.title').firstChild.data = title; } diff --git a/programs/server/embedded.xml b/programs/server/embedded.xml index 0f11efab8a3..c2336e0d582 100644 --- a/programs/server/embedded.xml +++ b/programs/server/embedded.xml @@ -1,4 +1,3 @@ - diff --git a/programs/server/users.d/allow_introspection_functions.xml b/programs/server/users.d/allow_introspection_functions.xml index cfde1b4525d..ec3057c82d7 100644 --- a/programs/server/users.d/allow_introspection_functions.xml +++ b/programs/server/users.d/allow_introspection_functions.xml @@ -1,4 +1,3 @@ - diff --git a/programs/server/users.d/allow_only_from_localhost.xml b/programs/server/users.d/allow_only_from_localhost.xml index b1b38686133..406b89b4d7c 100644 --- a/programs/server/users.d/allow_only_from_localhost.xml +++ b/programs/server/users.d/allow_only_from_localhost.xml @@ -1,4 +1,3 @@ - diff --git a/programs/server/users.xml b/programs/server/users.xml index 96067d01a6b..5e2ff51bf4d 100644 --- a/programs/server/users.xml +++ b/programs/server/users.xml @@ -1,4 +1,3 @@ - @@ -6,15 +5,6 @@ - - random diff --git a/programs/static-files-disk-uploader/clickhouse-static-files-disk-uploader.cpp b/programs/static-files-disk-uploader/clickhouse-static-files-disk-uploader.cpp index 063604b10b1..cf271f16a76 100644 --- a/programs/static-files-disk-uploader/clickhouse-static-files-disk-uploader.cpp +++ b/programs/static-files-disk-uploader/clickhouse-static-files-disk-uploader.cpp @@ -1,2 +1 @@ int mainEntryClickHouseStaticFilesDiskUploader(int argc, char ** argv); -int main(int argc_, char ** argv_) { return mainEntryClickHouseStaticFilesDiskUploader(argc_, argv_); } diff --git a/programs/static-files-disk-uploader/static-files-disk-uploader.cpp b/programs/static-files-disk-uploader/static-files-disk-uploader.cpp index 786ae1f559f..32f87d4d64a 100644 --- a/programs/static-files-disk-uploader/static-files-disk-uploader.cpp +++ b/programs/static-files-disk-uploader/static-files-disk-uploader.cpp @@ -58,7 +58,9 @@ void processFile(const fs::path & file_path, const fs::path & dst_path, bool tes } else { - auto src_buf = createReadBufferFromFileBase(file_path, {}, fs::file_size(file_path)); + ReadSettings read_settings{}; + read_settings.local_fs_method = LocalFSReadMethod::pread; + auto src_buf = createReadBufferFromFileBase(file_path, read_settings, fs::file_size(file_path)); std::shared_ptr dst_buf; /// test mode for integration tests. @@ -146,7 +148,7 @@ try po::options_description description("Allowed options", getTerminalWidth()); description.add_options() ("help,h", "produce help message") - ("metadata-path", po::value(), "Metadata path (select data_paths from system.tables where name='table_name'") + ("metadata-path", po::value(), "Metadata path (SELECT data_paths FROM system.tables WHERE name = 'table_name' AND database = 'database_name')") ("test-mode", "Use test mode, which will put data on given url via PUT") ("link", "Create symlinks instead of copying") ("url", po::value(), "Web server url for test mode") diff --git a/programs/su/clickhouse-su.cpp b/programs/su/clickhouse-su.cpp index bb0967ca271..9459ccad0e8 100644 --- a/programs/su/clickhouse-su.cpp +++ b/programs/su/clickhouse-su.cpp @@ -1,2 +1 @@ int mainEntryClickHouseSU(int argc, char ** argv); -int main(int argc_, char ** argv_) { return mainEntryClickHouseSU(argc_, argv_); } diff --git a/src/Access/AccessControl.cpp b/src/Access/AccessControl.cpp index 89292fe9272..04642df6f40 100644 --- a/src/Access/AccessControl.cpp +++ b/src/Access/AccessControl.cpp @@ -162,6 +162,7 @@ void AccessControl::setUpFromMainConfig(const Poco::Util::AbstractConfiguration if (config_.has("custom_settings_prefixes")) setCustomSettingsPrefixes(config_.getString("custom_settings_prefixes")); + setImplicitNoPasswordAllowed(config_.getBool("allow_implicit_no_password", true)); setNoPasswordAllowed(config_.getBool("allow_no_password", true)); setPlaintextPasswordAllowed(config_.getBool("allow_plaintext_password", true)); @@ -171,6 +172,7 @@ void AccessControl::setUpFromMainConfig(const Poco::Util::AbstractConfiguration setOnClusterQueriesRequireClusterGrant(config_.getBool("access_control_improvements.on_cluster_queries_require_cluster_grant", false)); setSelectFromSystemDatabaseRequiresGrant(config_.getBool("access_control_improvements.select_from_system_db_requires_grant", false)); setSelectFromInformationSchemaRequiresGrant(config_.getBool("access_control_improvements.select_from_information_schema_requires_grant", false)); + setSettingsConstraintsReplacePrevious(config_.getBool("access_control_improvements.settings_constraints_replace_previous", false)); addStoragesFromMainConfig(config_, config_path_, get_zookeeper_function_); } @@ -390,9 +392,9 @@ void AccessControl::addStoragesFromMainConfig( } -void AccessControl::reload() +void AccessControl::reload(ReloadMode reload_mode) { - MultipleAccessStorage::reload(); + MultipleAccessStorage::reload(reload_mode); changes_notifier->sendNotifications(); } @@ -498,6 +500,15 @@ void AccessControl::checkSettingNameIsAllowed(const std::string_view setting_nam custom_settings_prefixes->checkSettingNameIsAllowed(setting_name); } +void AccessControl::setImplicitNoPasswordAllowed(bool allow_implicit_no_password_) +{ + allow_implicit_no_password = allow_implicit_no_password_; +} + +bool AccessControl::isImplicitNoPasswordAllowed() const +{ + return allow_implicit_no_password; +} void AccessControl::setNoPasswordAllowed(bool allow_no_password_) { diff --git a/src/Access/AccessControl.h b/src/Access/AccessControl.h index ab9cdba9ad1..607e0119178 100644 --- a/src/Access/AccessControl.h +++ b/src/Access/AccessControl.h @@ -99,8 +99,8 @@ public: const String & config_path, const zkutil::GetZooKeeper & get_zookeeper_function); - /// Reloads and updates entities in this storage. This function is used to implement SYSTEM RELOAD CONFIG. - void reload() override; + /// Reloads and updates all access entities. + void reload(ReloadMode reload_mode) override; using OnChangedHandler = std::function; @@ -134,6 +134,11 @@ public: bool isSettingNameAllowed(const std::string_view name) const; void checkSettingNameIsAllowed(const std::string_view name) const; + /// Allows implicit user creation without password (by default it's allowed). + /// In other words, allow 'CREATE USER' queries without 'IDENTIFIED WITH' clause. + void setImplicitNoPasswordAllowed(const bool allow_implicit_no_password_); + bool isImplicitNoPasswordAllowed() const; + /// Allows users without password (by default it's allowed). void setNoPasswordAllowed(const bool allow_no_password_); bool isNoPasswordAllowed() const; @@ -158,6 +163,9 @@ public: void setSelectFromInformationSchemaRequiresGrant(bool enable) { select_from_information_schema_requires_grant = enable; } bool doesSelectFromInformationSchemaRequireGrant() const { return select_from_information_schema_requires_grant; } + void setSettingsConstraintsReplacePrevious(bool enable) { settings_constraints_replace_previous = enable; } + bool doesSettingsConstraintsReplacePrevious() const { return settings_constraints_replace_previous; } + std::shared_ptr getContextAccess( const UUID & user_id, const std::vector & current_roles, @@ -219,10 +227,12 @@ private: std::unique_ptr changes_notifier; std::atomic_bool allow_plaintext_password = true; std::atomic_bool allow_no_password = true; + std::atomic_bool allow_implicit_no_password = true; std::atomic_bool users_without_row_policies_can_read_rows = false; std::atomic_bool on_cluster_queries_require_cluster_grant = false; std::atomic_bool select_from_system_db_requires_grant = false; std::atomic_bool select_from_information_schema_requires_grant = false; + std::atomic_bool settings_constraints_replace_previous = false; }; } diff --git a/src/Access/Common/AccessType.h b/src/Access/Common/AccessType.h index e8d3b453188..5c85c93c98f 100644 --- a/src/Access/Common/AccessType.h +++ b/src/Access/Common/AccessType.h @@ -25,7 +25,7 @@ enum class AccessType M(SHOW_DICTIONARIES, "", DICTIONARY, SHOW) /* allows to execute SHOW DICTIONARIES, SHOW CREATE DICTIONARY, EXISTS ; implicitly enabled by any grant on the dictionary */\ M(SHOW, "", GROUP, ALL) /* allows to execute SHOW, USE, EXISTS, CHECK, DESCRIBE */\ - M(SHOW_CACHES, "", GROUP, ALL) \ + M(SHOW_FILESYSTEM_CACHES, "", GROUP, ALL) \ \ M(SELECT, "", COLUMN, ALL) \ M(INSERT, "", COLUMN, ALL) \ @@ -143,6 +143,7 @@ enum class AccessType M(SYSTEM_DROP_SCHEMA_CACHE, "SYSTEM DROP SCHEMA CACHE, DROP SCHEMA CACHE", GLOBAL, SYSTEM_DROP_CACHE) \ M(SYSTEM_DROP_CACHE, "DROP CACHE", GROUP, SYSTEM) \ M(SYSTEM_RELOAD_CONFIG, "RELOAD CONFIG", GLOBAL, SYSTEM_RELOAD) \ + M(SYSTEM_RELOAD_USERS, "RELOAD USERS", GLOBAL, SYSTEM_RELOAD) \ M(SYSTEM_RELOAD_SYMBOLS, "RELOAD SYMBOLS", GLOBAL, SYSTEM_RELOAD) \ M(SYSTEM_RELOAD_DICTIONARY, "SYSTEM RELOAD DICTIONARIES, RELOAD DICTIONARY, RELOAD DICTIONARIES", GLOBAL, SYSTEM_RELOAD) \ M(SYSTEM_RELOAD_MODEL, "SYSTEM RELOAD MODELS, RELOAD MODEL, RELOAD MODELS", GLOBAL, SYSTEM_RELOAD) \ diff --git a/src/Access/DiskAccessStorage.cpp b/src/Access/DiskAccessStorage.cpp index 0cbe420f345..ff51ae1cfd4 100644 --- a/src/Access/DiskAccessStorage.cpp +++ b/src/Access/DiskAccessStorage.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -182,8 +183,8 @@ DiskAccessStorage::DiskAccessStorage(const String & storage_name_, const String if (should_rebuild_lists) { - rebuildLists(); - writeLists(); + LOG_WARNING(getLogger(), "Recovering lists in directory {}", directory_path); + reloadAllAndRebuildLists(); } } @@ -224,63 +225,57 @@ bool DiskAccessStorage::isPathEqual(const String & directory_path_) const } -void DiskAccessStorage::clear() -{ - entries_by_id.clear(); - for (auto type : collections::range(AccessEntityType::MAX)) - entries_by_name_and_type[static_cast(type)].clear(); -} - - bool DiskAccessStorage::readLists() { - clear(); + std::vector> ids_names_types; - bool ok = true; for (auto type : collections::range(AccessEntityType::MAX)) { - auto & entries_by_name = entries_by_name_and_type[static_cast(type)]; auto file_path = getListFilePath(directory_path, type); if (!std::filesystem::exists(file_path)) { LOG_WARNING(getLogger(), "File {} doesn't exist", file_path); - ok = false; - break; + return false; } try { for (const auto & [id, name] : readListFile(file_path)) - { - auto & entry = entries_by_id[id]; - entry.id = id; - entry.type = type; - entry.name = name; - entries_by_name[entry.name] = &entry; - } + ids_names_types.emplace_back(id, name, type); } catch (...) { tryLogCurrentException(getLogger(), "Could not read " + file_path); - ok = false; - break; + return false; } } - if (!ok) - clear(); - return ok; + entries_by_id.clear(); + for (auto type : collections::range(AccessEntityType::MAX)) + entries_by_name_and_type[static_cast(type)].clear(); + + for (auto & [id, name, type] : ids_names_types) + { + auto & entry = entries_by_id[id]; + entry.id = id; + entry.type = type; + entry.name = std::move(name); + auto & entries_by_name = entries_by_name_and_type[static_cast(type)]; + entries_by_name[entry.name] = &entry; + } + + return true; } -bool DiskAccessStorage::writeLists() +void DiskAccessStorage::writeLists() { if (failed_to_write_lists) - return false; /// We don't try to write list files after the first fail. - /// The next restart of the server will invoke rebuilding of the list files. + return; /// We don't try to write list files after the first fail. + /// The next restart of the server will invoke rebuilding of the list files. if (types_of_lists_to_write.empty()) - return true; + return; for (const auto & type : types_of_lists_to_write) { @@ -299,14 +294,13 @@ bool DiskAccessStorage::writeLists() tryLogCurrentException(getLogger(), "Could not write " + file_path); failed_to_write_lists = true; types_of_lists_to_write.clear(); - return false; + return; } } /// The list files was successfully written, we don't need the 'need_rebuild_lists.mark' file any longer. std::filesystem::remove(getNeedRebuildListsMarkFilePath(directory_path)); types_of_lists_to_write.clear(); - return true; } @@ -364,10 +358,9 @@ void DiskAccessStorage::stopListsWritingThread() /// Reads and parses all the ".sql" files from a specified directory /// and then saves the files "users.list", "roles.list", etc. to the same directory. -bool DiskAccessStorage::rebuildLists() +void DiskAccessStorage::reloadAllAndRebuildLists() { - LOG_WARNING(getLogger(), "Recovering lists in directory {}", directory_path); - clear(); + std::vector> all_entities; for (const auto & directory_entry : std::filesystem::directory_iterator(directory_path)) { @@ -386,21 +379,55 @@ bool DiskAccessStorage::rebuildLists() if (!entity) continue; - const String & name = entity->getName(); - auto type = entity->getType(); - auto & entry = entries_by_id[id]; - entry.id = id; - entry.type = type; - entry.name = name; - entry.entity = entity; - auto & entries_by_name = entries_by_name_and_type[static_cast(type)]; - entries_by_name[entry.name] = &entry; + all_entities.emplace_back(id, entity); } + setAllInMemory(all_entities); + for (auto type : collections::range(AccessEntityType::MAX)) types_of_lists_to_write.insert(type); - return true; + failed_to_write_lists = false; /// Try again writing lists. + writeLists(); +} + +void DiskAccessStorage::setAllInMemory(const std::vector> & all_entities) +{ + /// Remove conflicting entities from the specified list. + auto entities_without_conflicts = all_entities; + clearConflictsInEntitiesList(entities_without_conflicts, getLogger()); + + /// Remove entities which are not used anymore. + boost::container::flat_set ids_to_keep; + ids_to_keep.reserve(entities_without_conflicts.size()); + for (const auto & [id, _] : entities_without_conflicts) + ids_to_keep.insert(id); + removeAllExceptInMemory(ids_to_keep); + + /// Insert or update entities. + for (const auto & [id, entity] : entities_without_conflicts) + insertNoLock(id, entity, /* replace_if_exists = */ true, /* throw_if_exists = */ false, /* write_on_disk= */ false); +} + +void DiskAccessStorage::removeAllExceptInMemory(const boost::container::flat_set & ids_to_keep) +{ + for (auto it = entries_by_id.begin(); it != entries_by_id.end();) + { + const auto & id = it->first; + ++it; /// We must go to the next element in the map `entries_by_id` here because otherwise removeNoLock() can invalidate our iterator. + if (!ids_to_keep.contains(id)) + removeNoLock(id, /* throw_if_not_exists */ true, /* write_on_disk= */ false); + } +} + + +void DiskAccessStorage::reload(ReloadMode reload_mode) +{ + if (reload_mode != ReloadMode::ALL) + return; + + std::lock_guard lock{mutex}; + reloadAllAndRebuildLists(); } @@ -471,21 +498,21 @@ std::optional> DiskAccessStorage::readNameWi std::optional DiskAccessStorage::insertImpl(const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists) { UUID id = generateRandomID(); - if (insertWithID(id, new_entity, replace_if_exists, throw_if_exists)) + if (insertWithID(id, new_entity, replace_if_exists, throw_if_exists, /* write_on_disk= */ true)) return id; return std::nullopt; } -bool DiskAccessStorage::insertWithID(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists) +bool DiskAccessStorage::insertWithID(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists, bool write_on_disk) { std::lock_guard lock{mutex}; - return insertNoLock(id, new_entity, replace_if_exists, throw_if_exists); + return insertNoLock(id, new_entity, replace_if_exists, throw_if_exists, write_on_disk); } -bool DiskAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists) +bool DiskAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists, bool write_on_disk) { const String & name = new_entity->getName(); AccessEntityType type = new_entity->getType(); @@ -497,6 +524,9 @@ bool DiskAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr & ne auto & entries_by_name = entries_by_name_and_type[static_cast(type)]; auto it_by_name = entries_by_name.find(name); bool name_collision = (it_by_name != entries_by_name.end()); + UUID id_by_name; + if (name_collision) + id_by_name = it_by_name->second->id; if (name_collision && !replace_if_exists) { @@ -507,19 +537,57 @@ bool DiskAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr & ne } auto it_by_id = entries_by_id.find(id); - if (it_by_id != entries_by_id.end()) + bool id_collision = (it_by_id != entries_by_id.end()); + if (id_collision && !replace_if_exists) { - const auto & existing_entry = it_by_id->second; - throwIDCollisionCannotInsert(id, type, name, existing_entry.entity->getType(), existing_entry.entity->getName()); + if (throw_if_exists) + { + const auto & existing_entry = it_by_id->second; + throwIDCollisionCannotInsert(id, type, name, existing_entry.type, existing_entry.name); + } + else + return false; } - scheduleWriteLists(type); - writeAccessEntityToDisk(id, *new_entity); + if (write_on_disk) + scheduleWriteLists(type); - if (name_collision && replace_if_exists) - removeNoLock(it_by_name->second->id, /* throw_if_not_exists = */ false); + /// Remove collisions if necessary. + if (name_collision && (id_by_name != id)) + { + assert(replace_if_exists); + removeNoLock(id_by_name, /* throw_if_not_exists= */ false, write_on_disk); + } + + if (id_collision) + { + assert(replace_if_exists); + auto & existing_entry = it_by_id->second; + if (existing_entry.type == new_entity->getType()) + { + if (!existing_entry.entity || (*existing_entry.entity != *new_entity)) + { + if (write_on_disk) + writeAccessEntityToDisk(id, *new_entity); + if (existing_entry.name != new_entity->getName()) + { + entries_by_name.erase(existing_entry.name); + [[maybe_unused]] bool inserted = entries_by_name.emplace(new_entity->getName(), &existing_entry).second; + assert(inserted); + } + existing_entry.entity = new_entity; + changes_notifier.onEntityUpdated(id, new_entity); + } + return true; + } + + removeNoLock(id, /* throw_if_not_exists= */ false, write_on_disk); + } /// Do insertion. + if (write_on_disk) + writeAccessEntityToDisk(id, *new_entity); + auto & entry = entries_by_id[id]; entry.id = id; entry.type = type; @@ -535,11 +603,11 @@ bool DiskAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr & ne bool DiskAccessStorage::removeImpl(const UUID & id, bool throw_if_not_exists) { std::lock_guard lock{mutex}; - return removeNoLock(id, throw_if_not_exists); + return removeNoLock(id, throw_if_not_exists, /* write_on_disk= */ true); } -bool DiskAccessStorage::removeNoLock(const UUID & id, bool throw_if_not_exists) +bool DiskAccessStorage::removeNoLock(const UUID & id, bool throw_if_not_exists, bool write_on_disk) { auto it = entries_by_id.find(id); if (it == entries_by_id.end()) @@ -556,8 +624,11 @@ bool DiskAccessStorage::removeNoLock(const UUID & id, bool throw_if_not_exists) if (readonly) throwReadonlyCannotRemove(type, entry.name); - scheduleWriteLists(type); - deleteAccessEntityOnDisk(id); + if (write_on_disk) + { + scheduleWriteLists(type); + deleteAccessEntityOnDisk(id); + } /// Do removing. UUID removed_id = id; @@ -573,11 +644,11 @@ bool DiskAccessStorage::removeNoLock(const UUID & id, bool throw_if_not_exists) bool DiskAccessStorage::updateImpl(const UUID & id, const UpdateFunc & update_func, bool throw_if_not_exists) { std::lock_guard lock{mutex}; - return updateNoLock(id, update_func, throw_if_not_exists); + return updateNoLock(id, update_func, throw_if_not_exists, /* write_on_disk= */ true); } -bool DiskAccessStorage::updateNoLock(const UUID & id, const UpdateFunc & update_func, bool throw_if_not_exists) +bool DiskAccessStorage::updateNoLock(const UUID & id, const UpdateFunc & update_func, bool throw_if_not_exists, bool write_on_disk) { auto it = entries_by_id.find(id); if (it == entries_by_id.end()) @@ -613,10 +684,13 @@ bool DiskAccessStorage::updateNoLock(const UUID & id, const UpdateFunc & update_ { if (entries_by_name.contains(new_name)) throwNameCollisionCannotRename(type, old_name, new_name); - scheduleWriteLists(type); + if (write_on_disk) + scheduleWriteLists(type); } - writeAccessEntityToDisk(id, *new_entity); + if (write_on_disk) + writeAccessEntityToDisk(id, *new_entity); + entry.entity = new_entity; if (name_changed) @@ -668,7 +742,7 @@ void DiskAccessStorage::restoreFromBackup(RestorerFromBackup & restorer) restorer.addDataRestoreTask([this, entities = std::move(entities), replace_if_exists, throw_if_exists] { for (const auto & [id, entity] : entities) - insertWithID(id, entity, replace_if_exists, throw_if_exists); + insertWithID(id, entity, replace_if_exists, throw_if_exists, /* write_on_disk= */ true); }); } diff --git a/src/Access/DiskAccessStorage.h b/src/Access/DiskAccessStorage.h index d3bd61ff353..b1ef1d10ba7 100644 --- a/src/Access/DiskAccessStorage.h +++ b/src/Access/DiskAccessStorage.h @@ -27,6 +27,8 @@ public: void setReadOnly(bool readonly_) { readonly = readonly_; } bool isReadOnly() const override { return readonly; } + void reload(ReloadMode reload_mode) override; + bool exists(const UUID & id) const override; bool isBackupAllowed() const override { return backup_allowed; } @@ -41,19 +43,20 @@ private: bool removeImpl(const UUID & id, bool throw_if_not_exists) override; bool updateImpl(const UUID & id, const UpdateFunc & update_func, bool throw_if_not_exists) override; - void clear(); - bool readLists(); - bool writeLists(); - void scheduleWriteLists(AccessEntityType type); - bool rebuildLists(); + bool readLists() TSA_REQUIRES(mutex); + void writeLists() TSA_REQUIRES(mutex); + void scheduleWriteLists(AccessEntityType type) TSA_REQUIRES(mutex); + void reloadAllAndRebuildLists() TSA_REQUIRES(mutex); + void setAllInMemory(const std::vector> & all_entities) TSA_REQUIRES(mutex); + void removeAllExceptInMemory(const boost::container::flat_set & ids_to_keep) TSA_REQUIRES(mutex); - void listsWritingThreadFunc(); + void listsWritingThreadFunc() TSA_NO_THREAD_SAFETY_ANALYSIS; void stopListsWritingThread(); - bool insertWithID(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists); - bool insertNoLock(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists); - bool removeNoLock(const UUID & id, bool throw_if_not_exists); - bool updateNoLock(const UUID & id, const UpdateFunc & update_func, bool throw_if_not_exists); + bool insertWithID(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists, bool write_on_disk); + bool insertNoLock(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists, bool write_on_disk) TSA_REQUIRES(mutex); + bool updateNoLock(const UUID & id, const UpdateFunc & update_func, bool throw_if_not_exists, bool write_on_disk) TSA_REQUIRES(mutex); + bool removeNoLock(const UUID & id, bool throw_if_not_exists, bool write_on_disk) TSA_REQUIRES(mutex); AccessEntityPtr readAccessEntityFromDisk(const UUID & id) const; void writeAccessEntityToDisk(const UUID & id, const IAccessEntity & entity) const; @@ -69,13 +72,22 @@ private: }; String directory_path; - std::unordered_map entries_by_id; - std::unordered_map entries_by_name_and_type[static_cast(AccessEntityType::MAX)]; - boost::container::flat_set types_of_lists_to_write; - bool failed_to_write_lists = false; /// Whether writing of the list files has been failed since the recent restart of the server. - ThreadFromGlobalPool lists_writing_thread; /// List files are written in a separate thread. - std::condition_variable lists_writing_thread_should_exit; /// Signals `lists_writing_thread` to exit. + + std::unordered_map entries_by_id TSA_GUARDED_BY(mutex); + std::unordered_map entries_by_name_and_type[static_cast(AccessEntityType::MAX)] TSA_GUARDED_BY(mutex); + boost::container::flat_set types_of_lists_to_write TSA_GUARDED_BY(mutex); + + /// Whether writing of the list files has been failed since the recent restart of the server. + bool failed_to_write_lists TSA_GUARDED_BY(mutex) = false; + + /// List files are written in a separate thread. + ThreadFromGlobalPool lists_writing_thread; + + /// Signals `lists_writing_thread` to exit. + std::condition_variable lists_writing_thread_should_exit; + bool lists_writing_thread_is_waiting = false; + AccessChangesNotifier & changes_notifier; std::atomic readonly; std::atomic backup_allowed; diff --git a/src/Access/IAccessStorage.cpp b/src/Access/IAccessStorage.cpp index 2be99dfb38b..f562a6ebeec 100644 --- a/src/Access/IAccessStorage.cpp +++ b/src/Access/IAccessStorage.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -562,6 +563,62 @@ UUID IAccessStorage::generateRandomID() } +void IAccessStorage::clearConflictsInEntitiesList(std::vector> & entities, const Poco::Logger * log_) +{ + std::unordered_map positions_by_id; + std::unordered_map positions_by_type_and_name[static_cast(AccessEntityType::MAX)]; + std::vector positions_to_remove; + + for (size_t pos = 0; pos != entities.size(); ++pos) + { + const auto & [id, entity] = entities[pos]; + + if (auto it = positions_by_id.find(id); it == positions_by_id.end()) + { + positions_by_id[id] = pos; + } + else if (it->second != pos) + { + /// Conflict: same ID is used for multiple entities. We will ignore them. + positions_to_remove.emplace_back(pos); + positions_to_remove.emplace_back(it->second); + } + + std::string_view entity_name = entity->getName(); + auto & positions_by_name = positions_by_type_and_name[static_cast(entity->getType())]; + if (auto it = positions_by_name.find(entity_name); it == positions_by_name.end()) + { + positions_by_name[entity_name] = pos; + } + else if (it->second != pos) + { + /// Conflict: same name and type are used for multiple entities. We will ignore them. + positions_to_remove.emplace_back(pos); + positions_to_remove.emplace_back(it->second); + } + } + + if (positions_to_remove.empty()) + return; + + std::sort(positions_to_remove.begin(), positions_to_remove.end()); + positions_to_remove.erase(std::unique(positions_to_remove.begin(), positions_to_remove.end()), positions_to_remove.end()); + + for (size_t pos : positions_to_remove) + { + LOG_WARNING( + log_, + "Skipping {} (id={}) due to conflicts with other access entities", + entities[pos].second->formatTypeWithName(), + toString(entities[pos].first)); + } + + /// Remove conflicting entities. + for (size_t pos : positions_to_remove | boost::adaptors::reversed) /// Must remove in reversive order. + entities.erase(entities.begin() + pos); +} + + Poco::Logger * IAccessStorage::getLogger() const { Poco::Logger * ptr = log.load(); diff --git a/src/Access/IAccessStorage.h b/src/Access/IAccessStorage.h index 394d3ed6358..aa3947201e7 100644 --- a/src/Access/IAccessStorage.h +++ b/src/Access/IAccessStorage.h @@ -42,15 +42,26 @@ public: /// Returns true if this entity is readonly. virtual bool isReadOnly(const UUID &) const { return isReadOnly(); } - /// Reloads and updates entities in this storage. This function is used to implement SYSTEM RELOAD CONFIG. - virtual void reload() {} - - /// Starts periodic reloading and update of entities in this storage. + /// Starts periodic reloading and updating of entities in this storage. virtual void startPeriodicReloading() {} - /// Stops periodic reloading and update of entities in this storage. + /// Stops periodic reloading and updating of entities in this storage. virtual void stopPeriodicReloading() {} + enum class ReloadMode + { + /// Try to reload all access storages (including users.xml, local(disk) access storage, replicated(in zk) access storage. + /// This mode is invoked by the SYSTEM RELOAD USERS command. + ALL, + + /// Only reloads users.xml + /// This mode is invoked by the SYSTEM RELOAD CONFIG command. + USERS_CONFIG_ONLY, + }; + + /// Makes this storage to reload and update access entities right now. + virtual void reload(ReloadMode /* reload_mode */) {} + /// Returns the identifiers of all the entities of a specified type contained in the storage. std::vector findAll(AccessEntityType type) const; @@ -177,6 +188,7 @@ protected: static UUID generateRandomID(); Poco::Logger * getLogger() const; static String formatEntityTypeWithName(AccessEntityType type, const String & name) { return AccessEntityTypeInfo::get(type).formatEntityNameWithType(name); } + static void clearConflictsInEntitiesList(std::vector> & entities, const Poco::Logger * log_); [[noreturn]] void throwNotFound(const UUID & id) const; [[noreturn]] void throwNotFound(AccessEntityType type, const String & name) const; [[noreturn]] static void throwBadCast(const UUID & id, AccessEntityType type, const String & name, AccessEntityType required_type); diff --git a/src/Access/MemoryAccessStorage.cpp b/src/Access/MemoryAccessStorage.cpp index 60669532e25..8fcca235ee8 100644 --- a/src/Access/MemoryAccessStorage.cpp +++ b/src/Access/MemoryAccessStorage.cpp @@ -5,7 +5,6 @@ #include #include #include -#include namespace DB @@ -90,6 +89,9 @@ bool MemoryAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr & auto & entries_by_name = entries_by_name_and_type[static_cast(type)]; auto it_by_name = entries_by_name.find(name); bool name_collision = (it_by_name != entries_by_name.end()); + UUID id_by_name; + if (name_collision) + id_by_name = it_by_name->second->id; if (name_collision && !replace_if_exists) { @@ -100,16 +102,43 @@ bool MemoryAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr & } auto it_by_id = entries_by_id.find(id); - if (it_by_id != entries_by_id.end()) + bool id_collision = (it_by_id != entries_by_id.end()); + if (id_collision && !replace_if_exists) { const auto & existing_entry = it_by_id->second; - throwIDCollisionCannotInsert(id, type, name, existing_entry.entity->getType(), existing_entry.entity->getName()); + if (throw_if_exists) + throwIDCollisionCannotInsert(id, type, name, existing_entry.entity->getType(), existing_entry.entity->getName()); + else + return false; } - if (name_collision && replace_if_exists) + /// Remove collisions if necessary. + if (name_collision && (id_by_name != id)) { - const auto & existing_entry = *(it_by_name->second); - removeNoLock(existing_entry.id, /* throw_if_not_exists = */ false); + assert(replace_if_exists); + removeNoLock(id_by_name, /* throw_if_not_exists= */ true); + } + + if (id_collision) + { + assert(replace_if_exists); + auto & existing_entry = it_by_id->second; + if (existing_entry.entity->getType() == new_entity->getType()) + { + if (*existing_entry.entity != *new_entity) + { + if (existing_entry.entity->getName() != new_entity->getName()) + { + entries_by_name.erase(existing_entry.entity->getName()); + [[maybe_unused]] bool inserted = entries_by_name.emplace(new_entity->getName(), &existing_entry).second; + assert(inserted); + } + existing_entry.entity = new_entity; + changes_notifier.onEntityUpdated(id, new_entity); + } + return true; + } + removeNoLock(id, /* throw_if_not_exists= */ true); } /// Do insertion. @@ -201,6 +230,29 @@ bool MemoryAccessStorage::updateNoLock(const UUID & id, const UpdateFunc & updat } +void MemoryAccessStorage::removeAllExcept(const std::vector & ids_to_keep) +{ + std::lock_guard lock{mutex}; + removeAllExceptNoLock(ids_to_keep); +} + +void MemoryAccessStorage::removeAllExceptNoLock(const std::vector & ids_to_keep) +{ + removeAllExceptNoLock(boost::container::flat_set{ids_to_keep.begin(), ids_to_keep.end()}); +} + +void MemoryAccessStorage::removeAllExceptNoLock(const boost::container::flat_set & ids_to_keep) +{ + for (auto it = entries_by_id.begin(); it != entries_by_id.end();) + { + const auto & id = it->first; + ++it; /// We must go to the next element in the map `entries_by_id` here because otherwise removeNoLock() can invalidate our iterator. + if (!ids_to_keep.contains(id)) + removeNoLock(id, /* throw_if_not_exists */ true); + } +} + + void MemoryAccessStorage::setAll(const std::vector & all_entities) { std::vector> entities_with_ids; @@ -215,61 +267,20 @@ void MemoryAccessStorage::setAll(const std::vector not_used_ids; - std::vector conflicting_ids; + /// Remove conflicting entities from the specified list. + auto entities_without_conflicts = all_entities; + clearConflictsInEntitiesList(entities_without_conflicts, getLogger()); - /// Get the list of currently used IDs. Later we will remove those of them which are not used anymore. - for (const auto & id : entries_by_id | boost::adaptors::map_keys) - not_used_ids.emplace(id); - - /// Get the list of conflicting IDs and update the list of currently used ones. - for (const auto & [id, entity] : all_entities) - { - auto it = entries_by_id.find(id); - if (it != entries_by_id.end()) - { - not_used_ids.erase(id); /// ID is used. - - Entry & entry = it->second; - if (entry.entity->getType() != entity->getType()) - conflicting_ids.emplace_back(id); /// Conflict: same ID, different type. - } - - const auto & entries_by_name = entries_by_name_and_type[static_cast(entity->getType())]; - auto it2 = entries_by_name.find(entity->getName()); - if (it2 != entries_by_name.end()) - { - Entry & entry = *(it2->second); - if (entry.id != id) - conflicting_ids.emplace_back(entry.id); /// Conflict: same name and type, different ID. - } - } - - /// Remove entities which are not used anymore and which are in conflict with new entities. - boost::container::flat_set ids_to_remove = std::move(not_used_ids); - boost::range::copy(conflicting_ids, std::inserter(ids_to_remove, ids_to_remove.end())); - for (const auto & id : ids_to_remove) - removeNoLock(id, /* throw_if_not_exists = */ false); + /// Remove entities which are not used anymore. + boost::container::flat_set ids_to_keep; + ids_to_keep.reserve(entities_without_conflicts.size()); + for (const auto & [id, _] : entities_without_conflicts) + ids_to_keep.insert(id); + removeAllExceptNoLock(ids_to_keep); /// Insert or update entities. - for (const auto & [id, entity] : all_entities) - { - auto it = entries_by_id.find(id); - if (it != entries_by_id.end()) - { - if (*(it->second.entity) != *entity) - { - const AccessEntityPtr & changed_entity = entity; - updateNoLock(id, - [&changed_entity](const AccessEntityPtr &) { return changed_entity; }, - /* throw_if_not_exists = */ true); - } - } - else - { - insertNoLock(id, entity, /* replace_if_exists = */ false, /* throw_if_exists = */ true); - } - } + for (const auto & [id, entity] : entities_without_conflicts) + insertNoLock(id, entity, /* replace_if_exists = */ true, /* throw_if_exists = */ false); } diff --git a/src/Access/MemoryAccessStorage.h b/src/Access/MemoryAccessStorage.h index 5c8d33ed443..b63132147da 100644 --- a/src/Access/MemoryAccessStorage.h +++ b/src/Access/MemoryAccessStorage.h @@ -22,6 +22,15 @@ public: const char * getStorageType() const override { return STORAGE_TYPE; } + /// Inserts an entity with a specified ID. + /// If `replace_if_exists == true` it can replace an existing entry with such ID and also remove an existing entry + /// with such name & type. + bool insertWithID(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists); + + /// Removes all entities except the specified list `ids_to_keep`. + /// The function skips IDs not contained in the storage. + void removeAllExcept(const std::vector & ids_to_keep); + /// Sets all entities at once. void setAll(const std::vector & all_entities); void setAll(const std::vector> & all_entities); @@ -39,11 +48,13 @@ private: bool removeImpl(const UUID & id, bool throw_if_not_exists) override; bool updateImpl(const UUID & id, const UpdateFunc & update_func, bool throw_if_not_exists) override; - bool insertWithID(const UUID & id, const AccessEntityPtr & new_entity, bool replace_if_exists, bool throw_if_exists); bool insertNoLock(const UUID & id, const AccessEntityPtr & entity, bool replace_if_exists, bool throw_if_exists) TSA_REQUIRES(mutex); bool removeNoLock(const UUID & id, bool throw_if_not_exists) TSA_REQUIRES(mutex); bool updateNoLock(const UUID & id, const UpdateFunc & update_func, bool throw_if_not_exists) TSA_REQUIRES(mutex); + void removeAllExceptNoLock(const std::vector & ids_to_keep) TSA_REQUIRES(mutex); + void removeAllExceptNoLock(const boost::container::flat_set & ids_to_keep) TSA_REQUIRES(mutex); + struct Entry { UUID id; @@ -54,6 +65,6 @@ private: std::unordered_map entries_by_id TSA_GUARDED_BY(mutex); /// We want to search entries both by ID and by the pair of name and type. std::unordered_map entries_by_name_and_type[static_cast(AccessEntityType::MAX)] TSA_GUARDED_BY(mutex); AccessChangesNotifier & changes_notifier; - bool backup_allowed = false; + const bool backup_allowed = false; }; } diff --git a/src/Access/MultipleAccessStorage.cpp b/src/Access/MultipleAccessStorage.cpp index e7151cc7b4b..f910c99d6b3 100644 --- a/src/Access/MultipleAccessStorage.cpp +++ b/src/Access/MultipleAccessStorage.cpp @@ -223,13 +223,6 @@ bool MultipleAccessStorage::isReadOnly(const UUID & id) const } -void MultipleAccessStorage::reload() -{ - auto storages = getStoragesInternal(); - for (const auto & storage : *storages) - storage->reload(); -} - void MultipleAccessStorage::startPeriodicReloading() { auto storages = getStoragesInternal(); @@ -244,6 +237,13 @@ void MultipleAccessStorage::stopPeriodicReloading() storage->stopPeriodicReloading(); } +void MultipleAccessStorage::reload(ReloadMode reload_mode) +{ + auto storages = getStoragesInternal(); + for (const auto & storage : *storages) + storage->reload(reload_mode); +} + std::optional MultipleAccessStorage::insertImpl(const AccessEntityPtr & entity, bool replace_if_exists, bool throw_if_exists) { diff --git a/src/Access/MultipleAccessStorage.h b/src/Access/MultipleAccessStorage.h index bc9a4705785..6a0c1bdfc02 100644 --- a/src/Access/MultipleAccessStorage.h +++ b/src/Access/MultipleAccessStorage.h @@ -25,9 +25,9 @@ public: bool isReadOnly() const override; bool isReadOnly(const UUID & id) const override; - void reload() override; void startPeriodicReloading() override; void stopPeriodicReloading() override; + void reload(ReloadMode reload_mode) override; void setStorages(const std::vector & storages); void addStorage(const StoragePtr & new_storage); diff --git a/src/Access/QuotaCache.cpp b/src/Access/QuotaCache.cpp index 43ab4268b0c..af47819b8ce 100644 --- a/src/Access/QuotaCache.cpp +++ b/src/Access/QuotaCache.cpp @@ -301,4 +301,5 @@ std::vector QuotaCache::getAllQuotasUsage() const } return all_usage; } + } diff --git a/src/Access/ReplicatedAccessStorage.cpp b/src/Access/ReplicatedAccessStorage.cpp index c7aec75265c..747c354b28f 100644 --- a/src/Access/ReplicatedAccessStorage.cpp +++ b/src/Access/ReplicatedAccessStorage.cpp @@ -24,8 +24,8 @@ namespace DB { namespace ErrorCodes { -extern const int BAD_ARGUMENTS; -extern const int NO_ZOOKEEPER; + extern const int BAD_ARGUMENTS; + extern const int NO_ZOOKEEPER; } static UUID parseUUID(const String & text) @@ -46,6 +46,7 @@ ReplicatedAccessStorage::ReplicatedAccessStorage( , zookeeper_path(zookeeper_path_) , get_zookeeper(get_zookeeper_) , watched_queue(std::make_shared>(std::numeric_limits::max())) + , memory_storage(storage_name_, changes_notifier_, false) , changes_notifier(changes_notifier_) , backup_allowed(allow_backup_) { @@ -59,7 +60,7 @@ ReplicatedAccessStorage::ReplicatedAccessStorage( if (zookeeper_path.front() != '/') zookeeper_path = "/" + zookeeper_path; - initializeZookeeper(); + initZooKeeperWithRetries(/* max_retries= */ 2); } ReplicatedAccessStorage::~ReplicatedAccessStorage() @@ -121,15 +122,14 @@ bool ReplicatedAccessStorage::insertWithID(const UUID & id, const AccessEntityPt const String & name = new_entity->getName(); LOG_DEBUG(getLogger(), "Inserting entity of type {} named {} with id {}", type_info.name, name, toString(id)); - auto zookeeper = get_zookeeper(); + auto zookeeper = getZooKeeper(); bool ok = false; retryOnZooKeeperUserError(10, [&]{ ok = insertZooKeeper(zookeeper, id, new_entity, replace_if_exists, throw_if_exists); }); if (!ok) return false; - std::lock_guard lock{mutex}; - refreshEntityNoLock(zookeeper, id); + refreshEntity(zookeeper, id); return true; } @@ -163,51 +163,79 @@ bool ReplicatedAccessStorage::insertZooKeeper( if (res == Coordination::Error::ZNODEEXISTS) { + if (!throw_if_exists && !replace_if_exists) + return false; /// Couldn't insert a new entity. + + if (throw_if_exists) + { + if (responses[0]->error == Coordination::Error::ZNODEEXISTS) + { + /// To fail with a nice error message, we need info about what already exists. + /// This itself could fail if the conflicting uuid disappears in the meantime. + /// If that happens, then we'll just retry from the start. + String existing_entity_definition = zookeeper->get(entity_path); + + AccessEntityPtr existing_entity = deserializeAccessEntity(existing_entity_definition, entity_path); + AccessEntityType existing_type = existing_entity->getType(); + String existing_name = existing_entity->getName(); + throwIDCollisionCannotInsert(id, type, name, existing_type, existing_name); + } + else + { + /// Couldn't insert the new entity because there is an existing entity with such name. + throwNameCollisionCannotInsert(type, name); + } + } + + assert(replace_if_exists); + Coordination::Requests replace_ops; if (responses[0]->error == Coordination::Error::ZNODEEXISTS) { - /// The UUID already exists, simply fail. - - /// To fail with a nice error message, we need info about what already exists. - /// This itself could fail if the conflicting uuid disappears in the meantime. + /// The UUID is already associated with some existing entity, we will get rid of the conflicting entity first. + /// This itself could fail if the conflicting entity disappears in the meantime. /// If that happens, then we'll just retry from the start. - String existing_entity_definition = zookeeper->get(entity_path); + Coordination::Stat stat; + String existing_entity_definition = zookeeper->get(entity_path, &stat); + auto existing_entity = deserializeAccessEntity(existing_entity_definition, entity_path); + const String & existing_entity_name = existing_entity->getName(); + const AccessEntityType existing_entity_type = existing_entity->getType(); + const AccessEntityTypeInfo existing_entity_type_info = AccessEntityTypeInfo::get(existing_entity_type); + const String existing_name_path = zookeeper_path + "/" + existing_entity_type_info.unique_char + "/" + escapeForFileName(existing_entity_name); - AccessEntityPtr existing_entity = deserializeAccessEntity(existing_entity_definition, entity_path); - AccessEntityType existing_type = existing_entity->getType(); - String existing_name = existing_entity->getName(); - throwIDCollisionCannotInsert(id, type, name, existing_type, existing_name); - } - else if (replace_if_exists) - { - /// The name already exists for this type. - /// If asked to, we need to replace the existing entity. + if (existing_name_path != name_path) + replace_ops.emplace_back(zkutil::makeRemoveRequest(existing_name_path, -1)); - /// First get the uuid of the existing entity - /// This itself could fail if the conflicting name disappears in the meantime. - /// If that happens, then we'll just retry from the start. - Coordination::Stat name_stat; - String existing_entity_uuid = zookeeper->get(name_path, &name_stat); - - const String existing_entity_path = zookeeper_path + "/uuid/" + existing_entity_uuid; - Coordination::Requests replace_ops; - replace_ops.emplace_back(zkutil::makeRemoveRequest(existing_entity_path, -1)); - replace_ops.emplace_back(zkutil::makeCreateRequest(entity_path, new_entity_definition, zkutil::CreateMode::Persistent)); - replace_ops.emplace_back(zkutil::makeSetRequest(name_path, entity_uuid, name_stat.version)); - - /// If this fails, then we'll just retry from the start. - zookeeper->multi(replace_ops); - - /// Everything's fine, the new entity has been inserted instead of an existing entity. - return true; + replace_ops.emplace_back(zkutil::makeSetRequest(entity_path, new_entity_definition, stat.version)); } else { - /// Couldn't insert the new entity because there is an existing entity with such name. - if (throw_if_exists) - throwNameCollisionCannotInsert(type, name); - else - return false; + replace_ops.emplace_back(zkutil::makeCreateRequest(entity_path, new_entity_definition, zkutil::CreateMode::Persistent)); } + + if (responses[1]->error == Coordination::Error::ZNODEEXISTS) + { + /// The name is already associated with some existing entity, we will get rid of the conflicting entity first. + /// This itself could fail if the conflicting entity disappears in the meantime. + /// If that happens, then we'll just retry from the start. + Coordination::Stat stat; + String existing_entity_uuid = zookeeper->get(name_path, &stat); + const String existing_entity_path = zookeeper_path + "/uuid/" + existing_entity_uuid; + + if (existing_entity_path != entity_path) + replace_ops.emplace_back(zkutil::makeRemoveRequest(existing_entity_path, -1)); + + replace_ops.emplace_back(zkutil::makeSetRequest(name_path, entity_uuid, stat.version)); + } + else + { + replace_ops.emplace_back(zkutil::makeCreateRequest(name_path, entity_uuid, zkutil::CreateMode::Persistent)); + } + + /// If this fails, then we'll just retry from the start. + zookeeper->multi(replace_ops); + + /// Everything's fine, the new entity has been inserted instead of an existing entity. + return true; } /// If this fails, then we'll just retry from the start. @@ -221,7 +249,7 @@ bool ReplicatedAccessStorage::removeImpl(const UUID & id, bool throw_if_not_exis { LOG_DEBUG(getLogger(), "Removing entity {}", toString(id)); - auto zookeeper = get_zookeeper(); + auto zookeeper = getZooKeeper(); bool ok = false; retryOnZooKeeperUserError(10, [&] { ok = removeZooKeeper(zookeeper, id, throw_if_not_exists); }); @@ -273,15 +301,14 @@ bool ReplicatedAccessStorage::updateImpl(const UUID & id, const UpdateFunc & upd { LOG_DEBUG(getLogger(), "Updating entity {}", toString(id)); - auto zookeeper = get_zookeeper(); + auto zookeeper = getZooKeeper(); bool ok = false; retryOnZooKeeperUserError(10, [&] { ok = updateZooKeeper(zookeeper, id, update_func, throw_if_not_exists); }); if (!ok) return false; - std::lock_guard lock{mutex}; - refreshEntityNoLock(zookeeper, id); + refreshEntity(zookeeper, id); return true; } @@ -349,50 +376,110 @@ void ReplicatedAccessStorage::runWatchingThread() { LOG_DEBUG(getLogger(), "Started watching thread"); setThreadName("ReplACLWatch"); + while (watching) { + bool refreshed = false; try { - if (!initialized) - initializeZookeeper(); - if (refresh()) - changes_notifier.sendNotifications(); + initZooKeeperIfNeeded(); + refreshed = refresh(); } catch (...) { - tryLogCurrentException(getLogger(), "Unexpected error, will try to restart worker thread:"); + tryLogCurrentException(getLogger(), "Will try to restart watching thread after error"); resetAfterError(); sleepForSeconds(5); + continue; + } + + if (refreshed) + { + try + { + changes_notifier.sendNotifications(); + } + catch (...) + { + tryLogCurrentException(getLogger(), "Error while sending notifications"); + } } } } void ReplicatedAccessStorage::resetAfterError() { - initialized = false; - - UUID id; - while (watched_queue->tryPop(id)) {} - - std::lock_guard lock{mutex}; - for (const auto type : collections::range(AccessEntityType::MAX)) - entries_by_name_and_type[static_cast(type)].clear(); - entries_by_id.clear(); + /// Make watching thread reinitialize ZooKeeper and reread everything. + std::lock_guard lock{cached_zookeeper_mutex}; + cached_zookeeper = nullptr; } -void ReplicatedAccessStorage::initializeZookeeper() +void ReplicatedAccessStorage::initZooKeeperWithRetries(size_t max_retries) { - assert(!initialized); - auto zookeeper = get_zookeeper(); + for (size_t attempt = 0; attempt < max_retries; ++attempt) + { + try + { + initZooKeeperIfNeeded(); + break; /// If we're here the initialization has been successful. + } + catch (const Exception & e) + { + bool need_another_attempt = false; - if (!zookeeper) - throw Exception("Can't have Replicated access without ZooKeeper", ErrorCodes::NO_ZOOKEEPER); + if (const auto * coordination_exception = dynamic_cast(&e); + coordination_exception && Coordination::isHardwareError(coordination_exception->code)) + { + /// In case of a network error we'll try to initialize again. + LOG_ERROR(getLogger(), "Initialization failed. Error: {}", e.message()); + need_another_attempt = (attempt + 1 < max_retries); + } - createRootNodes(zookeeper); + if (!need_another_attempt) + throw; + } + } +} - refreshEntities(zookeeper); +void ReplicatedAccessStorage::initZooKeeperIfNeeded() +{ + getZooKeeper(); +} - initialized = true; +zkutil::ZooKeeperPtr ReplicatedAccessStorage::getZooKeeper() +{ + std::lock_guard lock{cached_zookeeper_mutex}; + return getZooKeeperNoLock(); +} + +zkutil::ZooKeeperPtr ReplicatedAccessStorage::getZooKeeperNoLock() +{ + if (!cached_zookeeper || cached_zookeeper->expired()) + { + auto zookeeper = get_zookeeper(); + if (!zookeeper) + throw Exception("Can't have Replicated access without ZooKeeper", ErrorCodes::NO_ZOOKEEPER); + + /// It's possible that we connected to different [Zoo]Keeper instance + /// so we may read a bit stale state. + zookeeper->sync(zookeeper_path); + + createRootNodes(zookeeper); + refreshEntities(zookeeper, /* all= */ true); + cached_zookeeper = zookeeper; + } + return cached_zookeeper; +} + +void ReplicatedAccessStorage::reload(ReloadMode reload_mode) +{ + if (reload_mode != ReloadMode::ALL) + return; + + /// Reinitialize ZooKeeper and reread everything. + std::lock_guard lock{cached_zookeeper_mutex}; + cached_zookeeper = nullptr; + getZooKeeperNoLock(); } void ReplicatedAccessStorage::createRootNodes(const zkutil::ZooKeeperPtr & zookeeper) @@ -414,10 +501,10 @@ bool ReplicatedAccessStorage::refresh() if (!watched_queue->tryPop(id, /* timeout_ms: */ 10000)) return false; - auto zookeeper = get_zookeeper(); + auto zookeeper = getZooKeeper(); if (id == UUIDHelpers::Nil) - refreshEntities(zookeeper); + refreshEntities(zookeeper, /* all= */ false); else refreshEntity(zookeeper, id); @@ -425,10 +512,16 @@ bool ReplicatedAccessStorage::refresh() } -void ReplicatedAccessStorage::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper) +void ReplicatedAccessStorage::refreshEntities(const zkutil::ZooKeeperPtr & zookeeper, bool all) { LOG_DEBUG(getLogger(), "Refreshing entities list"); + if (all) + { + /// It doesn't make sense to keep the queue because we will reread everything in this function. + watched_queue->clear(); + } + const String zookeeper_uuids_path = zookeeper_path + "/uuid"; auto watch_entities_list = [watched_queue = watched_queue](const Coordination::WatchResponse &) { @@ -437,185 +530,129 @@ void ReplicatedAccessStorage::refreshEntities(const zkutil::ZooKeeperPtr & zooke Coordination::Stat stat; const auto entity_uuid_strs = zookeeper->getChildrenWatch(zookeeper_uuids_path, &stat, watch_entities_list); - std::unordered_set entity_uuids; + std::vector entity_uuids; entity_uuids.reserve(entity_uuid_strs.size()); for (const String & entity_uuid_str : entity_uuid_strs) - entity_uuids.insert(parseUUID(entity_uuid_str)); + entity_uuids.emplace_back(parseUUID(entity_uuid_str)); std::lock_guard lock{mutex}; - std::vector entities_to_remove; - /// Locally remove entities that were removed from ZooKeeper - for (const auto & pair : entries_by_id) + if (all) { - const UUID & entity_uuid = pair.first; - if (!entity_uuids.contains(entity_uuid)) - entities_to_remove.push_back(entity_uuid); + /// all=true means we read & parse all access entities from ZooKeeper. + std::vector> entities; + for (const auto & uuid : entity_uuids) + { + if (auto entity = tryReadEntityFromZooKeeper(zookeeper, uuid)) + entities.emplace_back(uuid, entity); + } + memory_storage.setAll(entities); } - for (const auto & entity_uuid : entities_to_remove) - removeEntityNoLock(entity_uuid); - - /// Locally add entities that were added to ZooKeeper - for (const auto & entity_uuid : entity_uuids) + else { - const auto it = entries_by_id.find(entity_uuid); - if (it == entries_by_id.end()) - refreshEntityNoLock(zookeeper, entity_uuid); + /// all=false means we read & parse only new access entities from ZooKeeper. + memory_storage.removeAllExcept(entity_uuids); + for (const auto & uuid : entity_uuids) + { + if (!memory_storage.exists(uuid)) + refreshEntityNoLock(zookeeper, uuid); + } } LOG_DEBUG(getLogger(), "Refreshing entities list finished"); } + void ReplicatedAccessStorage::refreshEntity(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) { + LOG_DEBUG(getLogger(), "Refreshing entity {}", toString(id)); + + auto entity = tryReadEntityFromZooKeeper(zookeeper, id); + std::lock_guard lock{mutex}; - refreshEntityNoLock(zookeeper, id); + + if (entity) + setEntityNoLock(id, entity); + else + removeEntityNoLock(id); } void ReplicatedAccessStorage::refreshEntityNoLock(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) { LOG_DEBUG(getLogger(), "Refreshing entity {}", toString(id)); + auto entity = tryReadEntityFromZooKeeper(zookeeper, id); + if (entity) + setEntityNoLock(id, entity); + else + removeEntityNoLock(id); +} + +AccessEntityPtr ReplicatedAccessStorage::tryReadEntityFromZooKeeper(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) const +{ const auto watch_entity = [watched_queue = watched_queue, id](const Coordination::WatchResponse & response) { if (response.type == Coordination::Event::CHANGED) [[maybe_unused]] bool push_result = watched_queue->push(id); }; + Coordination::Stat entity_stat; const String entity_path = zookeeper_path + "/uuid/" + toString(id); String entity_definition; - const bool exists = zookeeper->tryGetWatch(entity_path, entity_definition, &entity_stat, watch_entity); - if (exists) + bool exists = zookeeper->tryGetWatch(entity_path, entity_definition, &entity_stat, watch_entity); + if (!exists) + return nullptr; + + try { - const AccessEntityPtr entity = deserializeAccessEntity(entity_definition, entity_path); - setEntityNoLock(id, entity); + return deserializeAccessEntity(entity_definition, entity_path); } - else + catch (...) { - removeEntityNoLock(id); + tryLogCurrentException(getLogger(), "Error while reading the definition of " + toString(id)); + return nullptr; } } - void ReplicatedAccessStorage::setEntityNoLock(const UUID & id, const AccessEntityPtr & entity) { LOG_DEBUG(getLogger(), "Setting id {} to entity named {}", toString(id), entity->getName()); - const AccessEntityType type = entity->getType(); - const String & name = entity->getName(); - - /// If the type+name already exists and is a different entity, remove old entity - auto & entries_by_name = entries_by_name_and_type[static_cast(type)]; - if (auto it = entries_by_name.find(name); it != entries_by_name.end() && it->second->id != id) - { - removeEntityNoLock(it->second->id); - } - - /// If the entity already exists under a different type+name, remove old type+name - bool existed_before = false; - if (auto it = entries_by_id.find(id); it != entries_by_id.end()) - { - existed_before = true; - const AccessEntityPtr & existing_entity = it->second.entity; - const AccessEntityType existing_type = existing_entity->getType(); - const String & existing_name = existing_entity->getName(); - if (existing_type != type || existing_name != name) - { - auto & existing_entries_by_name = entries_by_name_and_type[static_cast(existing_type)]; - existing_entries_by_name.erase(existing_name); - } - } - - auto & entry = entries_by_id[id]; - entry.id = id; - entry.entity = entity; - entries_by_name[name] = &entry; - - if (initialized) - { - if (existed_before) - changes_notifier.onEntityUpdated(id, entity); - else - changes_notifier.onEntityAdded(id, entity); - } + memory_storage.insertWithID(id, entity, /* replace_if_exists= */ true, /* throw_if_exists= */ false); } void ReplicatedAccessStorage::removeEntityNoLock(const UUID & id) { LOG_DEBUG(getLogger(), "Removing entity with id {}", toString(id)); - const auto it = entries_by_id.find(id); - if (it == entries_by_id.end()) - { - LOG_DEBUG(getLogger(), "Id {} not found, ignoring removal", toString(id)); - return; - } - - const Entry & entry = it->second; - const AccessEntityType type = entry.entity->getType(); - const String & name = entry.entity->getName(); - - auto & entries_by_name = entries_by_name_and_type[static_cast(type)]; - const auto name_it = entries_by_name.find(name); - if (name_it == entries_by_name.end()) - LOG_WARNING(getLogger(), "Entity {} not found in names, ignoring removal of name", toString(id)); - else if (name_it->second != &(it->second)) - LOG_WARNING(getLogger(), "Name {} not pointing to entity {}, ignoring removal of name", name, toString(id)); - else - entries_by_name.erase(name); - - UUID removed_id = id; - entries_by_id.erase(id); - LOG_DEBUG(getLogger(), "Removed entity with id {}", toString(id)); - - changes_notifier.onEntityRemoved(removed_id, type); + memory_storage.remove(id, /* throw_if_not_exists= */ false); } std::optional ReplicatedAccessStorage::findImpl(AccessEntityType type, const String & name) const { std::lock_guard lock{mutex}; - const auto & entries_by_name = entries_by_name_and_type[static_cast(type)]; - const auto it = entries_by_name.find(name); - if (it == entries_by_name.end()) - return {}; - - const Entry * entry = it->second; - return entry->id; + return memory_storage.find(type, name); } std::vector ReplicatedAccessStorage::findAllImpl(AccessEntityType type) const { std::lock_guard lock{mutex}; - std::vector result; - result.reserve(entries_by_id.size()); - for (const auto & [id, entry] : entries_by_id) - if (entry.entity->isTypeOf(type)) - result.emplace_back(id); - return result; + return memory_storage.findAll(type); } bool ReplicatedAccessStorage::exists(const UUID & id) const { std::lock_guard lock{mutex}; - return entries_by_id.contains(id); + return memory_storage.exists(id); } AccessEntityPtr ReplicatedAccessStorage::readImpl(const UUID & id, bool throw_if_not_exists) const { std::lock_guard lock{mutex}; - const auto it = entries_by_id.find(id); - if (it == entries_by_id.end()) - { - if (throw_if_not_exists) - throwNotFound(id); - else - return nullptr; - } - const Entry & entry = it->second; - return entry.entity; + return memory_storage.read(id, throw_if_not_exists); } diff --git a/src/Access/ReplicatedAccessStorage.h b/src/Access/ReplicatedAccessStorage.h index 6311e2ac7c0..d9d4b628f8d 100644 --- a/src/Access/ReplicatedAccessStorage.h +++ b/src/Access/ReplicatedAccessStorage.h @@ -1,20 +1,13 @@ #pragma once #include -#include -#include -#include -#include - -#include -#include #include #include #include #include -#include +#include namespace DB @@ -34,6 +27,7 @@ public: void startPeriodicReloading() override { startWatchingThread(); } void stopPeriodicReloading() override { stopWatchingThread(); } + void reload(ReloadMode reload_mode) override; bool exists(const UUID & id) const override; @@ -43,9 +37,10 @@ public: private: String zookeeper_path; - zkutil::GetZooKeeper get_zookeeper; + const zkutil::GetZooKeeper get_zookeeper; - std::atomic initialized = false; + zkutil::ZooKeeperPtr cached_zookeeper TSA_GUARDED_BY(cached_zookeeper_mutex); + std::mutex cached_zookeeper_mutex; std::atomic watching = false; ThreadFromGlobalPool watching_thread; @@ -60,7 +55,10 @@ private: bool removeZooKeeper(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id, bool throw_if_not_exists); bool updateZooKeeper(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id, const UpdateFunc & update_func, bool throw_if_not_exists); - void initializeZookeeper(); + void initZooKeeperWithRetries(size_t max_retries); + void initZooKeeperIfNeeded(); + zkutil::ZooKeeperPtr getZooKeeper(); + zkutil::ZooKeeperPtr getZooKeeperNoLock() TSA_REQUIRES(cached_zookeeper_mutex); void createRootNodes(const zkutil::ZooKeeperPtr & zookeeper); void startWatchingThread(); @@ -70,27 +68,21 @@ private: void resetAfterError(); bool refresh(); - void refreshEntities(const zkutil::ZooKeeperPtr & zookeeper); + void refreshEntities(const zkutil::ZooKeeperPtr & zookeeper, bool all); void refreshEntity(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id); void refreshEntityNoLock(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) TSA_REQUIRES(mutex); + AccessEntityPtr tryReadEntityFromZooKeeper(const zkutil::ZooKeeperPtr & zookeeper, const UUID & id) const; void setEntityNoLock(const UUID & id, const AccessEntityPtr & entity) TSA_REQUIRES(mutex); void removeEntityNoLock(const UUID & id) TSA_REQUIRES(mutex); - struct Entry - { - UUID id; - AccessEntityPtr entity; - }; - std::optional findImpl(AccessEntityType type, const String & name) const override; std::vector findAllImpl(AccessEntityType type) const override; AccessEntityPtr readImpl(const UUID & id, bool throw_if_not_exists) const override; mutable std::mutex mutex; - std::unordered_map entries_by_id TSA_GUARDED_BY(mutex); - std::unordered_map entries_by_name_and_type[static_cast(AccessEntityType::MAX)] TSA_GUARDED_BY(mutex); + MemoryAccessStorage memory_storage TSA_GUARDED_BY(mutex); AccessChangesNotifier & changes_notifier; - bool backup_allowed = false; + const bool backup_allowed = false; }; } diff --git a/src/Access/SettingsConstraints.cpp b/src/Access/SettingsConstraints.cpp index 34f2e10dc83..d97a78c78ab 100644 --- a/src/Access/SettingsConstraints.cpp +++ b/src/Access/SettingsConstraints.cpp @@ -35,88 +35,43 @@ void SettingsConstraints::clear() constraints.clear(); } - -void SettingsConstraints::setMinValue(std::string_view setting_name, const Field & min_value) +void SettingsConstraints::set(const String & setting_name, const Field & min_value, const Field & max_value, SettingConstraintWritability writability) { - getConstraintRef(setting_name).min_value = Settings::castValueUtil(setting_name, min_value); + auto & constraint = constraints[setting_name]; + if (!min_value.isNull()) + constraint.min_value = Settings::castValueUtil(setting_name, min_value); + if (!max_value.isNull()) + constraint.max_value = Settings::castValueUtil(setting_name, max_value); + constraint.writability = writability; } -Field SettingsConstraints::getMinValue(std::string_view setting_name) const +void SettingsConstraints::get(const Settings & current_settings, std::string_view setting_name, Field & min_value, Field & max_value, SettingConstraintWritability & writability) const { - const auto * ptr = tryGetConstraint(setting_name); - if (ptr) - return ptr->min_value; - else - return {}; -} - - -void SettingsConstraints::setMaxValue(std::string_view setting_name, const Field & max_value) -{ - getConstraintRef(setting_name).max_value = Settings::castValueUtil(setting_name, max_value); -} - -Field SettingsConstraints::getMaxValue(std::string_view setting_name) const -{ - const auto * ptr = tryGetConstraint(setting_name); - if (ptr) - return ptr->max_value; - else - return {}; -} - - -void SettingsConstraints::setReadOnly(std::string_view setting_name, bool read_only) -{ - getConstraintRef(setting_name).read_only = read_only; -} - -bool SettingsConstraints::isReadOnly(std::string_view setting_name) const -{ - const auto * ptr = tryGetConstraint(setting_name); - if (ptr) - return ptr->read_only; - else - return false; -} - - -void SettingsConstraints::set(std::string_view setting_name, const Field & min_value, const Field & max_value, bool read_only) -{ - auto & ref = getConstraintRef(setting_name); - ref.min_value = Settings::castValueUtil(setting_name, min_value); - ref.max_value = Settings::castValueUtil(setting_name, max_value); - ref.read_only = read_only; -} - -void SettingsConstraints::get(std::string_view setting_name, Field & min_value, Field & max_value, bool & read_only) const -{ - const auto * ptr = tryGetConstraint(setting_name); - if (ptr) - { - min_value = ptr->min_value; - max_value = ptr->max_value; - read_only = ptr->read_only; - } - else - { - min_value = Field{}; - max_value = Field{}; - read_only = false; - } + auto checker = getChecker(current_settings, setting_name); + min_value = checker.constraint.min_value; + max_value = checker.constraint.max_value; + writability = checker.constraint.writability; } void SettingsConstraints::merge(const SettingsConstraints & other) { - for (const auto & [other_name, other_constraint] : other.constraints) + if (access_control->doesSettingsConstraintsReplacePrevious()) { - auto & constraint = getConstraintRef(other_name); - if (!other_constraint.min_value.isNull()) - constraint.min_value = other_constraint.min_value; - if (!other_constraint.max_value.isNull()) - constraint.max_value = other_constraint.max_value; - if (other_constraint.read_only) - constraint.read_only = true; + for (const auto & [other_name, other_constraint] : other.constraints) + constraints[other_name] = other_constraint; + } + else + { + for (const auto & [other_name, other_constraint] : other.constraints) + { + auto & constraint = constraints[other_name]; + if (!other_constraint.min_value.isNull()) + constraint.min_value = other_constraint.min_value; + if (!other_constraint.max_value.isNull()) + constraint.max_value = other_constraint.max_value; + if (other_constraint.writability == SettingConstraintWritability::CONST) + constraint.writability = SettingConstraintWritability::CONST; // NOTE: In this mode flag cannot be overridden to be false + } } } @@ -180,26 +135,6 @@ bool SettingsConstraints::checkImpl(const Settings & current_settings, SettingCh } }; - bool cannot_compare = false; - auto less = [&](const Field & left, const Field & right) - { - cannot_compare = false; - if (reaction == THROW_ON_VIOLATION) - return applyVisitor(FieldVisitorAccurateLess{}, left, right); - else - { - try - { - return applyVisitor(FieldVisitorAccurateLess{}, left, right); - } - catch (...) - { - cannot_compare = true; - return false; - } - } - }; - if (reaction == THROW_ON_VIOLATION) { try @@ -239,115 +174,119 @@ bool SettingsConstraints::checkImpl(const Settings & current_settings, SettingCh return false; } - if (!current_settings.allow_ddl && setting_name == "allow_ddl") + return getChecker(current_settings, setting_name).check(change, new_value, reaction); +} + +bool SettingsConstraints::Checker::check(SettingChange & change, const Field & new_value, ReactionOnViolation reaction) const +{ + const String & setting_name = change.name; + + auto less_or_cannot_compare = [=](const Field & left, const Field & right) { if (reaction == THROW_ON_VIOLATION) - throw Exception("Cannot modify 'allow_ddl' setting when DDL queries are prohibited for the user", ErrorCodes::QUERY_IS_PROHIBITED); + return applyVisitor(FieldVisitorAccurateLess{}, left, right); else - return false; - } - - /** The `readonly` value is understood as follows: - * 0 - everything allowed. - * 1 - only read queries can be made; you can not change the settings. - * 2 - You can only do read queries and you can change the settings, except for the `readonly` setting. - */ - if (current_settings.readonly == 1) - { - if (reaction == THROW_ON_VIOLATION) - throw Exception("Cannot modify '" + setting_name + "' setting in readonly mode", ErrorCodes::READONLY); - else - return false; - } - - if (current_settings.readonly > 1 && setting_name == "readonly") - { - if (reaction == THROW_ON_VIOLATION) - throw Exception("Cannot modify 'readonly' setting in readonly mode", ErrorCodes::READONLY); - else - return false; - } - - const Constraint * constraint = tryGetConstraint(setting_name); - if (constraint) - { - if (constraint->read_only) { - if (reaction == THROW_ON_VIOLATION) - throw Exception("Setting " + setting_name + " should not be changed", ErrorCodes::SETTING_CONSTRAINT_VIOLATION); - else - return false; - } - - const Field & min_value = constraint->min_value; - const Field & max_value = constraint->max_value; - if (!min_value.isNull() && !max_value.isNull() && (less(max_value, min_value) || cannot_compare)) - { - if (reaction == THROW_ON_VIOLATION) - throw Exception("Setting " + setting_name + " should not be changed", ErrorCodes::SETTING_CONSTRAINT_VIOLATION); - else - return false; - } - - if (!min_value.isNull() && (less(new_value, min_value) || cannot_compare)) - { - if (reaction == THROW_ON_VIOLATION) + try { - throw Exception( - "Setting " + setting_name + " shouldn't be less than " + applyVisitor(FieldVisitorToString(), constraint->min_value), - ErrorCodes::SETTING_CONSTRAINT_VIOLATION); + return applyVisitor(FieldVisitorAccurateLess{}, left, right); } - else - change.value = min_value; - } - - if (!max_value.isNull() && (less(max_value, new_value) || cannot_compare)) - { - if (reaction == THROW_ON_VIOLATION) + catch (...) { - throw Exception( - "Setting " + setting_name + " shouldn't be greater than " + applyVisitor(FieldVisitorToString(), constraint->max_value), - ErrorCodes::SETTING_CONSTRAINT_VIOLATION); + return true; } - else - change.value = max_value; } + }; + + if (!explain.empty()) + { + if (reaction == THROW_ON_VIOLATION) + throw Exception(explain, code); + else + return false; + } + + if (constraint.writability == SettingConstraintWritability::CONST) + { + if (reaction == THROW_ON_VIOLATION) + throw Exception("Setting " + setting_name + " should not be changed", ErrorCodes::SETTING_CONSTRAINT_VIOLATION); + else + return false; + } + + const auto & min_value = constraint.min_value; + const auto & max_value = constraint.max_value; + + if (!min_value.isNull() && !max_value.isNull() && less_or_cannot_compare(max_value, min_value)) + { + if (reaction == THROW_ON_VIOLATION) + throw Exception("Setting " + setting_name + " should not be changed", ErrorCodes::SETTING_CONSTRAINT_VIOLATION); + else + return false; + } + + if (!min_value.isNull() && less_or_cannot_compare(new_value, min_value)) + { + if (reaction == THROW_ON_VIOLATION) + { + throw Exception( + "Setting " + setting_name + " shouldn't be less than " + applyVisitor(FieldVisitorToString(), min_value), + ErrorCodes::SETTING_CONSTRAINT_VIOLATION); + } + else + change.value = min_value; + } + + if (!max_value.isNull() && less_or_cannot_compare(max_value, new_value)) + { + if (reaction == THROW_ON_VIOLATION) + { + throw Exception( + "Setting " + setting_name + " shouldn't be greater than " + applyVisitor(FieldVisitorToString(), max_value), + ErrorCodes::SETTING_CONSTRAINT_VIOLATION); + } + else + change.value = max_value; } return true; } - -SettingsConstraints::Constraint & SettingsConstraints::getConstraintRef(std::string_view setting_name) +SettingsConstraints::Checker SettingsConstraints::getChecker(const Settings & current_settings, std::string_view setting_name) const { + if (!current_settings.allow_ddl && setting_name == "allow_ddl") + return Checker("Cannot modify 'allow_ddl' setting when DDL queries are prohibited for the user", ErrorCodes::QUERY_IS_PROHIBITED); + + /** The `readonly` value is understood as follows: + * 0 - no read-only restrictions. + * 1 - only read requests, as well as changing settings with `changable_in_readonly` flag. + * 2 - only read requests, as well as changing settings, except for the `readonly` setting. + */ + + if (current_settings.readonly > 1 && setting_name == "readonly") + return Checker("Cannot modify 'readonly' setting in readonly mode", ErrorCodes::READONLY); + auto it = constraints.find(setting_name); - if (it == constraints.end()) + if (current_settings.readonly == 1) { - auto setting_name_ptr = std::make_shared(setting_name); - Constraint new_constraint; - new_constraint.setting_name = setting_name_ptr; - it = constraints.emplace(*setting_name_ptr, std::move(new_constraint)).first; + if (it == constraints.end() || it->second.writability != SettingConstraintWritability::CHANGEABLE_IN_READONLY) + return Checker("Cannot modify '" + String(setting_name) + "' setting in readonly mode", ErrorCodes::READONLY); } - return it->second; + else // For both readonly=0 and readonly=2 + { + if (it == constraints.end()) + return Checker(); // Allowed + } + return Checker(it->second); } -const SettingsConstraints::Constraint * SettingsConstraints::tryGetConstraint(std::string_view setting_name) const -{ - auto it = constraints.find(setting_name); - if (it == constraints.end()) - return nullptr; - return &it->second; -} - - bool SettingsConstraints::Constraint::operator==(const Constraint & other) const { - return (read_only == other.read_only) && (min_value == other.min_value) && (max_value == other.max_value) - && (*setting_name == *other.setting_name); + return writability == other.writability && min_value == other.min_value && max_value == other.max_value; } bool operator ==(const SettingsConstraints & left, const SettingsConstraints & right) { - return (left.constraints == right.constraints); + return left.constraints == right.constraints; } } diff --git a/src/Access/SettingsConstraints.h b/src/Access/SettingsConstraints.h index 645a690e051..822bf42861b 100644 --- a/src/Access/SettingsConstraints.h +++ b/src/Access/SettingsConstraints.h @@ -1,9 +1,9 @@ #pragma once +#include #include #include - namespace Poco::Util { class AbstractConfiguration; @@ -35,18 +35,22 @@ class AccessControl; * 20000000000 * * - * + * * + * + * + * * * * * * This class also checks that we are not in the read-only mode. * If a setting cannot be change due to the read-only mode this class throws an exception. - * The value of `readonly` value is understood as follows: - * 0 - everything allowed. - * 1 - only read queries can be made; you can not change the settings. - * 2 - you can only do read queries and you can change the settings, except for the `readonly` setting. + * The value of `readonly` is understood as follows: + * 0 - not read-only mode, no additional checks. + * 1 - only read queries, as well as changing settings with flag. + * 2 - only read queries and you can change the settings, except for the `readonly` setting. + * */ class SettingsConstraints { @@ -61,17 +65,8 @@ public: void clear(); bool empty() const { return constraints.empty(); } - void setMinValue(std::string_view setting_name, const Field & min_value); - Field getMinValue(std::string_view setting_name) const; - - void setMaxValue(std::string_view setting_name, const Field & max_value); - Field getMaxValue(std::string_view setting_name) const; - - void setReadOnly(std::string_view setting_name, bool read_only); - bool isReadOnly(std::string_view setting_name) const; - - void set(std::string_view setting_name, const Field & min_value, const Field & max_value, bool read_only); - void get(std::string_view setting_name, Field & min_value, Field & max_value, bool & read_only) const; + void set(const String & setting_name, const Field & min_value, const Field & max_value, SettingConstraintWritability writability); + void get(const Settings & current_settings, std::string_view setting_name, Field & min_value, Field & max_value, SettingConstraintWritability & writability) const; void merge(const SettingsConstraints & other); @@ -87,10 +82,15 @@ public: friend bool operator !=(const SettingsConstraints & left, const SettingsConstraints & right) { return !(left == right); } private: + enum ReactionOnViolation + { + THROW_ON_VIOLATION, + CLAMP_ON_VIOLATION, + }; + struct Constraint { - std::shared_ptr setting_name; - bool read_only = false; + SettingConstraintWritability writability = SettingConstraintWritability::WRITABLE; Field min_value; Field max_value; @@ -98,18 +98,53 @@ private: bool operator !=(const Constraint & other) const { return !(*this == other); } }; - enum ReactionOnViolation + struct Checker { - THROW_ON_VIOLATION, - CLAMP_ON_VIOLATION, + Constraint constraint; + String explain; + int code = 0; + + // Allows everything + Checker() = default; + + // Forbidden with explanation + Checker(const String & explain_, int code_) + : constraint{.writability = SettingConstraintWritability::CONST} + , explain(explain_) + , code(code_) + {} + + // Allow or forbid depending on range defined by constraint, also used to return stored constraint + explicit Checker(const Constraint & constraint_) + : constraint(constraint_) + {} + + // Perform checking + bool check(SettingChange & change, const Field & new_value, ReactionOnViolation reaction) const; }; + + struct StringHash + { + using is_transparent = void; + size_t operator()(std::string_view txt) const + { + return std::hash{}(txt); + } + size_t operator()(const String & txt) const + { + return std::hash{}(txt); + } + }; + bool checkImpl(const Settings & current_settings, SettingChange & change, ReactionOnViolation reaction) const; - Constraint & getConstraintRef(std::string_view setting_name); - const Constraint * tryGetConstraint(std::string_view setting_name) const; + Checker getChecker(const Settings & current_settings, std::string_view setting_name) const; - std::unordered_map constraints; - const AccessControl * access_control = nullptr; + // Special container for heterogeneous lookups: to avoid `String` construction during `find(std::string_view)` + using Constraints = std::unordered_map>; + Constraints constraints; + + const AccessControl * access_control; }; } diff --git a/src/Access/SettingsProfileElement.cpp b/src/Access/SettingsProfileElement.cpp index 465f26f37d9..474ffec0d21 100644 --- a/src/Access/SettingsProfileElement.cpp +++ b/src/Access/SettingsProfileElement.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -18,6 +19,10 @@ namespace constexpr const char ALLOW_BACKUP_SETTING_NAME[] = "allow_backup"; } +namespace ErrorCodes +{ + extern const int NOT_IMPLEMENTED; +} SettingsProfileElement::SettingsProfileElement(const ASTSettingsProfileElement & ast) { @@ -46,17 +51,20 @@ void SettingsProfileElement::init(const ASTSettingsProfileElement & ast, const A { setting_name = ast.setting_name; - /// Optionally check if a setting with that name is allowed. if (access_control) { + /// Check if a setting with that name is allowed. if (setting_name != ALLOW_BACKUP_SETTING_NAME) access_control->checkSettingNameIsAllowed(setting_name); + /// Check if a CHANGEABLE_IN_READONLY is allowed. + if (ast.writability == SettingConstraintWritability::CHANGEABLE_IN_READONLY && !access_control->doesSettingsConstraintsReplacePrevious()) + throw Exception("CHANGEABLE_IN_READONLY for " + setting_name + " is not allowed unless settings_constraints_replace_previous is enabled", ErrorCodes::NOT_IMPLEMENTED); } value = ast.value; min_value = ast.min_value; max_value = ast.max_value; - readonly = ast.readonly; + writability = ast.writability; if (!value.isNull()) value = Settings::castValueUtil(setting_name, value); @@ -80,7 +88,7 @@ std::shared_ptr SettingsProfileElement::toAST() const ast->value = value; ast->min_value = min_value; ast->max_value = max_value; - ast->readonly = readonly; + ast->writability = writability; return ast; } @@ -101,7 +109,7 @@ std::shared_ptr SettingsProfileElement::toASTWithName ast->value = value; ast->min_value = min_value; ast->max_value = max_value; - ast->readonly = readonly; + ast->writability = writability; return ast; } @@ -205,17 +213,12 @@ SettingsConstraints SettingsProfileElements::toSettingsConstraints(const AccessC { SettingsConstraints res{access_control}; for (const auto & elem : *this) - { - if (!elem.setting_name.empty() && (elem.setting_name != ALLOW_BACKUP_SETTING_NAME)) - { - if (!elem.min_value.isNull()) - res.setMinValue(elem.setting_name, elem.min_value); - if (!elem.max_value.isNull()) - res.setMaxValue(elem.setting_name, elem.max_value); - if (elem.readonly) - res.setReadOnly(elem.setting_name, *elem.readonly); - } - } + if (!elem.setting_name.empty() && elem.setting_name != ALLOW_BACKUP_SETTING_NAME) + res.set( + elem.setting_name, + elem.min_value, + elem.max_value, + elem.writability ? *elem.writability : SettingConstraintWritability::WRITABLE); return res; } diff --git a/src/Access/SettingsProfileElement.h b/src/Access/SettingsProfileElement.h index a4124826b40..c02e9947d61 100644 --- a/src/Access/SettingsProfileElement.h +++ b/src/Access/SettingsProfileElement.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -25,9 +26,9 @@ struct SettingsProfileElement Field value; Field min_value; Field max_value; - std::optional readonly; + std::optional writability; - auto toTuple() const { return std::tie(parent_profile, setting_name, value, min_value, max_value, readonly); } + auto toTuple() const { return std::tie(parent_profile, setting_name, value, min_value, max_value, writability); } friend bool operator==(const SettingsProfileElement & lhs, const SettingsProfileElement & rhs) { return lhs.toTuple() == rhs.toTuple(); } friend bool operator!=(const SettingsProfileElement & lhs, const SettingsProfileElement & rhs) { return !(lhs == rhs); } friend bool operator <(const SettingsProfileElement & lhs, const SettingsProfileElement & rhs) { return lhs.toTuple() < rhs.toTuple(); } diff --git a/src/Access/UsersConfigAccessStorage.cpp b/src/Access/UsersConfigAccessStorage.cpp index 1d755fdf1da..28ef4ebaa7a 100644 --- a/src/Access/UsersConfigAccessStorage.cpp +++ b/src/Access/UsersConfigAccessStorage.cpp @@ -441,17 +441,32 @@ namespace String path_to_name = path_to_constraints + "." + setting_name; config.keys(path_to_name, constraint_types); + size_t writability_count = 0; for (const String & constraint_type : constraint_types) { if (constraint_type == "min") profile_element.min_value = Settings::stringToValueUtil(setting_name, config.getString(path_to_name + "." + constraint_type)); else if (constraint_type == "max") profile_element.max_value = Settings::stringToValueUtil(setting_name, config.getString(path_to_name + "." + constraint_type)); - else if (constraint_type == "readonly") - profile_element.readonly = true; + else if (constraint_type == "readonly" || constraint_type == "const") + { + writability_count++; + profile_element.writability = SettingConstraintWritability::CONST; + } + else if (constraint_type == "changeable_in_readonly") + { + writability_count++; + if (access_control.doesSettingsConstraintsReplacePrevious()) + profile_element.writability = SettingConstraintWritability::CHANGEABLE_IN_READONLY; + else + throw Exception("Setting changeable_in_readonly for " + setting_name + " is not allowed unless settings_constraints_replace_previous is enabled", ErrorCodes::NOT_IMPLEMENTED); + } else throw Exception("Setting " + constraint_type + " value for " + setting_name + " isn't supported", ErrorCodes::NOT_IMPLEMENTED); } + if (writability_count > 1) + throw Exception("Not more than one constraint writability specifier (const/readonly/changeable_in_readonly) is allowed for " + setting_name, ErrorCodes::NOT_IMPLEMENTED); + profile_elements.push_back(std::move(profile_element)); } @@ -635,13 +650,6 @@ void UsersConfigAccessStorage::load( /* already_loaded = */ false); } -void UsersConfigAccessStorage::reload() -{ - std::lock_guard lock{load_mutex}; - if (config_reloader) - config_reloader->reload(); -} - void UsersConfigAccessStorage::startPeriodicReloading() { std::lock_guard lock{load_mutex}; @@ -656,6 +664,13 @@ void UsersConfigAccessStorage::stopPeriodicReloading() config_reloader->stop(); } +void UsersConfigAccessStorage::reload(ReloadMode /* reload_mode */) +{ + std::lock_guard lock{load_mutex}; + if (config_reloader) + config_reloader->reload(); +} + std::optional UsersConfigAccessStorage::findImpl(AccessEntityType type, const String & name) const { return memory_storage.find(type, name); diff --git a/src/Access/UsersConfigAccessStorage.h b/src/Access/UsersConfigAccessStorage.h index 3fa8b4185a8..b533ccbf200 100644 --- a/src/Access/UsersConfigAccessStorage.h +++ b/src/Access/UsersConfigAccessStorage.h @@ -38,9 +38,9 @@ public: const String & preprocessed_dir = {}, const zkutil::GetZooKeeper & get_zookeeper_function = {}); - void reload() override; void startPeriodicReloading() override; void stopPeriodicReloading() override; + void reload(ReloadMode reload_mode) override; bool exists(const UUID & id) const override; diff --git a/src/AggregateFunctions/AggregateFunctionArray.h b/src/AggregateFunctions/AggregateFunctionArray.h index 85e0dfc8050..abefe8e0de1 100644 --- a/src/AggregateFunctions/AggregateFunctionArray.h +++ b/src/AggregateFunctions/AggregateFunctionArray.h @@ -64,6 +64,11 @@ public: return nested_func->isVersioned(); } + size_t getVersionFromRevision(size_t revision) const override + { + return nested_func->getVersionFromRevision(revision); + } + size_t getDefaultVersion() const override { return nested_func->getDefaultVersion(); @@ -79,6 +84,11 @@ public: nested_func->destroy(place); } + void destroyUpToState(AggregateDataPtr __restrict place) const noexcept override + { + nested_func->destroyUpToState(place); + } + bool hasTrivialDestructor() const override { return nested_func->hasTrivialDestructor(); diff --git a/src/AggregateFunctions/AggregateFunctionCategoricalInformationValue.cpp b/src/AggregateFunctions/AggregateFunctionCategoricalInformationValue.cpp index 35654c08659..89ffdfa6109 100644 --- a/src/AggregateFunctions/AggregateFunctionCategoricalInformationValue.cpp +++ b/src/AggregateFunctions/AggregateFunctionCategoricalInformationValue.cpp @@ -1,12 +1,18 @@ -#include - +#include #include #include #include +#include +#include +#include +#include +#include +#include namespace DB { + struct Settings; namespace ErrorCodes @@ -15,6 +21,136 @@ namespace ErrorCodes extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; } +/** The function takes arguments x1, x2, ... xn, y. All arguments are bool. + * x arguments represents the fact that some category is true. + * + * It calculates how many times y was true and how many times y was false when every n-th category was true + * and the total number of times y was true and false. + * + * So, the size of the state is (n + 1) * 2 cells. + */ +class AggregateFunctionCategoricalIV final : public IAggregateFunctionHelper +{ +private: + using Counter = UInt64; + size_t category_count; + + static Counter & counter(AggregateDataPtr __restrict place, size_t i, bool what) + { + return reinterpret_cast(place)[i * 2 + (what ? 1 : 0)]; + } + + static const Counter & counter(ConstAggregateDataPtr __restrict place, size_t i, bool what) + { + return reinterpret_cast(place)[i * 2 + (what ? 1 : 0)]; + } + +public: + AggregateFunctionCategoricalIV(const DataTypes & arguments_, const Array & params_) : + IAggregateFunctionHelper{arguments_, params_}, + category_count{arguments_.size() - 1} + { + // notice: argument types has been checked before + } + + String getName() const override + { + return "categoricalInformationValue"; + } + + bool allocatesMemoryInArena() const override { return false; } + + void create(AggregateDataPtr __restrict place) const override + { + memset(place, 0, sizeOfData()); + } + + void destroy(AggregateDataPtr __restrict) const noexcept override + { + // nothing + } + + bool hasTrivialDestructor() const override + { + return true; + } + + size_t sizeOfData() const override + { + return sizeof(Counter) * (category_count + 1) * 2; + } + + size_t alignOfData() const override + { + return alignof(Counter); + } + + void add(AggregateDataPtr __restrict place, const IColumn ** columns, size_t row_num, Arena *) const override + { + const auto * y_col = static_cast(columns[category_count]); + bool y = y_col->getData()[row_num]; + + for (size_t i = 0; i < category_count; ++i) + { + const auto * x_col = static_cast(columns[i]); + bool x = x_col->getData()[row_num]; + + if (x) + ++counter(place, i, y); + } + + ++counter(place, category_count, y); + } + + void merge(AggregateDataPtr __restrict place, ConstAggregateDataPtr rhs, Arena *) const override + { + for (size_t i = 0; i <= category_count; ++i) + { + counter(place, i, false) += counter(rhs, i, false); + counter(place, i, true) += counter(rhs, i, true); + } + } + + void serialize(ConstAggregateDataPtr __restrict place, WriteBuffer & buf, std::optional /* version */) const override + { + buf.write(place, sizeOfData()); + } + + void deserialize(AggregateDataPtr __restrict place, ReadBuffer & buf, std::optional /* version */, Arena *) const override + { + buf.read(place, sizeOfData()); + } + + DataTypePtr getReturnType() const override + { + return std::make_shared( + std::make_shared>()); + } + + void insertResultInto(AggregateDataPtr __restrict place, IColumn & to, Arena *) const override /// NOLINT + { + auto & col = static_cast(to); + auto & data_col = static_cast(col.getData()); + auto & offset_col = static_cast(col.getOffsetsColumn()); + + data_col.reserve(data_col.size() + category_count); + + Float64 sum_no = static_cast(counter(place, category_count, false)); + Float64 sum_yes = static_cast(counter(place, category_count, true)); + + for (size_t i = 0; i < category_count; ++i) + { + Float64 no = static_cast(counter(place, i, false)); + Float64 yes = static_cast(counter(place, i, true)); + + data_col.insertValue((no / sum_no - yes / sum_yes) * (log((no / sum_no) / (yes / sum_yes)))); + } + + offset_col.insertValue(data_col.size()); + } +}; + + namespace { @@ -39,16 +175,15 @@ AggregateFunctionPtr createAggregateFunctionCategoricalIV( ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); } - return std::make_shared>(arguments, params); + return std::make_shared(arguments, params); } } -void registerAggregateFunctionCategoricalIV( - AggregateFunctionFactory & factory -) +void registerAggregateFunctionCategoricalIV(AggregateFunctionFactory & factory) { - factory.registerFunction("categoricalInformationValue", createAggregateFunctionCategoricalIV); + AggregateFunctionProperties properties = { .returns_default_when_only_null = true }; + factory.registerFunction("categoricalInformationValue", { createAggregateFunctionCategoricalIV, properties }); } } diff --git a/src/AggregateFunctions/AggregateFunctionCategoricalInformationValue.h b/src/AggregateFunctions/AggregateFunctionCategoricalInformationValue.h deleted file mode 100644 index 0e0db27cf22..00000000000 --- a/src/AggregateFunctions/AggregateFunctionCategoricalInformationValue.h +++ /dev/null @@ -1,135 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#include - - -namespace DB -{ -struct Settings; - -template -class AggregateFunctionCategoricalIV final : public IAggregateFunctionHelper> -{ -private: - size_t category_count; - -public: - AggregateFunctionCategoricalIV(const DataTypes & arguments_, const Array & params_) : - IAggregateFunctionHelper> {arguments_, params_}, - category_count {arguments_.size() - 1} - { - // notice: argument types has been checked before - } - - String getName() const override - { - return "categoricalInformationValue"; - } - - bool allocatesMemoryInArena() const override { return false; } - - void create(AggregateDataPtr __restrict place) const override - { - memset(place, 0, sizeOfData()); - } - - void destroy(AggregateDataPtr __restrict) const noexcept override - { - // nothing - } - - bool hasTrivialDestructor() const override - { - return true; - } - - size_t sizeOfData() const override - { - return sizeof(T) * (category_count + 1) * 2; - } - - size_t alignOfData() const override - { - return alignof(T); - } - - void add(AggregateDataPtr __restrict place, const IColumn ** columns, size_t row_num, Arena *) const override - { - const auto * y_col = static_cast(columns[category_count]); - bool y = y_col->getData()[row_num]; - - for (size_t i : collections::range(0, category_count)) - { - const auto * x_col = static_cast(columns[i]); - bool x = x_col->getData()[row_num]; - - if (x) - reinterpret_cast(place)[i * 2 + size_t(y)] += 1; - } - - reinterpret_cast(place)[category_count * 2 + size_t(y)] += 1; - } - - void merge(AggregateDataPtr __restrict place, ConstAggregateDataPtr rhs, Arena *) const override - { - for (size_t i : collections::range(0, category_count + 1)) - { - reinterpret_cast(place)[i * 2] += reinterpret_cast(rhs)[i * 2]; - reinterpret_cast(place)[i * 2 + 1] += reinterpret_cast(rhs)[i * 2 + 1]; - } - } - - void serialize(ConstAggregateDataPtr __restrict place, WriteBuffer & buf, std::optional /* version */) const override - { - buf.write(place, sizeOfData()); - } - - void deserialize(AggregateDataPtr __restrict place, ReadBuffer & buf, std::optional /* version */, Arena *) const override - { - buf.read(place, sizeOfData()); - } - - DataTypePtr getReturnType() const override - { - return std::make_shared( - std::make_shared>() - ); - } - - void insertResultInto(AggregateDataPtr __restrict place, IColumn & to, Arena *) const override /// NOLINT - { - auto & col = static_cast(to); - auto & data_col = static_cast(col.getData()); - auto & offset_col = static_cast( - col.getOffsetsColumn() - ); - - data_col.reserve(data_col.size() + category_count); - - T sum_no = reinterpret_cast(place)[category_count * 2]; - T sum_yes = reinterpret_cast(place)[category_count * 2 + 1]; - - Float64 rev_no = 1. / sum_no; - Float64 rev_yes = 1. / sum_yes; - - for (size_t i : collections::range(0, category_count)) - { - T no = reinterpret_cast(place)[i * 2]; - T yes = reinterpret_cast(place)[i * 2 + 1]; - - data_col.insertValue((no * rev_no - yes * rev_yes) * (log(no * rev_no) - log(yes * rev_yes))); - } - - offset_col.insertValue(data_col.size()); - } -}; - -} diff --git a/src/AggregateFunctions/AggregateFunctionDistinct.h b/src/AggregateFunctions/AggregateFunctionDistinct.h index 5afe104bcc0..482d21363fe 100644 --- a/src/AggregateFunctions/AggregateFunctionDistinct.h +++ b/src/AggregateFunctions/AggregateFunctionDistinct.h @@ -225,6 +225,12 @@ public: nested_func->destroy(getNestedPlace(place)); } + void destroyUpToState(AggregateDataPtr __restrict place) const noexcept override + { + this->data(place).~Data(); + nested_func->destroyUpToState(getNestedPlace(place)); + } + String getName() const override { return nested_func->getName() + "Distinct"; @@ -245,6 +251,21 @@ public: return nested_func->isState(); } + bool isVersioned() const override + { + return nested_func->isVersioned(); + } + + size_t getVersionFromRevision(size_t revision) const override + { + return nested_func->getVersionFromRevision(revision); + } + + size_t getDefaultVersion() const override + { + return nested_func->getDefaultVersion(); + } + AggregateFunctionPtr getNestedFunction() const override { return nested_func; } }; diff --git a/src/AggregateFunctions/AggregateFunctionForEach.h b/src/AggregateFunctions/AggregateFunctionForEach.h index 064b7b00c86..07713dcb304 100644 --- a/src/AggregateFunctions/AggregateFunctionForEach.h +++ b/src/AggregateFunctions/AggregateFunctionForEach.h @@ -66,6 +66,7 @@ private: if (old_size < new_size) { char * old_state = state.array_of_aggregate_datas; + char * new_state = arena.alignedAlloc( new_size * nested_size_of_data, nested_func->alignOfData()); @@ -134,23 +135,43 @@ public: return nested_func->isVersioned(); } + size_t getVersionFromRevision(size_t revision) const override + { + return nested_func->getVersionFromRevision(revision); + } + size_t getDefaultVersion() const override { return nested_func->getDefaultVersion(); } - void destroy(AggregateDataPtr __restrict place) const noexcept override + template + void destroyImpl(AggregateDataPtr __restrict place) const noexcept { AggregateFunctionForEachData & state = data(place); char * nested_state = state.array_of_aggregate_datas; for (size_t i = 0; i < state.dynamic_array_size; ++i) { - nested_func->destroy(nested_state); + if constexpr (up_to_state) + nested_func->destroyUpToState(nested_state); + else + nested_func->destroy(nested_state); + nested_state += nested_size_of_data; } } + void destroy(AggregateDataPtr __restrict place) const noexcept override + { + destroyImpl(place); + } + + void destroyUpToState(AggregateDataPtr __restrict place) const noexcept override + { + destroyImpl(place); + } + bool hasTrivialDestructor() const override { return nested_func->hasTrivialDestructor(); diff --git a/src/AggregateFunctions/AggregateFunctionGroupBitmap.cpp b/src/AggregateFunctions/AggregateFunctionGroupBitmap.cpp index 0eff1ae516f..71eb3e8c7da 100644 --- a/src/AggregateFunctions/AggregateFunctionGroupBitmap.cpp +++ b/src/AggregateFunctions/AggregateFunctionGroupBitmap.cpp @@ -75,6 +75,12 @@ namespace /// We need to look inside the type of its argument to obtain it. const DataTypeAggregateFunction & datatype_aggfunc = dynamic_cast(*argument_type_ptr); AggregateFunctionPtr aggfunc = datatype_aggfunc.getFunction(); + + if (aggfunc->getName() != AggregateFunctionGroupBitmapData::name()) + throw Exception( + "Illegal type " + argument_types[0]->getName() + " of argument for aggregate function " + name, + ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT); + DataTypePtr nested_argument_type_ptr = aggfunc->getArgumentTypes()[0]; AggregateFunctionPtr res(createWithIntegerType( diff --git a/src/AggregateFunctions/AggregateFunctionIf.cpp b/src/AggregateFunctions/AggregateFunctionIf.cpp index fa5e6b85a1e..c7b4d382565 100644 --- a/src/AggregateFunctions/AggregateFunctionIf.cpp +++ b/src/AggregateFunctions/AggregateFunctionIf.cpp @@ -218,10 +218,11 @@ public: }; -template -class AggregateFunctionIfNullVariadic final - : public AggregateFunctionNullBase> +template +class AggregateFunctionIfNullVariadic final : public AggregateFunctionNullBase< + result_is_nullable, + serialize_flag, + AggregateFunctionIfNullVariadic> { public: @@ -259,7 +260,7 @@ public: if (is_nullable[i]) { const ColumnNullable & nullable_col = assert_cast(*columns[i]); - if (null_is_skipped && nullable_col.isNullAt(row_num)) + if (nullable_col.isNullAt(row_num)) { /// If at least one column has a null value in the current row, /// we don't process this row. @@ -278,6 +279,71 @@ public: } } + void addBatchSinglePlace( + size_t row_begin, size_t row_end, AggregateDataPtr __restrict place, const IColumn ** columns, Arena * arena, ssize_t) const final + { + std::unique_ptr final_null_flags = std::make_unique(row_end); + const size_t filter_column_num = number_of_arguments - 1; + + if (is_nullable[filter_column_num]) + { + const ColumnNullable * nullable_column = assert_cast(columns[filter_column_num]); + const IColumn & filter_column = nullable_column->getNestedColumn(); + const UInt8 * filter_null_map = nullable_column->getNullMapColumn().getData().data(); + const UInt8 * filter_values = assert_cast(filter_column).getData().data(); + + for (size_t i = row_begin; i < row_end; i++) + { + final_null_flags[i] = filter_null_map[i] || !filter_values[i]; + } + } + else + { + const IColumn * filter_column = columns[filter_column_num]; + const UInt8 * filter_values = assert_cast(filter_column)->getData().data(); + for (size_t i = row_begin; i < row_end; i++) + final_null_flags[i] = !filter_values[i]; + } + + const IColumn * nested_columns[number_of_arguments]; + for (size_t arg = 0; arg < number_of_arguments; arg++) + { + if (is_nullable[arg]) + { + const ColumnNullable & nullable_col = assert_cast(*columns[arg]); + if (arg != filter_column_num) + { + const ColumnUInt8 & nullmap_column = nullable_col.getNullMapColumn(); + const UInt8 * col_null_map = nullmap_column.getData().data(); + for (size_t r = row_begin; r < row_end; r++) + { + final_null_flags[r] |= col_null_map[r]; + } + } + nested_columns[arg] = &nullable_col.getNestedColumn(); + } + else + nested_columns[arg] = columns[arg]; + } + + bool at_least_one = false; + for (size_t i = row_begin; i < row_end; i++) + { + if (!final_null_flags[i]) + { + at_least_one = true; + break; + } + } + + if (at_least_one) + { + this->setFlag(place); + this->nested_function->addBatchSinglePlaceNotNull( + row_begin, row_end, this->nestedPlace(place), nested_columns, final_null_flags.get(), arena, -1); + } + } + #if USE_EMBEDDED_COMPILER void compileAdd(llvm::IRBuilderBase & builder, llvm::Value * aggregate_data_ptr, const DataTypes & arguments_types, const std::vector & argument_values) const override @@ -303,9 +369,7 @@ public: if (is_nullable[i]) { auto * wrapped_value = b.CreateExtractValue(argument_value, {0}); - - if constexpr (null_is_skipped) - is_null_values[i] = b.CreateExtractValue(argument_value, {1}); + is_null_values[i] = b.CreateExtractValue(argument_value, {1}); wrapped_values[i] = wrapped_value; non_nullable_types[i] = removeNullable(arguments_types[i]); @@ -322,23 +386,20 @@ public: auto * join_block = llvm::BasicBlock::Create(head->getContext(), "join_block", head->getParent()); auto * join_block_after_null_checks = llvm::BasicBlock::Create(head->getContext(), "join_block_after_null_checks", head->getParent()); - if constexpr (null_is_skipped) + auto * values_have_null_ptr = b.CreateAlloca(b.getInt1Ty()); + b.CreateStore(b.getInt1(false), values_have_null_ptr); + + for (auto * is_null_value : is_null_values) { - auto * values_have_null_ptr = b.CreateAlloca(b.getInt1Ty()); - b.CreateStore(b.getInt1(false), values_have_null_ptr); + if (!is_null_value) + continue; - for (auto * is_null_value : is_null_values) - { - if (!is_null_value) - continue; - - auto * values_have_null = b.CreateLoad(b.getInt1Ty(), values_have_null_ptr); - b.CreateStore(b.CreateOr(values_have_null, is_null_value), values_have_null_ptr); - } - - b.CreateCondBr(b.CreateLoad(b.getInt1Ty(), values_have_null_ptr), join_block, join_block_after_null_checks); + auto * values_have_null = b.CreateLoad(b.getInt1Ty(), values_have_null_ptr); + b.CreateStore(b.CreateOr(values_have_null, is_null_value), values_have_null_ptr); } + b.CreateCondBr(b.CreateLoad(b.getInt1Ty(), values_have_null_ptr), join_block, join_block_after_null_checks); + b.SetInsertPoint(join_block_after_null_checks); const auto & predicate_type = arguments_types[argument_values.size() - 1]; @@ -368,8 +429,10 @@ public: #endif private: - using Base = AggregateFunctionNullBase>; + using Base = AggregateFunctionNullBase< + result_is_nullable, + serialize_flag, + AggregateFunctionIfNullVariadic>; static constexpr size_t MAX_ARGS = 8; size_t number_of_arguments = 0; @@ -408,14 +471,14 @@ AggregateFunctionPtr AggregateFunctionIf::getOwnNullAdapter( { if (return_type_is_nullable) { - return std::make_shared>(nested_function, arguments, params); + return std::make_shared>(nested_function, arguments, params); } else { if (need_to_serialize_flag) - return std::make_shared>(nested_function, arguments, params); + return std::make_shared>(nested_function, arguments, params); else - return std::make_shared>(nested_function, arguments, params); + return std::make_shared>(nested_function, arguments, params); } } } diff --git a/src/AggregateFunctions/AggregateFunctionIf.h b/src/AggregateFunctions/AggregateFunctionIf.h index 18104f94fad..6b0905d6d5e 100644 --- a/src/AggregateFunctions/AggregateFunctionIf.h +++ b/src/AggregateFunctions/AggregateFunctionIf.h @@ -71,6 +71,11 @@ public: return nested_func->isVersioned(); } + size_t getVersionFromRevision(size_t revision) const override + { + return nested_func->getVersionFromRevision(revision); + } + size_t getDefaultVersion() const override { return nested_func->getDefaultVersion(); @@ -86,6 +91,11 @@ public: nested_func->destroy(place); } + void destroyUpToState(AggregateDataPtr __restrict place) const noexcept override + { + nested_func->destroyUpToState(place); + } + bool hasTrivialDestructor() const override { return nested_func->hasTrivialDestructor(); diff --git a/src/AggregateFunctions/AggregateFunctionIntervalLengthSum.h b/src/AggregateFunctions/AggregateFunctionIntervalLengthSum.h index 92f527f7c43..fdde50074aa 100644 --- a/src/AggregateFunctions/AggregateFunctionIntervalLengthSum.h +++ b/src/AggregateFunctions/AggregateFunctionIntervalLengthSum.h @@ -196,7 +196,7 @@ public: const Array & params, const AggregateFunctionProperties & /*properties*/) const override { - return std::make_shared>(nested_function, arguments, params); + return std::make_shared>(nested_function, arguments, params); } void add(AggregateDataPtr __restrict place, const IColumn ** columns, const size_t row_num, Arena *) const override diff --git a/src/AggregateFunctions/AggregateFunctionMap.h b/src/AggregateFunctions/AggregateFunctionMap.h index 9ed4b48c281..4cb26fcc8d1 100644 --- a/src/AggregateFunctions/AggregateFunctionMap.h +++ b/src/AggregateFunctions/AggregateFunctionMap.h @@ -84,6 +84,26 @@ private: using Base = IAggregateFunctionDataHelper>; public: + bool isState() const override + { + return nested_func->isState(); + } + + bool isVersioned() const override + { + return nested_func->isVersioned(); + } + + size_t getVersionFromRevision(size_t revision) const override + { + return nested_func->getVersionFromRevision(revision); + } + + size_t getDefaultVersion() const override + { + return nested_func->getDefaultVersion(); + } + AggregateFunctionMap(AggregateFunctionPtr nested, const DataTypes & types) : Base(types, nested->getParameters()), nested_func(nested) { if (types.empty()) @@ -187,6 +207,32 @@ public: } } + template + void destroyImpl(AggregateDataPtr __restrict place) const noexcept + { + AggregateFunctionMapCombinatorData & state = Base::data(place); + + for (const auto & [key, nested_place] : state.merged_maps) + { + if constexpr (up_to_state) + nested_func->destroyUpToState(nested_place); + else + nested_func->destroy(nested_place); + } + + state.~Data(); + } + + void destroy(AggregateDataPtr __restrict place) const noexcept override + { + destroyImpl(place); + } + + void destroyUpToState(AggregateDataPtr __restrict place) const noexcept override + { + destroyImpl(place); + } + void serialize(ConstAggregateDataPtr __restrict place, WriteBuffer & buf, std::optional /* version */) const override { auto & merged_maps = this->data(place).merged_maps; diff --git a/src/AggregateFunctions/AggregateFunctionMerge.h b/src/AggregateFunctions/AggregateFunctionMerge.h index 7bf0f5ea00f..bb2d36eeed1 100644 --- a/src/AggregateFunctions/AggregateFunctionMerge.h +++ b/src/AggregateFunctions/AggregateFunctionMerge.h @@ -80,6 +80,11 @@ public: nested_func->destroy(place); } + void destroyUpToState(AggregateDataPtr __restrict place) const noexcept override + { + nested_func->destroyUpToState(place); + } + bool hasTrivialDestructor() const override { return nested_func->hasTrivialDestructor(); @@ -126,6 +131,11 @@ public: } AggregateFunctionPtr getNestedFunction() const override { return nested_func; } + + bool isState() const override + { + return nested_func->isState(); + } }; } diff --git a/src/AggregateFunctions/AggregateFunctionMinMaxAny.h b/src/AggregateFunctions/AggregateFunctionMinMaxAny.h index d579a925f9d..ad633418ec3 100644 --- a/src/AggregateFunctions/AggregateFunctionMinMaxAny.h +++ b/src/AggregateFunctions/AggregateFunctionMinMaxAny.h @@ -492,7 +492,7 @@ public: void insertResultInto(IColumn & to) const { if (has()) - assert_cast(to).insertDataWithTerminatingZero(getData(), size); + assert_cast(to).insertData(getData(), size); else assert_cast(to).insertDefault(); } @@ -569,7 +569,7 @@ public: void change(const IColumn & column, size_t row_num, Arena * arena) { - changeImpl(assert_cast(column).getDataAtWithTerminatingZero(row_num), arena); + changeImpl(assert_cast(column).getDataAt(row_num), arena); } void change(const Self & to, Arena * arena) @@ -618,7 +618,7 @@ public: bool changeIfLess(const IColumn & column, size_t row_num, Arena * arena) { - if (!has() || assert_cast(column).getDataAtWithTerminatingZero(row_num) < getStringRef()) + if (!has() || assert_cast(column).getDataAt(row_num) < getStringRef()) { change(column, row_num, arena); return true; @@ -640,7 +640,7 @@ public: bool changeIfGreater(const IColumn & column, size_t row_num, Arena * arena) { - if (!has() || assert_cast(column).getDataAtWithTerminatingZero(row_num) > getStringRef()) + if (!has() || assert_cast(column).getDataAt(row_num) > getStringRef()) { change(column, row_num, arena); return true; @@ -667,7 +667,7 @@ public: bool isEqualTo(const IColumn & column, size_t row_num) const { - return has() && assert_cast(column).getDataAtWithTerminatingZero(row_num) == getStringRef(); + return has() && assert_cast(column).getDataAt(row_num) == getStringRef(); } static bool allocatesMemoryInArena() diff --git a/src/AggregateFunctions/AggregateFunctionNull.cpp b/src/AggregateFunctions/AggregateFunctionNull.cpp index 027d8f33538..01558b56667 100644 --- a/src/AggregateFunctions/AggregateFunctionNull.cpp +++ b/src/AggregateFunctions/AggregateFunctionNull.cpp @@ -108,14 +108,14 @@ public: { if (return_type_is_nullable) { - return std::make_shared>(nested_function, arguments, params); + return std::make_shared>(nested_function, arguments, params); } else { if (serialize_flag) - return std::make_shared>(nested_function, arguments, params); + return std::make_shared>(nested_function, arguments, params); else - return std::make_shared>(nested_function, arguments, params); + return std::make_shared>(nested_function, arguments, params); } } } diff --git a/src/AggregateFunctions/AggregateFunctionNull.h b/src/AggregateFunctions/AggregateFunctionNull.h index ca284680800..c26f4b03b14 100644 --- a/src/AggregateFunctions/AggregateFunctionNull.h +++ b/src/AggregateFunctions/AggregateFunctionNull.h @@ -114,6 +114,11 @@ public: nested_function->destroy(nestedPlace(place)); } + void destroyUpToState(AggregateDataPtr __restrict place) const noexcept override + { + nested_function->destroyUpToState(nestedPlace(place)); + } + bool hasTrivialDestructor() const override { return nested_function->hasTrivialDestructor(); @@ -189,6 +194,21 @@ public: return nested_function->isState(); } + bool isVersioned() const override + { + return nested_function->isVersioned(); + } + + size_t getVersionFromRevision(size_t revision) const override + { + return nested_function->getVersionFromRevision(revision); + } + + size_t getDefaultVersion() const override + { + return nested_function->getDefaultVersion(); + } + AggregateFunctionPtr getNestedFunction() const override { return nested_function; } #if USE_EMBEDDED_COMPILER @@ -366,16 +386,17 @@ public: }; -template -class AggregateFunctionNullVariadic final - : public AggregateFunctionNullBase> +template +class AggregateFunctionNullVariadic final : public AggregateFunctionNullBase< + result_is_nullable, + serialize_flag, + AggregateFunctionNullVariadic> { public: AggregateFunctionNullVariadic(AggregateFunctionPtr nested_function_, const DataTypes & arguments, const Array & params) - : AggregateFunctionNullBase>(std::move(nested_function_), arguments, params), - number_of_arguments(arguments.size()) + : AggregateFunctionNullBase>( + std::move(nested_function_), arguments, params) + , number_of_arguments(arguments.size()) { if (number_of_arguments == 1) throw Exception("Logical error: single argument is passed to AggregateFunctionNullVariadic", ErrorCodes::LOGICAL_ERROR); @@ -398,7 +419,7 @@ public: if (is_nullable[i]) { const ColumnNullable & nullable_col = assert_cast(*columns[i]); - if (null_is_skipped && nullable_col.isNullAt(row_num)) + if (nullable_col.isNullAt(row_num)) { /// If at least one column has a null value in the current row, /// we don't process this row. @@ -414,6 +435,105 @@ public: this->nested_function->add(this->nestedPlace(place), nested_columns, row_num, arena); } + void addBatchSinglePlace( + size_t row_begin, + size_t row_end, + AggregateDataPtr __restrict place, + const IColumn ** columns, + Arena * arena, + ssize_t if_argument_pos) const final + { + /// We are going to merge all the flags into a single one to be able to call the nested batching functions + std::vector nullable_filters; + const IColumn * nested_columns[number_of_arguments]; + + std::unique_ptr final_flags = nullptr; + const UInt8 * final_flags_ptr = nullptr; + + if (if_argument_pos >= 0) + { + final_flags = std::make_unique(row_end); + final_flags_ptr = final_flags.get(); + + bool included_elements = 0; + const auto & flags = assert_cast(*columns[if_argument_pos]).getData(); + for (size_t i = row_begin; i < row_end; i++) + { + final_flags[i] = !flags.data()[i]; + included_elements += !!flags.data()[i]; + } + + if (included_elements == 0) + return; + if (included_elements != (row_end - row_begin)) + { + nullable_filters.push_back(final_flags_ptr); + } + } + + for (size_t i = 0; i < number_of_arguments; ++i) + { + if (is_nullable[i]) + { + const ColumnNullable & nullable_col = assert_cast(*columns[i]); + nested_columns[i] = &nullable_col.getNestedColumn(); + const ColumnUInt8 & nullmap_column = nullable_col.getNullMapColumn(); + nullable_filters.push_back(nullmap_column.getData().data()); + } + else + { + nested_columns[i] = columns[i]; + } + } + + chassert(nullable_filters.size() > 0); + bool found_one = false; + if (nullable_filters.size() == 1) + { + /// We can avoid making copies of the only filter but we still need to check that there is data to be added + final_flags_ptr = nullable_filters[0]; + for (size_t i = row_begin; i < row_end; i++) + { + if (!final_flags_ptr[i]) + { + found_one = true; + break; + } + } + } + else + { + if (!final_flags) + { + final_flags = std::make_unique(row_end); + final_flags_ptr = final_flags.get(); + } + + const size_t filter_start = nullable_filters[0] == final_flags_ptr ? 1 : 0; + for (size_t filter = filter_start; filter < nullable_filters.size(); filter++) + { + for (size_t i = row_begin; i < row_end; i++) + final_flags[i] |= nullable_filters[filter][i]; + } + + for (size_t i = row_begin; i < row_end; i++) + { + if (!final_flags_ptr[i]) + { + found_one = true; + break; + } + } + } + + if (!found_one) + return; // Nothing to do and nothing to mark + + this->setFlag(place); + this->nested_function->addBatchSinglePlaceNotNull( + row_begin, row_end, this->nestedPlace(place), nested_columns, final_flags_ptr, arena, -1); + } + #if USE_EMBEDDED_COMPILER @@ -438,9 +558,7 @@ public: if (is_nullable[i]) { auto * wrapped_value = b.CreateExtractValue(argument_value, {0}); - - if constexpr (null_is_skipped) - is_null_values[i] = b.CreateExtractValue(argument_value, {1}); + is_null_values[i] = b.CreateExtractValue(argument_value, {1}); wrapped_values[i] = wrapped_value; non_nullable_types[i] = removeNullable(arguments_types[i]); @@ -452,48 +570,39 @@ public: } } - if constexpr (null_is_skipped) + auto * head = b.GetInsertBlock(); + + auto * join_block = llvm::BasicBlock::Create(head->getContext(), "join_block", head->getParent()); + auto * if_null = llvm::BasicBlock::Create(head->getContext(), "if_null", head->getParent()); + auto * if_not_null = llvm::BasicBlock::Create(head->getContext(), "if_not_null", head->getParent()); + + auto * values_have_null_ptr = b.CreateAlloca(b.getInt1Ty()); + b.CreateStore(b.getInt1(false), values_have_null_ptr); + + for (auto * is_null_value : is_null_values) { - auto * head = b.GetInsertBlock(); + if (!is_null_value) + continue; - auto * join_block = llvm::BasicBlock::Create(head->getContext(), "join_block", head->getParent()); - auto * if_null = llvm::BasicBlock::Create(head->getContext(), "if_null", head->getParent()); - auto * if_not_null = llvm::BasicBlock::Create(head->getContext(), "if_not_null", head->getParent()); - - auto * values_have_null_ptr = b.CreateAlloca(b.getInt1Ty()); - b.CreateStore(b.getInt1(false), values_have_null_ptr); - - for (auto * is_null_value : is_null_values) - { - if (!is_null_value) - continue; - - auto * values_have_null = b.CreateLoad(b.getInt1Ty(), values_have_null_ptr); - b.CreateStore(b.CreateOr(values_have_null, is_null_value), values_have_null_ptr); - } - - b.CreateCondBr(b.CreateLoad(b.getInt1Ty(), values_have_null_ptr), if_null, if_not_null); - - b.SetInsertPoint(if_null); - b.CreateBr(join_block); - - b.SetInsertPoint(if_not_null); - - if constexpr (result_is_nullable) - b.CreateStore(llvm::ConstantInt::get(b.getInt8Ty(), 1), aggregate_data_ptr); - - auto * aggregate_data_ptr_with_prefix_size_offset = b.CreateConstInBoundsGEP1_64(nullptr, aggregate_data_ptr, this->prefix_size); - this->nested_function->compileAdd(b, aggregate_data_ptr_with_prefix_size_offset, arguments_types, wrapped_values); - b.CreateBr(join_block); - - b.SetInsertPoint(join_block); + auto * values_have_null = b.CreateLoad(b.getInt1Ty(), values_have_null_ptr); + b.CreateStore(b.CreateOr(values_have_null, is_null_value), values_have_null_ptr); } - else - { + + b.CreateCondBr(b.CreateLoad(b.getInt1Ty(), values_have_null_ptr), if_null, if_not_null); + + b.SetInsertPoint(if_null); + b.CreateBr(join_block); + + b.SetInsertPoint(if_not_null); + + if constexpr (result_is_nullable) b.CreateStore(llvm::ConstantInt::get(b.getInt8Ty(), 1), aggregate_data_ptr); - auto * aggregate_data_ptr_with_prefix_size_offset = b.CreateConstInBoundsGEP1_64(nullptr, aggregate_data_ptr, this->prefix_size); - this->nested_function->compileAdd(b, aggregate_data_ptr_with_prefix_size_offset, non_nullable_types, wrapped_values); - } + + auto * aggregate_data_ptr_with_prefix_size_offset = b.CreateConstInBoundsGEP1_64(nullptr, aggregate_data_ptr, this->prefix_size); + this->nested_function->compileAdd(b, aggregate_data_ptr_with_prefix_size_offset, arguments_types, wrapped_values); + b.CreateBr(join_block); + + b.SetInsertPoint(join_block); } #endif diff --git a/src/AggregateFunctions/AggregateFunctionOrFill.h b/src/AggregateFunctions/AggregateFunctionOrFill.h index 4eca1b4df92..c5a0d60224a 100644 --- a/src/AggregateFunctions/AggregateFunctionOrFill.h +++ b/src/AggregateFunctions/AggregateFunctionOrFill.h @@ -98,6 +98,11 @@ public: nested_function->destroy(place); } + void destroyUpToState(AggregateDataPtr __restrict place) const noexcept override + { + nested_function->destroyUpToState(place); + } + void add( AggregateDataPtr __restrict place, const IColumn ** columns, diff --git a/src/AggregateFunctions/AggregateFunctionQuantile.cpp b/src/AggregateFunctions/AggregateFunctionQuantile.cpp index 6783a55418a..38b3c91be69 100644 --- a/src/AggregateFunctions/AggregateFunctionQuantile.cpp +++ b/src/AggregateFunctions/AggregateFunctionQuantile.cpp @@ -1,8 +1,9 @@ #include - +#include #include #include - +#include +#include #include @@ -21,70 +22,6 @@ namespace template using FuncQuantile = AggregateFunctionQuantile, NameQuantile, false, std::conditional_t, false>; template using FuncQuantiles = AggregateFunctionQuantile, NameQuantiles, false, std::conditional_t, true>; -template using FuncQuantileDeterministic = AggregateFunctionQuantile, NameQuantileDeterministic, true, std::conditional_t, false>; -template using FuncQuantilesDeterministic = AggregateFunctionQuantile, NameQuantilesDeterministic, true, std::conditional_t, true>; - -template using FuncQuantileExact = AggregateFunctionQuantile, NameQuantileExact, false, void, false>; -template using FuncQuantilesExact = AggregateFunctionQuantile, NameQuantilesExact, false, void, true>; - -template using FuncQuantileExactLow = AggregateFunctionQuantile, NameQuantileExactLow, false, void, false>; -template using FuncQuantilesExactLow = AggregateFunctionQuantile, NameQuantilesExactLow, false, void, true>; -template using FuncQuantileExactHigh = AggregateFunctionQuantile, NameQuantileExactHigh, false, void, false>; -template using FuncQuantilesExactHigh = AggregateFunctionQuantile, NameQuantilesExactHigh, false, void, true>; - -template using FuncQuantileExactExclusive = AggregateFunctionQuantile, NameQuantileExactExclusive, false, Float64, false>; -template using FuncQuantilesExactExclusive = AggregateFunctionQuantile, NameQuantilesExactExclusive, false, Float64, true>; - -template using FuncQuantileExactInclusive = AggregateFunctionQuantile, NameQuantileExactInclusive, false, Float64, false>; -template using FuncQuantilesExactInclusive = AggregateFunctionQuantile, NameQuantilesExactInclusive, false, Float64, true>; - -template using FuncQuantileExactWeighted = AggregateFunctionQuantile, NameQuantileExactWeighted, true, void, false>; -template using FuncQuantilesExactWeighted = AggregateFunctionQuantile, NameQuantilesExactWeighted, true, void, true>; - -template using FuncQuantileTiming = AggregateFunctionQuantile, NameQuantileTiming, false, Float32, false>; -template using FuncQuantilesTiming = AggregateFunctionQuantile, NameQuantilesTiming, false, Float32, true>; - -template using FuncQuantileTimingWeighted = AggregateFunctionQuantile, NameQuantileTimingWeighted, true, Float32, false>; -template using FuncQuantilesTimingWeighted = AggregateFunctionQuantile, NameQuantilesTimingWeighted, true, Float32, true>; - -template using FuncQuantileTDigest = AggregateFunctionQuantile, NameQuantileTDigest, false, std::conditional_t, false>; -template using FuncQuantilesTDigest = AggregateFunctionQuantile, NameQuantilesTDigest, false, std::conditional_t, true>; - -template using FuncQuantileTDigestWeighted = AggregateFunctionQuantile, NameQuantileTDigestWeighted, true, std::conditional_t, false>; -template using FuncQuantilesTDigestWeighted = AggregateFunctionQuantile, NameQuantilesTDigestWeighted, true, std::conditional_t, true>; - -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