mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 01:25:21 +00:00
Merge branch 'master' into fix-avro
This commit is contained in:
commit
0655ff3265
10
.github/workflows/backport_branches.yml
vendored
10
.github/workflows/backport_branches.yml
vendored
@ -394,7 +394,7 @@ jobs:
|
||||
- name: Set envs
|
||||
run: |
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
CHECK_NAME=ClickHouse build check (actions)
|
||||
CHECK_NAME=ClickHouse build check
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
TEMP_PATH=${{runner.temp}}/report_check
|
||||
NEEDS_DATA_PATH=${{runner.temp}}/needs.json
|
||||
@ -437,7 +437,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (address, actions)
|
||||
CHECK_NAME=Stateless tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -477,7 +477,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (debug, actions)
|
||||
CHECK_NAME=Stateful tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -521,7 +521,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_thread
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (thread, actions)
|
||||
CHECK_NAME=Stress test (thread)
|
||||
REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -560,7 +560,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (release, actions)
|
||||
CHECK_NAME=Integration tests (release)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
|
3
.github/workflows/docs_check.yml
vendored
3
.github/workflows/docs_check.yml
vendored
@ -102,6 +102,9 @@ jobs:
|
||||
run: |
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{ runner.temp }}/style_check
|
||||
ROBOT_CLICKHOUSE_SSH_KEY<<RCSK
|
||||
${{secrets.ROBOT_CLICKHOUSE_SSH_KEY}}
|
||||
RCSK
|
||||
EOF
|
||||
- name: Download changed images
|
||||
# even if artifact does not exist, e.g. on `do not test` label or failed Docker job
|
||||
|
104
.github/workflows/master.yml
vendored
104
.github/workflows/master.yml
vendored
@ -108,7 +108,7 @@ jobs:
|
||||
- name: Style Check
|
||||
run: |
|
||||
cd "$GITHUB_WORKSPACE/tests/ci"
|
||||
python3 style_check.py
|
||||
python3 style_check.py --no-push
|
||||
- name: Cleanup
|
||||
if: always()
|
||||
run: |
|
||||
@ -971,7 +971,7 @@ jobs:
|
||||
- name: Set envs
|
||||
run: |
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
CHECK_NAME=ClickHouse build check (actions)
|
||||
CHECK_NAME=ClickHouse build check
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
TEMP_PATH=${{runner.temp}}/report_check
|
||||
@ -1020,7 +1020,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/report_check
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=ClickHouse special build check (actions)
|
||||
CHECK_NAME=ClickHouse special build check
|
||||
NEEDS_DATA_PATH=${{runner.temp}}/needs.json
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -1061,7 +1061,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (release, actions)
|
||||
CHECK_NAME=Stateless tests (release)
|
||||
REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1098,7 +1098,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_release_database_ordinary
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (release, DatabaseOrdinary, actions)
|
||||
CHECK_NAME=Stateless tests (release, DatabaseOrdinary)
|
||||
REPO_COPY=${{runner.temp}}/stateless_release_database_ordinary/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1135,7 +1135,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_s3_storage
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (release, s3 storage, actions)
|
||||
CHECK_NAME=Stateless tests (release, s3 storage)
|
||||
REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1172,7 +1172,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (aarch64, actions)
|
||||
CHECK_NAME=Stateless tests (aarch64)
|
||||
REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1209,7 +1209,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (address, actions)
|
||||
CHECK_NAME=Stateless tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -1248,7 +1248,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (address, actions)
|
||||
CHECK_NAME=Stateless tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1287,7 +1287,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (thread, actions)
|
||||
CHECK_NAME=Stateless tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -1326,7 +1326,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (thread, actions)
|
||||
CHECK_NAME=Stateless tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1365,7 +1365,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (thread, actions)
|
||||
CHECK_NAME=Stateless tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=2
|
||||
@ -1404,7 +1404,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (ubsan, actions)
|
||||
CHECK_NAME=Stateless tests (ubsan)
|
||||
REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1441,7 +1441,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (memory, actions)
|
||||
CHECK_NAME=Stateless tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -1480,7 +1480,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (memory, actions)
|
||||
CHECK_NAME=Stateless tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1519,7 +1519,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (memory, actions)
|
||||
CHECK_NAME=Stateless tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=2
|
||||
@ -1558,7 +1558,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (debug, actions)
|
||||
CHECK_NAME=Stateless tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -1597,7 +1597,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (debug, actions)
|
||||
CHECK_NAME=Stateless tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1636,7 +1636,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (debug, actions)
|
||||
CHECK_NAME=Stateless tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=2
|
||||
@ -1678,7 +1678,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (release, actions)
|
||||
CHECK_NAME=Stateful tests (release)
|
||||
REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1715,7 +1715,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_release_database_ordinary
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (release, DatabaseOrdinary, actions)
|
||||
CHECK_NAME=Stateful tests (release, DatabaseOrdinary)
|
||||
REPO_COPY=${{runner.temp}}/stateful_release_database_ordinary/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1752,7 +1752,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (aarch64, actions)
|
||||
CHECK_NAME=Stateful tests (aarch64)
|
||||
REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1789,7 +1789,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (address, actions)
|
||||
CHECK_NAME=Stateful tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1826,7 +1826,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (thread, actions)
|
||||
CHECK_NAME=Stateful tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1863,7 +1863,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_msan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (memory, actions)
|
||||
CHECK_NAME=Stateful tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1900,7 +1900,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (ubsan, actions)
|
||||
CHECK_NAME=Stateful tests (ubsan)
|
||||
REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1937,7 +1937,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (debug, actions)
|
||||
CHECK_NAME=Stateful tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1977,7 +1977,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_thread
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (address, actions)
|
||||
CHECK_NAME=Stress test (address)
|
||||
REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2017,7 +2017,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_thread
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (thread, actions)
|
||||
CHECK_NAME=Stress test (thread)
|
||||
REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2053,7 +2053,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (memory, actions)
|
||||
CHECK_NAME=Stress test (memory)
|
||||
REPO_COPY=${{runner.temp}}/stress_memory/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2089,7 +2089,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_undefined
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (undefined, actions)
|
||||
CHECK_NAME=Stress test (undefined)
|
||||
REPO_COPY=${{runner.temp}}/stress_undefined/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2125,7 +2125,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (debug, actions)
|
||||
CHECK_NAME=Stress test (debug)
|
||||
REPO_COPY=${{runner.temp}}/stress_debug/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2164,7 +2164,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (asan, actions)
|
||||
CHECK_NAME=Integration tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse
|
||||
RUN_BY_HASH_NUM=0
|
||||
RUN_BY_HASH_TOTAL=3
|
||||
@ -2202,7 +2202,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (asan, actions)
|
||||
CHECK_NAME=Integration tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse
|
||||
RUN_BY_HASH_NUM=1
|
||||
RUN_BY_HASH_TOTAL=3
|
||||
@ -2240,7 +2240,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (asan, actions)
|
||||
CHECK_NAME=Integration tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse
|
||||
RUN_BY_HASH_NUM=2
|
||||
RUN_BY_HASH_TOTAL=3
|
||||
@ -2278,7 +2278,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=0
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -2316,7 +2316,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=1
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -2354,7 +2354,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=2
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -2392,7 +2392,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=3
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -2430,7 +2430,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (release, actions)
|
||||
CHECK_NAME=Integration tests (release)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse
|
||||
RUN_BY_HASH_NUM=0
|
||||
RUN_BY_HASH_TOTAL=2
|
||||
@ -2468,7 +2468,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (release, actions)
|
||||
CHECK_NAME=Integration tests (release)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse
|
||||
RUN_BY_HASH_NUM=1
|
||||
RUN_BY_HASH_TOTAL=2
|
||||
@ -2509,7 +2509,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (ASan, actions)
|
||||
CHECK_NAME=AST fuzzer (ASan)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_asan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2545,7 +2545,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (TSan, actions)
|
||||
CHECK_NAME=AST fuzzer (TSan)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_tsan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2581,7 +2581,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (UBSan, actions)
|
||||
CHECK_NAME=AST fuzzer (UBSan)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_ubsan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2617,7 +2617,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_msan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (MSan, actions)
|
||||
CHECK_NAME=AST fuzzer (MSan)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_msan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2653,7 +2653,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (debug, actions)
|
||||
CHECK_NAME=AST fuzzer (debug)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_debug/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2692,7 +2692,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (asan, actions)
|
||||
CHECK_NAME=Unit tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2728,7 +2728,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (release-clang, actions)
|
||||
CHECK_NAME=Unit tests (release-clang)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2764,7 +2764,7 @@ jobs:
|
||||
# cat >> "$GITHUB_ENV" << 'EOF'
|
||||
# TEMP_PATH=${{runner.temp}}/unit_tests_asan
|
||||
# REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
# CHECK_NAME=Unit tests (release-gcc, actions)
|
||||
# CHECK_NAME=Unit tests (release-gcc)
|
||||
# REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse
|
||||
# EOF
|
||||
# - name: Download json reports
|
||||
@ -2800,7 +2800,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (tsan, actions)
|
||||
CHECK_NAME=Unit tests (tsan)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_tsan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2836,7 +2836,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_msan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (msan, actions)
|
||||
CHECK_NAME=Unit tests (msan)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_msan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2872,7 +2872,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (ubsan, actions)
|
||||
CHECK_NAME=Unit tests (ubsan)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_ubsan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
|
117
.github/workflows/pull_request.yml
vendored
117
.github/workflows/pull_request.yml
vendored
@ -118,6 +118,9 @@ jobs:
|
||||
run: |
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{ runner.temp }}/style_check
|
||||
ROBOT_CLICKHOUSE_SSH_KEY<<RCSK
|
||||
${{secrets.ROBOT_CLICKHOUSE_SSH_KEY}}
|
||||
RCSK
|
||||
EOF
|
||||
- name: Download changed images
|
||||
# even if artifact does not exist, e.g. on `do not test` label or failed Docker job
|
||||
@ -1026,7 +1029,7 @@ jobs:
|
||||
- name: Set envs
|
||||
run: |
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
CHECK_NAME=ClickHouse build check (actions)
|
||||
CHECK_NAME=ClickHouse build check
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
TEMP_PATH=${{runner.temp}}/report_check
|
||||
NEEDS_DATA_PATH=${{runner.temp}}/needs.json
|
||||
@ -1075,7 +1078,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/report_check
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=ClickHouse special build check (actions)
|
||||
CHECK_NAME=ClickHouse special build check
|
||||
NEEDS_DATA_PATH=${{runner.temp}}/needs.json
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -1116,7 +1119,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (release, actions)
|
||||
CHECK_NAME=Stateless tests (release)
|
||||
REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1153,7 +1156,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_database_replicated
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (release, DatabaseReplicated, actions)
|
||||
CHECK_NAME=Stateless tests (release, DatabaseReplicated)
|
||||
REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -1192,7 +1195,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_database_replicated
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (release, DatabaseReplicated, actions)
|
||||
CHECK_NAME=Stateless tests (release, DatabaseReplicated)
|
||||
REPO_COPY=${{runner.temp}}/stateless_database_replicated/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1231,7 +1234,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_wide_parts
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (release, wide parts enabled, actions)
|
||||
CHECK_NAME=Stateless tests (release, wide parts enabled)
|
||||
REPO_COPY=${{runner.temp}}/stateless_wide_parts/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1268,7 +1271,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_s3_storage
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (release, s3 storage, actions)
|
||||
CHECK_NAME=Stateless tests (release, s3 storage)
|
||||
REPO_COPY=${{runner.temp}}/stateless_s3_storage/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1305,7 +1308,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (aarch64, actions)
|
||||
CHECK_NAME=Stateless tests (aarch64)
|
||||
REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1342,7 +1345,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (address, actions)
|
||||
CHECK_NAME=Stateless tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -1381,7 +1384,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (address, actions)
|
||||
CHECK_NAME=Stateless tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1420,7 +1423,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (thread, actions)
|
||||
CHECK_NAME=Stateless tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -1459,7 +1462,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (thread, actions)
|
||||
CHECK_NAME=Stateless tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1498,7 +1501,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (thread, actions)
|
||||
CHECK_NAME=Stateless tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=2
|
||||
@ -1537,7 +1540,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (ubsan, actions)
|
||||
CHECK_NAME=Stateless tests (ubsan)
|
||||
REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -1574,7 +1577,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (memory, actions)
|
||||
CHECK_NAME=Stateless tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -1613,7 +1616,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (memory, actions)
|
||||
CHECK_NAME=Stateless tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1652,7 +1655,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (memory, actions)
|
||||
CHECK_NAME=Stateless tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=2
|
||||
@ -1691,7 +1694,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (debug, actions)
|
||||
CHECK_NAME=Stateless tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -1730,7 +1733,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (debug, actions)
|
||||
CHECK_NAME=Stateless tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1769,7 +1772,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (debug, actions)
|
||||
CHECK_NAME=Stateless tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=2
|
||||
@ -1808,7 +1811,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_flaky_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests flaky check (address, actions)
|
||||
CHECK_NAME=Stateless tests flaky check (address)
|
||||
REPO_COPY=${{runner.temp}}/stateless_flaky_asan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1844,7 +1847,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/tests_bugfix_check
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Tests bugfix validate check (actions)
|
||||
CHECK_NAME=tests bugfix validate check
|
||||
KILL_TIMEOUT=3600
|
||||
REPO_COPY=${{runner.temp}}/tests_bugfix_check/ClickHouse
|
||||
EOF
|
||||
@ -1866,12 +1869,12 @@ jobs:
|
||||
|
||||
TEMP_PATH="${TEMP_PATH}/integration" \
|
||||
REPORTS_PATH="${REPORTS_PATH}/integration" \
|
||||
python3 integration_test_check.py "Integration tests bugfix validate check" \
|
||||
python3 integration_test_check.py "Integration $CHECK_NAME" \
|
||||
--validate-bugfix --post-commit-status=file || echo 'ignore exit code'
|
||||
|
||||
TEMP_PATH="${TEMP_PATH}/stateless" \
|
||||
REPORTS_PATH="${REPORTS_PATH}/stateless" \
|
||||
python3 functional_test_check.py "Stateless tests bugfix validate check" "$KILL_TIMEOUT" \
|
||||
python3 functional_test_check.py "Stateless $CHECK_NAME" "$KILL_TIMEOUT" \
|
||||
--validate-bugfix --post-commit-status=file || echo 'ignore exit code'
|
||||
|
||||
python3 bugfix_validate_check.py "${TEMP_PATH}/stateless/post_commit_status.tsv" "${TEMP_PATH}/integration/post_commit_status.tsv"
|
||||
@ -1895,7 +1898,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (release, actions)
|
||||
CHECK_NAME=Stateful tests (release)
|
||||
REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1932,7 +1935,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (aarch64, actions)
|
||||
CHECK_NAME=Stateful tests (aarch64)
|
||||
REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1969,7 +1972,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (address, actions)
|
||||
CHECK_NAME=Stateful tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -2006,7 +2009,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (thread, actions)
|
||||
CHECK_NAME=Stateful tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -2043,7 +2046,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_msan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (memory, actions)
|
||||
CHECK_NAME=Stateful tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -2080,7 +2083,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (ubsan, actions)
|
||||
CHECK_NAME=Stateful tests (ubsan)
|
||||
REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -2117,7 +2120,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (debug, actions)
|
||||
CHECK_NAME=Stateful tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -2157,7 +2160,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_thread
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (address, actions)
|
||||
CHECK_NAME=Stress test (address)
|
||||
REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2197,7 +2200,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_thread
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (thread, actions)
|
||||
CHECK_NAME=Stress test (thread)
|
||||
REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2233,7 +2236,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (memory, actions)
|
||||
CHECK_NAME=Stress test (memory)
|
||||
REPO_COPY=${{runner.temp}}/stress_memory/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2269,7 +2272,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_undefined
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (undefined, actions)
|
||||
CHECK_NAME=Stress test (undefined)
|
||||
REPO_COPY=${{runner.temp}}/stress_undefined/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2305,7 +2308,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (debug, actions)
|
||||
CHECK_NAME=Stress test (debug)
|
||||
REPO_COPY=${{runner.temp}}/stress_debug/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2344,7 +2347,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (ASan, actions)
|
||||
CHECK_NAME=AST fuzzer (ASan)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_asan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2380,7 +2383,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (TSan, actions)
|
||||
CHECK_NAME=AST fuzzer (TSan)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_tsan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2416,7 +2419,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (UBSan, actions)
|
||||
CHECK_NAME=AST fuzzer (UBSan)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_ubsan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2452,7 +2455,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_msan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (MSan, actions)
|
||||
CHECK_NAME=AST fuzzer (MSan)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_msan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2488,7 +2491,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/ast_fuzzer_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=AST fuzzer (debug, actions)
|
||||
CHECK_NAME=AST fuzzer (debug)
|
||||
REPO_COPY=${{runner.temp}}/ast_fuzzer_debug/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2527,7 +2530,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (asan, actions)
|
||||
CHECK_NAME=Integration tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse
|
||||
RUN_BY_HASH_NUM=0
|
||||
RUN_BY_HASH_TOTAL=3
|
||||
@ -2565,7 +2568,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (asan, actions)
|
||||
CHECK_NAME=Integration tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse
|
||||
RUN_BY_HASH_NUM=1
|
||||
RUN_BY_HASH_TOTAL=3
|
||||
@ -2603,7 +2606,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (asan, actions)
|
||||
CHECK_NAME=Integration tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse
|
||||
RUN_BY_HASH_NUM=2
|
||||
RUN_BY_HASH_TOTAL=3
|
||||
@ -2641,7 +2644,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=0
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -2679,7 +2682,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=1
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -2717,7 +2720,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=2
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -2755,7 +2758,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=3
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -2793,7 +2796,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (release, actions)
|
||||
CHECK_NAME=Integration tests (release)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse
|
||||
RUN_BY_HASH_NUM=0
|
||||
RUN_BY_HASH_TOTAL=2
|
||||
@ -2831,7 +2834,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (release, actions)
|
||||
CHECK_NAME=Integration tests (release)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse
|
||||
RUN_BY_HASH_NUM=1
|
||||
RUN_BY_HASH_TOTAL=2
|
||||
@ -2869,7 +2872,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan_flaky_check
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests flaky check (asan, actions)
|
||||
CHECK_NAME=Integration tests flaky check (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan_flaky_check/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2908,7 +2911,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (asan, actions)
|
||||
CHECK_NAME=Unit tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2944,7 +2947,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (release-clang, actions)
|
||||
CHECK_NAME=Unit tests (release-clang)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -2980,7 +2983,7 @@ jobs:
|
||||
# cat >> "$GITHUB_ENV" << 'EOF'
|
||||
# TEMP_PATH=${{runner.temp}}/unit_tests_asan
|
||||
# REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
# CHECK_NAME=Unit tests (release-gcc, actions)
|
||||
# CHECK_NAME=Unit tests (release-gcc)
|
||||
# REPO_COPY=${{runner.temp}}/unit_tests_asan/ClickHouse
|
||||
# EOF
|
||||
# - name: Download json reports
|
||||
@ -3016,7 +3019,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (tsan, actions)
|
||||
CHECK_NAME=Unit tests (tsan)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_tsan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -3052,7 +3055,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_msan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (msan, actions)
|
||||
CHECK_NAME=Unit tests (msan)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_msan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -3088,7 +3091,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/unit_tests_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Unit tests (ubsan, actions)
|
||||
CHECK_NAME=Unit tests (ubsan)
|
||||
REPO_COPY=${{runner.temp}}/unit_tests_ubsan/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
|
72
.github/workflows/release_branches.yml
vendored
72
.github/workflows/release_branches.yml
vendored
@ -473,7 +473,7 @@ jobs:
|
||||
- name: Set envs
|
||||
run: |
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
CHECK_NAME=ClickHouse build check (actions)
|
||||
CHECK_NAME=ClickHouse build check
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
TEMP_PATH=${{runner.temp}}/report_check
|
||||
@ -517,7 +517,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (release, actions)
|
||||
CHECK_NAME=Stateless tests (release)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -554,7 +554,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (aarch64, actions)
|
||||
CHECK_NAME=Stateless tests (aarch64)
|
||||
REPO_COPY=${{runner.temp}}/stateless_release/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -591,7 +591,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (address, actions)
|
||||
CHECK_NAME=Stateless tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -630,7 +630,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (address, actions)
|
||||
CHECK_NAME=Stateless tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -669,7 +669,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (thread, actions)
|
||||
CHECK_NAME=Stateless tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -708,7 +708,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (thread, actions)
|
||||
CHECK_NAME=Stateless tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -747,7 +747,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (thread, actions)
|
||||
CHECK_NAME=Stateless tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateless_tsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=2
|
||||
@ -786,7 +786,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (ubsan, actions)
|
||||
CHECK_NAME=Stateless tests (ubsan)
|
||||
REPO_COPY=${{runner.temp}}/stateless_ubsan/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
EOF
|
||||
@ -823,7 +823,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (memory, actions)
|
||||
CHECK_NAME=Stateless tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -862,7 +862,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (memory, actions)
|
||||
CHECK_NAME=Stateless tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -901,7 +901,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (memory, actions)
|
||||
CHECK_NAME=Stateless tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateless_memory/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=2
|
||||
@ -940,7 +940,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (debug, actions)
|
||||
CHECK_NAME=Stateless tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=0
|
||||
@ -979,7 +979,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (debug, actions)
|
||||
CHECK_NAME=Stateless tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=1
|
||||
@ -1018,7 +1018,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateless_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateless tests (debug, actions)
|
||||
CHECK_NAME=Stateless tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateless_debug/ClickHouse
|
||||
KILL_TIMEOUT=10800
|
||||
RUN_BY_HASH_NUM=2
|
||||
@ -1060,7 +1060,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (release, actions)
|
||||
CHECK_NAME=Stateful tests (release)
|
||||
REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1097,7 +1097,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (aarch64, actions)
|
||||
CHECK_NAME=Stateful tests (aarch64)
|
||||
REPO_COPY=${{runner.temp}}/stateful_release/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1134,7 +1134,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (address, actions)
|
||||
CHECK_NAME=Stateful tests (address)
|
||||
REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1171,7 +1171,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (thread, actions)
|
||||
CHECK_NAME=Stateful tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/stateful_tsan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1208,7 +1208,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_msan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (memory, actions)
|
||||
CHECK_NAME=Stateful tests (memory)
|
||||
REPO_COPY=${{runner.temp}}/stateful_msan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1245,7 +1245,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_ubsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (ubsan, actions)
|
||||
CHECK_NAME=Stateful tests (ubsan)
|
||||
REPO_COPY=${{runner.temp}}/stateful_ubsan/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1282,7 +1282,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stateful_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stateful tests (debug, actions)
|
||||
CHECK_NAME=Stateful tests (debug)
|
||||
REPO_COPY=${{runner.temp}}/stateful_debug/ClickHouse
|
||||
KILL_TIMEOUT=3600
|
||||
EOF
|
||||
@ -1322,7 +1322,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_thread
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (address, actions)
|
||||
CHECK_NAME=Stress test (address)
|
||||
REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -1362,7 +1362,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_thread
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (thread, actions)
|
||||
CHECK_NAME=Stress test (thread)
|
||||
REPO_COPY=${{runner.temp}}/stress_thread/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -1398,7 +1398,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_memory
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (memory, actions)
|
||||
CHECK_NAME=Stress test (memory)
|
||||
REPO_COPY=${{runner.temp}}/stress_memory/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -1434,7 +1434,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_undefined
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (undefined, actions)
|
||||
CHECK_NAME=Stress test (undefined)
|
||||
REPO_COPY=${{runner.temp}}/stress_undefined/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -1470,7 +1470,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/stress_debug
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Stress test (debug, actions)
|
||||
CHECK_NAME=Stress test (debug)
|
||||
REPO_COPY=${{runner.temp}}/stress_debug/ClickHouse
|
||||
EOF
|
||||
- name: Download json reports
|
||||
@ -1509,7 +1509,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (asan, actions)
|
||||
CHECK_NAME=Integration tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse
|
||||
RUN_BY_HASH_NUM=0
|
||||
RUN_BY_HASH_TOTAL=3
|
||||
@ -1547,7 +1547,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (asan, actions)
|
||||
CHECK_NAME=Integration tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse
|
||||
RUN_BY_HASH_NUM=1
|
||||
RUN_BY_HASH_TOTAL=3
|
||||
@ -1585,7 +1585,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_asan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (asan, actions)
|
||||
CHECK_NAME=Integration tests (asan)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_asan/ClickHouse
|
||||
RUN_BY_HASH_NUM=2
|
||||
RUN_BY_HASH_TOTAL=3
|
||||
@ -1623,7 +1623,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=0
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -1661,7 +1661,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=1
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -1699,7 +1699,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=2
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -1737,7 +1737,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_tsan
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (thread, actions)
|
||||
CHECK_NAME=Integration tests (thread)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_tsan/ClickHouse
|
||||
RUN_BY_HASH_NUM=3
|
||||
RUN_BY_HASH_TOTAL=4
|
||||
@ -1775,7 +1775,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (release, actions)
|
||||
CHECK_NAME=Integration tests (release)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse
|
||||
RUN_BY_HASH_NUM=0
|
||||
RUN_BY_HASH_TOTAL=2
|
||||
@ -1813,7 +1813,7 @@ jobs:
|
||||
cat >> "$GITHUB_ENV" << 'EOF'
|
||||
TEMP_PATH=${{runner.temp}}/integration_tests_release
|
||||
REPORTS_PATH=${{runner.temp}}/reports_dir
|
||||
CHECK_NAME=Integration tests (release, actions)
|
||||
CHECK_NAME=Integration tests (release)
|
||||
REPO_COPY=${{runner.temp}}/integration_tests_release/ClickHouse
|
||||
RUN_BY_HASH_NUM=1
|
||||
RUN_BY_HASH_TOTAL=2
|
||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -259,6 +259,9 @@
|
||||
[submodule "contrib/minizip-ng"]
|
||||
path = contrib/minizip-ng
|
||||
url = https://github.com/zlib-ng/minizip-ng
|
||||
[submodule "contrib/qpl"]
|
||||
path = contrib/qpl
|
||||
url = https://github.com/intel/qpl.git
|
||||
[submodule "contrib/wyhash"]
|
||||
path = contrib/wyhash
|
||||
url = https://github.com/wangyi-fudan/wyhash.git
|
||||
@ -274,9 +277,6 @@
|
||||
[submodule "contrib/liburing"]
|
||||
path = contrib/liburing
|
||||
url = https://github.com/axboe/liburing.git
|
||||
[submodule "contrib/base-x"]
|
||||
path = contrib/base-x
|
||||
url = https://github.com/ClickHouse/base-x.git
|
||||
[submodule "contrib/c-ares"]
|
||||
path = contrib/c-ares
|
||||
url = https://github.com/ClickHouse/c-ares
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
#### Upgrade Notes
|
||||
* Enable setting `enable_positional_arguments` by default. It allows queries like `SELECT ... ORDER BY 1, 2` where 1, 2 are the references to the select clause. If you need to return the old behavior, disable this setting. [#38204](https://github.com/ClickHouse/ClickHouse/pull/38204) ([Alexey Milovidov](https://github.com/alexey-milovidov)).
|
||||
* Disable `format_csv_allow_single_quotes` by default. See [#37096](https://github.com/ClickHouse/ClickHouse/issues/37096). ([Kruglov Pavel](https://github.com/Avogar)).
|
||||
* `Ordinary` database engine and old storage definition syntax for `*MergeTree` tables are deprecated. By default it's not possible to create new databases with `Ordinary` engine. If `system` database has `Ordinary` engine it will be automatically converted to `Atomic` on server startup. There are settings to keep old behavior (`allow_deprecated_database_ordinary` and `allow_deprecated_syntax_for_merge_tree`), but these settings may be removed in future releases. [#38335](https://github.com/ClickHouse/ClickHouse/pull/38335) ([Alexander Tokmakov](https://github.com/tavplubix)).
|
||||
* Force rewriting comma join to inner by default (set default value `cross_to_inner_join_rewrite = 2`). To have old behavior set `cross_to_inner_join_rewrite = 1`. [#39326](https://github.com/ClickHouse/ClickHouse/pull/39326) ([Vladimir C](https://github.com/vdimir)). If you will face any incompatibilities, you can turn this setting back.
|
||||
|
||||
|
@ -669,18 +669,18 @@ std::string JSON::getName() const
|
||||
return getString();
|
||||
}
|
||||
|
||||
StringRef JSON::getRawString() const
|
||||
std::string_view JSON::getRawString() const
|
||||
{
|
||||
Pos s = ptr_begin;
|
||||
if (*s != '"')
|
||||
throw JSONException(std::string("JSON: expected \", got ") + *s);
|
||||
while (++s != ptr_end && *s != '"');
|
||||
if (s != ptr_end)
|
||||
return StringRef(ptr_begin + 1, s - ptr_begin - 1);
|
||||
return std::string_view(ptr_begin + 1, s - ptr_begin - 1);
|
||||
throw JSONException("JSON: incorrect syntax (expected end of string, found end of JSON).");
|
||||
}
|
||||
|
||||
StringRef JSON::getRawName() const
|
||||
std::string_view JSON::getRawName() const
|
||||
{
|
||||
return getRawString();
|
||||
}
|
||||
|
@ -136,8 +136,8 @@ public:
|
||||
std::string getName() const; /// Получить имя name-value пары.
|
||||
JSON getValue() const; /// Получить значение name-value пары.
|
||||
|
||||
StringRef getRawString() const;
|
||||
StringRef getRawName() const;
|
||||
std::string_view getRawString() const;
|
||||
std::string_view getRawName() const;
|
||||
|
||||
/// Получить значение элемента; если элемент - строка, то распарсить значение из строки; если не строка или число - то исключение.
|
||||
double toDouble() const;
|
||||
|
@ -1,68 +1,192 @@
|
||||
#include <sys/auxv.h>
|
||||
#include "atomic.h"
|
||||
#include <unistd.h> // __environ
|
||||
#include <sys/auxv.h>
|
||||
#include <fcntl.h> // open
|
||||
#include <sys/stat.h> // O_RDONLY
|
||||
#include <unistd.h> // read, close
|
||||
#include <stdlib.h> // ssize_t
|
||||
#include <stdio.h> // perror, fprintf
|
||||
#include <link.h> // ElfW
|
||||
#include <errno.h>
|
||||
|
||||
// We don't have libc struct available here. Compute aux vector manually.
|
||||
static unsigned long * __auxv = NULL;
|
||||
static unsigned long __auxv_secure = 0;
|
||||
#define ARRAY_SIZE(a) sizeof((a))/sizeof((a[0]))
|
||||
|
||||
static size_t __find_auxv(unsigned long type)
|
||||
/// Suppress TSan since it is possible for this code to be called from multiple threads,
|
||||
/// and initialization is safe to be done multiple times from multiple threads.
|
||||
#if defined(__clang__)
|
||||
# define NO_SANITIZE_THREAD __attribute__((__no_sanitize__("thread")))
|
||||
#else
|
||||
# define NO_SANITIZE_THREAD
|
||||
#endif
|
||||
|
||||
// We don't have libc struct available here.
|
||||
// Compute aux vector manually (from /proc/self/auxv).
|
||||
//
|
||||
// Right now there is only 51 AT_* constants,
|
||||
// so 64 should be enough until this implementation will be replaced with musl.
|
||||
static unsigned long __auxv_procfs[64];
|
||||
static unsigned long __auxv_secure = 0;
|
||||
// Common
|
||||
static unsigned long * __auxv_environ = NULL;
|
||||
|
||||
static void * volatile getauxval_func;
|
||||
|
||||
static unsigned long __auxv_init_environ(unsigned long type);
|
||||
|
||||
//
|
||||
// auxv from procfs interface
|
||||
//
|
||||
ssize_t __retry_read(int fd, void * buf, size_t count)
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
ssize_t ret = read(fd, buf, count);
|
||||
if (ret == -1)
|
||||
{
|
||||
if (errno == EINTR)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
perror("Cannot read /proc/self/auxv");
|
||||
abort();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
unsigned long NO_SANITIZE_THREAD __getauxval_procfs(unsigned long type)
|
||||
{
|
||||
if (type == AT_SECURE)
|
||||
{
|
||||
return __auxv_secure;
|
||||
}
|
||||
|
||||
if (type >= ARRAY_SIZE(__auxv_procfs))
|
||||
{
|
||||
errno = ENOENT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return __auxv_procfs[type];
|
||||
}
|
||||
static unsigned long NO_SANITIZE_THREAD __auxv_init_procfs(unsigned long type)
|
||||
{
|
||||
// For debugging:
|
||||
// - od -t dL /proc/self/auxv
|
||||
// - LD_SHOW_AUX= ls
|
||||
int fd = open("/proc/self/auxv", O_RDONLY);
|
||||
// It is possible in case of:
|
||||
// - no procfs mounted
|
||||
// - on android you are not able to read it unless running from shell or debugging
|
||||
// - some other issues
|
||||
if (fd == -1)
|
||||
{
|
||||
// Fallback to environ.
|
||||
a_cas_p(&getauxval_func, (void *)__auxv_init_procfs, (void *)__auxv_init_environ);
|
||||
return __auxv_init_environ(type);
|
||||
}
|
||||
|
||||
ElfW(auxv_t) aux;
|
||||
|
||||
/// NOTE: sizeof(aux) is very small (less then PAGE_SIZE), so partial read should not be possible.
|
||||
_Static_assert(sizeof(aux) < 4096, "Unexpected sizeof(aux)");
|
||||
while (__retry_read(fd, &aux, sizeof(aux)) == sizeof(aux))
|
||||
{
|
||||
if (aux.a_type == AT_NULL)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (aux.a_type == AT_IGNORE || aux.a_type == AT_IGNOREPPC)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (aux.a_type >= ARRAY_SIZE(__auxv_procfs))
|
||||
{
|
||||
fprintf(stderr, "AT_* is out of range: %li (maximum allowed is %zu)\n", aux.a_type, ARRAY_SIZE(__auxv_procfs));
|
||||
abort();
|
||||
}
|
||||
if (__auxv_procfs[aux.a_type])
|
||||
{
|
||||
/// It is possible due to race on initialization.
|
||||
}
|
||||
__auxv_procfs[aux.a_type] = aux.a_un.a_val;
|
||||
}
|
||||
close(fd);
|
||||
|
||||
__auxv_secure = __getauxval_procfs(AT_SECURE);
|
||||
|
||||
// Now we've initialized __auxv_procfs, next time getauxval() will only call __get_auxval().
|
||||
a_cas_p(&getauxval_func, (void *)__auxv_init_procfs, (void *)__getauxval_procfs);
|
||||
|
||||
return __getauxval_procfs(type);
|
||||
}
|
||||
|
||||
//
|
||||
// auxv from environ interface
|
||||
//
|
||||
// NOTE: environ available only after static initializers,
|
||||
// so you cannot rely on this if you need getauxval() before.
|
||||
//
|
||||
// Good example of such user is sanitizers, for example
|
||||
// LSan will not work with __auxv_init_environ(),
|
||||
// since it needs getauxval() before.
|
||||
//
|
||||
static size_t NO_SANITIZE_THREAD __find_auxv(unsigned long type)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; __auxv[i]; i += 2)
|
||||
for (i = 0; __auxv_environ[i]; i += 2)
|
||||
{
|
||||
if (__auxv[i] == type)
|
||||
if (__auxv_environ[i] == type)
|
||||
{
|
||||
return i + 1;
|
||||
}
|
||||
}
|
||||
return (size_t) -1;
|
||||
}
|
||||
|
||||
unsigned long __getauxval(unsigned long type)
|
||||
unsigned long NO_SANITIZE_THREAD __getauxval_environ(unsigned long type)
|
||||
{
|
||||
if (type == AT_SECURE)
|
||||
return __auxv_secure;
|
||||
|
||||
if (__auxv)
|
||||
if (__auxv_environ)
|
||||
{
|
||||
size_t index = __find_auxv(type);
|
||||
if (index != ((size_t) -1))
|
||||
return __auxv[index];
|
||||
return __auxv_environ[index];
|
||||
}
|
||||
|
||||
errno = ENOENT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void * volatile getauxval_func;
|
||||
|
||||
static unsigned long __auxv_init(unsigned long type)
|
||||
static unsigned long NO_SANITIZE_THREAD __auxv_init_environ(unsigned long type)
|
||||
{
|
||||
if (!__environ)
|
||||
{
|
||||
// __environ is not initialized yet so we can't initialize __auxv right now.
|
||||
// __environ is not initialized yet so we can't initialize __auxv_environ right now.
|
||||
// That's normally occurred only when getauxval() is called from some sanitizer's internal code.
|
||||
errno = ENOENT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Initialize __auxv and __auxv_secure.
|
||||
// Initialize __auxv_environ and __auxv_secure.
|
||||
size_t i;
|
||||
for (i = 0; __environ[i]; i++);
|
||||
__auxv = (unsigned long *) (__environ + i + 1);
|
||||
__auxv_environ = (unsigned long *) (__environ + i + 1);
|
||||
|
||||
size_t secure_idx = __find_auxv(AT_SECURE);
|
||||
if (secure_idx != ((size_t) -1))
|
||||
__auxv_secure = __auxv[secure_idx];
|
||||
__auxv_secure = __auxv_environ[secure_idx];
|
||||
|
||||
// Now we've initialized __auxv, next time getauxval() will only call __get_auxval().
|
||||
a_cas_p(&getauxval_func, (void *)__auxv_init, (void *)__getauxval);
|
||||
// Now we need to switch to __getauxval_environ for all later calls, since
|
||||
// everything is initialized.
|
||||
a_cas_p(&getauxval_func, (void *)__auxv_init_environ, (void *)__getauxval_environ);
|
||||
|
||||
return __getauxval(type);
|
||||
return __getauxval_environ(type);
|
||||
}
|
||||
|
||||
// First time getauxval() will call __auxv_init().
|
||||
static void * volatile getauxval_func = (void *)__auxv_init;
|
||||
// Callchain:
|
||||
// - __auxv_init_procfs -> __getauxval_environ
|
||||
// - __auxv_init_procfs -> __auxv_init_environ -> __getauxval_environ
|
||||
static void * volatile getauxval_func = (void *)__auxv_init_procfs;
|
||||
|
||||
unsigned long getauxval(unsigned long type)
|
||||
{
|
||||
|
2
contrib/CMakeLists.txt
vendored
2
contrib/CMakeLists.txt
vendored
@ -156,8 +156,8 @@ endif()
|
||||
|
||||
add_contrib (sqlite-cmake sqlite-amalgamation)
|
||||
add_contrib (s2geometry-cmake s2geometry)
|
||||
add_contrib (base-x-cmake base-x)
|
||||
add_contrib(c-ares-cmake c-ares)
|
||||
add_contrib (qpl-cmake qpl)
|
||||
|
||||
# Put all targets defined here and in subdirectories under "contrib/<immediate-subdir>" 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
|
||||
|
1
contrib/base-x
vendored
1
contrib/base-x
vendored
@ -1 +0,0 @@
|
||||
Subproject commit a85f98fb4ed52c2f4029a4b6ac1ef0bafdfc56f5
|
@ -1,28 +0,0 @@
|
||||
option (ENABLE_BASEX "Enable base-x" ${ENABLE_LIBRARIES})
|
||||
|
||||
if (NOT ENABLE_BASEX)
|
||||
message(STATUS "Not using base-x")
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(LIBRARY_DIR "${ClickHouse_SOURCE_DIR}/contrib/base-x")
|
||||
|
||||
set (SRCS
|
||||
${LIBRARY_DIR}/base_x.hh
|
||||
${LIBRARY_DIR}/uinteger_t.hh
|
||||
)
|
||||
|
||||
add_library(_base-x INTERFACE)
|
||||
target_include_directories(_base-x SYSTEM BEFORE INTERFACE "${ClickHouse_SOURCE_DIR}/contrib/base-x")
|
||||
|
||||
if (XCODE OR XCODE_VERSION)
|
||||
# https://gitlab.kitware.com/cmake/cmake/issues/17457
|
||||
# Some native build systems may not like targets that have only object files, so consider adding at least one real source file
|
||||
# This applies to Xcode.
|
||||
if (NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/dummy.c")
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dummy.c" "")
|
||||
endif ()
|
||||
target_sources(_base-x PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/dummy.c")
|
||||
endif ()
|
||||
|
||||
add_library(ch_contrib::base-x ALIAS _base-x)
|
1
contrib/qpl
vendored
Submodule
1
contrib/qpl
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit cdc8442f7a5e7a6ff6eea39c69665e0c5034d85d
|
322
contrib/qpl-cmake/CMakeLists.txt
Normal file
322
contrib/qpl-cmake/CMakeLists.txt
Normal file
@ -0,0 +1,322 @@
|
||||
## The Intel® QPL provides high performance implementations of data processing functions for existing hardware accelerator, and/or software path in case if hardware accelerator is not available.
|
||||
if (OS_LINUX AND ARCH_AMD64 AND (ENABLE_AVX2 OR ENABLE_AVX512))
|
||||
option (ENABLE_QPL "Enable Intel® Query Processing Library" ${ENABLE_LIBRARIES})
|
||||
elseif(ENABLE_QPL)
|
||||
message (${RECONFIGURE_MESSAGE_LEVEL} "QPL library is only supported on x86_64 arch with avx2/avx512 support")
|
||||
endif()
|
||||
|
||||
if (NOT ENABLE_QPL)
|
||||
message(STATUS "Not using QPL")
|
||||
return()
|
||||
endif()
|
||||
|
||||
set (QPL_PROJECT_DIR "${ClickHouse_SOURCE_DIR}/contrib/qpl")
|
||||
set (QPL_SRC_DIR "${ClickHouse_SOURCE_DIR}/contrib/qpl/sources")
|
||||
set (QPL_BINARY_DIR "${ClickHouse_BINARY_DIR}/build/contrib/qpl")
|
||||
set (UUID_DIR "${ClickHouse_SOURCE_DIR}/contrib/qpl-cmake")
|
||||
|
||||
set (EFFICIENT_WAIT ON)
|
||||
set (BLOCK_ON_FAULT ON)
|
||||
set (LOG_HW_INIT OFF)
|
||||
set (SANITIZE_MEMORY OFF)
|
||||
set (SANITIZE_THREADS OFF)
|
||||
set (LIB_FUZZING_ENGINE OFF)
|
||||
|
||||
function(GetLibraryVersion _content _outputVar)
|
||||
string(REGEX MATCHALL "Qpl VERSION (.+) LANGUAGES" VERSION_REGEX "${_content}")
|
||||
SET(${_outputVar} ${CMAKE_MATCH_1} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
FILE(READ "${QPL_PROJECT_DIR}/CMakeLists.txt" HEADER_CONTENT)
|
||||
GetLibraryVersion("${HEADER_CONTENT}" QPL_VERSION)
|
||||
|
||||
message(STATUS "Intel QPL version: ${QPL_VERSION}")
|
||||
|
||||
# There are 5 source subdirectories under $QPL_SRC_DIR: isal, c_api, core-sw, middle-layer, c_api.
|
||||
# Generate 7 library targets: middle_layer_lib, isal, isal_asm, qplcore_px, qplcore_avx512, core_iaa, middle_layer_lib.
|
||||
# Output ch_contrib::qpl by linking with 7 library targets.
|
||||
|
||||
include("${QPL_PROJECT_DIR}/cmake/CompileOptions.cmake")
|
||||
|
||||
# check nasm compiler
|
||||
include(CheckLanguage)
|
||||
check_language(ASM_NASM)
|
||||
if(NOT CMAKE_ASM_NASM_COMPILER)
|
||||
message(FATAL_ERROR "Please install NASM from 'https://www.nasm.us/' because NASM compiler can not be found!")
|
||||
endif()
|
||||
|
||||
# [SUBDIR]isal
|
||||
enable_language(ASM_NASM)
|
||||
|
||||
set(ISAL_C_SRC ${QPL_SRC_DIR}/isal/igzip/adler32_base.c
|
||||
${QPL_SRC_DIR}/isal/igzip/huff_codes.c
|
||||
${QPL_SRC_DIR}/isal/igzip/hufftables_c.c
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip.c
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_base.c
|
||||
${QPL_SRC_DIR}/isal/igzip/flatten_ll.c
|
||||
${QPL_SRC_DIR}/isal/igzip/encode_df.c
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_icf_base.c
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_inflate.c
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_icf_body.c
|
||||
${QPL_SRC_DIR}/isal/crc/crc_base.c
|
||||
${QPL_SRC_DIR}/isal/crc/crc64_base.c)
|
||||
|
||||
set(ISAL_ASM_SRC ${QPL_SRC_DIR}/isal/igzip/igzip_body.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_gen_icf_map_lh1_04.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_gen_icf_map_lh1_06.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_decode_block_stateless_04.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_finish.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/encode_df_04.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/encode_df_06.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_decode_block_stateless_01.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/proc_heap.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_icf_body_h1_gr_bt.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_icf_finish.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_inflate_multibinary.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_update_histogram_01.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_update_histogram_04.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/rfc1951_lookup.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/adler32_sse.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/adler32_avx2_4.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_deflate_hash.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_set_long_icf_fg_04.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_set_long_icf_fg_06.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/igzip_multibinary.asm
|
||||
${QPL_SRC_DIR}/isal/igzip/stdmac.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc_multibinary.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_gzip_refl_by8.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_gzip_refl_by8_02.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_gzip_refl_by16_10.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_ieee_01.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_ieee_02.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_ieee_by4.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_ieee_by16_10.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_iscsi_00.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_iscsi_01.asm
|
||||
${QPL_SRC_DIR}/isal/crc/crc32_iscsi_by16_10.asm)
|
||||
|
||||
# Adding ISA-L library target
|
||||
add_library(isal OBJECT ${ISAL_C_SRC})
|
||||
add_library(isal_asm OBJECT ${ISAL_ASM_SRC})
|
||||
|
||||
# Setting external and internal interfaces for ISA-L library
|
||||
target_include_directories(isal
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_SRC_DIR}/isal/include>
|
||||
PRIVATE ${QPL_SRC_DIR}/isal/include
|
||||
PUBLIC ${QPL_SRC_DIR}/isal/igzip)
|
||||
|
||||
target_compile_options(isal PRIVATE
|
||||
"$<$<C_COMPILER_ID:GNU>:${QPL_LINUX_TOOLCHAIN_REQUIRED_FLAGS}>"
|
||||
"$<$<CONFIG:Debug>:>"
|
||||
"$<$<CONFIG:Release>:>")
|
||||
|
||||
target_compile_options(isal_asm PUBLIC "-I${QPL_SRC_DIR}/isal/include/"
|
||||
PUBLIC "-I${QPL_SRC_DIR}/isal/igzip/"
|
||||
PUBLIC "-I${QPL_SRC_DIR}/isal/crc/"
|
||||
PUBLIC "-DQPL_LIB")
|
||||
|
||||
# AS_FEATURE_LEVEL=10 means "Check SIMD capabilities of the target system at runtime and use up to AVX512 if available".
|
||||
# AS_FEATURE_LEVEL=5 means "Check SIMD capabilities of the target system at runtime and use up to AVX2 if available".
|
||||
# HAVE_KNOWS_AVX512 means rely on AVX512 being available on the target system.
|
||||
if (ENABLE_AVX512)
|
||||
target_compile_options(isal_asm PUBLIC "-DHAVE_AS_KNOWS_AVX512" "-DAS_FEATURE_LEVEL=10")
|
||||
else()
|
||||
target_compile_options(isal_asm PUBLIC "-DAS_FEATURE_LEVEL=5")
|
||||
endif()
|
||||
|
||||
# Here must remove "-fno-sanitize=undefined" from COMPILE_OPTIONS.
|
||||
# Otherwise nasm compiler would fail to proceed due to unrecognition of "-fno-sanitize=undefined"
|
||||
if (SANITIZE STREQUAL "undefined")
|
||||
get_target_property(target_options isal_asm COMPILE_OPTIONS)
|
||||
list(REMOVE_ITEM target_options "-fno-sanitize=undefined")
|
||||
set_property(TARGET isal_asm PROPERTY COMPILE_OPTIONS ${target_options})
|
||||
endif()
|
||||
|
||||
target_compile_definitions(isal PUBLIC
|
||||
QPL_LIB
|
||||
NDEBUG)
|
||||
|
||||
# [SUBDIR]core-sw
|
||||
# Two libraries:qplcore_avx512/qplcore_px for SW fallback will be created which are implemented by AVX512 and non-AVX512 instructions respectively.
|
||||
# The upper level QPL API will check SIMD capabilities of the target system at runtime and decide to call AVX512 function or non-AVX512 function.
|
||||
# Hence, here we don't need put qplcore_avx512 under an ENABLE_AVX512 CMake switch.
|
||||
# Actually, if we do that, some undefined symbols errors would happen because both of AVX512 function and non-AVX512 function are referenced by QPL API.
|
||||
# PLATFORM=2 means AVX512 implementation; PLATFORM=0 means non-AVX512 implementation.
|
||||
|
||||
# Find Core Sources
|
||||
file(GLOB SOURCES
|
||||
${QPL_SRC_DIR}/core-sw/src/checksums/*.c
|
||||
${QPL_SRC_DIR}/core-sw/src/filtering/*.c
|
||||
${QPL_SRC_DIR}/core-sw/src/other/*.c
|
||||
${QPL_SRC_DIR}/core-sw/src/compression/*.c)
|
||||
|
||||
file(GLOB DATA_SOURCES
|
||||
${QPL_SRC_DIR}/core-sw/src/data/*.c)
|
||||
|
||||
# Create avx512 library
|
||||
add_library(qplcore_avx512 OBJECT ${SOURCES})
|
||||
|
||||
target_compile_definitions(qplcore_avx512 PRIVATE PLATFORM=2)
|
||||
|
||||
target_include_directories(qplcore_avx512
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_SRC_DIR}/core-sw/include>
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_SRC_DIR}/core-sw/src/include>
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_SRC_DIR}/core-sw/src/compression/include>
|
||||
PRIVATE $<TARGET_PROPERTY:isal,INTERFACE_INCLUDE_DIRECTORIES>)
|
||||
|
||||
set_target_properties(qplcore_avx512 PROPERTIES
|
||||
$<$<C_COMPILER_ID:GNU>:C_STANDARD 17>)
|
||||
|
||||
target_link_libraries(qplcore_avx512 ${CMAKE_DL_LIBS} isal)
|
||||
|
||||
target_compile_options(qplcore_avx512
|
||||
PRIVATE ${QPL_LINUX_TOOLCHAIN_REQUIRED_FLAGS}
|
||||
PRIVATE -march=skylake-avx512
|
||||
PRIVATE "$<$<CONFIG:Debug>:>"
|
||||
PRIVATE "$<$<CONFIG:Release>:-O3;-D_FORTIFY_SOURCE=2>")
|
||||
|
||||
|
||||
target_compile_definitions(qplcore_avx512 PUBLIC QPL_BADARG_CHECK)
|
||||
|
||||
#
|
||||
# Create px library
|
||||
#
|
||||
#set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
# Create library
|
||||
add_library(qplcore_px OBJECT ${SOURCES} ${DATA_SOURCES})
|
||||
|
||||
target_compile_definitions(qplcore_px PRIVATE PLATFORM=0)
|
||||
|
||||
target_include_directories(qplcore_px
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_SRC_DIR}/core-sw/include>
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_SRC_DIR}/core-sw/src/include>
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_SRC_DIR}/core-sw/src/compression/include>
|
||||
PRIVATE $<TARGET_PROPERTY:isal,INTERFACE_INCLUDE_DIRECTORIES>)
|
||||
|
||||
set_target_properties(qplcore_px PROPERTIES
|
||||
$<$<C_COMPILER_ID:GNU>:C_STANDARD 17>)
|
||||
|
||||
target_link_libraries(qplcore_px isal ${CMAKE_DL_LIBS})
|
||||
|
||||
target_compile_options(qplcore_px
|
||||
PRIVATE ${QPL_LINUX_TOOLCHAIN_REQUIRED_FLAGS}
|
||||
PRIVATE "$<$<CONFIG:Debug>:>"
|
||||
PRIVATE "$<$<CONFIG:Release>:-O3;-D_FORTIFY_SOURCE=2>")
|
||||
|
||||
target_compile_definitions(qplcore_px PUBLIC QPL_BADARG_CHECK)
|
||||
|
||||
# [SUBDIR]core-iaa
|
||||
file(GLOB HW_PATH_SRC ${QPL_SRC_DIR}/core-iaa/sources/aecs/*.c
|
||||
${QPL_SRC_DIR}/core-iaa/sources/aecs/*.cpp
|
||||
${QPL_SRC_DIR}/core-iaa/sources/driver_loader/*.c
|
||||
${QPL_SRC_DIR}/core-iaa/sources/driver_loader/*.cpp
|
||||
${QPL_SRC_DIR}/core-iaa/sources/descriptors/*.c
|
||||
${QPL_SRC_DIR}/core-iaa/sources/descriptors/*.cpp
|
||||
${QPL_SRC_DIR}/core-iaa/sources/bit_rev.c)
|
||||
|
||||
# Create library
|
||||
add_library(core_iaa OBJECT ${HW_PATH_SRC})
|
||||
|
||||
target_include_directories(core_iaa
|
||||
PRIVATE ${UUID_DIR}
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_SRC_DIR}/core-iaa/include>
|
||||
PRIVATE $<BUILD_INTERFACE:${QPL_SRC_DIR}/core-iaa/sources/include>
|
||||
PRIVATE $<TARGET_PROPERTY:qplcore_avx512,INTERFACE_INCLUDE_DIRECTORIES>)
|
||||
|
||||
target_compile_options(core_iaa
|
||||
PRIVATE $<$<C_COMPILER_ID:GNU>:${QPL_LINUX_TOOLCHAIN_REQUIRED_FLAGS};
|
||||
$<$<CONFIG:Release>:-O3;-D_FORTIFY_SOURCE=2>>)
|
||||
|
||||
target_compile_features(core_iaa PRIVATE c_std_11)
|
||||
|
||||
target_compile_definitions(core_iaa PRIVATE QPL_BADARG_CHECK
|
||||
PRIVATE $<$<BOOL:${BLOCK_ON_FAULT}>: BLOCK_ON_FAULT_ENABLED>
|
||||
PRIVATE $<$<BOOL:${LOG_HW_INIT}>:LOG_HW_INIT>)
|
||||
|
||||
# [SUBDIR]middle-layer
|
||||
generate_unpack_kernel_arrays(${QPL_BINARY_DIR})
|
||||
|
||||
file(GLOB MIDDLE_LAYER_SRC
|
||||
${QPL_SRC_DIR}/middle-layer/analytics/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/c_wrapper/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/checksum/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/common/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/compression/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/compression/*/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/compression/*/*/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/dispatcher/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/other/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/util/*.cpp
|
||||
${QPL_SRC_DIR}/middle-layer/inflate/*.cpp
|
||||
${QPL_SRC_DIR}/core-iaa/sources/accelerator/*.cpp) # todo
|
||||
|
||||
file(GLOB GENERATED_PX_TABLES_SRC ${QPL_BINARY_DIR}/generated/px_*.cpp)
|
||||
file(GLOB GENERATED_AVX512_TABLES_SRC ${QPL_BINARY_DIR}/generated/avx512_*.cpp)
|
||||
|
||||
add_library(middle_layer_lib OBJECT
|
||||
${GENERATED_PX_TABLES_SRC}
|
||||
${GENERATED_AVX512_TABLES_SRC}
|
||||
${MIDDLE_LAYER_SRC})
|
||||
|
||||
target_compile_options(middle_layer_lib
|
||||
PRIVATE $<$<C_COMPILER_ID:GNU>:${QPL_LINUX_TOOLCHAIN_REQUIRED_FLAGS};
|
||||
${QPL_LINUX_TOOLCHAIN_DYNAMIC_LIBRARY_FLAGS};
|
||||
$<$<CONFIG:Release>:-O3;-D_FORTIFY_SOURCE=2>>
|
||||
PRIVATE $<$<COMPILE_LANG_AND_ID:CXX,GNU>:${QPL_LINUX_TOOLCHAIN_CPP_EMBEDDED_FLAGS}>)
|
||||
|
||||
target_compile_definitions(middle_layer_lib
|
||||
PUBLIC QPL_VERSION="${QPL_VERSION}"
|
||||
PUBLIC $<$<BOOL:${LOG_HW_INIT}>:LOG_HW_INIT>
|
||||
PUBLIC $<$<BOOL:${EFFICIENT_WAIT}>:QPL_EFFICIENT_WAIT>
|
||||
PUBLIC QPL_BADARG_CHECK)
|
||||
|
||||
set_source_files_properties(${GENERATED_PX_TABLES_SRC} PROPERTIES COMPILE_DEFINITIONS PLATFORM=0)
|
||||
set_source_files_properties(${GENERATED_AVX512_TABLES_SRC} PROPERTIES COMPILE_DEFINITIONS PLATFORM=2)
|
||||
|
||||
target_include_directories(middle_layer_lib
|
||||
PRIVATE ${UUID_DIR}
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_SRC_DIR}/middle-layer>
|
||||
PUBLIC $<TARGET_PROPERTY:_qpl,INTERFACE_INCLUDE_DIRECTORIES>
|
||||
PUBLIC $<TARGET_PROPERTY:qplcore_px,INTERFACE_INCLUDE_DIRECTORIES>
|
||||
PUBLIC $<TARGET_PROPERTY:qplcore_avx512,INTERFACE_INCLUDE_DIRECTORIES>
|
||||
PUBLIC $<TARGET_PROPERTY:isal,INTERFACE_INCLUDE_DIRECTORIES>
|
||||
PUBLIC $<TARGET_PROPERTY:core_iaa,INTERFACE_INCLUDE_DIRECTORIES>)
|
||||
|
||||
target_compile_definitions(middle_layer_lib PUBLIC -DQPL_LIB)
|
||||
|
||||
# [SUBDIR]c_api
|
||||
file(GLOB_RECURSE QPL_C_API_SRC
|
||||
${QPL_SRC_DIR}/c_api/*.c
|
||||
${QPL_SRC_DIR}/c_api/*.cpp)
|
||||
|
||||
add_library(_qpl STATIC ${QPL_C_API_SRC}
|
||||
$<TARGET_OBJECTS:middle_layer_lib>
|
||||
$<TARGET_OBJECTS:isal>
|
||||
$<TARGET_OBJECTS:isal_asm>
|
||||
$<TARGET_OBJECTS:qplcore_px>
|
||||
$<TARGET_OBJECTS:qplcore_avx512>
|
||||
$<TARGET_OBJECTS:core_iaa>
|
||||
$<TARGET_OBJECTS:middle_layer_lib>)
|
||||
|
||||
target_include_directories(_qpl
|
||||
PUBLIC $<BUILD_INTERFACE:${QPL_PROJECT_DIR}/include/>
|
||||
PRIVATE $<TARGET_PROPERTY:middle_layer_lib,INTERFACE_INCLUDE_DIRECTORIES>
|
||||
PRIVATE $<BUILD_INTERFACE:${QPL_SRC_DIR}/c_api>)
|
||||
|
||||
target_compile_options(_qpl
|
||||
PRIVATE $<$<C_COMPILER_ID:GNU>:${QPL_LINUX_TOOLCHAIN_REQUIRED_FLAGS};
|
||||
${QPL_LINUX_TOOLCHAIN_DYNAMIC_LIBRARY_FLAGS};
|
||||
$<$<CONFIG:Release>:-O3;-D_FORTIFY_SOURCE=2>>
|
||||
PRIVATE $<$<COMPILE_LANG_AND_ID:CXX,GNU>:${QPL_LINUX_TOOLCHAIN_CPP_EMBEDDED_FLAGS}>)
|
||||
|
||||
target_compile_definitions(_qpl
|
||||
PRIVATE -DQPL_LIB
|
||||
PRIVATE -DQPL_BADARG_CHECK
|
||||
PUBLIC -DENABLE_QPL_COMPRESSION)
|
||||
|
||||
target_link_libraries(_qpl
|
||||
PRIVATE ${CMAKE_DL_LIBS})
|
||||
|
||||
add_library (ch_contrib::qpl ALIAS _qpl)
|
||||
target_include_directories(_qpl SYSTEM BEFORE PUBLIC "${QPL_PROJECT_DIR}/include")
|
4
contrib/qpl-cmake/uuid/uuid.h
Normal file
4
contrib/qpl-cmake/uuid/uuid.h
Normal file
@ -0,0 +1,4 @@
|
||||
#ifndef _QPL_UUID_UUID_H
|
||||
#define _QPL_UUID_UUID_H
|
||||
typedef unsigned char uuid_t[16];
|
||||
#endif /* _QPL_UUID_UUID_H */
|
@ -51,6 +51,7 @@ RUN apt-get update \
|
||||
rename \
|
||||
software-properties-common \
|
||||
tzdata \
|
||||
nasm \
|
||||
--yes --no-install-recommends \
|
||||
&& apt-get clean
|
||||
|
||||
|
@ -55,6 +55,7 @@ RUN apt-get update \
|
||||
pkg-config \
|
||||
tzdata \
|
||||
pv \
|
||||
nasm \
|
||||
--yes --no-install-recommends
|
||||
|
||||
# Sanitizer options for services (clickhouse-server)
|
||||
|
@ -72,6 +72,7 @@ RUN apt-get update \
|
||||
tzdata \
|
||||
unixodbc \
|
||||
file \
|
||||
nasm \
|
||||
--yes --no-install-recommends
|
||||
|
||||
RUN pip3 install numpy scipy pandas Jinja2
|
||||
|
@ -17,7 +17,9 @@ RUN apt-get update && env DEBIAN_FRONTEND=noninteractive apt-get install --yes \
|
||||
python3-pip \
|
||||
shellcheck \
|
||||
yamllint \
|
||||
&& pip3 install black boto3 codespell dohq-artifactory PyGithub unidiff pylint==2.6.2
|
||||
&& pip3 install black boto3 codespell dohq-artifactory PyGithub unidiff pylint==2.6.2 \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /root/.cache/pip
|
||||
|
||||
# Architecture of the image when BuildKit/buildx is used
|
||||
ARG TARGETARCH
|
||||
|
@ -40,10 +40,10 @@ def process_result(result_folder):
|
||||
|
||||
|
||||
def write_results(results_file, status_file, results, status):
|
||||
with open(results_file, "w") as f:
|
||||
with open(results_file, "w", encoding="utf-8") as f:
|
||||
out = csv.writer(f, delimiter="\t")
|
||||
out.writerows(results)
|
||||
with open(status_file, "w") as f:
|
||||
with open(status_file, "w", encoding="utf-8") as f:
|
||||
out = csv.writer(f, delimiter="\t")
|
||||
out.writerow(status)
|
||||
|
||||
@ -53,9 +53,10 @@ if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(
|
||||
description="ClickHouse script for parsing results of style check"
|
||||
)
|
||||
parser.add_argument("--in-results-dir", default="/test_output/")
|
||||
parser.add_argument("--out-results-file", default="/test_output/test_results.tsv")
|
||||
parser.add_argument("--out-status-file", default="/test_output/check_status.tsv")
|
||||
default_dir = "/test_output"
|
||||
parser.add_argument("--in-results-dir", default=default_dir)
|
||||
parser.add_argument("--out-results-file", default=f"{default_dir}/test_results.tsv")
|
||||
parser.add_argument("--out-status-file", default=f"{default_dir}/check_status.tsv")
|
||||
args = parser.parse_args()
|
||||
|
||||
state, description, test_results = process_result(args.in_results_dir)
|
||||
|
@ -194,18 +194,25 @@ Differs from the `TabSeparated` format in that the column names are written in t
|
||||
|
||||
During parsing, the first row is expected to contain the column names. You can use column names to determine their position and to check their correctness.
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
:::
|
||||
|
||||
This format is also available under the name `TSVWithNames`.
|
||||
|
||||
## TabSeparatedWithNamesAndTypes {#tabseparatedwithnamesandtypes}
|
||||
|
||||
Differs from the `TabSeparated` format in that the column names are written to the first row, while the column types are in the second row.
|
||||
The first row with names is processed the same way as in `TabSeparatedWithNames` format.
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
If setting [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header) is set to 1,
|
||||
the types from input data will be compared with the types of the corresponding columns from the table. Otherwise, the second row will be skipped.
|
||||
:::
|
||||
|
||||
This format is also available under the name `TSVWithNamesAndTypes`.
|
||||
|
||||
@ -451,10 +458,24 @@ The CSV format supports the output of totals and extremes the same way as `TabSe
|
||||
|
||||
Also prints the header row with column names, similar to [TabSeparatedWithNames](#tabseparatedwithnames).
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
:::
|
||||
|
||||
## CSVWithNamesAndTypes {#csvwithnamesandtypes}
|
||||
|
||||
Also prints two header rows with column names and types, similar to [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes).
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
If setting [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header) is set to 1,
|
||||
the types from input data will be compared with the types of the corresponding columns from the table. Otherwise, the second row will be skipped.
|
||||
:::
|
||||
|
||||
## CustomSeparated {#format-customseparated}
|
||||
|
||||
Similar to [Template](#format-template), but it prints or reads all names and types of columns and uses escaping rule from [format_custom_escaping_rule](../operations/settings/settings.md#format_custom_escaping_rule) setting and delimiters from [format_custom_field_delimiter](../operations/settings/settings.md#format_custom_field_delimiter), [format_custom_row_before_delimiter](../operations/settings/settings.md#format_custom_row_before_delimiter), [format_custom_row_after_delimiter](../operations/settings/settings.md#format_custom_row_after_delimiter), [format_custom_row_between_delimiter](../operations/settings/settings.md#format_custom_row_between_delimiter), [format_custom_result_before_delimiter](../operations/settings/settings.md#format_custom_result_before_delimiter) and [format_custom_result_after_delimiter](../operations/settings/settings.md#format_custom_result_after_delimiter) settings, not from format strings.
|
||||
@ -465,10 +486,24 @@ There is also `CustomSeparatedIgnoreSpaces` format, which is similar to [Templat
|
||||
|
||||
Also prints the header row with column names, similar to [TabSeparatedWithNames](#tabseparatedwithnames).
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
:::
|
||||
|
||||
## CustomSeparatedWithNamesAndTypes {#customseparatedwithnamesandtypes}
|
||||
|
||||
Also prints two header rows with column names and types, similar to [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes).
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
If setting [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header) is set to 1,
|
||||
the types from input data will be compared with the types of the corresponding columns from the table. Otherwise, the second row will be skipped.
|
||||
:::
|
||||
|
||||
## SQLInsert {#sqlinsert}
|
||||
|
||||
Outputs data as a sequence of `INSERT INTO table (columns...) VALUES (...), (...) ...;` statements.
|
||||
@ -911,18 +946,46 @@ Differs from `JSONEachRow`/`JSONStringsEachRow` in that ClickHouse will also yie
|
||||
|
||||
Differs from `JSONCompactEachRow` format in that it also prints the header row with column names, similar to [TabSeparatedWithNames](#tabseparatedwithnames).
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
:::
|
||||
|
||||
## JSONCompactEachRowWithNamesAndTypes {#jsoncompacteachrowwithnamesandtypes}
|
||||
|
||||
Differs from `JSONCompactEachRow` format in that it also prints two header rows with column names and types, similar to [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes).
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
If setting [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header) is set to 1,
|
||||
the types from input data will be compared with the types of the corresponding columns from the table. Otherwise, the second row will be skipped.
|
||||
:::
|
||||
|
||||
## JSONCompactStringsEachRowWithNames {#jsoncompactstringseachrowwithnames}
|
||||
|
||||
Differs from `JSONCompactStringsEachRow` in that in that it also prints the header row with column names, similar to [TabSeparatedWithNames](#tabseparatedwithnames).
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
:::
|
||||
|
||||
## JSONCompactStringsEachRowWithNamesAndTypes {#jsoncompactstringseachrowwithnamesandtypes}
|
||||
|
||||
Differs from `JSONCompactStringsEachRow` in that it also prints two header rows with column names and types, similar to [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes).
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
If setting [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header) is set to 1,
|
||||
the types from input data will be compared with the types of the corresponding columns from the table. Otherwise, the second row will be skipped.
|
||||
:::
|
||||
|
||||
```json
|
||||
["num", "str", "arr"]
|
||||
["Int32", "String", "Array(UInt8)"]
|
||||
@ -1199,6 +1262,12 @@ Similar to [RowBinary](#rowbinary), but with added header:
|
||||
- [LEB128](https://en.wikipedia.org/wiki/LEB128)-encoded number of columns (N)
|
||||
- N `String`s specifying column names
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
:::
|
||||
|
||||
## RowBinaryWithNamesAndTypes {#rowbinarywithnamesandtypes}
|
||||
|
||||
Similar to [RowBinary](#rowbinary), but with added header:
|
||||
@ -1207,6 +1276,14 @@ Similar to [RowBinary](#rowbinary), but with added header:
|
||||
- N `String`s specifying column names
|
||||
- N `String`s specifying column types
|
||||
|
||||
:::warning
|
||||
If setting [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header) is set to 1,
|
||||
the columns from input data will be mapped to the columns from the table by their names, columns with unknown names will be skipped if setting [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields) is set to 1.
|
||||
Otherwise, the first row will be skipped.
|
||||
If setting [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header) is set to 1,
|
||||
the types from input data will be compared with the types of the corresponding columns from the table. Otherwise, the second row will be skipped.
|
||||
:::
|
||||
|
||||
## Values {#data-format-values}
|
||||
|
||||
Prints every row in brackets. Rows are separated by commas. There is no comma after the last row. The values inside the brackets are also comma-separated. Numbers are output in a decimal format without quotes. Arrays are output in square brackets. Strings, dates, and dates with times are output in quotes. Escaping rules and parsing are similar to the [TabSeparated](#tabseparated) format. During formatting, extra spaces aren’t inserted, but during parsing, they are allowed and skipped (except for spaces inside array values, which are not allowed). [NULL](../sql-reference/syntax.md) is represented as `NULL`.
|
||||
|
@ -45,7 +45,7 @@ Configuration template:
|
||||
|
||||
- `min_part_size` – The minimum size of a data part.
|
||||
- `min_part_size_ratio` – The ratio of the data part size to the table size.
|
||||
- `method` – Compression method. Acceptable values: `lz4`, `lz4hc`, `zstd`.
|
||||
- `method` – Compression method. Acceptable values: `lz4`, `lz4hc`, `zstd`,`deflate_qpl`.
|
||||
- `level` – Compression level. See [Codecs](../../sql-reference/statements/create/table.md#create-query-general-purpose-codecs).
|
||||
|
||||
You can configure multiple `<case>` sections.
|
||||
|
@ -836,7 +836,7 @@ Result:
|
||||
|
||||
## now
|
||||
|
||||
Returns the current date and time.
|
||||
Returns the current date and time at the moment of query analysis. The function is a constant expression.
|
||||
|
||||
**Syntax**
|
||||
|
||||
@ -884,14 +884,20 @@ Result:
|
||||
└──────────────────────┘
|
||||
```
|
||||
|
||||
## nowInBlock
|
||||
|
||||
Returns the current date and time at the moment of processing of each block of data. In contrast to the function `now`, it is not a constant expression, and the returned value will be different in different blocks for long-running queries.
|
||||
|
||||
It makes sense to use this function to generate the current time in long-running INSERT SELECT queries.
|
||||
|
||||
## today
|
||||
|
||||
Accepts zero arguments and returns the current date at one of the moments of request execution.
|
||||
Accepts zero arguments and returns the current date at one of the moments of query analysis.
|
||||
The same as ‘toDate(now())’.
|
||||
|
||||
## yesterday
|
||||
|
||||
Accepts zero arguments and returns yesterday’s date at one of the moments of request execution.
|
||||
Accepts zero arguments and returns yesterday’s date at one of the moments of query analysis.
|
||||
The same as ‘today() - 1’.
|
||||
|
||||
## timeSlot
|
||||
|
@ -494,22 +494,21 @@ If the ‘s’ string is non-empty and does not contain the ‘c’ character at
|
||||
|
||||
Returns the string ‘s’ that was converted from the encoding in ‘from’ to the encoding in ‘to’.
|
||||
|
||||
## Base58Encode(plaintext[, alphabet_name]), Base58Decode(encoded_text[, alphabet_name])
|
||||
## Base58Encode(plaintext), Base58Decode(encoded_text)
|
||||
|
||||
Accepts a String and encodes/decodes it using [Base58](https://tools.ietf.org/id/draft-msporny-base58-01.html) encoding scheme using specified alphabet.
|
||||
Accepts a String and encodes/decodes it using [Base58](https://tools.ietf.org/id/draft-msporny-base58-01.html) encoding scheme using "Bitcoin" alphabet.
|
||||
|
||||
**Syntax**
|
||||
|
||||
```sql
|
||||
base58Encode(decoded[, alphabet_name])
|
||||
base58Decode(encoded[, alphabet_name])
|
||||
base58Encode(decoded)
|
||||
base58Decode(encoded)
|
||||
```
|
||||
|
||||
**Arguments**
|
||||
|
||||
- `decoded` — [String](../../sql-reference/data-types/string.md) column or constant.
|
||||
- `encoded` — [String](../../sql-reference/data-types/string.md) column or constant. If the string is not a valid base58-encoded value, an exception is thrown.
|
||||
- `alphabet_name` — String constant. Specifies alphabet used for encoding. Possible values: `gmp`, `bitcoin`, `ripple`, `flickr`. Default: `bitcoin`.
|
||||
|
||||
**Returned value**
|
||||
|
||||
@ -522,17 +521,17 @@ Type: [String](../../sql-reference/data-types/string.md).
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT base58Encode('encode', 'flickr');
|
||||
SELECT base58Decode('izCFiDUY', 'ripple');
|
||||
SELECT base58Encode('Encoded');
|
||||
SELECT base58Encode('3dc8KtHrwM');
|
||||
```
|
||||
|
||||
Result:
|
||||
```text
|
||||
┌─base58Encode('encode', 'flickr')─┐
|
||||
│ SvyTHb1D │
|
||||
┌─encodeBase58('Encoded')─┐
|
||||
│ 3dc8KtHrwM │
|
||||
└──────────────────────────────────┘
|
||||
┌─base58Decode('izCFiDUY', 'ripple')─┐
|
||||
│ decode │
|
||||
┌─decodeBase58('3dc8KtHrwM')─┐
|
||||
│ Encoded │
|
||||
└────────────────────────────────────┘
|
||||
```
|
||||
|
||||
|
@ -96,7 +96,7 @@ For more information, see the link: [RE2](https://github.com/google/re2/blob/mas
|
||||
|
||||
## translate(s, from, to)
|
||||
|
||||
The function replaces characters in the string ‘s’ in accordance with one-to-one character mapping defined by ‘from’ and ‘to’ strings. ‘from’ and ‘to’ must be ASCII strings of the same size. Non-ASCII characters in the original string are not modified.
|
||||
The function replaces characters in the string ‘s’ in accordance with one-to-one character mapping defined by ‘from’ and ‘to’ strings. ‘from’ and ‘to’ must be constant ASCII strings of the same size. Non-ASCII characters in the original string are not modified.
|
||||
|
||||
Example:
|
||||
|
||||
@ -112,7 +112,7 @@ SELECT translate('Hello, World!', 'delor', 'DELOR') AS res
|
||||
|
||||
## translateUTF8(string, from, to)
|
||||
|
||||
Similar to previous function, but works with UTF-8 arguments. ‘from’ and ‘to’ must be valid UTF-8 strings of the same size.
|
||||
Similar to previous function, but works with UTF-8 arguments. ‘from’ and ‘to’ must be valid constant UTF-8 strings of the same size.
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -248,6 +248,13 @@ ClickHouse supports general purpose codecs and specialized codecs.
|
||||
|
||||
High compression levels are useful for asymmetric scenarios, like compress once, decompress repeatedly. Higher levels mean better compression and higher CPU usage.
|
||||
|
||||
#### DEFLATE_QPL
|
||||
|
||||
`DEFLATE_QPL` — [Deflate compression algorithm](https://github.com/intel/qpl) implemented by Intel® Query Processing Library, which has dependency on Intel Hardware:
|
||||
|
||||
- DEFLATE_QPL is only supported on systems with AVX2/AVX512/IAA.
|
||||
- DEFLATE_QPL-compressed data can only be transferred between nodes with AVX2/AVX512/IAA.
|
||||
|
||||
### Specialized Codecs
|
||||
|
||||
These codecs are designed to make compression more effective by using specific features of data. Some of these codecs do not compress data themself. Instead, they prepare the data for a common purpose codec, which compresses it better than without this preparation.
|
||||
|
@ -18,7 +18,6 @@ sidebar_label: "Используемые сторонние библиотеки
|
||||
| aws-c-common | [Apache](https://github.com/ClickHouse-Extras/aws-c-common/blob/736a82d1697c108b04a277e66438a7f4e19b6857/LICENSE) |
|
||||
| aws-c-event-stream | [Apache](https://github.com/ClickHouse-Extras/aws-c-event-stream/blob/3bc33662f9ccff4f4cbcf9509cc78c26e022fde0/LICENSE) |
|
||||
| aws-checksums | [Apache](https://github.com/ClickHouse-Extras/aws-checksums/blob/519d6d9093819b6cf89ffff589a27ef8f83d0f65/LICENSE) |
|
||||
| base58 | [MIT](https://github.com/ClickHouse/base-x/blob/3e58874643c087f57e82b0ff03825c933fab945a/LICENSE) |
|
||||
| base64 | [BSD 2-clause](https://github.com/ClickHouse-Extras/Turbo-Base64/blob/af9b331f2b4f30b41c70f3a571ff904a8251c1d3/LICENSE) |
|
||||
| boost | [Boost](https://github.com/ClickHouse-Extras/boost/blob/9cf09dbfd55a5c6202dedbdf40781a51b02c2675/LICENSE_1_0.txt) |
|
||||
| boringssl | [BSD](https://github.com/ClickHouse-Extras/boringssl/blob/a6a2e2ab3e44d97ce98e51c558e989f211de7eb3/LICENSE) |
|
||||
|
@ -15,16 +15,15 @@ $ make
|
||||
|
||||
Генерация данных:
|
||||
|
||||
:::danger "Внимание"
|
||||
:::warning "Внимание"
|
||||
-s 100 – dbgen генерирует 600 миллионов строк (67 ГБ)
|
||||
-s 1000 – dbgen генерирует 6 миллиардов строк (занимает много времени)
|
||||
:::
|
||||
|
||||
``` bash
|
||||
$ ./dbgen -s 1000 -T c
|
||||
$ ./dbgen -s 1000 -T l
|
||||
$ ./dbgen -s 1000 -T p
|
||||
$ ./dbgen -s 1000 -T s
|
||||
$ ./dbgen -s 1000 -T d
|
||||
```
|
||||
|
||||
Создание таблиц в Кликхауз:
|
||||
@ -105,11 +104,10 @@ $ clickhouse-client --query "INSERT INTO lineorder FORMAT CSV" < lineorder.tbl
|
||||
|
||||
``` sql
|
||||
SET max_memory_usage = 20000000000;
|
||||
|
||||
CREATE TABLE lineorder_flat
|
||||
ENGINE = MergeTree
|
||||
PARTITION BY toYear(LO_ORDERDATE)
|
||||
ORDER BY (LO_ORDERDATE, LO_ORDERKEY) AS
|
||||
SELECT
|
||||
ENGINE = MergeTree ORDER BY (LO_ORDERDATE, LO_ORDERKEY)
|
||||
AS SELECT
|
||||
l.LO_ORDERKEY AS LO_ORDERKEY,
|
||||
l.LO_LINENUMBER AS LO_LINENUMBER,
|
||||
l.LO_CUSTKEY AS LO_CUSTKEY,
|
||||
|
@ -19,6 +19,7 @@ ClickHouse может принимать (`INSERT`) и отдавать (`SELECT
|
||||
| [TemplateIgnoreSpaces](#templateignorespaces) | ✔ | ✗ |
|
||||
| [CSV](#csv) | ✔ | ✔ |
|
||||
| [CSVWithNames](#csvwithnames) | ✔ | ✔ |
|
||||
| [CSVWithNamesAndTypes](#csvwithnamesandtypes) | ✔ | ✔ |
|
||||
| [CustomSeparated](#format-customseparated) | ✔ | ✔ |
|
||||
| [CustomSeparatedWithNames](#customseparatedwithnames) | ✔ | ✔ |
|
||||
| [CustomSeparatedWithNamesAndTypes](#customseparatedwithnamesandtypes) | ✔ | ✔ |
|
||||
@ -52,6 +53,7 @@ ClickHouse может принимать (`INSERT`) и отдавать (`SELECT
|
||||
| [ArrowStream](#data-format-arrow-stream) | ✔ | ✔ |
|
||||
| [ORC](#data-format-orc) | ✔ | ✔ |
|
||||
| [RowBinary](#rowbinary) | ✔ | ✔ |
|
||||
| [RowBinaryWithNames](#rowbinarywithnames) | ✔ | ✔ |
|
||||
| [RowBinaryWithNamesAndTypes](#rowbinarywithnamesandtypes) | ✔ | ✔ |
|
||||
| [Native](#native) | ✔ | ✔ |
|
||||
| [Null](#null) | ✗ | ✔ |
|
||||
@ -171,6 +173,12 @@ SELECT * FROM nestedt FORMAT TSV
|
||||
|
||||
При парсинге первая строка должна содержать имена столбцов. Вы можете использовать имена столбцов, чтобы указать их порядок расположения, или чтобы проверить их корректность.
|
||||
|
||||
:::warning
|
||||
Если включен параметр [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header),
|
||||
столбцы из входных данных будут сопоставлены со столбцами таблицы по их именам, столбцы с неизвестными именами будут пропущены, если включен параметр [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields).
|
||||
В противном случае первая строка будет пропущена.
|
||||
:::
|
||||
|
||||
Этот формат также доступен под именем `TSVWithNames`.
|
||||
|
||||
## TabSeparatedWithNamesAndTypes {#tabseparatedwithnamesandtypes}
|
||||
@ -178,6 +186,14 @@ SELECT * FROM nestedt FORMAT TSV
|
||||
Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов, а во второй - типы столбцов.
|
||||
При парсинге, первая и вторая строка полностью игнорируется.
|
||||
|
||||
:::warning
|
||||
Если включен параметр [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header),
|
||||
столбцы из входных данных будут сопоставлены со столбцами таблицы по их именам, столбцы с неизвестными именами будут пропущены, если включен параметр [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields).
|
||||
В противном случае первая строка будет пропущена.
|
||||
Если включен параметр [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header),
|
||||
типы из входных данных будут сравниваться с типами соответствующих столбцов из таблицы. В противном случае вторая строка будет пропущена.
|
||||
:::
|
||||
|
||||
Этот формат также доступен под именем `TSVWithNamesAndTypes`.
|
||||
|
||||
## Template {#format-template}
|
||||
@ -374,6 +390,24 @@ $ clickhouse-client --format_csv_delimiter="|" --query="INSERT INTO test.csv FOR
|
||||
|
||||
Выводит также заголовок, аналогично [TabSeparatedWithNames](#tabseparatedwithnames).
|
||||
|
||||
:::warning
|
||||
Если включен параметр [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header),
|
||||
столбцы из входных данных будут сопоставлены со столбцами таблицы по их именам, столбцы с неизвестными именами будут пропущены, если включен параметр [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields).
|
||||
В противном случае первая строка будет пропущена.
|
||||
:::
|
||||
|
||||
## CSVWithNamesAndTypes {#csvwithnamesandtypes}
|
||||
|
||||
В первой строке пишутся имена столбцов, а во второй - типы столбцов, аналогично [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes)
|
||||
|
||||
:::warning
|
||||
Если включен параметр [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header),
|
||||
столбцы из входных данных будут сопоставлены со столбцами таблицы по их именам, столбцы с неизвестными именами будут пропущены, если включен параметр [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields).
|
||||
В противном случае первая строка будет пропущена.
|
||||
Если включен параметр [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header),
|
||||
типы из входных данных будут сравниваться с типами соответствующих столбцов из таблицы. В противном случае вторая строка будет пропущена.
|
||||
:::
|
||||
|
||||
## CustomSeparated {#format-customseparated}
|
||||
|
||||
Аналогичен [Template](#format-template), но выводит (или считывает) все имена и типы столбцов, используя для них правило экранирования из настройки [format_custom_escaping_rule](../operations/settings/settings.md#format-custom-escaping-rule) и разделители из настроек [format_custom_field_delimiter](../operations/settings/settings.md#format-custom-field-delimiter), [format_custom_row_before_delimiter](../operations/settings/settings.md#format-custom-row-before-delimiter), [format_custom_row_after_delimiter](../operations/settings/settings.md#format-custom-row-after-delimiter), [format_custom_row_between_delimiter](../operations/settings/settings.md#format-custom-row-between-delimiter), [format_custom_result_before_delimiter](../operations/settings/settings.md#format-custom-result-before-delimiter) и [format_custom_result_after_delimiter](../operations/settings/settings.md#format-custom-result-after-delimiter), а не из форматных строк.
|
||||
@ -384,10 +418,24 @@ $ clickhouse-client --format_csv_delimiter="|" --query="INSERT INTO test.csv FOR
|
||||
|
||||
Выводит также заголовок с именами столбцов, аналогичен формату [TabSeparatedWithNames](#tabseparatedwithnames).
|
||||
|
||||
:::warning
|
||||
Если включен параметр [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header),
|
||||
столбцы из входных данных будут сопоставлены со столбцами таблицы по их именам, столбцы с неизвестными именами будут пропущены, если включен параметр [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields).
|
||||
В противном случае первая строка будет пропущена.
|
||||
:::
|
||||
|
||||
## CustomSeparatedWithNamesAndTypes {#customseparatedwithnamesandtypes}
|
||||
|
||||
Выводит также два заголовка с именами и типами столбцов, аналогичен формату [TabSeparatedWithNamesAndTypes](#tabseparatedwithnamesandtypes).
|
||||
|
||||
:::warning
|
||||
Если включен параметр [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header),
|
||||
столбцы из входных данных будут сопоставлены со столбцами таблицы по их именам, столбцы с неизвестными именами будут пропущены, если включен параметр [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields).
|
||||
В противном случае первая строка будет пропущена.
|
||||
Если включен параметр [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header),
|
||||
типы из входных данных будут сравниваться с типами соответствующих столбцов из таблицы. В противном случае вторая строка будет пропущена.
|
||||
:::
|
||||
|
||||
## JSON {#json}
|
||||
|
||||
Выводит данные в формате JSON. Кроме таблицы с данными, также выводятся имена и типы столбцов, и некоторая дополнительная информация - общее количество выведенных строк, а также количество строк, которое могло бы быть выведено, если бы не было LIMIT-а. Пример:
|
||||
@ -660,6 +708,14 @@ SELECT * FROM json_square_brackets;
|
||||
|
||||
Отличается от `JSONCompactEachRow`/`JSONCompactStringsEachRow` тем, что имена и типы столбцов записываются как первые две строки.
|
||||
|
||||
:::warning
|
||||
Если включен параметр [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header),
|
||||
столбцы из входных данных будут сопоставлены со столбцами таблицы по их именам, столбцы с неизвестными именами будут пропущены, если включен параметр [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields).
|
||||
В противном случае первая строка будет пропущена.
|
||||
Если включен параметр [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header),
|
||||
типы из входных данных будут сравниваться с типами соответствующих столбцов из таблицы. В противном случае вторая строка будет пропущена.
|
||||
:::
|
||||
|
||||
```json
|
||||
["'hello'", "multiply(42, number)", "range(5)"]
|
||||
["String", "UInt64", "Array(UInt8)"]
|
||||
@ -904,6 +960,20 @@ Array представлены как длина в формате varint (unsig
|
||||
|
||||
Для поддержки [NULL](../sql-reference/syntax.md#null-literal) перед каждым значением типа [Nullable](../sql-reference/data-types/nullable.md) следует байт содержащий 1 или 0. Если байт 1, то значение равно NULL, и этот байт интерпретируется как отдельное значение (т.е. после него следует значение следующего поля). Если байт 0, то после байта следует значение поля (не равно NULL).
|
||||
|
||||
|
||||
## RowBinaryWithNames {#rowbinarywithnames}
|
||||
|
||||
То же самое что [RowBinary](#rowbinary), но добавляется заголовок:
|
||||
|
||||
- Количество колонок - N, закодированное [LEB128](https://en.wikipedia.org/wiki/LEB128),
|
||||
- N строк (`String`) с именами колонок,
|
||||
|
||||
:::warning
|
||||
Если включен параметр [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header),
|
||||
столбцы из входных данных будут сопоставлены со столбцами таблицы по их именам, столбцы с неизвестными именами будут пропущены, если включен параметр [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields).
|
||||
В противном случае первая строка будет пропущена.
|
||||
:::
|
||||
|
||||
## RowBinaryWithNamesAndTypes {#rowbinarywithnamesandtypes}
|
||||
|
||||
То же самое что [RowBinary](#rowbinary), но добавляется заголовок:
|
||||
@ -912,6 +982,14 @@ Array представлены как длина в формате varint (unsig
|
||||
- N строк (`String`) с именами колонок,
|
||||
- N строк (`String`) с типами колонок.
|
||||
|
||||
:::warning
|
||||
Если включен параметр [input_format_with_names_use_header](../operations/settings/settings.md#input_format_with_names_use_header),
|
||||
столбцы из входных данных будут сопоставлены со столбцами таблицы по их именам, столбцы с неизвестными именами будут пропущены, если включен параметр [input_format_skip_unknown_fields](../operations/settings/settings.md#input_format_skip_unknown_fields).
|
||||
В противном случае первая строка будет пропущена.
|
||||
Если включен параметр [input_format_with_types_use_header](../operations/settings/settings.md#input_format_with_types_use_header),
|
||||
типы из входных данных будут сравниваться с типами соответствующих столбцов из таблицы. В противном случае вторая строка будет пропущена.
|
||||
:::
|
||||
|
||||
## Values {#data-format-values}
|
||||
|
||||
Выводит каждую строку в скобках. Строки разделены запятыми. После последней строки запятой нет. Значения внутри скобок также разделены запятыми. Числа выводятся в десятичном виде без кавычек. Массивы выводятся в квадратных скобках. Строки, даты, даты-с-временем выводятся в кавычках. Правила экранирования и особенности парсинга аналогичны формату [TabSeparated](#tabseparated). При форматировании, лишние пробелы не ставятся, а при парсинге - допустимы и пропускаются (за исключением пробелов внутри значений типа массив, которые недопустимы). [NULL](../sql-reference/syntax.md) представляется как `NULL`.
|
||||
|
@ -44,7 +44,7 @@ ClickHouse перезагружает встроенные словари с з
|
||||
|
||||
- `min_part_size` - Минимальный размер части таблицы.
|
||||
- `min_part_size_ratio` - Отношение размера минимальной части таблицы к полному размеру таблицы.
|
||||
- `method` - Метод сжатия. Возможные значения: `lz4`, `lz4hc`, `zstd`.
|
||||
- `method` - Метод сжатия. Возможные значения: `lz4`, `lz4hc`, `zstd`,`deflate_qpl`.
|
||||
- `level` – Уровень сжатия. См. [Кодеки](../../sql-reference/statements/create/table/#create-query-common-purpose-codecs).
|
||||
|
||||
Можно сконфигурировать несколько разделов `<case>`.
|
||||
|
@ -527,7 +527,7 @@ SELECT * FROM table_with_enum_column_for_tsv_insert;
|
||||
|
||||
- [Использование вложенных структур](../../interfaces/formats.md#jsoneachrow-nested) with the `JSONEachRow` format.
|
||||
|
||||
## input_format_with_names_use_header {#settings-input-format-with-names-use-header}
|
||||
## input_format_with_names_use_header {#input_format_with_names_use_header}
|
||||
|
||||
Включает или отключает проверку порядка столбцов при вставке данных.
|
||||
|
||||
@ -535,8 +535,38 @@ SELECT * FROM table_with_enum_column_for_tsv_insert;
|
||||
|
||||
Поддерживаемые форматы:
|
||||
|
||||
- [CSVWithNames](../../interfaces/formats.md#csvwithnames)
|
||||
- [TabSeparatedWithNames](../../interfaces/formats.md#tabseparatedwithnames)
|
||||
- [CSVWithNames](../../interfaces/formats.md#csvwithnames)
|
||||
- [CSVWithNamesAndTypes](../../interfaces/formats.md#csvwithnamesandtypes)
|
||||
- [TabSeparatedWithNames](../../interfaces/formats.md#tabseparatedwithnames)
|
||||
- [TabSeparatedWithNamesAndTypes](../../interfaces/formats.md#tabseparatedwithnamesandtypes)
|
||||
- [JSONCompactEachRowWithNames](../../interfaces/formats.md#jsoncompacteachrowwithnames)
|
||||
- [JSONCompactEachRowWithNamesAndTypes](../../interfaces/formats.md#jsoncompacteachrowwithnamesandtypes)
|
||||
- [JSONCompactStringsEachRowWithNames](../../interfaces/formats.md#jsoncompactstringseachrowwithnames)
|
||||
- [JSONCompactStringsEachRowWithNamesAndTypes](../../interfaces/formats.md#jsoncompactstringseachrowwithnamesandtypes)
|
||||
- [RowBinaryWithNames](../../interfaces/formats.md#rowbinarywithnames)
|
||||
- [RowBinaryWithNamesAndTypes](../../interfaces/formats.md#rowbinarywithnamesandtypes)
|
||||
- [CustomSeparatedWithNames](../../interfaces/formats.md#customseparatedwithnames)
|
||||
- [CustomSeparatedWithNamesAndTypes](../../interfaces/formats.md#customseparatedwithnamesandtypes)
|
||||
|
||||
Возможные значения:
|
||||
|
||||
- 0 — выключена.
|
||||
- 1 — включена.
|
||||
|
||||
Значение по умолчанию: 1.
|
||||
|
||||
## input_format_with_types_use_header {#input_format_with_types_use_header}
|
||||
|
||||
Определяет, должен ли синтаксический анализатор формата проверять, соответствуют ли типы данных из входных данных типам данных из целевой таблицы.
|
||||
|
||||
Поддерживаемые форматы:
|
||||
|
||||
- [CSVWithNamesAndTypes](../../interfaces/formats.md#csvwithnamesandtypes)
|
||||
- [TabSeparatedWithNamesAndTypes](../../interfaces/formats.md#tabseparatedwithnamesandtypes)
|
||||
- [JSONCompactEachRowWithNamesAndTypes](../../interfaces/formats.md#jsoncompacteachrowwithnamesandtypes)
|
||||
- [JSONCompactStringsEachRowWithNamesAndTypes](../../interfaces/formats.md#jsoncompactstringseachrowwithnamesandtypes)
|
||||
- [RowBinaryWithNamesAndTypes](../../interfaces/formats.md#rowbinarywithnamesandtypes-rowbinarywithnamesandtypes)
|
||||
- [CustomSeparatedWithNamesAndTypes](../../interfaces/formats.md#customseparatedwithnamesandtypes)
|
||||
|
||||
Возможные значения:
|
||||
|
||||
|
@ -490,22 +490,21 @@ SELECT concat(key1, key2), sum(value) FROM key_val GROUP BY (key1, key2);
|
||||
|
||||
Возвращает сконвертированную из кодировки from в кодировку to строку s.
|
||||
|
||||
## Base58Encode(plaintext[, alphabet_name]), Base58Decode(plaintext[, alphabet_name]) {#base58}
|
||||
## Base58Encode(plaintext), Base58Decode(encoded_text) {#base58}
|
||||
|
||||
Принимает на вход строку или колонку строк и кодирует/раскодирует их с помощью схемы кодирования [Base58](https://tools.ietf.org/id/draft-msporny-base58-01.html) с использованием указанного алфавита.
|
||||
Принимает на вход строку или колонку строк и кодирует/раскодирует их с помощью схемы кодирования [Base58](https://tools.ietf.org/id/draft-msporny-base58-01.html) с использованием стандартного алфавита Bitcoin.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
```sql
|
||||
base58Encode(decoded[, alphabet_name])
|
||||
base58Decode(encoded[, alphabet_name])
|
||||
encodeBase58(decoded)
|
||||
decodeBase58(encoded)
|
||||
```
|
||||
|
||||
**Аргументы**
|
||||
|
||||
- `decoded` — Колонка или строка типа [String](../../sql-reference/data-types/string.md).
|
||||
- `encoded` — Колонка или строка типа [String](../../sql-reference/data-types/string.md). Если входная строка не является корректным кодом для какой-либо другой строки, возникнет исключение `1001`.
|
||||
- `alphabet_name` — Строковая константа. Указывает алфавит, для которого необходимо получить код. Может принимать одно из следующих значений: `gmp`, `bitcoin`, `ripple`, `flickr`. По умолчанию: `bitcoin`.
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
@ -518,16 +517,16 @@ base58Decode(encoded[, alphabet_name])
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT base58Encode('encode', 'flickr');
|
||||
SELECT base58Decode('izCFiDUY', 'ripple');
|
||||
SELECT encodeBase58('encode');
|
||||
SELECT decodeBase58('izCFiDUY');
|
||||
```
|
||||
|
||||
Результат:
|
||||
```text
|
||||
┌─base58Encode('encode', 'flickr')─┐
|
||||
┌─encodeBase58('encode', 'flickr')─┐
|
||||
│ SvyTHb1D │
|
||||
└──────────────────────────────────┘
|
||||
┌─base58Decode('izCFiDUY', 'ripple')─┐
|
||||
┌─decodeBase58('izCFiDUY', 'ripple')─┐
|
||||
│ decode │
|
||||
└────────────────────────────────────┘
|
||||
```
|
||||
|
@ -85,7 +85,7 @@ SELECT replaceRegexpAll('Hello, World!', '^', 'here: ') AS res
|
||||
|
||||
## translate(s, from, to)
|
||||
|
||||
Данная функция заменяет символы в строке ‘s’ в соответствии с поэлементным отображением определяемым строками ‘from’ и ‘to’. ‘from’ и ‘to’ должны быть корректными ASCII строками одного размера. Не ASCII символы в оригинальной строке не изменяются.
|
||||
Данная функция заменяет символы в строке ‘s’ в соответствии с поэлементным отображением определяемым строками ‘from’ и ‘to’. ‘from’ и ‘to’ должны быть корректными константными ASCII строками одного размера. Не ASCII символы в оригинальной строке не изменяются.
|
||||
|
||||
Example:
|
||||
|
||||
@ -101,7 +101,7 @@ SELECT translate('Hello, World!', 'delor', 'DELOR') AS res
|
||||
|
||||
## translateUTF8(string, from, to)
|
||||
|
||||
Аналогично предыдущей функции, но работает со строками, состоящими из UTF-8 символов. ‘from’ и ‘to’ должны быть корректными UTF-8 строками одного размера.
|
||||
Аналогично предыдущей функции, но работает со строками, состоящими из UTF-8 символов. ‘from’ и ‘to’ должны быть корректными константными UTF-8 строками одного размера.
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -15,15 +15,14 @@ $ make
|
||||
|
||||
开始生成数据:
|
||||
|
||||
!!! warning "注意"
|
||||
:::warning "注意"
|
||||
使用`-s 100`dbgen 将生成 6 亿行数据(67GB), 如果使用`-s 1000`它会生成 60 亿行数据(这需要很多时间))
|
||||
:::
|
||||
|
||||
```bash
|
||||
$ ./dbgen -s 1000 -T c
|
||||
$ ./dbgen -s 1000 -T l
|
||||
$ ./dbgen -s 1000 -T p
|
||||
$ ./dbgen -s 1000 -T s
|
||||
$ ./dbgen -s 1000 -T d
|
||||
```
|
||||
|
||||
在 ClickHouse 中创建数据表:
|
||||
@ -106,10 +105,8 @@ $ clickhouse-client --query "INSERT INTO lineorder FORMAT CSV" < lineorder.tbl
|
||||
SET max_memory_usage = 20000000000;
|
||||
|
||||
CREATE TABLE lineorder_flat
|
||||
ENGINE = MergeTree
|
||||
PARTITION BY toYear(LO_ORDERDATE)
|
||||
ORDER BY (LO_ORDERDATE, LO_ORDERKEY) AS
|
||||
SELECT
|
||||
ENGINE = MergeTree ORDER BY (LO_ORDERDATE, LO_ORDERKEY)
|
||||
AS SELECT
|
||||
l.LO_ORDERKEY AS LO_ORDERKEY,
|
||||
l.LO_LINENUMBER AS LO_LINENUMBER,
|
||||
l.LO_CUSTKEY AS LO_CUSTKEY,
|
||||
|
@ -79,6 +79,7 @@ int mainEntryClickHouseCompressor(int argc, char ** argv)
|
||||
("block-size,b", po::value<unsigned>()->default_value(DBMS_DEFAULT_BUFFER_SIZE), "compress in blocks of specified size")
|
||||
("hc", "use LZ4HC instead of LZ4")
|
||||
("zstd", "use ZSTD instead of LZ4")
|
||||
("deflate_qpl", "use deflate_qpl instead of LZ4")
|
||||
("codec", po::value<std::vector<std::string>>()->multitoken(), "use codecs combination instead of LZ4")
|
||||
("level", po::value<int>(), "compression level for codecs specified via flags")
|
||||
("none", "use no compression instead of LZ4")
|
||||
@ -103,6 +104,7 @@ int mainEntryClickHouseCompressor(int argc, char ** argv)
|
||||
bool decompress = options.count("decompress");
|
||||
bool use_lz4hc = options.count("hc");
|
||||
bool use_zstd = options.count("zstd");
|
||||
bool use_deflate_qpl = options.count("deflate_qpl");
|
||||
bool stat_mode = options.count("stat");
|
||||
bool use_none = options.count("none");
|
||||
unsigned block_size = options["block-size"].as<unsigned>();
|
||||
@ -110,7 +112,7 @@ int mainEntryClickHouseCompressor(int argc, char ** argv)
|
||||
if (options.count("codec"))
|
||||
codecs = options["codec"].as<std::vector<std::string>>();
|
||||
|
||||
if ((use_lz4hc || use_zstd || use_none) && !codecs.empty())
|
||||
if ((use_lz4hc || use_zstd || use_deflate_qpl || use_none) && !codecs.empty())
|
||||
throw Exception("Wrong options, codec flags like --zstd and --codec options are mutually exclusive", ErrorCodes::BAD_ARGUMENTS);
|
||||
|
||||
if (!codecs.empty() && options.count("level"))
|
||||
@ -122,6 +124,8 @@ int mainEntryClickHouseCompressor(int argc, char ** argv)
|
||||
method_family = "LZ4HC";
|
||||
else if (use_zstd)
|
||||
method_family = "ZSTD";
|
||||
else if (use_deflate_qpl)
|
||||
method_family = "DEFLATE_QPL";
|
||||
else if (use_none)
|
||||
method_family = "NONE";
|
||||
|
||||
|
@ -346,6 +346,12 @@ set_source_files_properties(
|
||||
Columns/ColumnString.cpp
|
||||
PROPERTIES COMPILE_FLAGS "${X86_INTRINSICS_FLAGS}")
|
||||
|
||||
if (ENABLE_QPL)
|
||||
set_source_files_properties(
|
||||
Compression/CompressionCodecDeflateQpl.cpp
|
||||
PROPERTIES COMPILE_FLAGS "-mwaitpkg")
|
||||
endif ()
|
||||
|
||||
target_link_libraries(clickhouse_common_io PUBLIC ch_contrib::re2_st)
|
||||
target_link_libraries(clickhouse_common_io PUBLIC ch_contrib::re2)
|
||||
|
||||
@ -530,6 +536,10 @@ endif ()
|
||||
|
||||
target_link_libraries (clickhouse_common_io PRIVATE ch_contrib::lz4)
|
||||
|
||||
if (TARGET ch_contrib::qpl)
|
||||
dbms_target_link_libraries(PUBLIC ch_contrib::qpl)
|
||||
endif ()
|
||||
|
||||
dbms_target_link_libraries(PRIVATE _boost_context)
|
||||
|
||||
if (ENABLE_NLP)
|
||||
|
@ -73,7 +73,7 @@ bool isSameConfiguration(const Poco::Util::AbstractConfiguration & left, const S
|
||||
/// Check that the right configuration has the same set of subkeys as the left configuration.
|
||||
Poco::Util::AbstractConfiguration::Keys right_subkeys;
|
||||
right.keys(right_key, right_subkeys);
|
||||
std::unordered_set<StringRef> left_subkeys{subkeys.begin(), subkeys.end()};
|
||||
std::unordered_set<std::string_view> left_subkeys{subkeys.begin(), subkeys.end()};
|
||||
if ((left_subkeys.size() != right_subkeys.size()) || (left_subkeys.size() != subkeys.size()))
|
||||
return false;
|
||||
for (const auto & right_subkey : right_subkeys)
|
||||
|
@ -9,7 +9,6 @@
|
||||
#include <Common/StringSearcher.h>
|
||||
#include <Common/StringUtils/StringUtils.h>
|
||||
#include <Common/UTF8Helpers.h>
|
||||
#include <base/StringRef.h>
|
||||
#include <base/unaligned.h>
|
||||
|
||||
/** Search for a substring in a string by Volnitsky's algorithm
|
||||
|
@ -99,6 +99,7 @@ try
|
||||
std::cout << "list\n";
|
||||
|
||||
zk.list("/",
|
||||
Coordination::ListRequestType::ALL,
|
||||
[&](const ListResponse & response)
|
||||
{
|
||||
if (response.error != Coordination::Error::ZOK)
|
||||
|
87
src/Common/base58.h
Normal file
87
src/Common/base58.h
Normal file
@ -0,0 +1,87 @@
|
||||
#pragma once
|
||||
#include <climits>
|
||||
#include <cstring>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
inline size_t encodeBase58(const char8_t * src, char8_t * dst)
|
||||
{
|
||||
const char * base58_encoding_alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
||||
|
||||
size_t idx = 0;
|
||||
for (; *src; ++src)
|
||||
{
|
||||
unsigned int carry = static_cast<unsigned char>(*src);
|
||||
for (size_t j = 0; j < idx; ++j)
|
||||
{
|
||||
carry += static_cast<unsigned int>(dst[j] << 8);
|
||||
dst[j] = static_cast<unsigned char>(carry % 58);
|
||||
carry /= 58;
|
||||
}
|
||||
while (carry > 0)
|
||||
{
|
||||
dst[idx++] = static_cast<unsigned char>(carry % 58);
|
||||
carry /= 58;
|
||||
}
|
||||
}
|
||||
|
||||
size_t c_idx = idx >> 1;
|
||||
for (size_t i = 0; i < c_idx; ++i)
|
||||
{
|
||||
char s = base58_encoding_alphabet[static_cast<unsigned char>(dst[i])];
|
||||
dst[i] = base58_encoding_alphabet[static_cast<unsigned char>(dst[idx - (i + 1)])];
|
||||
dst[idx - (i + 1)] = s;
|
||||
}
|
||||
if ((idx & 1))
|
||||
{
|
||||
dst[c_idx] = base58_encoding_alphabet[static_cast<unsigned char>(dst[c_idx])];
|
||||
}
|
||||
dst[idx] = '\0';
|
||||
return idx + 1;
|
||||
}
|
||||
|
||||
inline size_t decodeBase58(const char8_t * src, char8_t * dst)
|
||||
{
|
||||
const signed char uint_max = UINT_MAX;
|
||||
const signed char map_digits[128]
|
||||
= {uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max,
|
||||
uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max,
|
||||
uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max,
|
||||
uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, 0, 1, 2, 3, 4, 5, 6, 7, 8, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, 9, 10, 11, 12, 13, 14, 15, 16, uint_max, 17, 18, 19, 20, 21, uint_max, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
|
||||
uint_max, uint_max, uint_max, uint_max, uint_max, uint_max, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, uint_max, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, uint_max, uint_max, uint_max, uint_max, uint_max};
|
||||
|
||||
size_t idx = 0;
|
||||
|
||||
for (; *src; ++src)
|
||||
{
|
||||
unsigned int carry = map_digits[*src];
|
||||
if (unlikely(carry == UINT_MAX))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
for (size_t j = 0; j < idx; ++j)
|
||||
{
|
||||
carry += static_cast<unsigned char>(dst[j]) * 58;
|
||||
dst[j] = static_cast<unsigned char>(carry & 0xff);
|
||||
carry >>= 8;
|
||||
}
|
||||
while (carry > 0)
|
||||
{
|
||||
dst[idx++] = static_cast<unsigned char>(carry & 0xff);
|
||||
carry >>= 8;
|
||||
}
|
||||
}
|
||||
|
||||
size_t c_idx = idx >> 1;
|
||||
for (size_t i = 0; i < c_idx; ++i)
|
||||
{
|
||||
char s = dst[i];
|
||||
dst[i] = dst[idx - (i + 1)];
|
||||
dst[idx - (i + 1)] = s;
|
||||
}
|
||||
dst[idx] = '\0';
|
||||
return idx + 1;
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
|
||||
#include <Interpreters/AggregationCommon.h>
|
||||
|
||||
@ -33,22 +32,6 @@ int main(int, char **)
|
||||
std::cerr << "dump: " << wb.str() << std::endl;
|
||||
}
|
||||
|
||||
{
|
||||
using Cont = SmallMap<int, std::string, 16>;
|
||||
Cont cont;
|
||||
|
||||
cont.insert(Cont::value_type(1, "Hello, world!"));
|
||||
cont[1] = "Goodbye.";
|
||||
|
||||
for (auto x : cont)
|
||||
std::cerr << x.getKey() << " -> " << x.getMapped() << std::endl;
|
||||
|
||||
DB::WriteBufferFromOwnString wb;
|
||||
cont.writeText(wb);
|
||||
|
||||
std::cerr << "dump: " << wb.str() << std::endl;
|
||||
}
|
||||
|
||||
{
|
||||
using Cont = SmallSet<DB::UInt128, 16>;
|
||||
Cont cont;
|
||||
|
33
src/Common/tests/gtest_lsan.cpp
Normal file
33
src/Common/tests/gtest_lsan.cpp
Normal file
@ -0,0 +1,33 @@
|
||||
#include <base/defines.h> // ADDRESS_SANITIZER
|
||||
|
||||
#ifdef ADDRESS_SANITIZER
|
||||
|
||||
#include <cstdlib>
|
||||
#include <thread>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <sanitizer/lsan_interface.h>
|
||||
|
||||
/// Test that ensures that LSan works.
|
||||
///
|
||||
/// Regression test for the case when it may not work,
|
||||
/// because of broken getauxval() [1].
|
||||
///
|
||||
/// [1]: https://github.com/ClickHouse/ClickHouse/pull/33957
|
||||
TEST(Common, LSan)
|
||||
{
|
||||
int sanitizers_exit_code = 1;
|
||||
|
||||
ASSERT_EXIT({
|
||||
std::thread leak_in_thread([]()
|
||||
{
|
||||
void * leak = malloc(4096);
|
||||
ASSERT_NE(leak, nullptr);
|
||||
});
|
||||
leak_in_thread.join();
|
||||
|
||||
__lsan_do_leak_check();
|
||||
}, ::testing::ExitedWithCode(sanitizers_exit_code), ".*LeakSanitizer: detected memory leaks.*");
|
||||
}
|
||||
|
||||
#endif
|
@ -92,6 +92,8 @@ static int pollPid(pid_t pid, int timeout_in_ms)
|
||||
}
|
||||
#elif defined(OS_DARWIN) || defined(OS_FREEBSD)
|
||||
|
||||
#pragma clang diagnostic ignored "-Wreserved-identifier"
|
||||
|
||||
#include <sys/event.h>
|
||||
#include <err.h>
|
||||
|
||||
|
@ -106,21 +106,15 @@ static void validateChecksum(char * data, size_t size, const Checksum expected_c
|
||||
throw Exception(message.str(), ErrorCodes::CHECKSUM_DOESNT_MATCH);
|
||||
}
|
||||
|
||||
|
||||
/// Read compressed data into compressed_buffer. Get size of decompressed data from block header. Checksum if need.
|
||||
/// Returns number of compressed bytes read.
|
||||
size_t CompressedReadBufferBase::readCompressedData(size_t & size_decompressed, size_t & size_compressed_without_checksum, bool always_copy)
|
||||
static void readHeaderAndGetCodecAndSize(
|
||||
const char * compressed_buffer,
|
||||
UInt8 header_size,
|
||||
CompressionCodecPtr & codec,
|
||||
size_t & size_decompressed,
|
||||
size_t & size_compressed_without_checksum,
|
||||
bool allow_different_codecs)
|
||||
{
|
||||
if (compressed_in->eof())
|
||||
return 0;
|
||||
|
||||
UInt8 header_size = ICompressionCodec::getHeaderSize();
|
||||
own_compressed_buffer.resize(header_size + sizeof(Checksum));
|
||||
|
||||
compressed_in->readStrict(own_compressed_buffer.data(), sizeof(Checksum) + header_size);
|
||||
char * compressed_header = own_compressed_buffer.data() + sizeof(Checksum);
|
||||
|
||||
uint8_t method = ICompressionCodec::readMethod(compressed_header);
|
||||
uint8_t method = ICompressionCodec::readMethod(compressed_buffer);
|
||||
|
||||
if (!codec)
|
||||
{
|
||||
@ -142,8 +136,8 @@ size_t CompressedReadBufferBase::readCompressedData(size_t & size_decompressed,
|
||||
}
|
||||
}
|
||||
|
||||
size_compressed_without_checksum = ICompressionCodec::readCompressedBlockSize(compressed_header);
|
||||
size_decompressed = ICompressionCodec::readDecompressedBlockSize(compressed_header);
|
||||
size_compressed_without_checksum = ICompressionCodec::readCompressedBlockSize(compressed_buffer);
|
||||
size_decompressed = ICompressionCodec::readDecompressedBlockSize(compressed_buffer);
|
||||
|
||||
/// This is for clang static analyzer.
|
||||
assert(size_decompressed > 0);
|
||||
@ -157,8 +151,27 @@ size_t CompressedReadBufferBase::readCompressedData(size_t & size_decompressed,
|
||||
if (size_compressed_without_checksum < header_size)
|
||||
throw Exception("Can't decompress data: the compressed data size (" + toString(size_compressed_without_checksum)
|
||||
+ ", this should include header size) is less than the header size (" + toString(header_size) + ")", ErrorCodes::CORRUPTED_DATA);
|
||||
}
|
||||
|
||||
ProfileEvents::increment(ProfileEvents::ReadCompressedBytes, size_compressed_without_checksum + sizeof(Checksum));
|
||||
/// Read compressed data into compressed_buffer. Get size of decompressed data from block header. Checksum if need.
|
||||
/// Returns number of compressed bytes read.
|
||||
size_t CompressedReadBufferBase::readCompressedData(size_t & size_decompressed, size_t & size_compressed_without_checksum, bool always_copy)
|
||||
{
|
||||
if (compressed_in->eof())
|
||||
return 0;
|
||||
|
||||
UInt8 header_size = ICompressionCodec::getHeaderSize();
|
||||
own_compressed_buffer.resize(header_size + sizeof(Checksum));
|
||||
|
||||
compressed_in->readStrict(own_compressed_buffer.data(), sizeof(Checksum) + header_size);
|
||||
|
||||
readHeaderAndGetCodecAndSize(
|
||||
own_compressed_buffer.data() + sizeof(Checksum),
|
||||
header_size,
|
||||
codec,
|
||||
size_decompressed,
|
||||
size_compressed_without_checksum,
|
||||
allow_different_codecs);
|
||||
|
||||
auto additional_size_at_the_end_of_buffer = codec->getAdditionalSizeAtTheEndOfBuffer();
|
||||
|
||||
@ -184,9 +197,55 @@ size_t CompressedReadBufferBase::readCompressedData(size_t & size_decompressed,
|
||||
validateChecksum(compressed_buffer, size_compressed_without_checksum, checksum);
|
||||
}
|
||||
|
||||
ProfileEvents::increment(ProfileEvents::ReadCompressedBytes, size_compressed_without_checksum + sizeof(Checksum));
|
||||
return size_compressed_without_checksum + sizeof(Checksum);
|
||||
}
|
||||
|
||||
/// Read compressed data into compressed_buffer for asynchronous decompression to avoid the situation of "read compressed block across the compressed_in".
|
||||
size_t CompressedReadBufferBase::readCompressedDataBlockForAsynchronous(size_t & size_decompressed, size_t & size_compressed_without_checksum)
|
||||
{
|
||||
UInt8 header_size = ICompressionCodec::getHeaderSize();
|
||||
/// Make sure the whole header located in 'compressed_in->' buffer.
|
||||
if (compressed_in->eof() || (compressed_in->available() < (header_size + sizeof(Checksum))))
|
||||
return 0;
|
||||
|
||||
own_compressed_buffer.resize(header_size + sizeof(Checksum));
|
||||
compressed_in->readStrict(own_compressed_buffer.data(), sizeof(Checksum) + header_size);
|
||||
|
||||
readHeaderAndGetCodecAndSize(
|
||||
own_compressed_buffer.data() + sizeof(Checksum),
|
||||
header_size,
|
||||
codec,
|
||||
size_decompressed,
|
||||
size_compressed_without_checksum,
|
||||
allow_different_codecs);
|
||||
|
||||
auto additional_size_at_the_end_of_buffer = codec->getAdditionalSizeAtTheEndOfBuffer();
|
||||
|
||||
/// Make sure the whole compressed block located in 'compressed_in->' buffer.
|
||||
/// Otherwise, abandon header and restore original offset of compressed_in
|
||||
if (compressed_in->offset() >= header_size + sizeof(Checksum) &&
|
||||
compressed_in->available() >= (size_compressed_without_checksum - header_size) + additional_size_at_the_end_of_buffer + sizeof(Checksum))
|
||||
{
|
||||
compressed_in->position() -= header_size;
|
||||
compressed_buffer = compressed_in->position();
|
||||
compressed_in->position() += size_compressed_without_checksum;
|
||||
|
||||
if (!disable_checksum)
|
||||
{
|
||||
Checksum & checksum = *reinterpret_cast<Checksum *>(own_compressed_buffer.data());
|
||||
validateChecksum(compressed_buffer, size_compressed_without_checksum, checksum);
|
||||
}
|
||||
|
||||
ProfileEvents::increment(ProfileEvents::ReadCompressedBytes, size_compressed_without_checksum + sizeof(Checksum));
|
||||
return size_compressed_without_checksum + sizeof(Checksum);
|
||||
}
|
||||
else
|
||||
{
|
||||
compressed_in->position() -= (sizeof(Checksum) + header_size);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void readHeaderAndGetCodec(const char * compressed_buffer, size_t size_decompressed, CompressionCodecPtr & codec, bool allow_different_codecs)
|
||||
{
|
||||
@ -216,14 +275,12 @@ static void readHeaderAndGetCodec(const char * compressed_buffer, size_t size_de
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CompressedReadBufferBase::decompressTo(char * to, size_t size_decompressed, size_t size_compressed_without_checksum)
|
||||
{
|
||||
readHeaderAndGetCodec(compressed_buffer, size_decompressed, codec, allow_different_codecs);
|
||||
codec->decompress(compressed_buffer, size_compressed_without_checksum, to);
|
||||
}
|
||||
|
||||
|
||||
void CompressedReadBufferBase::decompress(BufferBase::Buffer & to, size_t size_decompressed, size_t size_compressed_without_checksum)
|
||||
{
|
||||
readHeaderAndGetCodec(compressed_buffer, size_decompressed, codec, allow_different_codecs);
|
||||
@ -245,6 +302,17 @@ void CompressedReadBufferBase::decompress(BufferBase::Buffer & to, size_t size_d
|
||||
codec->decompress(compressed_buffer, size_compressed_without_checksum, to.begin());
|
||||
}
|
||||
|
||||
void CompressedReadBufferBase::flushAsynchronousDecompressRequests() const
|
||||
{
|
||||
if (codec)
|
||||
codec->flushAsynchronousDecompressRequests();
|
||||
}
|
||||
|
||||
void CompressedReadBufferBase::setDecompressMode(ICompressionCodec::CodecMode mode) const
|
||||
{
|
||||
if (codec)
|
||||
codec->setDecompressMode(mode);
|
||||
}
|
||||
|
||||
/// 'compressed_in' could be initialized lazily, but before first call of 'readCompressedData'.
|
||||
CompressedReadBufferBase::CompressedReadBufferBase(ReadBuffer * in, bool allow_different_codecs_)
|
||||
@ -253,7 +321,7 @@ CompressedReadBufferBase::CompressedReadBufferBase(ReadBuffer * in, bool allow_d
|
||||
}
|
||||
|
||||
|
||||
CompressedReadBufferBase::~CompressedReadBufferBase() = default; /// Proper destruction of unique_ptr of forward-declared type.
|
||||
CompressedReadBufferBase::~CompressedReadBufferBase() = default; /// Proper destruction of unique_ptr of forward-declared type.
|
||||
|
||||
|
||||
}
|
||||
|
@ -39,6 +39,17 @@ protected:
|
||||
/// Returns number of compressed bytes read.
|
||||
size_t readCompressedData(size_t & size_decompressed, size_t & size_compressed_without_checksum, bool always_copy);
|
||||
|
||||
/// Read compressed data into compressed_buffer for asynchronous decompression to avoid the situation of "read compressed block across the compressed_in".
|
||||
///
|
||||
/// Compressed block may not be completely contained in "compressed_in" buffer which means compressed block may be read across the "compressed_in".
|
||||
/// For native LZ4/ZSTD, it has no problem in facing situation above because they are synchronous.
|
||||
/// But for asynchronous decompression, such as QPL deflate, it requires source and target buffer for decompression can not be overwritten until execution complete.
|
||||
///
|
||||
/// Returns number of compressed bytes read.
|
||||
/// If Returns value > 0, means the address range for current block are maintained in "compressed_in", then asynchronous decompression can be called to boost performance.
|
||||
/// If Returns value == 0, it means current block cannot be decompressed asynchronously.Meanwhile, asynchronous requests for previous blocks should be flushed if any.
|
||||
size_t readCompressedDataBlockForAsynchronous(size_t & size_decompressed, size_t & size_compressed_without_checksum);
|
||||
|
||||
/// Decompress into memory pointed by `to`
|
||||
void decompressTo(char * to, size_t size_decompressed, size_t size_compressed_without_checksum);
|
||||
|
||||
@ -46,6 +57,14 @@ protected:
|
||||
/// It is more efficient for compression codec NONE but not suitable if you want to decompress into specific location.
|
||||
void decompress(BufferBase::Buffer & to, size_t size_decompressed, size_t size_compressed_without_checksum);
|
||||
|
||||
/// Flush all asynchronous decompress request.
|
||||
void flushAsynchronousDecompressRequests() const;
|
||||
|
||||
/// Set decompression mode: Synchronous/Asynchronous/SoftwareFallback.
|
||||
/// The mode is "Synchronous" by default.
|
||||
/// flushAsynchronousDecompressRequests must be called subsequently once set "Asynchronous" mode.
|
||||
void setDecompressMode(ICompressionCodec::CodecMode mode) const;
|
||||
|
||||
public:
|
||||
/// 'compressed_in' could be initialized lazily, but before first call of 'readCompressedData'.
|
||||
explicit CompressedReadBufferBase(ReadBuffer * in = nullptr, bool allow_different_codecs_ = false);
|
||||
|
@ -91,6 +91,9 @@ void CompressedReadBufferFromFile::seek(size_t offset_in_compressed_file, size_t
|
||||
size_t CompressedReadBufferFromFile::readBig(char * to, size_t n)
|
||||
{
|
||||
size_t bytes_read = 0;
|
||||
/// The codec mode is only relevant for codecs which support hardware offloading.
|
||||
ICompressionCodec::CodecMode decompress_mode = ICompressionCodec::CodecMode::Synchronous;
|
||||
bool read_tail = false;
|
||||
|
||||
/// If there are unread bytes in the buffer, then we copy needed to `to`.
|
||||
if (pos < working_buffer.end())
|
||||
@ -102,10 +105,28 @@ size_t CompressedReadBufferFromFile::readBig(char * to, size_t n)
|
||||
size_t size_decompressed = 0;
|
||||
size_t size_compressed_without_checksum = 0;
|
||||
|
||||
size_t new_size_compressed = readCompressedData(size_decompressed, size_compressed_without_checksum, false);
|
||||
///Try to read block which is entirely located in a single 'compressed_in->' buffer.
|
||||
size_t new_size_compressed = readCompressedDataBlockForAsynchronous(size_decompressed, size_compressed_without_checksum);
|
||||
|
||||
if (new_size_compressed)
|
||||
{
|
||||
/// Current block is entirely located in a single 'compressed_in->' buffer.
|
||||
/// We can set asynchronous decompression mode if supported to boost performance.
|
||||
decompress_mode = ICompressionCodec::CodecMode::Asynchronous;
|
||||
}
|
||||
else
|
||||
{
|
||||
/// Current block cannot be decompressed asynchronously, means it probably span across two compressed_in buffers.
|
||||
/// Meanwhile, asynchronous requests for previous blocks should be flushed if any.
|
||||
flushAsynchronousDecompressRequests();
|
||||
/// Fallback to generic API
|
||||
new_size_compressed = readCompressedData(size_decompressed, size_compressed_without_checksum, false);
|
||||
decompress_mode = ICompressionCodec::CodecMode::Synchronous;
|
||||
}
|
||||
size_compressed = 0; /// file_in no longer points to the end of the block in working_buffer.
|
||||
|
||||
if (!new_size_compressed)
|
||||
return bytes_read;
|
||||
break;
|
||||
|
||||
auto additional_size_at_the_end_of_buffer = codec->getAdditionalSizeAtTheEndOfBuffer();
|
||||
|
||||
@ -113,6 +134,7 @@ size_t CompressedReadBufferFromFile::readBig(char * to, size_t n)
|
||||
/// need to skip some bytes in decompressed data (seek happened before readBig call).
|
||||
if (nextimpl_working_buffer_offset == 0 && size_decompressed + additional_size_at_the_end_of_buffer <= n - bytes_read)
|
||||
{
|
||||
setDecompressMode(decompress_mode);
|
||||
decompressTo(to + bytes_read, size_decompressed, size_compressed_without_checksum);
|
||||
bytes_read += size_decompressed;
|
||||
bytes += size_decompressed;
|
||||
@ -127,6 +149,8 @@ size_t CompressedReadBufferFromFile::readBig(char * to, size_t n)
|
||||
assert(size_decompressed + additional_size_at_the_end_of_buffer > 0);
|
||||
memory.resize(size_decompressed + additional_size_at_the_end_of_buffer);
|
||||
working_buffer = Buffer(memory.data(), &memory[size_decompressed]);
|
||||
/// Synchronous mode must be set since we need read partial data immediately from working buffer to target buffer.
|
||||
setDecompressMode(ICompressionCodec::CodecMode::Synchronous);
|
||||
decompress(working_buffer, size_decompressed, size_compressed_without_checksum);
|
||||
|
||||
/// Read partial data from first block. Won't run here at second block.
|
||||
@ -145,15 +169,25 @@ size_t CompressedReadBufferFromFile::readBig(char * to, size_t n)
|
||||
assert(size_decompressed + additional_size_at_the_end_of_buffer > 0);
|
||||
memory.resize(size_decompressed + additional_size_at_the_end_of_buffer);
|
||||
working_buffer = Buffer(memory.data(), &memory[size_decompressed]);
|
||||
// Asynchronous mode can be set here because working_buffer wouldn't be overwritten any more since this is the last block.
|
||||
setDecompressMode(ICompressionCodec::CodecMode::Asynchronous);
|
||||
decompress(working_buffer, size_decompressed, size_compressed_without_checksum);
|
||||
|
||||
///Read partial data from last block.
|
||||
pos = working_buffer.begin();
|
||||
bytes_read += read(to + bytes_read, n - bytes_read);
|
||||
read_tail = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/// Here we must make sure all asynchronous requests above are completely done.
|
||||
flushAsynchronousDecompressRequests();
|
||||
|
||||
if (read_tail)
|
||||
{
|
||||
/// Manually take nextimpl_working_buffer_offset into account, because we don't use
|
||||
/// nextImpl in this method.
|
||||
pos = working_buffer.begin();
|
||||
bytes_read += read(to + bytes_read, n - bytes_read);
|
||||
}
|
||||
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
|
413
src/Compression/CompressionCodecDeflateQpl.cpp
Normal file
413
src/Compression/CompressionCodecDeflateQpl.cpp
Normal file
@ -0,0 +1,413 @@
|
||||
#ifdef ENABLE_QPL_COMPRESSION
|
||||
#include <cstdio>
|
||||
#include <thread>
|
||||
#include <Compression/CompressionCodecDeflateQpl.h>
|
||||
#include <Compression/CompressionFactory.h>
|
||||
#include <Compression/CompressionInfo.h>
|
||||
#include <Parsers/ASTIdentifier.h>
|
||||
#include <Poco/Logger.h>
|
||||
#include <Common/logger_useful.h>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int CANNOT_COMPRESS;
|
||||
extern const int CANNOT_DECOMPRESS;
|
||||
}
|
||||
|
||||
std::array<qpl_job *, DeflateQplJobHWPool::MAX_HW_JOB_NUMBER> DeflateQplJobHWPool::hw_job_ptr_pool;
|
||||
std::array<std::atomic_bool, DeflateQplJobHWPool::MAX_HW_JOB_NUMBER> DeflateQplJobHWPool::hw_job_ptr_locks;
|
||||
bool DeflateQplJobHWPool::job_pool_ready = false;
|
||||
std::unique_ptr<uint8_t[]> DeflateQplJobHWPool::hw_jobs_buffer;
|
||||
|
||||
DeflateQplJobHWPool & DeflateQplJobHWPool::instance()
|
||||
{
|
||||
static DeflateQplJobHWPool pool;
|
||||
return pool;
|
||||
}
|
||||
|
||||
DeflateQplJobHWPool::DeflateQplJobHWPool()
|
||||
:random_engine(std::random_device()())
|
||||
,distribution(0, MAX_HW_JOB_NUMBER-1)
|
||||
{
|
||||
Poco::Logger * log = &Poco::Logger::get("DeflateQplJobHWPool");
|
||||
UInt32 job_size = 0;
|
||||
const char * qpl_version = qpl_get_library_version();
|
||||
|
||||
/// Get size required for saving a single qpl job object
|
||||
qpl_get_job_size(qpl_path_hardware, &job_size);
|
||||
/// Allocate entire buffer for storing all job objects
|
||||
hw_jobs_buffer = std::make_unique<uint8_t[]>(job_size * MAX_HW_JOB_NUMBER);
|
||||
/// Initialize pool for storing all job object pointers
|
||||
/// Reallocate buffer by shifting address offset for each job object.
|
||||
for (UInt32 index = 0; index < MAX_HW_JOB_NUMBER; ++index)
|
||||
{
|
||||
qpl_job * qpl_job_ptr = reinterpret_cast<qpl_job *>(hw_jobs_buffer.get() + index * job_size);
|
||||
if (qpl_init_job(qpl_path_hardware, qpl_job_ptr) != QPL_STS_OK)
|
||||
{
|
||||
job_pool_ready = false;
|
||||
LOG_WARNING(log, "Initialization of hardware-assisted DeflateQpl codec failed, falling back to software DeflateQpl codec. Please check if Intel In-Memory Analytics Accelerator (IAA) is properly set up. QPL Version: {}.",qpl_version);
|
||||
return;
|
||||
}
|
||||
hw_job_ptr_pool[index] = qpl_job_ptr;
|
||||
unLockJob(index);
|
||||
}
|
||||
|
||||
job_pool_ready = true;
|
||||
LOG_DEBUG(log, "Hardware-assisted DeflateQpl codec is ready! QPL Version: {}",qpl_version);
|
||||
}
|
||||
|
||||
DeflateQplJobHWPool::~DeflateQplJobHWPool()
|
||||
{
|
||||
for (UInt32 i = 0; i < MAX_HW_JOB_NUMBER; ++i)
|
||||
{
|
||||
if (hw_job_ptr_pool[i])
|
||||
{
|
||||
while (!tryLockJob(i));
|
||||
qpl_fini_job(hw_job_ptr_pool[i]);
|
||||
unLockJob(i);
|
||||
hw_job_ptr_pool[i] = nullptr;
|
||||
}
|
||||
}
|
||||
job_pool_ready = false;
|
||||
}
|
||||
|
||||
qpl_job * DeflateQplJobHWPool::acquireJob(UInt32 &job_id)
|
||||
{
|
||||
if (isJobPoolReady())
|
||||
{
|
||||
UInt32 retry = 0;
|
||||
auto index = distribution(random_engine);
|
||||
while (!tryLockJob(index))
|
||||
{
|
||||
index = distribution(random_engine);
|
||||
retry++;
|
||||
if (retry > MAX_HW_JOB_NUMBER)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
job_id = MAX_HW_JOB_NUMBER - index;
|
||||
assert(index < MAX_HW_JOB_NUMBER);
|
||||
return hw_job_ptr_pool[index];
|
||||
}
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void DeflateQplJobHWPool::releaseJob(UInt32 job_id)
|
||||
{
|
||||
if (isJobPoolReady())
|
||||
unLockJob(MAX_HW_JOB_NUMBER - job_id);
|
||||
}
|
||||
|
||||
bool DeflateQplJobHWPool::tryLockJob(UInt32 index)
|
||||
{
|
||||
bool expected = false;
|
||||
assert(index < MAX_HW_JOB_NUMBER);
|
||||
return hw_job_ptr_locks[index].compare_exchange_strong(expected, true);
|
||||
}
|
||||
|
||||
void DeflateQplJobHWPool::unLockJob(UInt32 index)
|
||||
{
|
||||
assert(index < MAX_HW_JOB_NUMBER);
|
||||
hw_job_ptr_locks[index].store(false);
|
||||
}
|
||||
|
||||
//HardwareCodecDeflateQpl
|
||||
HardwareCodecDeflateQpl::HardwareCodecDeflateQpl()
|
||||
:log(&Poco::Logger::get("HardwareCodecDeflateQpl"))
|
||||
{
|
||||
}
|
||||
|
||||
HardwareCodecDeflateQpl::~HardwareCodecDeflateQpl()
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
assert(decomp_async_job_map.empty());
|
||||
#else
|
||||
if (!decomp_async_job_map.empty())
|
||||
{
|
||||
LOG_WARNING(log, "Find un-released job when HardwareCodecDeflateQpl destroy");
|
||||
for (auto it : decomp_async_job_map)
|
||||
{
|
||||
DeflateQplJobHWPool::instance().releaseJob(it.first);
|
||||
}
|
||||
decomp_async_job_map.clear();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
Int32 HardwareCodecDeflateQpl::doCompressData(const char * source, UInt32 source_size, char * dest, UInt32 dest_size) const
|
||||
{
|
||||
UInt32 job_id = 0;
|
||||
qpl_job* job_ptr = nullptr;
|
||||
UInt32 compressed_size = 0;
|
||||
if (!(job_ptr = DeflateQplJobHWPool::instance().acquireJob(job_id)))
|
||||
{
|
||||
LOG_INFO(log, "DeflateQpl HW codec failed, falling back to SW codec.(Details: doCompressData->acquireJob fail, probably job pool exhausted)");
|
||||
return RET_ERROR;
|
||||
}
|
||||
|
||||
job_ptr->op = qpl_op_compress;
|
||||
job_ptr->next_in_ptr = reinterpret_cast<uint8_t *>(const_cast<char *>(source));
|
||||
job_ptr->next_out_ptr = reinterpret_cast<uint8_t *>(dest);
|
||||
job_ptr->available_in = source_size;
|
||||
job_ptr->level = qpl_default_level;
|
||||
job_ptr->available_out = dest_size;
|
||||
job_ptr->flags = QPL_FLAG_FIRST | QPL_FLAG_DYNAMIC_HUFFMAN | QPL_FLAG_LAST | QPL_FLAG_OMIT_VERIFY;
|
||||
|
||||
if (auto status = qpl_execute_job(job_ptr); status == QPL_STS_OK)
|
||||
{
|
||||
compressed_size = job_ptr->total_out;
|
||||
DeflateQplJobHWPool::instance().releaseJob(job_id);
|
||||
return compressed_size;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_WARNING(log, "DeflateQpl HW codec failed, falling back to SW codec.(Details: doCompressData->qpl_execute_job with error code: {} - please refer to qpl_status in ./contrib/qpl/include/qpl/c_api/status.h)", status);
|
||||
DeflateQplJobHWPool::instance().releaseJob(job_id);
|
||||
return RET_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
Int32 HardwareCodecDeflateQpl::doDecompressDataSynchronous(const char * source, UInt32 source_size, char * dest, UInt32 uncompressed_size)
|
||||
{
|
||||
UInt32 job_id = 0;
|
||||
qpl_job * job_ptr = nullptr;
|
||||
UInt32 decompressed_size = 0;
|
||||
if (!(job_ptr = DeflateQplJobHWPool::instance().acquireJob(job_id)))
|
||||
{
|
||||
LOG_INFO(log, "DeflateQpl HW codec failed, falling back to SW codec.(Details: doDecompressDataSynchronous->acquireJob fail, probably job pool exhausted)");
|
||||
return RET_ERROR;
|
||||
}
|
||||
|
||||
// Performing a decompression operation
|
||||
job_ptr->op = qpl_op_decompress;
|
||||
job_ptr->next_in_ptr = reinterpret_cast<uint8_t *>(const_cast<char *>(source));
|
||||
job_ptr->next_out_ptr = reinterpret_cast<uint8_t *>(dest);
|
||||
job_ptr->available_in = source_size;
|
||||
job_ptr->available_out = uncompressed_size;
|
||||
job_ptr->flags = QPL_FLAG_FIRST | QPL_FLAG_LAST;
|
||||
|
||||
if (auto status = qpl_submit_job(job_ptr); status != QPL_STS_OK)
|
||||
{
|
||||
DeflateQplJobHWPool::instance().releaseJob(job_id);
|
||||
LOG_WARNING(log, "DeflateQpl HW codec failed, falling back to SW codec.(Details: doDecompressDataSynchronous->qpl_execute_job with error code: {} - please refer to qpl_status in ./contrib/qpl/include/qpl/c_api/status.h)", status);
|
||||
return RET_ERROR;
|
||||
}
|
||||
/// Busy waiting till job complete.
|
||||
do
|
||||
{
|
||||
_tpause(1, __rdtsc() + 1000);
|
||||
} while (qpl_check_job(job_ptr) == QPL_STS_BEING_PROCESSED);
|
||||
|
||||
decompressed_size = job_ptr->total_out;
|
||||
DeflateQplJobHWPool::instance().releaseJob(job_id);
|
||||
return decompressed_size;
|
||||
}
|
||||
|
||||
Int32 HardwareCodecDeflateQpl::doDecompressDataAsynchronous(const char * source, UInt32 source_size, char * dest, UInt32 uncompressed_size)
|
||||
{
|
||||
UInt32 job_id = 0;
|
||||
qpl_job * job_ptr = nullptr;
|
||||
if (!(job_ptr = DeflateQplJobHWPool::instance().acquireJob(job_id)))
|
||||
{
|
||||
LOG_INFO(log, "DeflateQpl HW codec failed, falling back to SW codec.(Details: doDecompressDataAsynchronous->acquireJob fail, probably job pool exhausted)");
|
||||
return RET_ERROR;
|
||||
}
|
||||
|
||||
// Performing a decompression operation
|
||||
job_ptr->op = qpl_op_decompress;
|
||||
job_ptr->next_in_ptr = reinterpret_cast<uint8_t *>(const_cast<char *>(source));
|
||||
job_ptr->next_out_ptr = reinterpret_cast<uint8_t *>(dest);
|
||||
job_ptr->available_in = source_size;
|
||||
job_ptr->available_out = uncompressed_size;
|
||||
job_ptr->flags = QPL_FLAG_FIRST | QPL_FLAG_LAST;
|
||||
|
||||
if (auto status = qpl_submit_job(job_ptr); status == QPL_STS_OK)
|
||||
{
|
||||
decomp_async_job_map.insert({job_id, job_ptr});
|
||||
return job_id;
|
||||
}
|
||||
else
|
||||
{
|
||||
DeflateQplJobHWPool::instance().releaseJob(job_id);
|
||||
LOG_WARNING(log, "DeflateQpl HW codec failed, falling back to SW codec.(Details: doDecompressDataAsynchronous->qpl_execute_job with error code: {} - please refer to qpl_status in ./contrib/qpl/include/qpl/c_api/status.h)", status);
|
||||
return RET_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
void HardwareCodecDeflateQpl::flushAsynchronousDecompressRequests()
|
||||
{
|
||||
UInt32 n_jobs_processing = decomp_async_job_map.size();
|
||||
std::map<UInt32, qpl_job *>::iterator it = decomp_async_job_map.begin();
|
||||
|
||||
while (n_jobs_processing)
|
||||
{
|
||||
UInt32 job_id = 0;
|
||||
qpl_job * job_ptr = nullptr;
|
||||
job_id = it->first;
|
||||
job_ptr = it->second;
|
||||
|
||||
if (qpl_check_job(job_ptr) == QPL_STS_BEING_PROCESSED)
|
||||
{
|
||||
it++;
|
||||
}
|
||||
else
|
||||
{
|
||||
it = decomp_async_job_map.erase(it);
|
||||
DeflateQplJobHWPool::instance().releaseJob(job_id);
|
||||
n_jobs_processing--;
|
||||
if (n_jobs_processing <= 0)
|
||||
break;
|
||||
}
|
||||
if (it == decomp_async_job_map.end())
|
||||
{
|
||||
it = decomp_async_job_map.begin();
|
||||
_tpause(1, __rdtsc() + 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SoftwareCodecDeflateQpl::~SoftwareCodecDeflateQpl()
|
||||
{
|
||||
if (!sw_job)
|
||||
qpl_fini_job(sw_job);
|
||||
}
|
||||
|
||||
qpl_job * SoftwareCodecDeflateQpl::getJobCodecPtr()
|
||||
{
|
||||
if (!sw_job)
|
||||
{
|
||||
UInt32 size = 0;
|
||||
qpl_get_job_size(qpl_path_software, &size);
|
||||
|
||||
sw_buffer = std::make_unique<uint8_t[]>(size);
|
||||
sw_job = reinterpret_cast<qpl_job *>(sw_buffer.get());
|
||||
|
||||
// Job initialization
|
||||
if (auto status = qpl_init_job(qpl_path_software, sw_job); status != QPL_STS_OK)
|
||||
throw Exception(ErrorCodes::CANNOT_COMPRESS,
|
||||
"Initialization of DeflateQpl software fallback codec failed. (Details: qpl_init_job with error code: {} - please refer to qpl_status in ./contrib/qpl/include/qpl/c_api/status.h)", status);
|
||||
}
|
||||
return sw_job;
|
||||
}
|
||||
|
||||
UInt32 SoftwareCodecDeflateQpl::doCompressData(const char * source, UInt32 source_size, char * dest, UInt32 dest_size)
|
||||
{
|
||||
qpl_job * job_ptr = getJobCodecPtr();
|
||||
// Performing a compression operation
|
||||
job_ptr->op = qpl_op_compress;
|
||||
job_ptr->next_in_ptr = reinterpret_cast<uint8_t *>(const_cast<char *>(source));
|
||||
job_ptr->next_out_ptr = reinterpret_cast<uint8_t *>(dest);
|
||||
job_ptr->available_in = source_size;
|
||||
job_ptr->available_out = dest_size;
|
||||
job_ptr->level = qpl_default_level;
|
||||
job_ptr->flags = QPL_FLAG_FIRST | QPL_FLAG_DYNAMIC_HUFFMAN | QPL_FLAG_LAST | QPL_FLAG_OMIT_VERIFY;
|
||||
|
||||
if (auto status = qpl_execute_job(job_ptr); status != QPL_STS_OK)
|
||||
throw Exception(ErrorCodes::CANNOT_COMPRESS,
|
||||
"Execution of DeflateQpl software fallback codec failed. (Details: qpl_execute_job with error code: {} - please refer to qpl_status in ./contrib/qpl/include/qpl/c_api/status.h)", status);
|
||||
|
||||
return job_ptr->total_out;
|
||||
}
|
||||
|
||||
void SoftwareCodecDeflateQpl::doDecompressData(const char * source, UInt32 source_size, char * dest, UInt32 uncompressed_size)
|
||||
{
|
||||
qpl_job * job_ptr = getJobCodecPtr();
|
||||
|
||||
// Performing a decompression operation
|
||||
job_ptr->op = qpl_op_decompress;
|
||||
job_ptr->next_in_ptr = reinterpret_cast<uint8_t *>(const_cast<char *>(source));
|
||||
job_ptr->next_out_ptr = reinterpret_cast<uint8_t *>(dest);
|
||||
job_ptr->available_in = source_size;
|
||||
job_ptr->available_out = uncompressed_size;
|
||||
job_ptr->flags = QPL_FLAG_FIRST | QPL_FLAG_LAST;
|
||||
|
||||
if (auto status = qpl_execute_job(job_ptr); status != QPL_STS_OK)
|
||||
throw Exception(ErrorCodes::CANNOT_DECOMPRESS,
|
||||
"Execution of DeflateQpl software fallback codec failed. (Details: qpl_execute_job with error code: {} - please refer to qpl_status in ./contrib/qpl/include/qpl/c_api/status.h)", status);
|
||||
}
|
||||
|
||||
//CompressionCodecDeflateQpl
|
||||
CompressionCodecDeflateQpl::CompressionCodecDeflateQpl()
|
||||
:hw_codec(std::make_unique<HardwareCodecDeflateQpl>())
|
||||
,sw_codec(std::make_unique<SoftwareCodecDeflateQpl>())
|
||||
{
|
||||
setCodecDescription("DEFLATE_QPL");
|
||||
}
|
||||
|
||||
uint8_t CompressionCodecDeflateQpl::getMethodByte() const
|
||||
{
|
||||
return static_cast<uint8_t>(CompressionMethodByte::DeflateQpl);
|
||||
}
|
||||
|
||||
void CompressionCodecDeflateQpl::updateHash(SipHash & hash) const
|
||||
{
|
||||
getCodecDesc()->updateTreeHash(hash);
|
||||
}
|
||||
|
||||
UInt32 CompressionCodecDeflateQpl::getMaxCompressedDataSize(UInt32 uncompressed_size) const
|
||||
{
|
||||
/// Aligned with ZLIB
|
||||
return ((uncompressed_size) + ((uncompressed_size) >> 12) + ((uncompressed_size) >> 14) + ((uncompressed_size) >> 25) + 13);
|
||||
}
|
||||
|
||||
UInt32 CompressionCodecDeflateQpl::doCompressData(const char * source, UInt32 source_size, char * dest) const
|
||||
{
|
||||
Int32 res = HardwareCodecDeflateQpl::RET_ERROR;
|
||||
if (DeflateQplJobHWPool::instance().isJobPoolReady())
|
||||
res = hw_codec->doCompressData(source, source_size, dest, getMaxCompressedDataSize(source_size));
|
||||
if (res == HardwareCodecDeflateQpl::RET_ERROR)
|
||||
res = sw_codec->doCompressData(source, source_size, dest, getMaxCompressedDataSize(source_size));
|
||||
return res;
|
||||
}
|
||||
|
||||
void CompressionCodecDeflateQpl::doDecompressData(const char * source, UInt32 source_size, char * dest, UInt32 uncompressed_size) const
|
||||
{
|
||||
switch (getDecompressMode())
|
||||
{
|
||||
case CodecMode::Synchronous:
|
||||
{
|
||||
Int32 res = HardwareCodecDeflateQpl::RET_ERROR;
|
||||
if (DeflateQplJobHWPool::instance().isJobPoolReady())
|
||||
{
|
||||
res = hw_codec->doDecompressDataSynchronous(source, source_size, dest, uncompressed_size);
|
||||
if (res == HardwareCodecDeflateQpl::RET_ERROR)
|
||||
sw_codec->doDecompressData(source, source_size, dest, uncompressed_size);
|
||||
}
|
||||
else
|
||||
sw_codec->doDecompressData(source, source_size, dest, uncompressed_size);
|
||||
return;
|
||||
}
|
||||
case CodecMode::Asynchronous:
|
||||
{
|
||||
Int32 res = HardwareCodecDeflateQpl::RET_ERROR;
|
||||
if (DeflateQplJobHWPool::instance().isJobPoolReady())
|
||||
res = hw_codec->doDecompressDataAsynchronous(source, source_size, dest, uncompressed_size);
|
||||
if (res == HardwareCodecDeflateQpl::RET_ERROR)
|
||||
sw_codec->doDecompressData(source, source_size, dest, uncompressed_size);
|
||||
return;
|
||||
}
|
||||
case CodecMode::SoftwareFallback:
|
||||
sw_codec->doDecompressData(source, source_size, dest, uncompressed_size);
|
||||
return;
|
||||
}
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
void CompressionCodecDeflateQpl::flushAsynchronousDecompressRequests()
|
||||
{
|
||||
if (DeflateQplJobHWPool::instance().isJobPoolReady())
|
||||
hw_codec->flushAsynchronousDecompressRequests();
|
||||
/// After flush previous all async requests, we must restore mode to be synchronous by default.
|
||||
setDecompressMode(CodecMode::Synchronous);
|
||||
}
|
||||
void registerCodecDeflateQpl(CompressionCodecFactory & factory)
|
||||
{
|
||||
factory.registerSimpleCompressionCodec(
|
||||
"DEFLATE_QPL", static_cast<char>(CompressionMethodByte::DeflateQpl), [&]() { return std::make_shared<CompressionCodecDeflateQpl>(); });
|
||||
}
|
||||
}
|
||||
#endif
|
120
src/Compression/CompressionCodecDeflateQpl.h
Normal file
120
src/Compression/CompressionCodecDeflateQpl.h
Normal file
@ -0,0 +1,120 @@
|
||||
#pragma once
|
||||
|
||||
#include <Compression/ICompressionCodec.h>
|
||||
#include <qpl/qpl.h>
|
||||
#include <random>
|
||||
|
||||
namespace Poco
|
||||
{
|
||||
class Logger;
|
||||
}
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
/// DeflateQplJobHWPool is resource pool to provide the job objects.
|
||||
/// Job object is used for storing context information during offloading compression job to HW Accelerator.
|
||||
class DeflateQplJobHWPool
|
||||
{
|
||||
public:
|
||||
DeflateQplJobHWPool();
|
||||
|
||||
~DeflateQplJobHWPool();
|
||||
|
||||
qpl_job * acquireJob(UInt32 &job_id);
|
||||
|
||||
static void releaseJob(UInt32 job_id);
|
||||
|
||||
static const bool & isJobPoolReady() { return job_pool_ready; }
|
||||
|
||||
static DeflateQplJobHWPool & instance();
|
||||
|
||||
private:
|
||||
static bool tryLockJob(UInt32 index);
|
||||
|
||||
static void unLockJob(UInt32 index);
|
||||
|
||||
/// Maximum jobs running in parallel supported by IAA hardware
|
||||
static constexpr auto MAX_HW_JOB_NUMBER = 1024;
|
||||
/// Entire buffer for storing all job objects
|
||||
static std::unique_ptr<uint8_t[]> hw_jobs_buffer;
|
||||
/// Job pool for storing all job object pointers
|
||||
static std::array<qpl_job *, DeflateQplJobHWPool::MAX_HW_JOB_NUMBER> hw_job_ptr_pool;
|
||||
/// Locks for accessing each job object pointers
|
||||
static std::array<std::atomic_bool, DeflateQplJobHWPool::MAX_HW_JOB_NUMBER> hw_job_ptr_locks;
|
||||
static bool job_pool_ready;
|
||||
std::mt19937 random_engine;
|
||||
std::uniform_int_distribution<int> distribution;
|
||||
};
|
||||
|
||||
class SoftwareCodecDeflateQpl
|
||||
{
|
||||
public:
|
||||
~SoftwareCodecDeflateQpl();
|
||||
UInt32 doCompressData(const char * source, UInt32 source_size, char * dest, UInt32 dest_size);
|
||||
void doDecompressData(const char * source, UInt32 source_size, char * dest, UInt32 uncompressed_size);
|
||||
|
||||
private:
|
||||
qpl_job * sw_job = nullptr;
|
||||
std::unique_ptr<uint8_t[]> sw_buffer;
|
||||
qpl_job * getJobCodecPtr();
|
||||
};
|
||||
|
||||
class HardwareCodecDeflateQpl
|
||||
{
|
||||
public:
|
||||
/// RET_ERROR stands for hardware codec fail,need fallback to software codec.
|
||||
static constexpr Int32 RET_ERROR = -1;
|
||||
|
||||
HardwareCodecDeflateQpl();
|
||||
~HardwareCodecDeflateQpl();
|
||||
Int32 doCompressData(const char * source, UInt32 source_size, char * dest, UInt32 dest_size) const;
|
||||
|
||||
///Submit job request to the IAA hardware and then busy waiting till it complete.
|
||||
Int32 doDecompressDataSynchronous(const char * source, UInt32 source_size, char * dest, UInt32 uncompressed_size);
|
||||
|
||||
///Submit job request to the IAA hardware and return immediately. IAA hardware will process decompression jobs automatically.
|
||||
Int32 doDecompressDataAsynchronous(const char * source, UInt32 source_size, char * dest, UInt32 uncompressed_size);
|
||||
|
||||
/// Flush result for all previous requests which means busy waiting till all the jobs in "decomp_async_job_map" are finished.
|
||||
/// Must be called subsequently after several calls of doDecompressDataReq.
|
||||
void flushAsynchronousDecompressRequests();
|
||||
|
||||
private:
|
||||
/// Asynchronous job map for decompression: job ID - job object.
|
||||
/// For each submission, push job ID && job object into this map;
|
||||
/// For flush, pop out job ID && job object from this map. Use job ID to release job lock and use job object to check job status till complete.
|
||||
std::map<UInt32, qpl_job *> decomp_async_job_map;
|
||||
Poco::Logger * log;
|
||||
};
|
||||
|
||||
class CompressionCodecDeflateQpl : public ICompressionCodec
|
||||
{
|
||||
public:
|
||||
CompressionCodecDeflateQpl();
|
||||
uint8_t getMethodByte() const override;
|
||||
void updateHash(SipHash & hash) const override;
|
||||
|
||||
protected:
|
||||
bool isCompression() const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool isGenericCompression() const override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
UInt32 doCompressData(const char * source, UInt32 source_size, char * dest) const override;
|
||||
void doDecompressData(const char * source, UInt32 source_size, char * dest, UInt32 uncompressed_size) const override;
|
||||
///Flush result for previous asynchronous decompression requests on asynchronous mode.
|
||||
void flushAsynchronousDecompressRequests() override;
|
||||
|
||||
private:
|
||||
UInt32 getMaxCompressedDataSize(UInt32 uncompressed_size) const override;
|
||||
std::unique_ptr<HardwareCodecDeflateQpl> hw_codec;
|
||||
std::unique_ptr<SoftwareCodecDeflateQpl> sw_codec;
|
||||
};
|
||||
|
||||
}
|
@ -166,7 +166,7 @@ void registerCodecLZ4(CompressionCodecFactory & factory);
|
||||
void registerCodecLZ4HC(CompressionCodecFactory & factory);
|
||||
void registerCodecZSTD(CompressionCodecFactory & factory);
|
||||
void registerCodecMultiple(CompressionCodecFactory & factory);
|
||||
|
||||
void registerCodecDeflateQpl(CompressionCodecFactory & factory);
|
||||
|
||||
/// Keeper use only general-purpose codecs, so we don't need these special codecs
|
||||
/// in standalone build
|
||||
@ -188,7 +188,6 @@ CompressionCodecFactory::CompressionCodecFactory()
|
||||
registerCodecZSTD(*this);
|
||||
registerCodecLZ4HC(*this);
|
||||
registerCodecMultiple(*this);
|
||||
|
||||
#ifndef KEEPER_STANDALONE_BUILD
|
||||
registerCodecDelta(*this);
|
||||
registerCodecT64(*this);
|
||||
@ -196,6 +195,9 @@ CompressionCodecFactory::CompressionCodecFactory()
|
||||
registerCodecGorilla(*this);
|
||||
registerCodecEncrypted(*this);
|
||||
registerCodecFPC(*this);
|
||||
#ifdef ENABLE_QPL_COMPRESSION
|
||||
registerCodecDeflateQpl(*this);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
default_codec = get("LZ4", {});
|
||||
|
@ -45,7 +45,8 @@ enum class CompressionMethodByte : uint8_t
|
||||
Gorilla = 0x95,
|
||||
AES_128_GCM_SIV = 0x96,
|
||||
AES_256_GCM_SIV = 0x97,
|
||||
FPC = 0x98
|
||||
FPC = 0x98,
|
||||
DeflateQpl = 0x99,
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -91,7 +91,6 @@ UInt32 ICompressionCodec::compress(const char * source, UInt32 source_size, char
|
||||
return header_size + compressed_bytes_written;
|
||||
}
|
||||
|
||||
|
||||
UInt32 ICompressionCodec::decompress(const char * source, UInt32 source_size, char * dest) const
|
||||
{
|
||||
assert(source != nullptr && dest != nullptr);
|
||||
|
@ -45,9 +45,37 @@ public:
|
||||
/// Compressed bytes from uncompressed source to dest. Dest should preallocate memory
|
||||
UInt32 compress(const char * source, UInt32 source_size, char * dest) const;
|
||||
|
||||
/// Decompress bytes from compressed source to dest. Dest should preallocate memory
|
||||
/// Decompress bytes from compressed source to dest. Dest should preallocate memory;
|
||||
UInt32 decompress(const char * source, UInt32 source_size, char * dest) const;
|
||||
|
||||
/// Three kinds of codec mode:
|
||||
/// Synchronous mode which is commonly used by default;
|
||||
/// --- For the codec with HW decompressor, it means submit request to HW and busy wait till complete.
|
||||
/// Asynchronous mode which required HW decompressor support;
|
||||
/// --- For the codec with HW decompressor, it means submit request to HW and return immediately.
|
||||
/// --- Must be used in pair with flushAsynchronousDecompressRequests.
|
||||
/// SoftwareFallback mode is exclusively defined for the codec with HW decompressor, enable its capability of "fallback to SW codec".
|
||||
enum class CodecMode
|
||||
{
|
||||
Synchronous,
|
||||
Asynchronous,
|
||||
SoftwareFallback
|
||||
};
|
||||
|
||||
/// Get current decompression mode
|
||||
CodecMode getDecompressMode() const{ return decompressMode; }
|
||||
|
||||
/// if set mode to CodecMode::Asynchronous, must be followed with flushAsynchronousDecompressRequests
|
||||
void setDecompressMode(CodecMode mode){ decompressMode = mode; }
|
||||
|
||||
/// Flush result for previous asynchronous decompression requests.
|
||||
/// This function must be called following several requests offload to HW.
|
||||
/// To make sure asynchronous results have been flushed into target buffer completely.
|
||||
/// Meanwhile, source and target buffer for decompression can not be overwritten until this function execute completely.
|
||||
/// Otherwise it would conflict with HW offloading and cause exception.
|
||||
/// For QPL deflate, it support the maximum number of requests equal to DeflateQplJobHWPool::jobPoolSize
|
||||
virtual void flushAsynchronousDecompressRequests(){}
|
||||
|
||||
/// Number of bytes, that will be used to compress uncompressed_size bytes with current codec
|
||||
virtual UInt32 getCompressedReserveSize(UInt32 uncompressed_size) const
|
||||
{
|
||||
@ -103,6 +131,7 @@ protected:
|
||||
|
||||
private:
|
||||
ASTPtr full_codec_desc;
|
||||
CodecMode decompressMode{CodecMode::Synchronous};
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -24,6 +24,12 @@
|
||||
#include <arm_neon.h>
|
||||
#endif
|
||||
|
||||
static inline UInt16 LZ4_readLE16(const void* mem_ptr)
|
||||
{
|
||||
const UInt8* p = reinterpret_cast<const UInt8*>(mem_ptr);
|
||||
return static_cast<UInt16>(p[0]) + (p[1] << 8);
|
||||
}
|
||||
|
||||
namespace LZ4
|
||||
{
|
||||
|
||||
@ -561,7 +567,7 @@ bool NO_INLINE decompressImpl(
|
||||
|
||||
/// Get match offset.
|
||||
|
||||
size_t offset = unalignedLoad<UInt16>(ip);
|
||||
size_t offset = LZ4_readLE16(ip);
|
||||
ip += 2;
|
||||
const UInt8 * match = op - offset;
|
||||
|
||||
|
@ -769,6 +769,7 @@ static constexpr UInt64 operator""_GiB(unsigned long long value)
|
||||
M(Bool, output_format_pretty_row_numbers, false, "Add row numbers before each row for pretty output format", 0) \
|
||||
M(Bool, insert_distributed_one_random_shard, false, "If setting is enabled, inserting into distributed table will choose a random shard to write when there is no sharding key", 0) \
|
||||
\
|
||||
M(Bool, exact_rows_before_limit, false, "When enabled, ClickHouse will provide exact value for rows_before_limit_at_least statistic, but with the cost that the data before limit will have to be read completely", 0) \
|
||||
M(UInt64, cross_to_inner_join_rewrite, 1, "Use inner join instead of comma/cross join if there're joining expressions in the WHERE section. Values: 0 - no rewrite, 1 - apply if possible for comma/cross, 2 - force rewrite all comma joins, cross - if possible", 0) \
|
||||
\
|
||||
M(Bool, output_format_arrow_low_cardinality_as_dictionary, false, "Enable output LowCardinality type as Dictionary Arrow type", 0) \
|
||||
|
@ -168,6 +168,8 @@ bool AsynchronousReadIndirectBufferFromRemoteFS::nextImpl()
|
||||
CurrentMetrics::Increment metric_increment{CurrentMetrics::AsynchronousReadWait};
|
||||
|
||||
size_t size = 0;
|
||||
size_t bytes_read = 0;
|
||||
|
||||
if (prefetch_future.valid())
|
||||
{
|
||||
ProfileEvents::increment(ProfileEvents::RemoteFSPrefetchedReads);
|
||||
@ -181,6 +183,8 @@ bool AsynchronousReadIndirectBufferFromRemoteFS::nextImpl()
|
||||
|
||||
/// If prefetch_future is valid, size should always be greater than zero.
|
||||
assert(offset <= size);
|
||||
bytes_read = size - offset;
|
||||
|
||||
ProfileEvents::increment(ProfileEvents::AsynchronousReadWaitMicroseconds, watch.elapsedMicroseconds());
|
||||
}
|
||||
|
||||
@ -200,9 +204,11 @@ bool AsynchronousReadIndirectBufferFromRemoteFS::nextImpl()
|
||||
auto offset = result.offset;
|
||||
|
||||
LOG_TEST(log, "Current size: {}, offset: {}", size, offset);
|
||||
assert(offset <= size);
|
||||
|
||||
if (size)
|
||||
assert(offset <= size);
|
||||
bytes_read = size - offset;
|
||||
|
||||
if (bytes_read)
|
||||
{
|
||||
/// Adjust the working buffer so that it ignores `offset` bytes.
|
||||
internal_buffer = Buffer(memory.data(), memory.data() + memory.size());
|
||||
@ -222,7 +228,7 @@ bool AsynchronousReadIndirectBufferFromRemoteFS::nextImpl()
|
||||
assert(file_offset_of_buffer_end <= impl->getFileSize());
|
||||
|
||||
prefetch_future = {};
|
||||
return size;
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
|
||||
|
@ -55,10 +55,6 @@ if (TARGET ch_contrib::llvm)
|
||||
target_link_libraries(clickhouse_functions PRIVATE ch_contrib::llvm)
|
||||
endif ()
|
||||
|
||||
if (TARGET ch_contrib::base-x)
|
||||
target_link_libraries(clickhouse_functions PRIVATE ch_contrib::base-x)
|
||||
endif()
|
||||
|
||||
if (TARGET ch_contrib::base64)
|
||||
target_link_libraries(clickhouse_functions PRIVATE ch_contrib::base64)
|
||||
endif()
|
||||
|
@ -1,15 +1,13 @@
|
||||
#pragma once
|
||||
#include "config_functions.h"
|
||||
|
||||
#if USE_BASEX
|
||||
# include <Columns/ColumnConst.h>
|
||||
# include <Common/MemorySanitizer.h>
|
||||
# include <Columns/ColumnString.h>
|
||||
# include <DataTypes/DataTypeString.h>
|
||||
# include <Functions/FunctionFactory.h>
|
||||
# include <Functions/FunctionHelpers.h>
|
||||
# include <IO/WriteHelpers.h>
|
||||
# include <base_x.hh>
|
||||
#include <Columns/ColumnConst.h>
|
||||
#include <Common/MemorySanitizer.h>
|
||||
#include <Columns/ColumnString.h>
|
||||
#include <DataTypes/DataTypeString.h>
|
||||
#include <Functions/FunctionFactory.h>
|
||||
#include <Functions/FunctionHelpers.h>
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <Common/base58.h>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
namespace DB
|
||||
@ -26,72 +24,37 @@ struct Base58Encode
|
||||
{
|
||||
static constexpr auto name = "base58Encode";
|
||||
|
||||
static void process(const ColumnString & input, ColumnString::MutablePtr & dst_column, const std::string & alphabet, size_t input_rows_count)
|
||||
static void process(const ColumnString & src_column, ColumnString::MutablePtr & dst_column, size_t input_rows_count)
|
||||
{
|
||||
auto & dst_data = dst_column->getChars();
|
||||
auto & dst_offsets = dst_column->getOffsets();
|
||||
|
||||
/// Wikipedia states Base58 has efficiency of 73%, and we take 1.5 scale to avoid reallocation in most cases
|
||||
size_t current_allocated_size = ceil(1.5 * input.getChars().size());
|
||||
/// Base58 has efficiency of 73% (8/11) [https://monerodocs.org/cryptography/base58/],
|
||||
/// and we take double scale to avoid any reallocation.
|
||||
|
||||
dst_data.resize(current_allocated_size);
|
||||
size_t max_result_size = ceil(2 * src_column.getChars().size() + 1);
|
||||
|
||||
dst_data.resize(max_result_size);
|
||||
dst_offsets.resize(input_rows_count);
|
||||
|
||||
const ColumnString::Offsets & src_offsets = input.getOffsets();
|
||||
const ColumnString::Offsets & src_offsets = src_column.getOffsets();
|
||||
|
||||
const auto * source = input.getChars().raw_data();
|
||||
const auto * src = src_column.getChars().data();
|
||||
auto * dst = dst_data.data();
|
||||
auto * dst_pos = dst;
|
||||
|
||||
size_t src_offset_prev = 0;
|
||||
size_t processed_size = 0;
|
||||
|
||||
const auto& encoder = (alphabet == "bitcoin") ? Base58::bitcoin() :
|
||||
((alphabet == "flickr") ? Base58::flickr() :
|
||||
((alphabet == "ripple") ? Base58::ripple() :
|
||||
Base58::base58())); //GMP
|
||||
|
||||
std::string encoded;
|
||||
for (size_t row = 0; row < input_rows_count; ++row)
|
||||
{
|
||||
size_t srclen = src_offsets[row] - src_offset_prev - 1;
|
||||
/// Why we didn't use char* here?
|
||||
/// We don't know the size of the result string beforehand (it's not byte-to-byte encoding),
|
||||
/// so we may need to do many resizes (the worst case -- we'll do it for each row)
|
||||
/// This way we do exponential resizes and one final resize after whole operation is complete
|
||||
encoded.clear();
|
||||
if (srclen)
|
||||
try
|
||||
{
|
||||
encoder.encode(encoded, source, srclen);
|
||||
}
|
||||
catch (const std::invalid_argument& e)
|
||||
{
|
||||
throw Exception(e.what(), ErrorCodes::BAD_ARGUMENTS);
|
||||
}
|
||||
catch (const std::domain_error& e)
|
||||
{
|
||||
throw Exception(e.what(), ErrorCodes::BAD_ARGUMENTS);
|
||||
}
|
||||
size_t outlen = encoded.size();
|
||||
size_t srclen = src_offsets[row] - src_offset_prev;
|
||||
auto encoded_size = encodeBase58(src, dst_pos);
|
||||
|
||||
if (processed_size + outlen >= current_allocated_size)
|
||||
{
|
||||
current_allocated_size += current_allocated_size;
|
||||
dst_data.resize(current_allocated_size);
|
||||
auto processed_offset = dst_pos - dst;
|
||||
dst = dst_data.data();
|
||||
dst_pos = dst;
|
||||
dst_pos += processed_offset;
|
||||
}
|
||||
std::memcpy(dst_pos, encoded.c_str(), ++outlen);
|
||||
|
||||
source += srclen + 1;
|
||||
dst_pos += outlen;
|
||||
src += srclen;
|
||||
dst_pos += encoded_size;
|
||||
|
||||
dst_offsets[row] = dst_pos - dst;
|
||||
src_offset_prev = src_offsets[row];
|
||||
processed_size += outlen;
|
||||
}
|
||||
|
||||
dst_data.resize(dst_pos - dst);
|
||||
@ -102,72 +65,40 @@ struct Base58Decode
|
||||
{
|
||||
static constexpr auto name = "base58Decode";
|
||||
|
||||
static void process(const ColumnString & input, ColumnString::MutablePtr & dst_column, const std::string & alphabet, size_t input_rows_count)
|
||||
static void process(const ColumnString & src_column, ColumnString::MutablePtr & dst_column, size_t input_rows_count)
|
||||
{
|
||||
auto & dst_data = dst_column->getChars();
|
||||
auto & dst_offsets = dst_column->getOffsets();
|
||||
|
||||
/// We allocate probably even more then needed to avoid many resizes
|
||||
size_t current_allocated_size = input.getChars().size();
|
||||
/// Base58 has efficiency of 73% (8/11) [https://monerodocs.org/cryptography/base58/],
|
||||
/// and decoded value will be no longer than source.
|
||||
|
||||
dst_data.resize(current_allocated_size);
|
||||
size_t max_result_size = src_column.getChars().size() + 1;
|
||||
|
||||
dst_data.resize(max_result_size);
|
||||
dst_offsets.resize(input_rows_count);
|
||||
|
||||
const ColumnString::Offsets & src_offsets = input.getOffsets();
|
||||
const ColumnString::Offsets & src_offsets = src_column.getOffsets();
|
||||
|
||||
const auto * source = input.getChars().raw_data();
|
||||
const auto * src = src_column.getChars().data();
|
||||
auto * dst = dst_data.data();
|
||||
auto * dst_pos = dst;
|
||||
|
||||
size_t src_offset_prev = 0;
|
||||
size_t processed_size = 0;
|
||||
|
||||
const auto& decoder = (alphabet == "bitcoin") ? Base58::bitcoin() :
|
||||
((alphabet == "flickr") ? Base58::flickr() :
|
||||
((alphabet == "ripple") ? Base58::ripple() :
|
||||
Base58::base58()));
|
||||
|
||||
std::string decoded;
|
||||
for (size_t row = 0; row < input_rows_count; ++row)
|
||||
{
|
||||
size_t srclen = src_offsets[row] - src_offset_prev - 1;
|
||||
/// Why we didn't use char* here?
|
||||
/// We don't know the size of the result string beforehand (it's not byte-to-byte encoding),
|
||||
/// so we may need to do many resizes (the worst case -- we'll do it for each row)
|
||||
/// This way we do exponential resizes and one final resize after whole operation is complete
|
||||
decoded.clear();
|
||||
if (srclen)
|
||||
try
|
||||
{
|
||||
decoder.decode(decoded, source, srclen);
|
||||
}
|
||||
catch (const std::invalid_argument& e)
|
||||
{
|
||||
throw Exception(e.what(), ErrorCodes::BAD_ARGUMENTS);
|
||||
}
|
||||
catch (const std::domain_error& e)
|
||||
{
|
||||
throw Exception(e.what(), ErrorCodes::BAD_ARGUMENTS);
|
||||
}
|
||||
size_t outlen = decoded.size();
|
||||
size_t srclen = src_offsets[row] - src_offset_prev;
|
||||
|
||||
if (processed_size + outlen >= current_allocated_size)
|
||||
{
|
||||
current_allocated_size += current_allocated_size;
|
||||
dst_data.resize(current_allocated_size);
|
||||
auto processed_offset = dst_pos - dst;
|
||||
dst = dst_data.data();
|
||||
dst_pos = dst;
|
||||
dst_pos += processed_offset;
|
||||
}
|
||||
std::memcpy(dst_pos, decoded.c_str(), ++outlen);
|
||||
auto decoded_size = decodeBase58(src, dst_pos);
|
||||
if (!decoded_size)
|
||||
throw Exception("Invalid Base58 value, cannot be decoded", ErrorCodes::BAD_ARGUMENTS);
|
||||
|
||||
source += srclen + 1;
|
||||
dst_pos += outlen;
|
||||
src += srclen;
|
||||
dst_pos += decoded_size;
|
||||
|
||||
dst_offsets[row] = dst_pos - dst;
|
||||
src_offset_prev = src_offsets[row];
|
||||
processed_size += outlen;
|
||||
}
|
||||
|
||||
dst_data.resize(dst_pos - dst);
|
||||
@ -190,9 +121,7 @@ public:
|
||||
return Func::name;
|
||||
}
|
||||
|
||||
bool isVariadic() const override { return true; }
|
||||
|
||||
size_t getNumberOfArguments() const override { return 0; }
|
||||
size_t getNumberOfArguments() const override { return 1; }
|
||||
|
||||
bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }
|
||||
|
||||
@ -202,19 +131,12 @@ public:
|
||||
|
||||
DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
|
||||
{
|
||||
if (arguments.size() != 1 && arguments.size() != 2)
|
||||
throw Exception(
|
||||
"Wrong number of arguments for function " + getName() + ": 1 or 2 expected.",
|
||||
ErrorCodes::BAD_ARGUMENTS);
|
||||
if (arguments.size() != 1)
|
||||
throw Exception("Wrong number of arguments for function " + getName() + ": 1 expected.", ErrorCodes::BAD_ARGUMENTS);
|
||||
|
||||
if (!isString(arguments[0].type))
|
||||
throw Exception(
|
||||
"Illegal type " + arguments[0].type->getName() + " of 1st argument of function " + getName() + ". Must be String.",
|
||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
|
||||
if (arguments.size() == 2 && !isString(arguments[1].type))
|
||||
throw Exception(
|
||||
"Illegal type " + arguments[1].type->getName() + " of 2nd argument of function " + getName() + ". Must be String.",
|
||||
"Illegal type " + arguments[0].type->getName() + " of first argument of function " + getName() + ". Must be String.",
|
||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
|
||||
return std::make_shared<DataTypeString>();
|
||||
@ -229,28 +151,11 @@ public:
|
||||
"Illegal column " + arguments[0].column->getName() + " of first argument of function " + getName() + ", must be String",
|
||||
ErrorCodes::ILLEGAL_COLUMN);
|
||||
|
||||
std::string alphabet = "bitcoin";
|
||||
|
||||
if (arguments.size() == 2)
|
||||
{
|
||||
const auto * alphabet_column = checkAndGetColumn<ColumnConst>(arguments[1].column.get());
|
||||
|
||||
if (!alphabet_column)
|
||||
throw Exception("Second argument for function " + getName() + " must be constant String", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
|
||||
alphabet = alphabet_column->getValue<DB::String>();
|
||||
if (alphabet != "bitcoin" && alphabet != "ripple" && alphabet != "flickr" && alphabet != "gmp")
|
||||
throw Exception("Second argument for function " + getName() + " must be 'bitcoin', 'ripple', 'gmp' or 'flickr'", ErrorCodes::ILLEGAL_COLUMN);
|
||||
|
||||
}
|
||||
|
||||
auto dst_column = ColumnString::create();
|
||||
|
||||
Func::process(*input, dst_column, alphabet, input_rows_count);
|
||||
Func::process(*input, dst_column, input_rows_count);
|
||||
|
||||
return dst_column;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -1,5 +1,4 @@
|
||||
#include <Functions/FunctionBase58Conversion.h>
|
||||
#if USE_BASEX
|
||||
#include <Functions/FunctionFactory.h>
|
||||
|
||||
namespace DB
|
||||
@ -14,4 +13,3 @@ void registerFunctionBase58Decode(FunctionFactory & factory)
|
||||
factory.registerFunction<FunctionBase58Conversion<Base58Decode>>();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -44,7 +44,10 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool isDeterministic() const override { return false; }
|
||||
bool isDeterministic() const override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isDeterministicInScopeOfQuery() const override
|
||||
{
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
// .h autogenerated by cmake!
|
||||
|
||||
#cmakedefine01 USE_BASEX
|
||||
#cmakedefine01 USE_BASE64
|
||||
#cmakedefine01 USE_SIMDJSON
|
||||
#cmakedefine01 USE_RAPIDJSON
|
||||
|
@ -1,9 +1,6 @@
|
||||
if (TARGET ch_contrib::fastops)
|
||||
set(USE_FASTOPS 1)
|
||||
endif()
|
||||
if (TARGET ch_contrib::base-x)
|
||||
set(USE_BASEX 1)
|
||||
endif()
|
||||
if (TARGET ch_contrib::base64)
|
||||
set(USE_BASE64 1)
|
||||
endif()
|
||||
|
@ -3,7 +3,6 @@
|
||||
#include <Functions/IFunction.h>
|
||||
#include <Core/DecimalFunctions.h>
|
||||
#include <Functions/FunctionFactory.h>
|
||||
#include <Core/Field.h>
|
||||
|
||||
#include <Functions/extractTimeZoneFromFunctionArguments.h>
|
||||
|
||||
|
88
src/Functions/nowInBlock.cpp
Normal file
88
src/Functions/nowInBlock.cpp
Normal file
@ -0,0 +1,88 @@
|
||||
#include <Functions/IFunction.h>
|
||||
#include <Functions/FunctionFactory.h>
|
||||
#include <Functions/extractTimeZoneFromFunctionArguments.h>
|
||||
#include <DataTypes/DataTypeDateTime.h>
|
||||
#include <Columns/ColumnsNumber.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
|
||||
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
/** Returns current time at calculation of every block.
|
||||
* In contrast to 'now' function, it's not a constant expression and is not a subject of constant folding.
|
||||
*/
|
||||
class FunctionNowInBlock : public IFunction
|
||||
{
|
||||
public:
|
||||
static constexpr auto name = "nowInBlock";
|
||||
static FunctionPtr create(ContextPtr)
|
||||
{
|
||||
return std::make_shared<FunctionNowInBlock>();
|
||||
}
|
||||
|
||||
String getName() const override
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Optional timezone argument.
|
||||
bool isVariadic() const override { return true; }
|
||||
|
||||
size_t getNumberOfArguments() const override { return 0; }
|
||||
|
||||
bool isDeterministic() const override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isDeterministicInScopeOfQuery() const override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
|
||||
{
|
||||
if (arguments.size() > 1)
|
||||
{
|
||||
throw Exception("Arguments size of function " + getName() + " should be 0 or 1", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||
}
|
||||
if (arguments.size() == 1 && !isStringOrFixedString(arguments[0].type))
|
||||
{
|
||||
throw Exception(
|
||||
"Arguments of function " + getName() + " should be String or FixedString", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
}
|
||||
if (arguments.size() == 1)
|
||||
{
|
||||
return std::make_shared<DataTypeDateTime>(extractTimeZoneNameFromFunctionArguments(arguments, 0, 0));
|
||||
}
|
||||
return std::make_shared<DataTypeDateTime>();
|
||||
}
|
||||
|
||||
ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override
|
||||
{
|
||||
return ColumnUInt32::create(input_rows_count, time(nullptr));
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
void registerFunctionNowInBlock(FunctionFactory & factory)
|
||||
{
|
||||
factory.registerFunction<FunctionNowInBlock>();
|
||||
}
|
||||
|
||||
}
|
@ -43,6 +43,7 @@ void registerFunctionToRelativeMinuteNum(FunctionFactory &);
|
||||
void registerFunctionToRelativeSecondNum(FunctionFactory &);
|
||||
void registerFunctionToTime(FunctionFactory &);
|
||||
void registerFunctionNow(FunctionFactory &);
|
||||
void registerFunctionNowInBlock(FunctionFactory &);
|
||||
void registerFunctionNow64(FunctionFactory &);
|
||||
void registerFunctionToday(FunctionFactory &);
|
||||
void registerFunctionYesterday(FunctionFactory &);
|
||||
@ -126,6 +127,7 @@ void registerFunctionsDateTime(FunctionFactory & factory)
|
||||
registerFunctionToTime(factory);
|
||||
registerFunctionNow(factory);
|
||||
registerFunctionNow64(factory);
|
||||
registerFunctionNowInBlock(factory);
|
||||
registerFunctionToday(factory);
|
||||
registerFunctionYesterday(factory);
|
||||
registerFunctionTimeSlot(factory);
|
||||
|
@ -49,10 +49,8 @@ void registerFunctionBase64Decode(FunctionFactory &);
|
||||
void registerFunctionTryBase64Decode(FunctionFactory &);
|
||||
#endif
|
||||
|
||||
#if USE_BASEX
|
||||
void registerFunctionBase58Encode(FunctionFactory &);
|
||||
void registerFunctionBase58Decode(FunctionFactory &);
|
||||
#endif
|
||||
|
||||
#if USE_NLP
|
||||
void registerFunctionStem(FunctionFactory &);
|
||||
@ -110,10 +108,8 @@ void registerFunctionsString(FunctionFactory & factory)
|
||||
registerFunctionTryBase64Decode(factory);
|
||||
#endif
|
||||
|
||||
#if USE_BASEX
|
||||
registerFunctionBase58Encode(factory);
|
||||
registerFunctionBase58Decode(factory);
|
||||
#endif
|
||||
|
||||
#if USE_NLP
|
||||
registerFunctionStem(factory);
|
||||
|
@ -90,7 +90,10 @@ bool AsynchronousReadBufferFromFileDescriptor::nextImpl()
|
||||
prefetch_future = {};
|
||||
file_offset_of_buffer_end += size;
|
||||
|
||||
if (size)
|
||||
assert(offset <= size);
|
||||
size_t bytes_read = size - offset;
|
||||
|
||||
if (bytes_read)
|
||||
{
|
||||
prefetch_buffer.swap(memory);
|
||||
/// Adjust the working buffer so that it ignores `offset` bytes.
|
||||
@ -109,7 +112,10 @@ bool AsynchronousReadBufferFromFileDescriptor::nextImpl()
|
||||
auto [size, offset] = asyncReadInto(memory.data(), memory.size()).get();
|
||||
file_offset_of_buffer_end += size;
|
||||
|
||||
if (size)
|
||||
assert(offset <= size);
|
||||
size_t bytes_read = size - offset;
|
||||
|
||||
if (bytes_read)
|
||||
{
|
||||
/// Adjust the working buffer so that it ignores `offset` bytes.
|
||||
internal_buffer = Buffer(memory.data(), memory.data() + memory.size());
|
||||
|
@ -30,7 +30,7 @@ class WriteBufferFromOwnString : public detail::StringHolder, public WriteBuffer
|
||||
public:
|
||||
WriteBufferFromOwnString() : WriteBufferFromString(value) {}
|
||||
|
||||
StringRef stringRef() const { return isFinished() ? StringRef(value) : StringRef(value.data(), pos - value.data()); }
|
||||
std::string_view stringView() const { return isFinished() ? std::string_view(value) : std::string_view(value.data(), pos - value.data()); }
|
||||
|
||||
std::string & str()
|
||||
{
|
||||
|
@ -2712,11 +2712,14 @@ void InterpreterSelectQuery::executePreLimit(QueryPlan & query_plan, bool do_not
|
||||
limit_offset = 0;
|
||||
}
|
||||
|
||||
auto limit = std::make_unique<LimitStep>(query_plan.getCurrentDataStream(), limit_length, limit_offset);
|
||||
const Settings & settings = context->getSettingsRef();
|
||||
|
||||
auto limit = std::make_unique<LimitStep>(query_plan.getCurrentDataStream(), limit_length, limit_offset, settings.exact_rows_before_limit);
|
||||
if (do_not_skip_offset)
|
||||
limit->setStepDescription("preliminary LIMIT (with OFFSET)");
|
||||
else
|
||||
limit->setStepDescription("preliminary LIMIT (without OFFSET)");
|
||||
|
||||
query_plan.addStep(std::move(limit));
|
||||
}
|
||||
}
|
||||
@ -2778,7 +2781,8 @@ void InterpreterSelectQuery::executeLimit(QueryPlan & query_plan)
|
||||
* if there is WITH TOTALS and there is no ORDER BY, then read the data to the end,
|
||||
* otherwise TOTALS is counted according to incomplete data.
|
||||
*/
|
||||
bool always_read_till_end = false;
|
||||
const Settings & settings = context->getSettingsRef();
|
||||
bool always_read_till_end = settings.exact_rows_before_limit;
|
||||
|
||||
if (query.group_by_with_totals && !query.orderBy())
|
||||
always_read_till_end = true;
|
||||
|
@ -344,7 +344,7 @@ void InterpreterSelectWithUnionQuery::buildQueryPlan(QueryPlan & query_plan)
|
||||
{
|
||||
if (settings.limit > 0)
|
||||
{
|
||||
auto limit = std::make_unique<LimitStep>(query_plan.getCurrentDataStream(), settings.limit, settings.offset);
|
||||
auto limit = std::make_unique<LimitStep>(query_plan.getCurrentDataStream(), settings.limit, settings.offset, settings.exact_rows_before_limit);
|
||||
limit->setStepDescription("LIMIT OFFSET for SETTINGS");
|
||||
query_plan.addStep(std::move(limit));
|
||||
}
|
||||
|
@ -30,11 +30,14 @@ struct CompactStringRef
|
||||
union
|
||||
{
|
||||
const char * data_mixed = nullptr;
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wnested-anon-types"
|
||||
struct
|
||||
{
|
||||
char dummy[6];
|
||||
UInt16 size;
|
||||
};
|
||||
#pragma clang diagnostic pop
|
||||
};
|
||||
|
||||
CompactStringRef(const char * data_, size_t size_)
|
||||
|
@ -178,7 +178,7 @@ void MsgPackRowOutputFormat::serializeField(const IColumn & column, DataTypePtr
|
||||
{
|
||||
WriteBufferFromOwnString buf;
|
||||
writeBinary(uuid_column.getElement(row_num), buf);
|
||||
std::string_view uuid_bin = buf.stringRef().toView();
|
||||
std::string_view uuid_bin = buf.stringView();
|
||||
packer.pack_bin(uuid_bin.size());
|
||||
packer.pack_bin_body(uuid_bin.data(), uuid_bin.size());
|
||||
return;
|
||||
@ -187,7 +187,7 @@ void MsgPackRowOutputFormat::serializeField(const IColumn & column, DataTypePtr
|
||||
{
|
||||
WriteBufferFromOwnString buf;
|
||||
writeText(uuid_column.getElement(row_num), buf);
|
||||
std::string_view uuid_text = buf.stringRef().toView();
|
||||
std::string_view uuid_text = buf.stringView();
|
||||
packer.pack_str(uuid_text.size());
|
||||
packer.pack_bin_body(uuid_text.data(), uuid_text.size());
|
||||
return;
|
||||
@ -198,7 +198,7 @@ void MsgPackRowOutputFormat::serializeField(const IColumn & column, DataTypePtr
|
||||
UUID value = uuid_column.getElement(row_num);
|
||||
writeBinaryBigEndian(value.toUnderType().items[0], buf);
|
||||
writeBinaryBigEndian(value.toUnderType().items[1], buf);
|
||||
std::string_view uuid_ext = buf.stringRef().toView();
|
||||
std::string_view uuid_ext = buf.stringView();
|
||||
packer.pack_ext(sizeof(UUID), int8_t(MsgPackExtensionTypes::UUIDType));
|
||||
packer.pack_ext_body(uuid_ext.data(), uuid_ext.size());
|
||||
return;
|
||||
|
@ -764,10 +764,10 @@ void DistributedSink::writeToShard(const Block & block, const std::vector<std::s
|
||||
/// And note that it is safe, because we have checksum and size for header.
|
||||
|
||||
/// Write the header.
|
||||
const StringRef header = header_buf.stringRef();
|
||||
const std::string_view header = header_buf.stringView();
|
||||
writeVarUInt(DBMS_DISTRIBUTED_SIGNATURE_HEADER, out);
|
||||
writeStringBinary(header, out);
|
||||
writePODBinary(CityHash_v1_0_2::CityHash128(header.data, header.size), out);
|
||||
writeStringBinary(StringRef(header), out);
|
||||
writePODBinary(CityHash_v1_0_2::CityHash128(header.data(), header.size()), out);
|
||||
|
||||
stream.write(block);
|
||||
|
||||
|
@ -112,6 +112,8 @@ bool AsynchronousReadBufferFromHDFS::nextImpl()
|
||||
Stopwatch next_watch;
|
||||
Int64 wait = -1;
|
||||
size_t size = 0;
|
||||
size_t bytes_read = 0;
|
||||
|
||||
if (prefetch_future.valid())
|
||||
{
|
||||
ProfileEvents::increment(ProfileEvents::RemoteFSPrefetchedReads);
|
||||
@ -126,7 +128,9 @@ bool AsynchronousReadBufferFromHDFS::nextImpl()
|
||||
LOG_TEST(log, "Current size: {}, offset: {}", size, offset);
|
||||
|
||||
/// If prefetch_future is valid, size should always be greater than zero.
|
||||
assert(offset < size);
|
||||
assert(offset <= size);
|
||||
bytes_read = size - offset;
|
||||
|
||||
wait = watch.elapsedMicroseconds();
|
||||
ProfileEvents::increment(ProfileEvents::AsynchronousReadWaitMicroseconds, wait);
|
||||
}
|
||||
@ -147,9 +151,10 @@ bool AsynchronousReadBufferFromHDFS::nextImpl()
|
||||
auto offset = result.offset;
|
||||
|
||||
LOG_TEST(log, "Current size: {}, offset: {}", size, offset);
|
||||
assert(offset < size);
|
||||
assert(offset <= size);
|
||||
bytes_read = size - offset;
|
||||
|
||||
if (size)
|
||||
if (bytes_read)
|
||||
{
|
||||
/// Adjust the working buffer so that it ignores `offset` bytes.
|
||||
internal_buffer = Buffer(memory.data(), memory.data() + memory.size());
|
||||
@ -166,7 +171,7 @@ bool AsynchronousReadBufferFromHDFS::nextImpl()
|
||||
|
||||
sum_duration += next_watch.elapsedMicroseconds();
|
||||
sum_wait += wait;
|
||||
return size;
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
off_t AsynchronousReadBufferFromHDFS::seek(off_t offset, int whence)
|
||||
|
@ -15,12 +15,6 @@ MergeTreeIndexGranularity::MergeTreeIndexGranularity(const std::vector<size_t> &
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
MergeTreeIndexGranularity::MergeTreeIndexGranularity(size_t marks_count, size_t fixed_granularity)
|
||||
: marks_rows_partial_sums(marks_count, fixed_granularity)
|
||||
{
|
||||
}
|
||||
|
||||
/// Rows after mark to next mark
|
||||
size_t MergeTreeIndexGranularity::getMarkRows(size_t mark_index) const
|
||||
{
|
||||
|
@ -20,8 +20,6 @@ private:
|
||||
public:
|
||||
MergeTreeIndexGranularity() = default;
|
||||
explicit MergeTreeIndexGranularity(const std::vector<size_t> & marks_rows_partial_sums_);
|
||||
MergeTreeIndexGranularity(size_t marks_count, size_t fixed_granularity);
|
||||
|
||||
|
||||
/// Return count of rows between marks
|
||||
size_t getRowsCountInRange(const MarkRange & range) const;
|
||||
|
@ -155,18 +155,12 @@ void MergeTreeSink::finishDelayedChunk()
|
||||
{
|
||||
ProfileEvents::increment(ProfileEvents::DuplicatedInsertedBlocks);
|
||||
LOG_INFO(storage.log, "Block with ID {} already exists as part {}; ignoring it", block_id, res.first.getPartName());
|
||||
}
|
||||
else
|
||||
{
|
||||
added = storage.renameTempPartAndAdd(part, transaction, partition.temp_part.builder, lock);
|
||||
transaction.commit(&lock);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
added = storage.renameTempPartAndAdd(part, transaction, partition.temp_part.builder, lock);
|
||||
transaction.commit(&lock);
|
||||
}
|
||||
|
||||
added = storage.renameTempPartAndAdd(part, transaction, partition.temp_part.builder, lock);
|
||||
transaction.commit(&lock);
|
||||
}
|
||||
|
||||
/// Part can be deduplicated, so increment counters and add to part log only if it's really added
|
||||
|
@ -23,7 +23,8 @@ int main()
|
||||
|
||||
String hdfs_namenode_url = "hdfs://namenode:port/";
|
||||
String path = "/path/to/hdfs/file";
|
||||
auto in = std::make_unique<ReadBufferFromHDFS>(hdfs_namenode_url, path, *config);
|
||||
ReadSettings settings = {};
|
||||
auto in = std::make_unique<ReadBufferFromHDFS>(hdfs_namenode_url, path, *config, settings);
|
||||
auto reader = IObjectStorage::getThreadPoolReader();
|
||||
AsynchronousReadBufferFromHDFS buf(reader, {}, std::move(in));
|
||||
|
||||
|
@ -58,9 +58,6 @@ endif()
|
||||
if (TARGET ch_contrib::base64)
|
||||
set(USE_BASE64 1)
|
||||
endif()
|
||||
if (TARGET ch_contrib::base-x)
|
||||
set(USE_BASEX 1)
|
||||
endif()
|
||||
if (TARGET ch_contrib::yaml_cpp)
|
||||
set(USE_YAML_CPP 1)
|
||||
endif()
|
||||
|
@ -19,7 +19,10 @@ from report import create_build_html_report
|
||||
from s3_helper import S3Helper
|
||||
from get_robot_token import get_best_robot_token
|
||||
from pr_info import PRInfo
|
||||
from commit_status_helper import get_commit
|
||||
from commit_status_helper import (
|
||||
get_commit,
|
||||
fail_simple_check,
|
||||
)
|
||||
from ci_config import CI_CONFIG
|
||||
from rerun_helper import RerunHelper
|
||||
|
||||
@ -151,6 +154,12 @@ def main():
|
||||
needs_data = json.load(file_handler)
|
||||
required_builds = len(needs_data)
|
||||
|
||||
# A report might be empty in case of `do not test` label, for example.
|
||||
# We should still be able to merge such PRs.
|
||||
all_skipped = needs_data is not None and all(
|
||||
i["result"] == "skipped" for i in needs_data.values()
|
||||
)
|
||||
|
||||
logging.info("The next builds are required: %s", ", ".join(needs_data))
|
||||
|
||||
gh = Github(get_best_robot_token())
|
||||
@ -228,6 +237,8 @@ def main():
|
||||
total_groups = len(build_results)
|
||||
logging.info("Totally got %s artifact groups", total_groups)
|
||||
if total_groups == 0:
|
||||
if not all_skipped:
|
||||
fail_simple_check(gh, pr_info, f"{build_check_name} failed")
|
||||
logging.error("No success builds, failing check")
|
||||
sys.exit(1)
|
||||
|
||||
@ -297,6 +308,8 @@ def main():
|
||||
)
|
||||
|
||||
if summary_status == "error":
|
||||
if not all_skipped:
|
||||
fail_simple_check(gh, pr_info, f"{build_check_name} failed")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
|
@ -179,7 +179,7 @@ CI_CONFIG = {
|
||||
},
|
||||
},
|
||||
"builds_report_config": {
|
||||
"ClickHouse build check (actions)": [
|
||||
"ClickHouse build check": [
|
||||
"package_release",
|
||||
"coverity",
|
||||
"package_aarch64",
|
||||
@ -190,7 +190,7 @@ CI_CONFIG = {
|
||||
"package_debug",
|
||||
"binary_release",
|
||||
],
|
||||
"ClickHouse special build check (actions)": [
|
||||
"ClickHouse special build check": [
|
||||
"binary_tidy",
|
||||
"binary_splitted",
|
||||
"binary_darwin",
|
||||
@ -203,145 +203,136 @@ CI_CONFIG = {
|
||||
"tests_config": {
|
||||
# required_build - build name for artifacts
|
||||
# force_tests - force success status for tests
|
||||
"Stateful tests (address, actions)": {
|
||||
"Stateful tests (address)": {
|
||||
"required_build": "package_asan",
|
||||
},
|
||||
"Stateful tests (thread, actions)": {
|
||||
"Stateful tests (thread)": {
|
||||
"required_build": "package_tsan",
|
||||
},
|
||||
"Stateful tests (memory, actions)": {
|
||||
"Stateful tests (memory)": {
|
||||
"required_build": "package_msan",
|
||||
},
|
||||
"Stateful tests (ubsan, actions)": {
|
||||
"Stateful tests (ubsan)": {
|
||||
"required_build": "package_ubsan",
|
||||
},
|
||||
"Stateful tests (debug, actions)": {
|
||||
"Stateful tests (debug)": {
|
||||
"required_build": "package_debug",
|
||||
},
|
||||
"Stateful tests (release, actions)": {
|
||||
"Stateful tests (release)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Stateful tests (aarch64, actions)": {
|
||||
"Stateful tests (aarch64)": {
|
||||
"required_build": "package_aarch64",
|
||||
},
|
||||
"Stateful tests (release, DatabaseOrdinary, actions)": {
|
||||
"Stateful tests (release, DatabaseOrdinary)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Stateful tests (release, DatabaseReplicated, actions)": {
|
||||
"Stateful tests (release, DatabaseReplicated)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Stateless tests (address, actions)": {
|
||||
"Stateless tests (address)": {
|
||||
"required_build": "package_asan",
|
||||
},
|
||||
"Stateless tests (thread, actions)": {
|
||||
"Stateless tests (thread)": {
|
||||
"required_build": "package_tsan",
|
||||
},
|
||||
"Stateless tests (memory, actions)": {
|
||||
"Stateless tests (memory)": {
|
||||
"required_build": "package_msan",
|
||||
},
|
||||
"Stateless tests (ubsan, actions)": {
|
||||
"Stateless tests (ubsan)": {
|
||||
"required_build": "package_ubsan",
|
||||
},
|
||||
"Stateless tests (debug, actions)": {
|
||||
"Stateless tests (debug)": {
|
||||
"required_build": "package_debug",
|
||||
},
|
||||
"Stateless tests (release, actions)": {
|
||||
"Stateless tests (release)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Stateless tests (aarch64, actions)": {
|
||||
"Stateless tests (aarch64)": {
|
||||
"required_build": "package_aarch64",
|
||||
},
|
||||
"Stateless tests (release, wide parts enabled, actions)": {
|
||||
"Stateless tests (release, wide parts enabled)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Stateless tests (release, DatabaseOrdinary, actions)": {
|
||||
"Stateless tests (release, DatabaseOrdinary)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Stateless tests (release, DatabaseReplicated, actions)": {
|
||||
"Stateless tests (release, DatabaseReplicated)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Stateless tests (release, s3 storage, actions)": {
|
||||
"Stateless tests (release, s3 storage)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Stress test (address, actions)": {
|
||||
"Stress test (address)": {
|
||||
"required_build": "package_asan",
|
||||
},
|
||||
"Stress test (thread, actions)": {
|
||||
"Stress test (thread)": {
|
||||
"required_build": "package_tsan",
|
||||
},
|
||||
"Stress test (undefined, actions)": {
|
||||
"Stress test (undefined)": {
|
||||
"required_build": "package_ubsan",
|
||||
},
|
||||
"Stress test (memory, actions)": {
|
||||
"Stress test (memory)": {
|
||||
"required_build": "package_msan",
|
||||
},
|
||||
"Stress test (debug, actions)": {
|
||||
"Stress test (debug)": {
|
||||
"required_build": "package_debug",
|
||||
},
|
||||
"Integration tests (asan, actions)": {
|
||||
"Integration tests (asan)": {
|
||||
"required_build": "package_asan",
|
||||
},
|
||||
"Integration tests (thread, actions)": {
|
||||
"Integration tests (thread)": {
|
||||
"required_build": "package_tsan",
|
||||
},
|
||||
"Integration tests (release, actions)": {
|
||||
"Integration tests (release)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Integration tests (memory, actions)": {
|
||||
"Integration tests (memory)": {
|
||||
"required_build": "package_msan",
|
||||
},
|
||||
"Integration tests flaky check (asan, actions)": {
|
||||
"Integration tests flaky check (asan)": {
|
||||
"required_build": "package_asan",
|
||||
},
|
||||
"Compatibility check (actions)": {
|
||||
"Compatibility check": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Split build smoke test (actions)": {
|
||||
"Split build smoke test": {
|
||||
"required_build": "binary_splitted",
|
||||
},
|
||||
"Testflows check (actions)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Unit tests (release-clang, actions)": {
|
||||
"Unit tests (release-clang)": {
|
||||
"required_build": "binary_release",
|
||||
},
|
||||
"Unit tests (asan, actions)": {
|
||||
"Unit tests (asan)": {
|
||||
"required_build": "package_asan",
|
||||
},
|
||||
"Unit tests (msan, actions)": {
|
||||
"Unit tests (msan)": {
|
||||
"required_build": "package_msan",
|
||||
},
|
||||
"Unit tests (tsan, actions)": {
|
||||
"Unit tests (tsan)": {
|
||||
"required_build": "package_tsan",
|
||||
},
|
||||
"Unit tests (ubsan, actions)": {
|
||||
"Unit tests (ubsan)": {
|
||||
"required_build": "package_ubsan",
|
||||
},
|
||||
"AST fuzzer (debug, actions)": {
|
||||
"AST fuzzer (debug)": {
|
||||
"required_build": "package_debug",
|
||||
},
|
||||
"AST fuzzer (ASan, actions)": {
|
||||
"AST fuzzer (ASan)": {
|
||||
"required_build": "package_asan",
|
||||
},
|
||||
"AST fuzzer (MSan, actions)": {
|
||||
"AST fuzzer (MSan)": {
|
||||
"required_build": "package_msan",
|
||||
},
|
||||
"AST fuzzer (TSan, actions)": {
|
||||
"AST fuzzer (TSan)": {
|
||||
"required_build": "package_tsan",
|
||||
},
|
||||
"AST fuzzer (UBSan, actions)": {
|
||||
"AST fuzzer (UBSan)": {
|
||||
"required_build": "package_ubsan",
|
||||
},
|
||||
"Release (actions)": {
|
||||
"required_build": "package_release",
|
||||
},
|
||||
"Stateless tests flaky check (address, actions)": {
|
||||
"Stateless tests flaky check (address)": {
|
||||
"required_build": "package_asan",
|
||||
},
|
||||
"Stateless tests bugfix validate check (address, actions)": {
|
||||
"required_build": "package_asan",
|
||||
},
|
||||
"ClickHouse Keeper Jepsen (actions)": {
|
||||
"ClickHouse Keeper Jepsen": {
|
||||
"required_build": "binary_release",
|
||||
},
|
||||
"Performance Comparison": {
|
||||
|
@ -16,7 +16,7 @@ from commit_status_helper import post_commit_status
|
||||
from docker_pull_helper import get_image_with_version
|
||||
from tee_popen import TeePopen
|
||||
|
||||
NAME = "Woboq Build (actions)"
|
||||
NAME = "Woboq Build"
|
||||
|
||||
|
||||
def get_run_command(repo_path, output_path, image):
|
||||
|
@ -28,7 +28,7 @@ IMAGE_UBUNTU = "clickhouse/test-old-ubuntu"
|
||||
IMAGE_CENTOS = "clickhouse/test-old-centos"
|
||||
MAX_GLIBC_VERSION = "2.4"
|
||||
DOWNLOAD_RETRIES_COUNT = 5
|
||||
CHECK_NAME = "Compatibility check (actions)"
|
||||
CHECK_NAME = "Compatibility check"
|
||||
|
||||
|
||||
def process_os_check(log_path):
|
||||
|
@ -21,7 +21,7 @@ from s3_helper import S3Helper
|
||||
from stopwatch import Stopwatch
|
||||
from upload_result_helper import upload_results
|
||||
|
||||
NAME = "Push to Dockerhub (actions)"
|
||||
NAME = "Push to Dockerhub"
|
||||
|
||||
TEMP_PATH = os.path.join(RUNNER_TEMP, "docker_images_check")
|
||||
|
||||
|
@ -18,7 +18,7 @@ from s3_helper import S3Helper
|
||||
from stopwatch import Stopwatch
|
||||
from upload_result_helper import upload_results
|
||||
|
||||
NAME = "Push multi-arch images to Dockerhub (actions)"
|
||||
NAME = "Push multi-arch images to Dockerhub"
|
||||
CHANGED_IMAGES = "changed_images_{}.json"
|
||||
Images = Dict[str, List[str]]
|
||||
|
||||
|
@ -303,7 +303,7 @@ def main():
|
||||
image = DockerImage(args.image_path, args.image_repo, False)
|
||||
args.release_type = auto_release_type(args.version, args.release_type)
|
||||
tags = gen_tags(args.version, args.release_type)
|
||||
NAME = f"Docker image {image.repo} building check (actions)"
|
||||
NAME = f"Docker image {image.repo} building check"
|
||||
pr_info = None
|
||||
if CI:
|
||||
pr_info = PRInfo()
|
||||
@ -320,7 +320,7 @@ def main():
|
||||
encoding="utf-8",
|
||||
shell=True,
|
||||
)
|
||||
NAME = f"Docker image {image.repo} build and push (actions)"
|
||||
NAME = f"Docker image {image.repo} build and push"
|
||||
|
||||
logging.info("Following tags will be created: %s", ", ".join(tags))
|
||||
status = "success"
|
||||
|
@ -19,7 +19,7 @@ from rerun_helper import RerunHelper
|
||||
from tee_popen import TeePopen
|
||||
|
||||
|
||||
NAME = "Docs Check (actions)"
|
||||
NAME = "Docs Check"
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(
|
||||
|
@ -18,7 +18,7 @@ from commit_status_helper import get_commit
|
||||
from rerun_helper import RerunHelper
|
||||
from tee_popen import TeePopen
|
||||
|
||||
NAME = "Docs Release (actions)"
|
||||
NAME = "Docs Release"
|
||||
|
||||
|
||||
def parse_args() -> argparse.Namespace:
|
||||
|
@ -28,7 +28,7 @@ from rerun_helper import RerunHelper
|
||||
from tee_popen import TeePopen
|
||||
from ccache_utils import get_ccache_if_not_exists, upload_ccache
|
||||
|
||||
NAME = "Fast test (actions)"
|
||||
NAME = "Fast test"
|
||||
|
||||
|
||||
def get_fasttest_cmd(
|
||||
|
@ -7,7 +7,7 @@ from pr_info import PRInfo
|
||||
from get_robot_token import get_best_robot_token
|
||||
from commit_status_helper import get_commit
|
||||
|
||||
NAME = "Run Check (actions)"
|
||||
NAME = "Run Check"
|
||||
|
||||
|
||||
def filter_statuses(statuses):
|
||||
|
@ -27,7 +27,7 @@ from rerun_helper import RerunHelper
|
||||
JEPSEN_GROUP_NAME = "jepsen_group"
|
||||
DESIRED_INSTANCE_COUNT = 3
|
||||
IMAGE_NAME = "clickhouse/keeper-jepsen-test"
|
||||
CHECK_NAME = "ClickHouse Keeper Jepsen (actions)"
|
||||
CHECK_NAME = "ClickHouse Keeper Jepsen"
|
||||
|
||||
|
||||
SUCCESSFUL_TESTS_ANCHOR = "# Successful tests"
|
||||
|
@ -17,7 +17,7 @@ from get_robot_token import get_best_robot_token
|
||||
from pr_info import FORCE_TESTS_LABEL, PRInfo
|
||||
from workflow_approve_rerun_lambda.app import TRUSTED_CONTRIBUTORS
|
||||
|
||||
NAME = "Run Check (actions)"
|
||||
NAME = "Run Check"
|
||||
|
||||
TRUSTED_ORG_IDS = {
|
||||
7409213, # yandex
|
||||
|
@ -23,7 +23,7 @@ from rerun_helper import RerunHelper
|
||||
DOCKER_IMAGE = "clickhouse/split-build-smoke-test"
|
||||
DOWNLOAD_RETRIES_COUNT = 5
|
||||
RESULT_LOG_NAME = "run.log"
|
||||
CHECK_NAME = "Split build smoke test (actions)"
|
||||
CHECK_NAME = "Split build smoke test"
|
||||
|
||||
|
||||
def process_result(result_folder, server_log_folder):
|
||||
|
@ -1,34 +1,31 @@
|
||||
#!/usr/bin/env python3
|
||||
import logging
|
||||
import subprocess
|
||||
import os
|
||||
import argparse
|
||||
import csv
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
from github import Github
|
||||
|
||||
from env_helper import (
|
||||
RUNNER_TEMP,
|
||||
GITHUB_WORKSPACE,
|
||||
)
|
||||
from s3_helper import S3Helper
|
||||
from pr_info import PRInfo
|
||||
from get_robot_token import get_best_robot_token
|
||||
from upload_result_helper import upload_results
|
||||
from docker_pull_helper import get_image_with_version
|
||||
from commit_status_helper import (
|
||||
post_commit_status,
|
||||
fail_simple_check,
|
||||
)
|
||||
from clickhouse_helper import (
|
||||
ClickHouseHelper,
|
||||
mark_flaky_tests,
|
||||
prepare_tests_results_for_clickhouse,
|
||||
)
|
||||
from stopwatch import Stopwatch
|
||||
from commit_status_helper import fail_simple_check, post_commit_status
|
||||
from docker_pull_helper import get_image_with_version
|
||||
from env_helper import GITHUB_WORKSPACE, RUNNER_TEMP
|
||||
from get_robot_token import get_best_robot_token
|
||||
from github_helper import GitHub
|
||||
from git_helper import git_runner
|
||||
from pr_info import PRInfo
|
||||
from rerun_helper import RerunHelper
|
||||
from s3_helper import S3Helper
|
||||
from ssh import SSHKey
|
||||
from stopwatch import Stopwatch
|
||||
from upload_result_helper import upload_results
|
||||
|
||||
NAME = "Style Check (actions)"
|
||||
NAME = "Style Check"
|
||||
|
||||
|
||||
def process_result(result_folder):
|
||||
@ -58,7 +55,8 @@ def process_result(result_folder):
|
||||
|
||||
try:
|
||||
results_path = os.path.join(result_folder, "test_results.tsv")
|
||||
test_results = list(csv.reader(open(results_path, "r"), delimiter="\t"))
|
||||
with open(results_path, "r", encoding="utf-8") as fd:
|
||||
test_results = list(csv.reader(fd, delimiter="\t"))
|
||||
if len(test_results) == 0:
|
||||
raise Exception("Empty results")
|
||||
|
||||
@ -69,8 +67,77 @@ def process_result(result_folder):
|
||||
return state, description, test_results, additional_files
|
||||
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser("Check and report style issues in the repository")
|
||||
parser.add_argument("--push", default=True, help=argparse.SUPPRESS)
|
||||
parser.add_argument(
|
||||
"--no-push",
|
||||
action="store_false",
|
||||
dest="push",
|
||||
help="do not commit and push automatic fixes",
|
||||
default=argparse.SUPPRESS,
|
||||
)
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def checkout_head(pr_info: PRInfo):
|
||||
# It works ONLY for PRs, and only over ssh, so either
|
||||
# ROBOT_CLICKHOUSE_SSH_KEY should be set or ssh-agent should work
|
||||
assert pr_info.number
|
||||
if not pr_info.head_name == pr_info.base_name:
|
||||
# We can't push to forks, sorry folks
|
||||
return
|
||||
remote_url = pr_info.event["pull_request"]["base"]["repo"]["ssh_url"]
|
||||
git_prefix = ( # All commits to remote are done as robot-clickhouse
|
||||
"git -c user.email=robot-clickhouse@clickhouse.com "
|
||||
"-c user.name=robot-clickhouse -c commit.gpgsign=false "
|
||||
"-c core.sshCommand="
|
||||
"'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'"
|
||||
)
|
||||
fetch_cmd = (
|
||||
f"{git_prefix} fetch --depth=1 "
|
||||
f"{remote_url} {pr_info.head_ref}:head-{pr_info.head_ref}"
|
||||
)
|
||||
if os.getenv("ROBOT_CLICKHOUSE_SSH_KEY", ""):
|
||||
with SSHKey("ROBOT_CLICKHOUSE_SSH_KEY"):
|
||||
git_runner(fetch_cmd)
|
||||
else:
|
||||
git_runner(fetch_cmd)
|
||||
git_runner(f"git checkout -f head-{pr_info.head_ref}")
|
||||
|
||||
|
||||
def commit_push_staged(pr_info: PRInfo):
|
||||
# It works ONLY for PRs, and only over ssh, so either
|
||||
# ROBOT_CLICKHOUSE_SSH_KEY should be set or ssh-agent should work
|
||||
assert pr_info.number
|
||||
if not pr_info.head_name == pr_info.base_name:
|
||||
# We can't push to forks, sorry folks
|
||||
return
|
||||
git_staged = git_runner("git diff --cached --name-only")
|
||||
if not git_staged:
|
||||
return
|
||||
remote_url = pr_info.event["pull_request"]["base"]["repo"]["ssh_url"]
|
||||
git_prefix = ( # All commits to remote are done as robot-clickhouse
|
||||
"git -c user.email=robot-clickhouse@clickhouse.com "
|
||||
"-c user.name=robot-clickhouse -c commit.gpgsign=false "
|
||||
"-c core.sshCommand="
|
||||
"'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'"
|
||||
)
|
||||
git_runner(f"{git_prefix} commit -m 'Automatic style fix'")
|
||||
push_cmd = (
|
||||
f"{git_prefix} push {remote_url} head-{pr_info.head_ref}:{pr_info.head_ref}"
|
||||
)
|
||||
if os.getenv("ROBOT_CLICKHOUSE_SSH_KEY", ""):
|
||||
with SSHKey("ROBOT_CLICKHOUSE_SSH_KEY"):
|
||||
git_runner(push_cmd)
|
||||
else:
|
||||
git_runner(push_cmd)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logging.getLogger("git_helper").setLevel(logging.DEBUG)
|
||||
args = parse_args()
|
||||
|
||||
stopwatch = Stopwatch()
|
||||
|
||||
@ -78,8 +145,10 @@ if __name__ == "__main__":
|
||||
temp_path = os.path.join(RUNNER_TEMP, "style_check")
|
||||
|
||||
pr_info = PRInfo()
|
||||
if args.push:
|
||||
checkout_head(pr_info)
|
||||
|
||||
gh = Github(get_best_robot_token())
|
||||
gh = GitHub(get_best_robot_token())
|
||||
|
||||
rerun_helper = RerunHelper(gh, pr_info, NAME)
|
||||
if rerun_helper.is_already_finished_by_status():
|
||||
@ -104,6 +173,9 @@ if __name__ == "__main__":
|
||||
shell=True,
|
||||
)
|
||||
|
||||
if args.push:
|
||||
commit_push_staged(pr_info)
|
||||
|
||||
state, description, test_results, additional_files = process_result(temp_path)
|
||||
ch_helper = ClickHouseHelper()
|
||||
mark_flaky_tests(ch_helper, NAME, test_results)
|
||||
@ -111,7 +183,7 @@ if __name__ == "__main__":
|
||||
report_url = upload_results(
|
||||
s3_helper, pr_info.number, pr_info.sha, test_results, additional_files, NAME
|
||||
)
|
||||
print("::notice ::Report url: {}".format(report_url))
|
||||
print(f"::notice ::Report url: {report_url}")
|
||||
post_commit_status(gh, pr_info.sha, NAME, description, state, report_url)
|
||||
|
||||
prepared_events = prepare_tests_results_for_clickhouse(
|
||||
|
@ -0,0 +1,72 @@
|
||||
{
|
||||
"meta":
|
||||
[
|
||||
{
|
||||
"name": "0",
|
||||
"type": "UInt8"
|
||||
}
|
||||
],
|
||||
|
||||
"data":
|
||||
[
|
||||
[0]
|
||||
],
|
||||
|
||||
"rows": 1,
|
||||
|
||||
"rows_before_limit_at_least": 10000
|
||||
}
|
||||
{
|
||||
"meta":
|
||||
[
|
||||
{
|
||||
"name": "0",
|
||||
"type": "UInt8"
|
||||
}
|
||||
],
|
||||
|
||||
"data":
|
||||
[
|
||||
[0]
|
||||
],
|
||||
|
||||
"rows": 1,
|
||||
|
||||
"rows_before_limit_at_least": 20000
|
||||
}
|
||||
{
|
||||
"meta":
|
||||
[
|
||||
{
|
||||
"name": "0",
|
||||
"type": "UInt8"
|
||||
}
|
||||
],
|
||||
|
||||
"data":
|
||||
[
|
||||
[0]
|
||||
],
|
||||
|
||||
"rows": 1,
|
||||
|
||||
"rows_before_limit_at_least": 1
|
||||
}
|
||||
{
|
||||
"meta":
|
||||
[
|
||||
{
|
||||
"name": "0",
|
||||
"type": "UInt8"
|
||||
}
|
||||
],
|
||||
|
||||
"data":
|
||||
[
|
||||
[0]
|
||||
],
|
||||
|
||||
"rows": 1,
|
||||
|
||||
"rows_before_limit_at_least": 20000
|
||||
}
|
17
tests/queries/0_stateless/01913_exact_rows_before_limit.sql
Normal file
17
tests/queries/0_stateless/01913_exact_rows_before_limit.sql
Normal file
@ -0,0 +1,17 @@
|
||||
-- Tags: no-parallel
|
||||
drop table if exists test_rows_compact_part;
|
||||
create table test_rows_compact_part(f1 int,f2 int) engine=MergeTree partition by f1 order by f2 settings min_bytes_for_wide_part=10485760;
|
||||
insert into test_rows_compact_part select 0,arrayJoin(range(10000)) ;
|
||||
insert into test_rows_compact_part select 1,arrayJoin(range(10000));
|
||||
select 0 from test_rows_compact_part limit 1 FORMAT JSONCompact settings exact_rows_before_limit = 0,output_format_write_statistics = 0;
|
||||
select 0 from test_rows_compact_part limit 1 FORMAT JSONCompact settings exact_rows_before_limit = 1, output_format_write_statistics = 0;
|
||||
drop table if exists test_rows_compact_part;
|
||||
|
||||
|
||||
drop table if exists test_rows_wide_part;
|
||||
create table test_rows_wide_part(f1 int,f2 int) engine=MergeTree partition by f1 order by f2 settings min_bytes_for_wide_part=0;
|
||||
insert into test_rows_wide_part select 0,arrayJoin(range(10000)) ;
|
||||
insert into test_rows_wide_part select 1,arrayJoin(range(10000));
|
||||
select 0 from test_rows_wide_part limit 1 FORMAT JSONCompact settings exact_rows_before_limit = 0,output_format_write_statistics = 0;
|
||||
select 0 from test_rows_wide_part limit 1 FORMAT JSONCompact settings exact_rows_before_limit = 1, output_format_write_statistics = 0;
|
||||
drop table if exists test_rows_compact_part;
|
@ -9,6 +9,7 @@ test_random_values() {
|
||||
$CLICKHOUSE_CLIENT -n -q "
|
||||
create table tbl_8parts_${layers}granules_rnd (key1 UInt32, sign Int8) engine = CollapsingMergeTree(sign) order by (key1) partition by (key1 % 8);
|
||||
insert into tbl_8parts_${layers}granules_rnd select number, 1 from numbers_mt($((layers * 8 * 8192)));
|
||||
optimize table tbl_8parts_${layers}granules_rnd final;
|
||||
explain pipeline select * from tbl_8parts_${layers}granules_rnd final settings max_threads = 16;" 2>&1 |
|
||||
grep -c "CollapsingSortedTransform"
|
||||
}
|
||||
@ -22,6 +23,7 @@ test_sequential_values() {
|
||||
$CLICKHOUSE_CLIENT -n -q "
|
||||
create table tbl_8parts_${layers}granules_seq (key1 UInt32, sign Int8) engine = CollapsingMergeTree(sign) order by (key1) partition by (key1 / $((layers * 8192)))::UInt64;
|
||||
insert into tbl_8parts_${layers}granules_seq select number, 1 from numbers_mt($((layers * 8 * 8192)));
|
||||
optimize table tbl_8parts_${layers}granules_seq final;
|
||||
explain pipeline select * from tbl_8parts_${layers}granules_seq final settings max_threads = 8;" 2>&1 |
|
||||
grep -c "CollapsingSortedTransform"
|
||||
}
|
||||
|
@ -8,30 +8,6 @@ fooba
|
||||
foobar
|
||||
Hello world!
|
||||
|
||||
f
|
||||
fo
|
||||
foo
|
||||
foob
|
||||
fooba
|
||||
foobar
|
||||
Hello world!
|
||||
|
||||
f
|
||||
fo
|
||||
foo
|
||||
foob
|
||||
fooba
|
||||
foobar
|
||||
Hello world!
|
||||
|
||||
f
|
||||
fo
|
||||
foo
|
||||
foob
|
||||
fooba
|
||||
foobar
|
||||
Hello world!
|
||||
|
||||
2m
|
||||
8o8
|
||||
bQbp
|
||||
|
@ -3,15 +3,10 @@
|
||||
SET send_logs_level = 'fatal';
|
||||
|
||||
SELECT base58Encode('Hold my beer...');
|
||||
SELECT base58Encode('Hold my beer...', ''); -- { serverError 44 }
|
||||
SELECT base58Encode('Hold my beer...', 'gmp', 'third'); -- { serverError 36 }
|
||||
SELECT base58Encode('Hold my beer...', 'Second arg'); -- { serverError 42 }
|
||||
SELECT base58Decode('Hold my beer...'); -- { serverError 36 }
|
||||
|
||||
SELECT base58Decode(encoded, 'gmp') FROM (SELECT base58Encode(val, 'gmp') as encoded FROM (select arrayJoin(['', 'f', 'fo', 'foo', 'foob', 'fooba', 'foobar', 'Hello world!']) val));
|
||||
SELECT base58Decode(encoded, 'ripple') FROM (SELECT base58Encode(val, 'ripple') as encoded FROM (select arrayJoin(['', 'f', 'fo', 'foo', 'foob', 'fooba', 'foobar', 'Hello world!']) val));
|
||||
SELECT base58Decode(encoded, 'flickr') FROM (SELECT base58Encode(val, 'flickr') as encoded FROM (select arrayJoin(['', 'f', 'fo', 'foo', 'foob', 'fooba', 'foobar', 'Hello world!']) val));
|
||||
SELECT base58Decode(encoded, 'bitcoin') FROM (SELECT base58Encode(val, 'bitcoin') as encoded FROM (select arrayJoin(['', 'f', 'fo', 'foo', 'foob', 'fooba', 'foobar', 'Hello world!']) val));
|
||||
SELECT base58Decode(encoded) FROM (SELECT base58Encode(val) as encoded FROM (select arrayJoin(['', 'f', 'fo', 'foo', 'foob', 'fooba', 'foobar', 'Hello world!']) val));
|
||||
|
||||
SELECT base58Encode(val) FROM (select arrayJoin(['', 'f', 'fo', 'foo', 'foob', 'fooba', 'foobar']) val);
|
||||
SELECT base58Decode(val) FROM (select arrayJoin(['', '2m', '8o8', 'bQbp', '3csAg9', 'CZJRhmz', 't1Zv2yaZ']) val);
|
||||
|
||||
SELECT base58Decode('Why_not?'); -- { serverError 36 }
|
||||
|
2
tests/queries/0_stateless/02372_now_in_block.reference
Normal file
2
tests/queries/0_stateless/02372_now_in_block.reference
Normal file
@ -0,0 +1,2 @@
|
||||
2
|
||||
1
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user