mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Merge branch 'ClickHouse:master' into master
This commit is contained in:
commit
496c3acd1c
34
.github/workflows/main.yml
vendored
34
.github/workflows/main.yml
vendored
@ -211,12 +211,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 0
|
BUILD_NAME: 'package_release'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -250,12 +250,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 8
|
BUILD_NAME: 'binary_release'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -289,12 +289,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 3
|
BUILD_NAME: 'package_asan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -328,12 +328,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 4
|
BUILD_NAME: 'package_ubsan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -367,12 +367,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 5
|
BUILD_NAME: 'package_tsan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -406,12 +406,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 6
|
BUILD_NAME: 'package_msan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -445,12 +445,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 7
|
BUILD_NAME: 'package_debug'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -486,13 +486,13 @@ jobs:
|
|||||||
IMAGES_PATH: ${{runner.temp}}/images_path
|
IMAGES_PATH: ${{runner.temp}}/images_path
|
||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse special build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 1
|
BUILD_NAME: 'binary_splitted'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
|
36
.github/workflows/master.yml
vendored
36
.github/workflows/master.yml
vendored
@ -84,7 +84,7 @@ jobs:
|
|||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 compatibility_check.py 0
|
cd $REPO_COPY/tests/ci && python3 compatibility_check.py
|
||||||
- name: Cleanup
|
- name: Cleanup
|
||||||
if: always()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
@ -142,12 +142,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 0
|
BUILD_NAME: 'package_release'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -181,12 +181,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 8
|
BUILD_NAME: 'binary_release'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -219,12 +219,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 3
|
BUILD_NAME: 'package_asan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -257,12 +257,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 4
|
BUILD_NAME: 'package_ubsan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -295,12 +295,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 5
|
BUILD_NAME: 'package_tsan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -333,12 +333,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 6
|
BUILD_NAME: 'package_msan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -371,12 +371,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 7
|
BUILD_NAME: 'package_debug'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -412,13 +412,13 @@ jobs:
|
|||||||
IMAGES_PATH: ${{runner.temp}}/images_path
|
IMAGES_PATH: ${{runner.temp}}/images_path
|
||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse special build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 1
|
BUILD_NAME: 'binary_splitted'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
|
26
.github/workflows/release_branches.yml
vendored
26
.github/workflows/release_branches.yml
vendored
@ -41,7 +41,7 @@ jobs:
|
|||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 compatibility_check.py 0
|
cd $REPO_COPY/tests/ci && python3 compatibility_check.py
|
||||||
- name: Cleanup
|
- name: Cleanup
|
||||||
if: always()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
@ -72,12 +72,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 0
|
BUILD_NAME: 'package_release'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -110,12 +110,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 3
|
BUILD_NAME: 'package_asan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -148,12 +148,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 4
|
BUILD_NAME: 'package_ubsan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -186,12 +186,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 5
|
BUILD_NAME: 'package_tsan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -224,12 +224,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 6
|
BUILD_NAME: 'package_msan'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@ -262,12 +262,12 @@ jobs:
|
|||||||
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
REPO_COPY: ${{runner.temp}}/build_check/ClickHouse
|
||||||
CACHES_PATH: ${{runner.temp}}/../ccaches
|
CACHES_PATH: ${{runner.temp}}/../ccaches
|
||||||
CHECK_NAME: 'ClickHouse build check (actions)'
|
CHECK_NAME: 'ClickHouse build check (actions)'
|
||||||
BUILD_NUMBER: 7
|
BUILD_NAME: 'package_debug'
|
||||||
run: |
|
run: |
|
||||||
sudo rm -fr $TEMP_PATH
|
sudo rm -fr $TEMP_PATH
|
||||||
mkdir -p $TEMP_PATH
|
mkdir -p $TEMP_PATH
|
||||||
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
cp -r $GITHUB_WORKSPACE $TEMP_PATH
|
||||||
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NUMBER
|
cd $REPO_COPY/tests/ci && python3 build_check.py "$CHECK_NAME" $BUILD_NAME
|
||||||
- name: Upload build URLs to artifacts
|
- name: Upload build URLs to artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
|
@ -169,9 +169,7 @@ endif ()
|
|||||||
include (cmake/check_flags.cmake)
|
include (cmake/check_flags.cmake)
|
||||||
include (cmake/add_warning.cmake)
|
include (cmake/add_warning.cmake)
|
||||||
|
|
||||||
if (NOT MSVC)
|
set (COMMON_WARNING_FLAGS "${COMMON_WARNING_FLAGS} -Wall") # -Werror and many more is also added inside cmake/warnings.cmake
|
||||||
set (COMMON_WARNING_FLAGS "${COMMON_WARNING_FLAGS} -Wall") # -Werror and many more is also added inside cmake/warnings.cmake
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (COMPILER_CLANG)
|
if (COMPILER_CLANG)
|
||||||
# clang: warning: argument unused during compilation: '-specs=/usr/share/dpkg/no-pie-compile.specs' [-Wunused-command-line-argument]
|
# clang: warning: argument unused during compilation: '-specs=/usr/share/dpkg/no-pie-compile.specs' [-Wunused-command-line-argument]
|
||||||
@ -219,30 +217,6 @@ endif()
|
|||||||
# Make sure the final executable has symbols exported
|
# Make sure the final executable has symbols exported
|
||||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")
|
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")
|
||||||
|
|
||||||
find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-13" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy")
|
|
||||||
|
|
||||||
if (NOT OBJCOPY_PATH AND OS_DARWIN)
|
|
||||||
find_program (BREW_PATH NAMES "brew")
|
|
||||||
if (BREW_PATH)
|
|
||||||
execute_process (COMMAND ${BREW_PATH} --prefix llvm ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE LLVM_PREFIX)
|
|
||||||
if (LLVM_PREFIX)
|
|
||||||
find_program (OBJCOPY_PATH NAMES "llvm-objcopy" PATHS "${LLVM_PREFIX}/bin" NO_DEFAULT_PATH)
|
|
||||||
endif ()
|
|
||||||
if (NOT OBJCOPY_PATH)
|
|
||||||
execute_process (COMMAND ${BREW_PATH} --prefix binutils ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE BINUTILS_PREFIX)
|
|
||||||
if (BINUTILS_PREFIX)
|
|
||||||
find_program (OBJCOPY_PATH NAMES "objcopy" PATHS "${BINUTILS_PREFIX}/bin" NO_DEFAULT_PATH)
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (OBJCOPY_PATH)
|
|
||||||
message (STATUS "Using objcopy: ${OBJCOPY_PATH}")
|
|
||||||
else ()
|
|
||||||
message (FATAL_ERROR "Cannot find objcopy.")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (OS_DARWIN)
|
if (OS_DARWIN)
|
||||||
# The `-all_load` flag forces loading of all symbols from all libraries,
|
# The `-all_load` flag forces loading of all symbols from all libraries,
|
||||||
# and leads to multiply-defined symbols. This flag allows force loading
|
# and leads to multiply-defined symbols. This flag allows force loading
|
||||||
@ -278,6 +252,13 @@ if (NOT CMAKE_BUILD_TYPE_UC STREQUAL "RELEASE")
|
|||||||
endif ()
|
endif ()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG")
|
||||||
|
set(USE_DEBUG_HELPERS ON)
|
||||||
|
else ()
|
||||||
|
set(USE_DEBUG_HELPERS ON)
|
||||||
|
endif()
|
||||||
|
option(USE_DEBUG_HELPERS "Enable debug helpers" ${USE_DEBUG_HELPERS})
|
||||||
|
|
||||||
# Create BuildID when using lld. For other linkers it is created by default.
|
# Create BuildID when using lld. For other linkers it is created by default.
|
||||||
if (LINKER_NAME MATCHES "lld$")
|
if (LINKER_NAME MATCHES "lld$")
|
||||||
# SHA1 is not cryptographically secure but it is the best what lld is offering.
|
# SHA1 is not cryptographically secure but it is the best what lld is offering.
|
||||||
@ -312,6 +293,10 @@ include(cmake/cpu_features.cmake)
|
|||||||
# Enable it explicitly.
|
# Enable it explicitly.
|
||||||
set (COMPILER_FLAGS "${COMPILER_FLAGS} -fasynchronous-unwind-tables")
|
set (COMPILER_FLAGS "${COMPILER_FLAGS} -fasynchronous-unwind-tables")
|
||||||
|
|
||||||
|
# Reproducible builds
|
||||||
|
set (COMPILER_FLAGS "${COMPILER_FLAGS} -ffile-prefix-map=${CMAKE_SOURCE_DIR}=.")
|
||||||
|
set (CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -ffile-prefix-map=${CMAKE_SOURCE_DIR}=.")
|
||||||
|
|
||||||
if (${CMAKE_VERSION} VERSION_LESS "3.12.4")
|
if (${CMAKE_VERSION} VERSION_LESS "3.12.4")
|
||||||
# CMake < 3.12 doesn't support setting 20 as a C++ standard version.
|
# CMake < 3.12 doesn't support setting 20 as a C++ standard version.
|
||||||
# We will add C++ standard controlling flag in CMAKE_CXX_FLAGS manually for now.
|
# We will add C++ standard controlling flag in CMAKE_CXX_FLAGS manually for now.
|
||||||
@ -411,25 +396,6 @@ if (COMPILER_CLANG)
|
|||||||
message (${RECONFIGURE_MESSAGE_LEVEL} "Cannot enable ThinLTO")
|
message (${RECONFIGURE_MESSAGE_LEVEL} "Cannot enable ThinLTO")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Always prefer llvm tools when using clang. For instance, we cannot use GNU ar when llvm LTO is enabled
|
|
||||||
find_program (LLVM_AR_PATH NAMES "llvm-ar" "llvm-ar-13" "llvm-ar-12" "llvm-ar-11" "llvm-ar-10" "llvm-ar-9" "llvm-ar-8")
|
|
||||||
|
|
||||||
if (LLVM_AR_PATH)
|
|
||||||
message(STATUS "Using llvm-ar: ${LLVM_AR_PATH}.")
|
|
||||||
set (CMAKE_AR ${LLVM_AR_PATH})
|
|
||||||
else ()
|
|
||||||
message(WARNING "Cannot find llvm-ar. System ar will be used instead. It does not work with ThinLTO.")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib" "llvm-ranlib-13" "llvm-ranlib-12" "llvm-ranlib-11" "llvm-ranlib-10" "llvm-ranlib-9" "llvm-ranlib-8")
|
|
||||||
|
|
||||||
if (LLVM_RANLIB_PATH)
|
|
||||||
message(STATUS "Using llvm-ranlib: ${LLVM_RANLIB_PATH}.")
|
|
||||||
set (CMAKE_RANLIB ${LLVM_RANLIB_PATH})
|
|
||||||
else ()
|
|
||||||
message(WARNING "Cannot find llvm-ranlib. System ranlib will be used instead. It does not work with ThinLTO.")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
elseif (ENABLE_THINLTO)
|
elseif (ENABLE_THINLTO)
|
||||||
message (${RECONFIGURE_MESSAGE_LEVEL} "ThinLTO is only available with CLang")
|
message (${RECONFIGURE_MESSAGE_LEVEL} "ThinLTO is only available with CLang")
|
||||||
endif ()
|
endif ()
|
||||||
@ -483,19 +449,6 @@ else ()
|
|||||||
set (CMAKE_POSITION_INDEPENDENT_CODE ON)
|
set (CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# https://github.com/include-what-you-use/include-what-you-use
|
|
||||||
option (USE_INCLUDE_WHAT_YOU_USE "Automatically reduce unneeded includes in source code (external tool)" OFF)
|
|
||||||
|
|
||||||
if (USE_INCLUDE_WHAT_YOU_USE)
|
|
||||||
find_program(IWYU_PATH NAMES include-what-you-use iwyu)
|
|
||||||
if (NOT IWYU_PATH)
|
|
||||||
message(FATAL_ERROR "Could not find the program include-what-you-use")
|
|
||||||
endif()
|
|
||||||
if (${CMAKE_VERSION} VERSION_LESS "3.3.0")
|
|
||||||
message(FATAL_ERROR "include-what-you-use requires CMake version at least 3.3.")
|
|
||||||
endif()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (ENABLE_TESTS)
|
if (ENABLE_TESTS)
|
||||||
message (STATUS "Unit tests are enabled")
|
message (STATUS "Unit tests are enabled")
|
||||||
else()
|
else()
|
||||||
@ -595,8 +548,6 @@ include (cmake/find/mysqlclient.cmake)
|
|||||||
|
|
||||||
# When testing for memory leaks with Valgrind, don't link tcmalloc or jemalloc.
|
# When testing for memory leaks with Valgrind, don't link tcmalloc or jemalloc.
|
||||||
|
|
||||||
include (cmake/print_flags.cmake)
|
|
||||||
|
|
||||||
if (TARGET global-group)
|
if (TARGET global-group)
|
||||||
install (EXPORT global DESTINATION cmake)
|
install (EXPORT global DESTINATION cmake)
|
||||||
endif ()
|
endif ()
|
||||||
@ -648,6 +599,7 @@ include_directories(${ConfigIncludePath})
|
|||||||
|
|
||||||
# Add as many warnings as possible for our own code.
|
# Add as many warnings as possible for our own code.
|
||||||
include (cmake/warnings.cmake)
|
include (cmake/warnings.cmake)
|
||||||
|
include (cmake/print_flags.cmake)
|
||||||
|
|
||||||
add_subdirectory (base)
|
add_subdirectory (base)
|
||||||
add_subdirectory (src)
|
add_subdirectory (src)
|
||||||
|
@ -29,7 +29,8 @@ elseif (ENABLE_READLINE)
|
|||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (USE_DEBUG_HELPERS)
|
if (USE_DEBUG_HELPERS)
|
||||||
set (INCLUDE_DEBUG_HELPERS "-include \"${ClickHouse_SOURCE_DIR}/base/base/iostream_debug_helpers.h\"")
|
get_target_property(MAGIC_ENUM_INCLUDE_DIR magic_enum INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
|
set (INCLUDE_DEBUG_HELPERS "-I\"${MAGIC_ENUM_INCLUDE_DIR}\" -include \"${ClickHouse_SOURCE_DIR}/base/base/iostream_debug_helpers.h\"")
|
||||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${INCLUDE_DEBUG_HELPERS}")
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${INCLUDE_DEBUG_HELPERS}")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
@ -18,8 +18,8 @@ struct CachedFn
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
using Traits = FnTraits<decltype(Func)>;
|
using Traits = FnTraits<decltype(Func)>;
|
||||||
using DecayedArgs = TLMap<std::decay_t, typename Traits::Args>;
|
using DecayedArgs = TypeListMap<std::decay_t, typename Traits::Args>;
|
||||||
using Key = TLChangeRoot<std::tuple, DecayedArgs>;
|
using Key = TypeListChangeRoot<std::tuple, DecayedArgs>;
|
||||||
using Result = typename Traits::Ret;
|
using Result = typename Traits::Ret;
|
||||||
|
|
||||||
std::map<Key, Result> cache; // Can't use hashmap as tuples are unhashable by default
|
std::map<Key, Result> cache; // Can't use hashmap as tuples are unhashable by default
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Typelist.h"
|
#include "TypeList.h"
|
||||||
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
@ -14,7 +14,7 @@ struct FnTraits<R(A...)>
|
|||||||
static constexpr bool value = std::is_invocable_r_v<R, F, A...>;
|
static constexpr bool value = std::is_invocable_r_v<R, F, A...>;
|
||||||
|
|
||||||
using Ret = R;
|
using Ret = R;
|
||||||
using Args = Typelist<A...>;
|
using Args = TypeList<A...>;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class R, class ...A>
|
template <class R, class ...A>
|
||||||
|
44
base/base/TypeList.h
Normal file
44
base/base/TypeList.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <utility>
|
||||||
|
#include "defines.h"
|
||||||
|
#include "TypePair.h"
|
||||||
|
|
||||||
|
/// General-purpose typelist. Easy on compilation times as it does not use recursion.
|
||||||
|
template <typename ...Args>
|
||||||
|
struct TypeList { static constexpr size_t size = sizeof...(Args); };
|
||||||
|
|
||||||
|
namespace TypeListUtils /// In some contexts it's more handy to use functions instead of aliases
|
||||||
|
{
|
||||||
|
template <typename ...LArgs, typename ...RArgs>
|
||||||
|
constexpr TypeList<LArgs..., RArgs...> concat(TypeList<LArgs...>, TypeList<RArgs...>) { return {}; }
|
||||||
|
|
||||||
|
template <typename T, typename ...Args>
|
||||||
|
constexpr TypeList<T, Args...> prepend(TypeList<Args...>) { return {}; }
|
||||||
|
|
||||||
|
template <typename T, typename ...Args>
|
||||||
|
constexpr TypeList<Args..., T> append(TypeList<Args...>) { return {}; }
|
||||||
|
|
||||||
|
template <template <typename> typename F, typename ...Args>
|
||||||
|
constexpr TypeList<F<Args>...> map(TypeList<Args...>) { return {}; }
|
||||||
|
|
||||||
|
template <template <typename...> typename Root, typename ...Args>
|
||||||
|
constexpr Root<Args...> changeRoot(TypeList<Args...>) { return {}; }
|
||||||
|
|
||||||
|
template <typename F, typename ...Args>
|
||||||
|
constexpr void forEach(TypeList<Args...>, F && f) { (std::forward<F>(f)(Id<Args>{}), ...); }
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename TypeListLeft, typename TypeListRight>
|
||||||
|
using TypeListConcat = decltype(TypeListUtils::concat(TypeListLeft{}, TypeListRight{}));
|
||||||
|
|
||||||
|
template <typename T, typename List> using TypeListPrepend = decltype(TypeListUtils::prepend<T>(List{}));
|
||||||
|
template <typename T, typename List> using TypeListAppend = decltype(TypeListUtils::append<T>(List{}));
|
||||||
|
|
||||||
|
template <template <typename> typename F, typename List>
|
||||||
|
using TypeListMap = decltype(TypeListUtils::map<F>(List{}));
|
||||||
|
|
||||||
|
template <template <typename...> typename Root, typename List>
|
||||||
|
using TypeListChangeRoot = decltype(TypeListUtils::changeRoot<Root>(List{}));
|
21
base/base/TypeLists.h
Normal file
21
base/base/TypeLists.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "TypeList.h"
|
||||||
|
#include "extended_types.h"
|
||||||
|
#include "Decimal.h"
|
||||||
|
#include "UUID.h"
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
using TypeListNativeInt = TypeList<UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64>;
|
||||||
|
using TypeListFloat = TypeList<Float32, Float64>;
|
||||||
|
using TypeListNativeNumber = TypeListConcat<TypeListNativeInt, TypeListFloat>;
|
||||||
|
using TypeListWideInt = TypeList<UInt128, Int128, UInt256, Int256>;
|
||||||
|
using TypeListInt = TypeListConcat<TypeListNativeInt, TypeListWideInt>;
|
||||||
|
using TypeListIntAndFloat = TypeListConcat<TypeListInt, TypeListFloat>;
|
||||||
|
using TypeListDecimal = TypeList<Decimal32, Decimal64, Decimal128, Decimal256>;
|
||||||
|
using TypeListNumber = TypeListConcat<TypeListIntAndFloat, TypeListDecimal>;
|
||||||
|
using TypeListNumberWithUUID = TypeListAppend<UUID, TypeListNumber>;
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
template <class T, class V> struct TypePair { };
|
template <typename T, typename V> struct TypePair {};
|
||||||
template <class T> struct Id { };
|
template <typename T> struct Id {};
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
#include <type_traits>
|
|
||||||
#include <utility>
|
|
||||||
#include "defines.h"
|
|
||||||
#include "TypePair.h"
|
|
||||||
|
|
||||||
/// General-purpose typelist. Easy on compilation times as it does not use recursion.
|
|
||||||
template <class ...Args>
|
|
||||||
struct Typelist { static constexpr size_t size = sizeof...(Args); };
|
|
||||||
|
|
||||||
namespace TLUtils /// In some contexts it's more handy to use functions instead of aliases
|
|
||||||
{
|
|
||||||
template <class ...LArgs, class ...RArgs>
|
|
||||||
constexpr Typelist<LArgs..., RArgs...> concat(Typelist<LArgs...>, Typelist<RArgs...>) { return {}; }
|
|
||||||
|
|
||||||
template <class T, class ...Args>
|
|
||||||
constexpr Typelist<T, Args...> prepend(Typelist<Args...>) { return {}; }
|
|
||||||
|
|
||||||
template <class T, class ...Args>
|
|
||||||
constexpr Typelist<Args..., T> append(Typelist<Args...>) { return {}; }
|
|
||||||
|
|
||||||
template <template<class> class F, class ...Args>
|
|
||||||
constexpr Typelist<F<Args>...> map(Typelist<Args...>) { return {}; }
|
|
||||||
|
|
||||||
template <template<class...> class Root, class ...Args>
|
|
||||||
constexpr Root<Args...> changeRoot(Typelist<Args...>) { return {}; }
|
|
||||||
|
|
||||||
template <class F, class ...Args>
|
|
||||||
constexpr void forEach(Typelist<Args...>, F && f) { (std::forward<F>(f)(Id<Args>{}), ...); }
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class TLLeft, class TLRight>
|
|
||||||
using TLConcat = decltype(TLUtils::concat(TLLeft{}, TLRight{}));
|
|
||||||
|
|
||||||
template <class T, class Typelist> using TLPrepend = decltype(TLUtils::prepend<T>(Typelist{}));
|
|
||||||
template <class T, class Typelist> using TLAppend = decltype(TLUtils::append<T>(Typelist{}));
|
|
||||||
|
|
||||||
template <template<class> class F, class Typelist>
|
|
||||||
using TLMap = decltype(TLUtils::map<F>(Typelist{}));
|
|
||||||
|
|
||||||
template <template<class...> class Root, class Typelist>
|
|
||||||
using TLChangeRoot = decltype(TLUtils::changeRoot<Root>(Typelist{}));
|
|
@ -1,18 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Typelist.h"
|
|
||||||
#include "extended_types.h"
|
|
||||||
#include "Decimal.h"
|
|
||||||
#include "UUID.h"
|
|
||||||
|
|
||||||
namespace DB
|
|
||||||
{
|
|
||||||
using TLIntegral = Typelist<UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, Float64>;
|
|
||||||
using TLExtendedIntegral = Typelist<UInt128, Int128, UInt256, Int256>;
|
|
||||||
using TLDecimals = Typelist<Decimal32, Decimal64, Decimal128, Decimal256>;
|
|
||||||
|
|
||||||
using TLIntegralWithExtended = TLConcat<TLIntegral, TLExtendedIntegral>;
|
|
||||||
|
|
||||||
using TLNumbers = TLConcat<TLIntegralWithExtended, TLDecimals>;
|
|
||||||
using TLNumbersWithUUID = TLAppend<UUID, TLNumbers>;
|
|
||||||
}
|
|
@ -5,5 +5,5 @@
|
|||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
using UUID = StrongTypedef<UInt128, struct UUIDTag>;
|
using UUID = StrongTypedef<UInt128, struct UUIDTag>;
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <magic_enum.hpp>
|
||||||
|
|
||||||
/** Usage:
|
/** Usage:
|
||||||
*
|
*
|
||||||
@ -61,6 +62,13 @@ std::enable_if_t<priority == 2, Out> & dumpImpl(Out & out, T && x, std::decay_t<
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <int priority, typename Out, typename T>
|
||||||
|
std::enable_if_t<priority == 3 && std::is_enum_v<std::decay_t<T>>, Out> &
|
||||||
|
dumpImpl(Out & out, T && x)
|
||||||
|
{
|
||||||
|
return out << magic_enum::enum_name(x);
|
||||||
|
}
|
||||||
|
|
||||||
/// string and const char * - output not as container or pointer.
|
/// string and const char * - output not as container or pointer.
|
||||||
|
|
||||||
template <int priority, typename Out, typename T>
|
template <int priority, typename Out, typename T>
|
||||||
@ -131,15 +139,26 @@ Out & dumpValue(Out & out, T && x)
|
|||||||
template <typename Out, typename T>
|
template <typename Out, typename T>
|
||||||
Out & dump(Out & out, const char * name, T && x)
|
Out & dump(Out & out, const char * name, T && x)
|
||||||
{
|
{
|
||||||
|
// Dumping string literal, printing name and demangled type is irrelevant.
|
||||||
|
if constexpr (std::is_same_v<const char *, std::decay_t<std::remove_reference_t<T>>>)
|
||||||
|
{
|
||||||
|
const auto name_len = strlen(name);
|
||||||
|
const auto value_len = strlen(x);
|
||||||
|
// `name` is the same as quoted `x`
|
||||||
|
if (name_len > 2 && value_len > 0 && name[0] == '"' && name[name_len - 1] == '"'
|
||||||
|
&& strncmp(name + 1, x, std::min(value_len, name_len) - 1) == 0)
|
||||||
|
return out << x;
|
||||||
|
}
|
||||||
|
|
||||||
out << demangle(typeid(x).name()) << " " << name << " = ";
|
out << demangle(typeid(x).name()) << " " << name << " = ";
|
||||||
return dumpValue(out, x);
|
return dumpValue(out, x) << "; ";
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
|
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DUMPVAR(VAR) ::dump(std::cerr, #VAR, (VAR)); std::cerr << "; ";
|
#define DUMPVAR(VAR) ::dump(std::cerr, #VAR, (VAR));
|
||||||
#define DUMPHEAD std::cerr << __FILE__ << ':' << __LINE__ << " [ " << getThreadId() << " ] ";
|
#define DUMPHEAD std::cerr << __FILE__ << ':' << __LINE__ << " [ " << getThreadId() << " ] ";
|
||||||
#define DUMPTAIL std::cerr << '\n';
|
#define DUMPTAIL std::cerr << '\n';
|
||||||
|
|
||||||
|
@ -7,13 +7,9 @@ set (CMAKE_SYSROOT "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/freebsd-aarc
|
|||||||
|
|
||||||
set (CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # disable linkage check - it doesn't work in CMake
|
set (CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # disable linkage check - it doesn't work in CMake
|
||||||
|
|
||||||
set (CMAKE_AR "/usr/bin/ar" CACHE FILEPATH "" FORCE)
|
# Will be changed later, but somehow needed to be set here.
|
||||||
set (CMAKE_RANLIB "/usr/bin/ranlib" CACHE FILEPATH "" FORCE)
|
set (CMAKE_AR "ar")
|
||||||
|
set (CMAKE_RANLIB "ranlib")
|
||||||
set (LINKER_NAME "ld.lld" CACHE STRING "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
|
|
||||||
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
||||||
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
||||||
|
@ -7,13 +7,9 @@ set (CMAKE_SYSROOT "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/freebsd-x86_
|
|||||||
|
|
||||||
set (CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # disable linkage check - it doesn't work in CMake
|
set (CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # disable linkage check - it doesn't work in CMake
|
||||||
|
|
||||||
set (CMAKE_AR "/usr/bin/ar" CACHE FILEPATH "" FORCE)
|
# Will be changed later, but somehow needed to be set here.
|
||||||
set (CMAKE_RANLIB "/usr/bin/ranlib" CACHE FILEPATH "" FORCE)
|
set (CMAKE_AR "ar")
|
||||||
|
set (CMAKE_RANLIB "ranlib")
|
||||||
set (LINKER_NAME "ld.lld" CACHE STRING "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
|
|
||||||
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
||||||
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
||||||
|
@ -6,25 +6,18 @@ set (CMAKE_C_COMPILER_TARGET "aarch64-linux-gnu")
|
|||||||
set (CMAKE_CXX_COMPILER_TARGET "aarch64-linux-gnu")
|
set (CMAKE_CXX_COMPILER_TARGET "aarch64-linux-gnu")
|
||||||
set (CMAKE_ASM_COMPILER_TARGET "aarch64-linux-gnu")
|
set (CMAKE_ASM_COMPILER_TARGET "aarch64-linux-gnu")
|
||||||
|
|
||||||
|
# Will be changed later, but somehow needed to be set here.
|
||||||
|
set (CMAKE_AR "ar")
|
||||||
|
set (CMAKE_RANLIB "ranlib")
|
||||||
|
|
||||||
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-aarch64")
|
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-aarch64")
|
||||||
|
|
||||||
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}/aarch64-linux-gnu/libc")
|
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}/aarch64-linux-gnu/libc")
|
||||||
|
|
||||||
find_program (LLVM_AR_PATH NAMES "llvm-ar" "llvm-ar-13" "llvm-ar-12" "llvm-ar-11" "llvm-ar-10" "llvm-ar-9" "llvm-ar-8")
|
|
||||||
find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib" "llvm-ranlib-13" "llvm-ranlib-12" "llvm-ranlib-11" "llvm-ranlib-10" "llvm-ranlib-9")
|
|
||||||
|
|
||||||
set (CMAKE_AR "${LLVM_AR_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
set (CMAKE_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
|
|
||||||
set (LINKER_NAME "ld.lld" CACHE STRING "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
|
|
||||||
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
||||||
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
||||||
|
|
||||||
|
@ -6,25 +6,18 @@ set (CMAKE_C_COMPILER_TARGET "ppc64le-linux-gnu")
|
|||||||
set (CMAKE_CXX_COMPILER_TARGET "ppc64le-linux-gnu")
|
set (CMAKE_CXX_COMPILER_TARGET "ppc64le-linux-gnu")
|
||||||
set (CMAKE_ASM_COMPILER_TARGET "ppc64le-linux-gnu")
|
set (CMAKE_ASM_COMPILER_TARGET "ppc64le-linux-gnu")
|
||||||
|
|
||||||
|
# Will be changed later, but somehow needed to be set here.
|
||||||
|
set (CMAKE_AR "ar")
|
||||||
|
set (CMAKE_RANLIB "ranlib")
|
||||||
|
|
||||||
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-powerpc64le")
|
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-powerpc64le")
|
||||||
|
|
||||||
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}/powerpc64le-linux-gnu/libc")
|
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}/powerpc64le-linux-gnu/libc")
|
||||||
|
|
||||||
find_program (LLVM_AR_PATH NAMES "llvm-ar" "llvm-ar-13" "llvm-ar-12" "llvm-ar-11" "llvm-ar-10" "llvm-ar-9" "llvm-ar-8")
|
|
||||||
find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib" "llvm-ranlib-13" "llvm-ranlib-12" "llvm-ranlib-11" "llvm-ranlib-10" "llvm-ranlib-9")
|
|
||||||
|
|
||||||
set (CMAKE_AR "${LLVM_AR_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
set (CMAKE_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
|
|
||||||
set (LINKER_NAME "ld.lld" CACHE STRING "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
|
|
||||||
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
||||||
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
||||||
|
|
||||||
|
@ -6,22 +6,18 @@ set (CMAKE_C_COMPILER_TARGET "riscv64-linux-gnu")
|
|||||||
set (CMAKE_CXX_COMPILER_TARGET "riscv64-linux-gnu")
|
set (CMAKE_CXX_COMPILER_TARGET "riscv64-linux-gnu")
|
||||||
set (CMAKE_ASM_COMPILER_TARGET "riscv64-linux-gnu")
|
set (CMAKE_ASM_COMPILER_TARGET "riscv64-linux-gnu")
|
||||||
|
|
||||||
|
# Will be changed later, but somehow needed to be set here.
|
||||||
|
set (CMAKE_AR "ar")
|
||||||
|
set (CMAKE_RANLIB "ranlib")
|
||||||
|
|
||||||
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-riscv64")
|
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-riscv64")
|
||||||
|
|
||||||
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}")
|
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}")
|
||||||
|
|
||||||
find_program (LLVM_AR_PATH NAMES "llvm-ar" "llvm-ar-13" "llvm-ar-12" "llvm-ar-11" "llvm-ar-10" "llvm-ar-9" "llvm-ar-8")
|
|
||||||
find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib" "llvm-ranlib-13" "llvm-ranlib-12" "llvm-ranlib-11" "llvm-ranlib-10" "llvm-ranlib-9")
|
|
||||||
|
|
||||||
set (CMAKE_AR "${LLVM_AR_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
set (CMAKE_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
|
|
||||||
set (LINKER_NAME "riscv64-linux-gnu-ld.bfd" CACHE STRING "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=bfd")
|
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=bfd")
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=bfd")
|
set (CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=bfd")
|
||||||
|
|
||||||
|
@ -6,25 +6,18 @@ set (CMAKE_C_COMPILER_TARGET "x86_64-linux-musl")
|
|||||||
set (CMAKE_CXX_COMPILER_TARGET "x86_64-linux-musl")
|
set (CMAKE_CXX_COMPILER_TARGET "x86_64-linux-musl")
|
||||||
set (CMAKE_ASM_COMPILER_TARGET "x86_64-linux-musl")
|
set (CMAKE_ASM_COMPILER_TARGET "x86_64-linux-musl")
|
||||||
|
|
||||||
|
# Will be changed later, but somehow needed to be set here.
|
||||||
|
set (CMAKE_AR "ar")
|
||||||
|
set (CMAKE_RANLIB "ranlib")
|
||||||
|
|
||||||
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-x86_64-musl")
|
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-x86_64-musl")
|
||||||
|
|
||||||
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}")
|
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}")
|
||||||
|
|
||||||
find_program (LLVM_AR_PATH NAMES "llvm-ar" "llvm-ar-13" "llvm-ar-12" "llvm-ar-11" "llvm-ar-10" "llvm-ar-9" "llvm-ar-8")
|
|
||||||
find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib" "llvm-ranlib-13" "llvm-ranlib-12" "llvm-ranlib-11" "llvm-ranlib-10" "llvm-ranlib-9")
|
|
||||||
|
|
||||||
set (CMAKE_AR "${LLVM_AR_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
set (CMAKE_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
|
|
||||||
set (LINKER_NAME "ld.lld" CACHE STRING "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
|
|
||||||
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
||||||
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
||||||
|
|
||||||
|
@ -6,25 +6,18 @@ set (CMAKE_C_COMPILER_TARGET "x86_64-linux-gnu")
|
|||||||
set (CMAKE_CXX_COMPILER_TARGET "x86_64-linux-gnu")
|
set (CMAKE_CXX_COMPILER_TARGET "x86_64-linux-gnu")
|
||||||
set (CMAKE_ASM_COMPILER_TARGET "x86_64-linux-gnu")
|
set (CMAKE_ASM_COMPILER_TARGET "x86_64-linux-gnu")
|
||||||
|
|
||||||
|
# Will be changed later, but somehow needed to be set here.
|
||||||
|
set (CMAKE_AR "ar")
|
||||||
|
set (CMAKE_RANLIB "ranlib")
|
||||||
|
|
||||||
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-x86_64")
|
set (TOOLCHAIN_PATH "${CMAKE_CURRENT_LIST_DIR}/../../contrib/sysroot/linux-x86_64")
|
||||||
|
|
||||||
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}/x86_64-linux-gnu/libc")
|
set (CMAKE_SYSROOT "${TOOLCHAIN_PATH}/x86_64-linux-gnu/libc")
|
||||||
|
|
||||||
find_program (LLVM_AR_PATH NAMES "llvm-ar" "llvm-ar-13" "llvm-ar-12" "llvm-ar-11" "llvm-ar-10" "llvm-ar-9" "llvm-ar-8")
|
|
||||||
find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib" "llvm-ranlib-13" "llvm-ranlib-12" "llvm-ranlib-11" "llvm-ranlib-10" "llvm-ranlib-9")
|
|
||||||
|
|
||||||
set (CMAKE_AR "${LLVM_AR_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
set (CMAKE_RANLIB "${LLVM_RANLIB_PATH}" CACHE FILEPATH "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_C_FLAGS_INIT "${CMAKE_C_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
set (CMAKE_ASM_FLAGS_INIT "${CMAKE_ASM_FLAGS} --gcc-toolchain=${TOOLCHAIN_PATH}")
|
||||||
|
|
||||||
set (LINKER_NAME "ld.lld" CACHE STRING "" FORCE)
|
|
||||||
|
|
||||||
set (CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
set (CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
|
|
||||||
|
|
||||||
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE "0" CACHE STRING "Result from TRY_RUN" FORCE)
|
||||||
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
set (HAS_PRE_1970_EXITCODE__TRYRUN_OUTPUT "" CACHE STRING "Output from TRY_RUN" FORCE)
|
||||||
|
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
set (FULL_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
set (FULL_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
||||||
set (FULL_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
set (FULL_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
||||||
set (FULL_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
set (FULL_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
|
||||||
|
|
||||||
message (STATUS "compiler C = ${CMAKE_C_COMPILER} ${FULL_C_FLAGS}")
|
message (STATUS "compiler C = ${CMAKE_C_COMPILER} ${FULL_C_FLAGS}")
|
||||||
message (STATUS "compiler CXX = ${CMAKE_CXX_COMPILER} ${FULL_CXX_FLAGS}")
|
message (STATUS "compiler CXX = ${CMAKE_CXX_COMPILER} ${FULL_CXX_FLAGS}")
|
||||||
message (STATUS "LINKER_FLAGS = ${FULL_EXE_LINKER_FLAGS}")
|
message (STATUS "LINKER_FLAGS = ${FULL_EXE_LINKER_FLAGS}")
|
||||||
|
|
||||||
|
# Reproducible builds
|
||||||
|
string (REPLACE "${CMAKE_SOURCE_DIR}" "." FULL_C_FLAGS_NORMALIZED "${FULL_C_FLAGS}")
|
||||||
|
string (REPLACE "${CMAKE_SOURCE_DIR}" "." FULL_CXX_FLAGS_NORMALIZED "${FULL_CXX_FLAGS}")
|
||||||
|
string (REPLACE "${CMAKE_SOURCE_DIR}" "." FULL_EXE_LINKER_FLAGS_NORMALIZED "${FULL_EXE_LINKER_FLAGS}")
|
||||||
|
@ -78,6 +78,15 @@ if (SANITIZE)
|
|||||||
|
|
||||||
elseif (SANITIZE STREQUAL "undefined")
|
elseif (SANITIZE STREQUAL "undefined")
|
||||||
set (UBSAN_FLAGS "-fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=float-divide-by-zero")
|
set (UBSAN_FLAGS "-fsanitize=undefined -fno-sanitize-recover=all -fno-sanitize=float-divide-by-zero")
|
||||||
|
if (ENABLE_FUZZING)
|
||||||
|
# Unsigned integer overflow is well defined behaviour from a perspective of C++ standard,
|
||||||
|
# compilers or CPU. We use in hash functions like SipHash and many other places in our codebase.
|
||||||
|
# This flag is needed only because fuzzers are run inside oss-fuzz infrastructure
|
||||||
|
# and they have a bunch of flags not halt the program if UIO happend and even to silence that warnings.
|
||||||
|
# But for unknown reason that flags don't work with ClickHouse or we don't understand how to properly use them,
|
||||||
|
# that's why we often receive reports about UIO. The simplest way to avoid this is just set this flag here.
|
||||||
|
set(UBSAN_FLAGS "${SAN_FLAGS} -fno-sanitize=unsigned-integer-overflow")
|
||||||
|
endif()
|
||||||
if (COMPILER_CLANG)
|
if (COMPILER_CLANG)
|
||||||
set (UBSAN_FLAGS "${UBSAN_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/tests/ubsan_suppressions.txt")
|
set (UBSAN_FLAGS "${UBSAN_FLAGS} -fsanitize-blacklist=${CMAKE_SOURCE_DIR}/tests/ubsan_suppressions.txt")
|
||||||
else()
|
else()
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
# Compiler
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
set (COMPILER_GCC 1)
|
set (COMPILER_GCC 1)
|
||||||
elseif (CMAKE_CXX_COMPILER_ID MATCHES "AppleClang")
|
elseif (CMAKE_CXX_COMPILER_ID MATCHES "AppleClang")
|
||||||
@ -6,6 +8,8 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|||||||
set (COMPILER_CLANG 1)
|
set (COMPILER_CLANG 1)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version)
|
||||||
|
|
||||||
if (COMPILER_GCC)
|
if (COMPILER_GCC)
|
||||||
# Require minimum version of gcc
|
# Require minimum version of gcc
|
||||||
set (GCC_MINIMUM_VERSION 11)
|
set (GCC_MINIMUM_VERSION 11)
|
||||||
@ -44,8 +48,10 @@ else ()
|
|||||||
message (WARNING "You are using an unsupported compiler. Compilation has only been tested with Clang and GCC.")
|
message (WARNING "You are using an unsupported compiler. Compilation has only been tested with Clang and GCC.")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
STRING(REGEX MATCHALL "[0-9]+" COMPILER_VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION})
|
string (REGEX MATCHALL "[0-9]+" COMPILER_VERSION_LIST ${CMAKE_CXX_COMPILER_VERSION})
|
||||||
LIST(GET COMPILER_VERSION_LIST 0 COMPILER_VERSION_MAJOR)
|
list (GET COMPILER_VERSION_LIST 0 COMPILER_VERSION_MAJOR)
|
||||||
|
|
||||||
|
# Linker
|
||||||
|
|
||||||
# Example values: `lld-10`, `gold`.
|
# Example values: `lld-10`, `gold`.
|
||||||
option (LINKER_NAME "Linker name or full path")
|
option (LINKER_NAME "Linker name or full path")
|
||||||
@ -93,3 +99,69 @@ if (LINKER_NAME)
|
|||||||
|
|
||||||
message(STATUS "Using custom linker by name: ${LINKER_NAME}")
|
message(STATUS "Using custom linker by name: ${LINKER_NAME}")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Archiver
|
||||||
|
|
||||||
|
if (COMPILER_GCC)
|
||||||
|
find_program (LLVM_AR_PATH NAMES "llvm-ar" "llvm-ar-13" "llvm-ar-12" "llvm-ar-11")
|
||||||
|
else ()
|
||||||
|
find_program (LLVM_AR_PATH NAMES "llvm-ar-${COMPILER_VERSION_MAJOR}" "llvm-ar")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (LLVM_AR_PATH)
|
||||||
|
set (CMAKE_AR "${LLVM_AR_PATH}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Ranlib
|
||||||
|
|
||||||
|
if (COMPILER_GCC)
|
||||||
|
find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib" "llvm-ranlib-13" "llvm-ranlib-12" "llvm-ranlib-11")
|
||||||
|
else ()
|
||||||
|
find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib-${COMPILER_VERSION_MAJOR}" "llvm-ranlib")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (LLVM_RANLIB_PATH)
|
||||||
|
set (CMAKE_RANLIB "${LLVM_RANLIB_PATH}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Install Name Tool
|
||||||
|
|
||||||
|
if (COMPILER_GCC)
|
||||||
|
find_program (LLVM_INSTALL_NAME_TOOL_PATH NAMES "llvm-install-name-tool" "llvm-install-name-tool-13" "llvm-install-name-tool-12" "llvm-install-name-tool-11")
|
||||||
|
else ()
|
||||||
|
find_program (LLVM_INSTALL_NAME_TOOL_PATH NAMES "llvm-install-name-tool-${COMPILER_VERSION_MAJOR}" "llvm-install-name-tool")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (LLVM_INSTALL_NAME_TOOL_PATH)
|
||||||
|
set (CMAKE_INSTALL_NAME_TOOL "${LLVM_INSTALL_NAME_TOOL_PATH}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Objcopy
|
||||||
|
|
||||||
|
if (COMPILER_GCC)
|
||||||
|
find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-13" "llvm-objcopy-12" "llvm-objcopy-11" "objcopy")
|
||||||
|
else ()
|
||||||
|
find_program (OBJCOPY_PATH NAMES "llvm-objcopy-${COMPILER_VERSION_MAJOR}" "llvm-objcopy" "objcopy")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT OBJCOPY_PATH AND OS_DARWIN)
|
||||||
|
find_program (BREW_PATH NAMES "brew")
|
||||||
|
if (BREW_PATH)
|
||||||
|
execute_process (COMMAND ${BREW_PATH} --prefix llvm ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE LLVM_PREFIX)
|
||||||
|
if (LLVM_PREFIX)
|
||||||
|
find_program (OBJCOPY_PATH NAMES "llvm-objcopy" PATHS "${LLVM_PREFIX}/bin" NO_DEFAULT_PATH)
|
||||||
|
endif ()
|
||||||
|
if (NOT OBJCOPY_PATH)
|
||||||
|
execute_process (COMMAND ${BREW_PATH} --prefix binutils ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE BINUTILS_PREFIX)
|
||||||
|
if (BINUTILS_PREFIX)
|
||||||
|
find_program (OBJCOPY_PATH NAMES "objcopy" PATHS "${BINUTILS_PREFIX}/bin" NO_DEFAULT_PATH)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (OBJCOPY_PATH)
|
||||||
|
message (STATUS "Using objcopy: ${OBJCOPY_PATH}")
|
||||||
|
else ()
|
||||||
|
message (FATAL_ERROR "Cannot find objcopy.")
|
||||||
|
endif ()
|
||||||
|
@ -26,46 +26,6 @@ if (COMPILER_CLANG)
|
|||||||
no_warning(zero-length-array)
|
no_warning(zero-length-array)
|
||||||
no_warning(c11-extensions)
|
no_warning(c11-extensions)
|
||||||
|
|
||||||
add_warning(comma)
|
|
||||||
add_warning(conditional-uninitialized)
|
|
||||||
add_warning(covered-switch-default)
|
|
||||||
add_warning(deprecated)
|
|
||||||
add_warning(embedded-directive)
|
|
||||||
add_warning(empty-init-stmt) # linux-only
|
|
||||||
add_warning(extra-semi-stmt) # linux-only
|
|
||||||
add_warning(extra-semi)
|
|
||||||
add_warning(gnu-case-range)
|
|
||||||
add_warning(inconsistent-missing-destructor-override)
|
|
||||||
add_warning(newline-eof)
|
|
||||||
add_warning(old-style-cast)
|
|
||||||
add_warning(range-loop-analysis)
|
|
||||||
add_warning(redundant-parens)
|
|
||||||
add_warning(reserved-id-macro)
|
|
||||||
add_warning(shadow-field)
|
|
||||||
add_warning(shadow-uncaptured-local)
|
|
||||||
add_warning(shadow)
|
|
||||||
add_warning(string-plus-int)
|
|
||||||
add_warning(undef)
|
|
||||||
add_warning(unreachable-code-return)
|
|
||||||
add_warning(unreachable-code)
|
|
||||||
add_warning(unused-exception-parameter)
|
|
||||||
add_warning(unused-macros)
|
|
||||||
add_warning(unused-member-function)
|
|
||||||
add_warning(unneeded-internal-declaration)
|
|
||||||
add_warning(implicit-int-float-conversion)
|
|
||||||
add_warning(no-delete-null-pointer-checks)
|
|
||||||
add_warning(anon-enum-enum-conversion)
|
|
||||||
add_warning(assign-enum)
|
|
||||||
add_warning(bitwise-op-parentheses)
|
|
||||||
add_warning(int-in-bool-context)
|
|
||||||
add_warning(sometimes-uninitialized)
|
|
||||||
add_warning(tautological-bitwise-compare)
|
|
||||||
|
|
||||||
# XXX: libstdc++ has some of these for 3way compare
|
|
||||||
if (USE_LIBCXX)
|
|
||||||
add_warning(zero-as-null-pointer-constant)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (WEVERYTHING)
|
if (WEVERYTHING)
|
||||||
add_warning(everything)
|
add_warning(everything)
|
||||||
no_warning(c++98-compat-pedantic)
|
no_warning(c++98-compat-pedantic)
|
||||||
@ -101,6 +61,47 @@ if (COMPILER_CLANG)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# TODO Enable conversion, sign-conversion, double-promotion warnings.
|
# TODO Enable conversion, sign-conversion, double-promotion warnings.
|
||||||
|
else ()
|
||||||
|
add_warning(comma)
|
||||||
|
add_warning(conditional-uninitialized)
|
||||||
|
add_warning(covered-switch-default)
|
||||||
|
add_warning(deprecated)
|
||||||
|
add_warning(embedded-directive)
|
||||||
|
add_warning(empty-init-stmt) # linux-only
|
||||||
|
add_warning(extra-semi-stmt) # linux-only
|
||||||
|
add_warning(extra-semi)
|
||||||
|
add_warning(gnu-case-range)
|
||||||
|
add_warning(inconsistent-missing-destructor-override)
|
||||||
|
add_warning(newline-eof)
|
||||||
|
add_warning(old-style-cast)
|
||||||
|
add_warning(range-loop-analysis)
|
||||||
|
add_warning(redundant-parens)
|
||||||
|
add_warning(reserved-id-macro)
|
||||||
|
add_warning(shadow-field)
|
||||||
|
add_warning(shadow-uncaptured-local)
|
||||||
|
add_warning(shadow)
|
||||||
|
add_warning(string-plus-int)
|
||||||
|
add_warning(undef)
|
||||||
|
add_warning(unreachable-code-return)
|
||||||
|
add_warning(unreachable-code)
|
||||||
|
add_warning(unused-exception-parameter)
|
||||||
|
add_warning(unused-macros)
|
||||||
|
add_warning(unused-member-function)
|
||||||
|
add_warning(unneeded-internal-declaration)
|
||||||
|
add_warning(implicit-int-float-conversion)
|
||||||
|
add_warning(no-delete-null-pointer-checks)
|
||||||
|
add_warning(anon-enum-enum-conversion)
|
||||||
|
add_warning(assign-enum)
|
||||||
|
add_warning(bitwise-op-parentheses)
|
||||||
|
add_warning(int-in-bool-context)
|
||||||
|
add_warning(sometimes-uninitialized)
|
||||||
|
add_warning(tautological-bitwise-compare)
|
||||||
|
|
||||||
|
# XXX: libstdc++ has some of these for 3way compare
|
||||||
|
if (USE_LIBCXX)
|
||||||
|
add_warning(zero-as-null-pointer-constant)
|
||||||
|
endif()
|
||||||
|
|
||||||
endif ()
|
endif ()
|
||||||
elseif (COMPILER_GCC)
|
elseif (COMPILER_GCC)
|
||||||
# Add compiler options only to c++ compiler
|
# Add compiler options only to c++ compiler
|
||||||
|
@ -82,7 +82,7 @@ if (NOT EXTERNAL_CCTZ_LIBRARY_FOUND OR NOT EXTERNAL_CCTZ_LIBRARY_WORKS)
|
|||||||
|
|
||||||
# each file in that dir (except of tab and localtime) store the info about timezone
|
# each file in that dir (except of tab and localtime) store the info about timezone
|
||||||
execute_process(COMMAND
|
execute_process(COMMAND
|
||||||
bash -c "cd ${TZDIR} && find * -type f -and ! -name '*.tab' -and ! -name 'localtime' | sort | paste -sd ';' -"
|
bash -c "cd ${TZDIR} && find * -type f -and ! -name '*.tab' -and ! -name 'localtime' | LC_ALL=C sort | paste -sd ';' -"
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
OUTPUT_VARIABLE TIMEZONES)
|
OUTPUT_VARIABLE TIMEZONES)
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ def parse_env_variables(build_type, compiler, sanitizer, package_type, image_typ
|
|||||||
PPC_SUFFIX = '-ppc64le'
|
PPC_SUFFIX = '-ppc64le'
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
cmake_flags = ['$CMAKE_FLAGS', '-DADD_GDB_INDEX_FOR_GOLD=1']
|
cmake_flags = ['$CMAKE_FLAGS']
|
||||||
|
|
||||||
is_clang = compiler.startswith(CLANG_PREFIX)
|
is_clang = compiler.startswith(CLANG_PREFIX)
|
||||||
is_cross_darwin = compiler.endswith(DARWIN_SUFFIX)
|
is_cross_darwin = compiler.endswith(DARWIN_SUFFIX)
|
||||||
@ -73,11 +73,6 @@ def parse_env_variables(build_type, compiler, sanitizer, package_type, image_typ
|
|||||||
is_cross_freebsd = compiler.endswith(FREEBSD_SUFFIX)
|
is_cross_freebsd = compiler.endswith(FREEBSD_SUFFIX)
|
||||||
is_cross_compile = is_cross_darwin or is_cross_darwin_arm or is_cross_arm or is_cross_freebsd or is_cross_ppc
|
is_cross_compile = is_cross_darwin or is_cross_darwin_arm or is_cross_arm or is_cross_freebsd or is_cross_ppc
|
||||||
|
|
||||||
# Explicitly use LLD with Clang by default.
|
|
||||||
# Don't force linker for cross-compilation.
|
|
||||||
if is_clang and not is_cross_compile:
|
|
||||||
cmake_flags.append("-DLINKER_NAME=ld.lld")
|
|
||||||
|
|
||||||
if is_cross_darwin:
|
if is_cross_darwin:
|
||||||
cc = compiler[:-len(DARWIN_SUFFIX)]
|
cc = compiler[:-len(DARWIN_SUFFIX)]
|
||||||
cmake_flags.append("-DCMAKE_AR:FILEPATH=/cctools/bin/x86_64-apple-darwin-ar")
|
cmake_flags.append("-DCMAKE_AR:FILEPATH=/cctools/bin/x86_64-apple-darwin-ar")
|
||||||
|
@ -77,7 +77,7 @@ function configure
|
|||||||
|
|
||||||
function watchdog
|
function watchdog
|
||||||
{
|
{
|
||||||
sleep 3600
|
sleep 1800
|
||||||
|
|
||||||
echo "Fuzzing run has timed out"
|
echo "Fuzzing run has timed out"
|
||||||
for _ in {1..10}
|
for _ in {1..10}
|
||||||
|
@ -138,7 +138,7 @@ if __name__ == "__main__":
|
|||||||
parser.add_argument("--client-cmd", default='clickhouse-client')
|
parser.add_argument("--client-cmd", default='clickhouse-client')
|
||||||
parser.add_argument("--server-log-folder", default='/var/log/clickhouse-server')
|
parser.add_argument("--server-log-folder", default='/var/log/clickhouse-server')
|
||||||
parser.add_argument("--output-folder")
|
parser.add_argument("--output-folder")
|
||||||
parser.add_argument("--global-time-limit", type=int, default=3600)
|
parser.add_argument("--global-time-limit", type=int, default=1800)
|
||||||
parser.add_argument("--num-parallel", type=int, default=cpu_count())
|
parser.add_argument("--num-parallel", type=int, default=cpu_count())
|
||||||
parser.add_argument('--hung-check', action='store_true', default=False)
|
parser.add_argument('--hung-check', action='store_true', default=False)
|
||||||
# make sense only for hung check
|
# make sense only for hung check
|
||||||
|
@ -290,7 +290,7 @@ ngrams(string, ngramsize)
|
|||||||
|
|
||||||
- Array with n-grams.
|
- Array with n-grams.
|
||||||
|
|
||||||
Type: [Array](../../sql-reference/data-types/array.md)([FixedString](../../sql-reference/data-types/fixedstring.md)).
|
Type: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)).
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
|
|
||||||
|
@ -252,7 +252,7 @@ ngrams(string, ngramsize)
|
|||||||
|
|
||||||
- Массив с n-граммами.
|
- Массив с n-граммами.
|
||||||
|
|
||||||
Тип: [Array](../../sql-reference/data-types/array.md)([FixedString](../../sql-reference/data-types/fixedstring.md)).
|
Тип: [Array](../../sql-reference/data-types/array.md)([String](../../sql-reference/data-types/string.md)).
|
||||||
|
|
||||||
**Пример**
|
**Пример**
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <Common/setThreadName.h>
|
#include <Common/setThreadName.h>
|
||||||
#include <IO/ConnectionTimeoutsContext.h>
|
#include <IO/ConnectionTimeoutsContext.h>
|
||||||
#include <Interpreters/InterpreterInsertQuery.h>
|
#include <Interpreters/InterpreterInsertQuery.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Processors/Transforms/ExpressionTransform.h>
|
#include <Processors/Transforms/ExpressionTransform.h>
|
||||||
#include <QueryPipeline/QueryPipelineBuilder.h>
|
#include <QueryPipeline/QueryPipelineBuilder.h>
|
||||||
#include <QueryPipeline/Chain.h>
|
#include <QueryPipeline/Chain.h>
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
#include "Internals.h"
|
#include "Internals.h"
|
||||||
#include <Storages/MergeTree/MergeTreeData.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Storages/extractKeyExpressionList.h>
|
#include <Parsers/ASTIdentifier.h>
|
||||||
#include <Processors/Executors/PullingPipelineExecutor.h>
|
#include <Processors/Executors/PullingPipelineExecutor.h>
|
||||||
#include <Processors/Transforms/SquashingChunksTransform.h>
|
#include <Processors/Transforms/SquashingChunksTransform.h>
|
||||||
|
#include <Storages/MergeTree/MergeTreeData.h>
|
||||||
|
#include <Storages/extractKeyExpressionList.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "ClusterPartition.h"
|
#include "ClusterPartition.h"
|
||||||
|
|
||||||
#include <Core/Defines.h>
|
#include <Core/Defines.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
|
|
||||||
#include <base/map.h>
|
#include <base/map.h>
|
||||||
#include <boost/algorithm/string/join.hpp>
|
#include <boost/algorithm/string/join.hpp>
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <Access/SettingsProfile.h>
|
#include <Access/SettingsProfile.h>
|
||||||
#include <Access/User.h>
|
#include <Access/User.h>
|
||||||
#include <Core/Defines.h>
|
#include <Core/Defines.h>
|
||||||
|
#include <IO/WriteHelpers.h>
|
||||||
#include <Interpreters/Access/InterpreterCreateQuotaQuery.h>
|
#include <Interpreters/Access/InterpreterCreateQuotaQuery.h>
|
||||||
#include <Interpreters/Access/InterpreterCreateRoleQuery.h>
|
#include <Interpreters/Access/InterpreterCreateRoleQuery.h>
|
||||||
#include <Interpreters/Access/InterpreterCreateRowPolicyQuery.h>
|
#include <Interpreters/Access/InterpreterCreateRowPolicyQuery.h>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include <AggregateFunctions/parseAggregateFunctionParameters.h>
|
#include <AggregateFunctions/parseAggregateFunctionParameters.h>
|
||||||
|
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTLiteral.h>
|
||||||
#include <Parsers/ExpressionListParsers.h>
|
#include <Parsers/ExpressionListParsers.h>
|
||||||
#include <Parsers/parseQuery.h>
|
#include <Parsers/parseQuery.h>
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Parsers/ASTLiteral.h>
|
|
||||||
#include <Parsers/ASTExpressionList.h>
|
|
||||||
#include <Interpreters/Context_fwd.h>
|
#include <Interpreters/Context_fwd.h>
|
||||||
|
#include <Parsers/ASTExpressionList.h>
|
||||||
|
#include <Parsers/IAST_fwd.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
#include <Backups/renameInCreateQuery.h>
|
|
||||||
#include <Backups/BackupRenamingConfig.h>
|
#include <Backups/BackupRenamingConfig.h>
|
||||||
|
#include <Backups/renameInCreateQuery.h>
|
||||||
|
#include <Interpreters/InDepthNodeVisitor.h>
|
||||||
|
#include <Interpreters/evaluateConstantExpression.h>
|
||||||
#include <Parsers/ASTCreateQuery.h>
|
#include <Parsers/ASTCreateQuery.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
|
#include <Parsers/ASTIdentifier.h>
|
||||||
#include <Parsers/ASTLiteral.h>
|
#include <Parsers/ASTLiteral.h>
|
||||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||||
#include <TableFunctions/TableFunctionFactory.h>
|
#include <TableFunctions/TableFunctionFactory.h>
|
||||||
#include <Interpreters/InDepthNodeVisitor.h>
|
|
||||||
#include <Interpreters/evaluateConstantExpression.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -28,7 +28,8 @@ configure_file (Common/config_version.h.in ${CONFIG_VERSION})
|
|||||||
configure_file (Core/config_core.h.in "${CMAKE_CURRENT_BINARY_DIR}/Core/include/config_core.h")
|
configure_file (Core/config_core.h.in "${CMAKE_CURRENT_BINARY_DIR}/Core/include/config_core.h")
|
||||||
|
|
||||||
if (USE_DEBUG_HELPERS)
|
if (USE_DEBUG_HELPERS)
|
||||||
set (INCLUDE_DEBUG_HELPERS "-I\"${ClickHouse_SOURCE_DIR}/base\" -include \"${ClickHouse_SOURCE_DIR}/src/Core/iostream_debug_helpers.h\"")
|
get_target_property(MAGIC_ENUM_INCLUDE_DIR magic_enum INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
|
set (INCLUDE_DEBUG_HELPERS "-I\"${ClickHouse_SOURCE_DIR}/base\" -I\"${MAGIC_ENUM_INCLUDE_DIR}\" -include \"${ClickHouse_SOURCE_DIR}/src/Core/iostream_debug_helpers.h\"")
|
||||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${INCLUDE_DEBUG_HELPERS}")
|
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${INCLUDE_DEBUG_HELPERS}")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
@ -40,7 +40,6 @@
|
|||||||
#include <Parsers/ASTDropQuery.h>
|
#include <Parsers/ASTDropQuery.h>
|
||||||
#include <Parsers/ASTSetQuery.h>
|
#include <Parsers/ASTSetQuery.h>
|
||||||
#include <Parsers/ASTUseQuery.h>
|
#include <Parsers/ASTUseQuery.h>
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
|
||||||
#include <Parsers/ASTSelectWithUnionQuery.h>
|
#include <Parsers/ASTSelectWithUnionQuery.h>
|
||||||
#include <Parsers/ASTQueryWithOutput.h>
|
#include <Parsers/ASTQueryWithOutput.h>
|
||||||
#include <Parsers/ASTLiteral.h>
|
#include <Parsers/ASTLiteral.h>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <base/demangle.h>
|
#include <base/demangle.h>
|
||||||
#include <base/Typelist.h>
|
#include <base/TypeList.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
|
|
||||||
/* Generic utils which are intended for visitor pattern implementation.
|
/* Generic utils which are intended for visitor pattern implementation.
|
||||||
@ -64,7 +64,7 @@ template <>
|
|||||||
class Visitor<>
|
class Visitor<>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using List = Typelist<>;
|
using List = TypeList<>;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
~Visitor() = default;
|
~Visitor() = default;
|
||||||
@ -74,7 +74,7 @@ template <typename Type>
|
|||||||
class Visitor<Type> : public Visitor<>
|
class Visitor<Type> : public Visitor<>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using List = Typelist<Type>;
|
using List = TypeList<Type>;
|
||||||
|
|
||||||
virtual void visit(Type &) = 0;
|
virtual void visit(Type &) = 0;
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ template <typename Type, typename ... Types>
|
|||||||
class Visitor<Type, Types ...> : public Visitor<Types ...>
|
class Visitor<Type, Types ...> : public Visitor<Types ...>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using List = Typelist<Type, Types ...>;
|
using List = TypeList<Type, Types ...>;
|
||||||
using Visitor<Types ...>::visit;
|
using Visitor<Types ...>::visit;
|
||||||
|
|
||||||
virtual void visit(Type &) = 0;
|
virtual void visit(Type &) = 0;
|
||||||
@ -145,10 +145,10 @@ protected:
|
|||||||
|
|
||||||
template <typename Derived, typename VisitorBase>
|
template <typename Derived, typename VisitorBase>
|
||||||
class VisitorImpl : public
|
class VisitorImpl : public
|
||||||
TLChangeRoot<
|
TypeListChangeRoot<
|
||||||
VisitorImplHelper,
|
VisitorImplHelper,
|
||||||
TLConcat<
|
TypeListConcat<
|
||||||
Typelist<Derived, VisitorBase>,
|
TypeList<Derived, VisitorBase>,
|
||||||
typename VisitorBase::List
|
typename VisitorBase::List
|
||||||
>
|
>
|
||||||
>
|
>
|
||||||
|
@ -87,7 +87,7 @@ CachedCompressedReadBuffer::CachedCompressedReadBuffer(
|
|||||||
void CachedCompressedReadBuffer::seek(size_t offset_in_compressed_file, size_t offset_in_decompressed_block)
|
void CachedCompressedReadBuffer::seek(size_t offset_in_compressed_file, size_t offset_in_decompressed_block)
|
||||||
{
|
{
|
||||||
/// Nothing to do if we already at required position
|
/// Nothing to do if we already at required position
|
||||||
if (file_pos == offset_in_compressed_file
|
if (!owned_cell && file_pos == offset_in_compressed_file
|
||||||
&& (offset() == offset_in_decompressed_block ||
|
&& (offset() == offset_in_decompressed_block ||
|
||||||
nextimpl_working_buffer_offset == offset_in_decompressed_block))
|
nextimpl_working_buffer_offset == offset_in_decompressed_block))
|
||||||
return;
|
return;
|
||||||
@ -106,6 +106,8 @@ void CachedCompressedReadBuffer::seek(size_t offset_in_compressed_file, size_t o
|
|||||||
bytes += offset();
|
bytes += offset();
|
||||||
/// No data, everything discarded
|
/// No data, everything discarded
|
||||||
pos = working_buffer.end();
|
pos = working_buffer.end();
|
||||||
|
owned_cell.reset();
|
||||||
|
|
||||||
/// Remember required offset in decompressed block which will be set in
|
/// Remember required offset in decompressed block which will be set in
|
||||||
/// the next ReadBuffer::next() call
|
/// the next ReadBuffer::next() call
|
||||||
nextimpl_working_buffer_offset = offset_in_decompressed_block;
|
nextimpl_working_buffer_offset = offset_in_decompressed_block;
|
||||||
|
@ -49,7 +49,7 @@ public:
|
|||||||
explicit CompressedReadBufferFromFile(std::unique_ptr<ReadBufferFromFileBase> buf, bool allow_different_codecs_ = false);
|
explicit CompressedReadBufferFromFile(std::unique_ptr<ReadBufferFromFileBase> buf, bool allow_different_codecs_ = false);
|
||||||
|
|
||||||
/// Seek is lazy in some sense. We move position in compressed file_in to offset_in_compressed_file, but don't
|
/// Seek is lazy in some sense. We move position in compressed file_in to offset_in_compressed_file, but don't
|
||||||
/// read data into working_buffer and don't shit our position to offset_in_decompressed_block. Instead
|
/// read data into working_buffer and don't shift our position to offset_in_decompressed_block. Instead
|
||||||
/// we store this offset inside nextimpl_working_buffer_offset.
|
/// we store this offset inside nextimpl_working_buffer_offset.
|
||||||
void seek(size_t offset_in_compressed_file, size_t offset_in_decompressed_block);
|
void seek(size_t offset_in_compressed_file, size_t offset_in_decompressed_block);
|
||||||
|
|
||||||
|
@ -7,11 +7,9 @@
|
|||||||
#include <Compression/CompressionCodecEncrypted.h>
|
#include <Compression/CompressionCodecEncrypted.h>
|
||||||
#include <Poco/Logger.h>
|
#include <Poco/Logger.h>
|
||||||
#include <base/logger_useful.h>
|
#include <base/logger_useful.h>
|
||||||
#include <Common/ErrorCodes.h>
|
|
||||||
|
|
||||||
// This depends on BoringSSL-specific API, notably <openssl/aead.h>.
|
// This depends on BoringSSL-specific API, notably <openssl/aead.h>.
|
||||||
#if USE_SSL && USE_INTERNAL_SSL_LIBRARY
|
#if USE_SSL && USE_INTERNAL_SSL_LIBRARY
|
||||||
#include <Parsers/ASTLiteral.h>
|
|
||||||
#include <openssl/digest.h>
|
#include <openssl/digest.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <boost/algorithm/hex.hpp>
|
#include <boost/algorithm/hex.hpp>
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
#include <Compression/CompressionFactory.h>
|
#include <Compression/CompressionFactory.h>
|
||||||
#include <base/unaligned.h>
|
#include <base/unaligned.h>
|
||||||
#include <Parsers/IAST_fwd.h>
|
#include <Parsers/IAST_fwd.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <IO/ReadBufferFromMemory.h>
|
#include <IO/ReadBufferFromMemory.h>
|
||||||
#include <IO/BitHelpers.h>
|
#include <IO/BitHelpers.h>
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#include <Compression/CompressionCodecNone.h>
|
#include <Compression/CompressionCodecNone.h>
|
||||||
#include <Compression/CompressionInfo.h>
|
#include <Compression/CompressionInfo.h>
|
||||||
#include <Compression/CompressionFactory.h>
|
#include <Compression/CompressionFactory.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#include <base/unaligned.h>
|
#include <base/unaligned.h>
|
||||||
#include <Parsers/IAST.h>
|
#include <Parsers/IAST.h>
|
||||||
#include <Parsers/ASTLiteral.h>
|
#include <Parsers/ASTLiteral.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <Core/Types.h>
|
#include <Core/Types.h>
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
|
|
||||||
#include <AggregateFunctions/AggregateFunctionFactory.h>
|
#include <AggregateFunctions/AggregateFunctionFactory.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
|
#include <Parsers/ASTIdentifier_fwd.h>
|
||||||
#include <Parsers/ASTLiteral.h>
|
#include <Parsers/ASTLiteral.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -8,8 +8,9 @@
|
|||||||
|
|
||||||
#include <AggregateFunctions/AggregateFunctionFactory.h>
|
#include <AggregateFunctions/AggregateFunctionFactory.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ASTLiteral.h>
|
|
||||||
#include <Parsers/ASTIdentifier.h>
|
#include <Parsers/ASTIdentifier.h>
|
||||||
|
#include <Parsers/ASTLiteral.h>
|
||||||
|
#include <Parsers/ASTSelectWithUnionQuery.h>
|
||||||
|
|
||||||
#include <boost/algorithm/string/join.hpp>
|
#include <boost/algorithm/string/join.hpp>
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
#include <Common/assert_cast.h>
|
#include <Common/assert_cast.h>
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
#include <Core/Field.h>
|
#include <Core/Field.h>
|
||||||
#include <base/Typelists.h>
|
#include <base/TypeLists.h>
|
||||||
#include <DataTypes/DataTypeDate.h>
|
#include <DataTypes/DataTypeDate.h>
|
||||||
#include <DataTypes/DataTypeDateTime.h>
|
#include <DataTypes/DataTypeDateTime.h>
|
||||||
#include <DataTypes/DataTypeFactory.h>
|
#include <DataTypes/DataTypeFactory.h>
|
||||||
@ -53,7 +53,7 @@ namespace
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <typename T>
|
||||||
void operator()(Id<T>)
|
void operator()(Id<T>)
|
||||||
{
|
{
|
||||||
if (typeid_cast<const DataTypeNumber<T> *>(&keys_type))
|
if (typeid_cast<const DataTypeNumber<T> *>(&keys_type))
|
||||||
@ -89,7 +89,7 @@ MutableColumnUniquePtr DataTypeLowCardinality::createColumnUniqueImpl(const IDat
|
|||||||
else if (which.isInt() || which.isUInt() || which.isFloat())
|
else if (which.isInt() || which.isUInt() || which.isFloat())
|
||||||
{
|
{
|
||||||
MutableColumnUniquePtr column;
|
MutableColumnUniquePtr column;
|
||||||
TLUtils::forEach(TLIntegral{}, CreateColumnVector(column, *type, creator));
|
TypeListUtils::forEach(TypeListIntAndFloat{}, CreateColumnVector(column, *type, creator));
|
||||||
|
|
||||||
if (!column)
|
if (!column)
|
||||||
throw Exception("Unexpected numeric type: " + type->getName(), ErrorCodes::LOGICAL_ERROR);
|
throw Exception("Unexpected numeric type: " + type->getName(), ErrorCodes::LOGICAL_ERROR);
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#include <Core/MultiEnum.h>
|
#include <Core/MultiEnum.h>
|
||||||
#include <Core/SettingsEnums.h>
|
#include <Core/SettingsEnums.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
#include <Parsers/IAST.h>
|
#include <Parsers/IAST.h>
|
||||||
#include "DataTypeDate.h"
|
#include "DataTypeDate.h"
|
||||||
#include "DataTypeDateTime.h"
|
#include "DataTypeDateTime.h"
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
#include <Databases/DDLDependencyVisitor.h>
|
#include <Databases/DDLDependencyVisitor.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
|
||||||
#include <Parsers/ASTCreateQuery.h>
|
|
||||||
#include <Parsers/ASTLiteral.h>
|
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
#include <Dictionaries/getDictionaryConfigurationFromAST.h>
|
#include <Dictionaries/getDictionaryConfigurationFromAST.h>
|
||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
|
#include <Parsers/ASTCreateQuery.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
|
#include <Parsers/ASTIdentifier.h>
|
||||||
|
#include <Parsers/ASTLiteral.h>
|
||||||
|
#include <Parsers/ASTSelectWithUnionQuery.h>
|
||||||
#include <Poco/String.h>
|
#include <Poco/String.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -11,9 +11,7 @@
|
|||||||
#include <Interpreters/evaluateConstantExpression.h>
|
#include <Interpreters/evaluateConstantExpression.h>
|
||||||
#include <Parsers/ASTCreateQuery.h>
|
#include <Parsers/ASTCreateQuery.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
#include <Parsers/ASTLiteral.h>
|
#include <Parsers/ASTLiteral.h>
|
||||||
#include <Parsers/formatAST.h>
|
|
||||||
#include <Parsers/queryToString.h>
|
#include <Parsers/queryToString.h>
|
||||||
#include <Storages/ExternalDataSourceConfiguration.h>
|
#include <Storages/ExternalDataSourceConfiguration.h>
|
||||||
#include <Common/Macros.h>
|
#include <Common/Macros.h>
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <Databases/DDLDependencyVisitor.h>
|
#include <Databases/DDLDependencyVisitor.h>
|
||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
#include <Parsers/ASTCreateQuery.h>
|
#include <Parsers/ASTCreateQuery.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Storages/IStorage.h>
|
#include <Storages/IStorage.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
#include <Interpreters/InterpreterCreateQuery.h>
|
#include <Interpreters/InterpreterCreateQuery.h>
|
||||||
#include <Parsers/ASTCreateQuery.h>
|
#include <Parsers/ASTCreateQuery.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ParserCreateQuery.h>
|
#include <Parsers/ParserCreateQuery.h>
|
||||||
#include <Parsers/formatAST.h>
|
#include <Parsers/formatAST.h>
|
||||||
#include <Parsers/parseQuery.h>
|
#include <Parsers/parseQuery.h>
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <base/getFQDNOrHostName.h>
|
#include <base/getFQDNOrHostName.h>
|
||||||
#include <Parsers/ASTAlterQuery.h>
|
#include <Parsers/ASTAlterQuery.h>
|
||||||
#include <Parsers/ASTDropQuery.h>
|
#include <Parsers/ASTDropQuery.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ParserCreateQuery.h>
|
#include <Parsers/ParserCreateQuery.h>
|
||||||
#include <Parsers/parseQuery.h>
|
#include <Parsers/parseQuery.h>
|
||||||
#include <Interpreters/InterpreterCreateQuery.h>
|
#include <Interpreters/InterpreterCreateQuery.h>
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#include <Interpreters/InterpreterCreateQuery.h>
|
#include <Interpreters/InterpreterCreateQuery.h>
|
||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
#include <Parsers/ASTCreateQuery.h>
|
#include <Parsers/ASTCreateQuery.h>
|
||||||
|
#include <Parsers/ASTSelectWithUnionQuery.h>
|
||||||
#include <Parsers/ParserCreateQuery.h>
|
#include <Parsers/ParserCreateQuery.h>
|
||||||
#include <Parsers/formatAST.h>
|
#include <Parsers/formatAST.h>
|
||||||
#include <Storages/StorageDictionary.h>
|
#include <Storages/StorageDictionary.h>
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <base/types.h>
|
#include <base/types.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
|
||||||
#include <Parsers/IAST.h>
|
#include <Parsers/IAST.h>
|
||||||
#include <Storages/IStorage_fwd.h>
|
#include <Storages/IStorage_fwd.h>
|
||||||
#include <Databases/IDatabase.h>
|
#include <Databases/IDatabase.h>
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#include <Databases/PostgreSQL/DatabasePostgreSQL.h>
|
#include <Databases/PostgreSQL/DatabasePostgreSQL.h>
|
||||||
|
|
||||||
|
#include <Parsers/ASTIdentifier.h>
|
||||||
|
|
||||||
#if USE_LIBPQXX
|
#if USE_LIBPQXX
|
||||||
|
|
||||||
#include <DataTypes/DataTypeNullable.h>
|
#include <DataTypes/DataTypeNullable.h>
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <Databases/SQLite/fetchSQLiteTableStructure.h>
|
#include <Databases/SQLite/fetchSQLiteTableStructure.h>
|
||||||
#include <Parsers/ASTCreateQuery.h>
|
#include <Parsers/ASTCreateQuery.h>
|
||||||
#include <Parsers/ASTColumnDeclaration.h>
|
#include <Parsers/ASTColumnDeclaration.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
#include <Storages/StorageSQLite.h>
|
#include <Storages/StorageSQLite.h>
|
||||||
#include <Databases/SQLite/SQLiteUtils.h>
|
#include <Databases/SQLite/SQLiteUtils.h>
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <Interpreters/ExpressionActions.h>
|
#include <Interpreters/ExpressionActions.h>
|
||||||
#include <Processors/Transforms/ExpressionTransform.h>
|
#include <Processors/Transforms/ExpressionTransform.h>
|
||||||
#include <QueryPipeline/QueryPipelineBuilder.h>
|
#include <QueryPipeline/QueryPipelineBuilder.h>
|
||||||
|
#include <Storages/ExternalDataSourceConfiguration.h>
|
||||||
#include <IO/ConnectionTimeouts.h>
|
#include <IO/ConnectionTimeouts.h>
|
||||||
#include <Interpreters/Session.h>
|
#include <Interpreters/Session.h>
|
||||||
#include <Interpreters/executeQuery.h>
|
#include <Interpreters/executeQuery.h>
|
||||||
@ -221,39 +222,67 @@ void registerDictionarySourceClickHouse(DictionarySourceFactory & factory)
|
|||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
ContextPtr global_context,
|
ContextPtr global_context,
|
||||||
const std::string & default_database [[maybe_unused]],
|
const std::string & default_database [[maybe_unused]],
|
||||||
bool /* created_from_ddl */) -> DictionarySourcePtr
|
bool created_from_ddl) -> DictionarySourcePtr
|
||||||
{
|
{
|
||||||
bool secure = config.getBool(config_prefix + ".secure", false);
|
bool secure = config.getBool(config_prefix + ".secure", false);
|
||||||
|
|
||||||
UInt16 default_port = getPortFromContext(global_context, secure);
|
UInt16 default_port = getPortFromContext(global_context, secure);
|
||||||
|
|
||||||
std::string settings_config_prefix = config_prefix + ".clickhouse";
|
std::string settings_config_prefix = config_prefix + ".clickhouse";
|
||||||
std::string host = config.getString(settings_config_prefix + ".host", "localhost");
|
|
||||||
UInt16 port = static_cast<UInt16>(config.getUInt(settings_config_prefix + ".port", default_port));
|
|
||||||
|
|
||||||
ClickHouseDictionarySource::Configuration configuration
|
std::unique_ptr<ClickHouseDictionarySource::Configuration> configuration;
|
||||||
|
auto named_collection = created_from_ddl ?
|
||||||
|
getExternalDataSourceConfiguration(config, settings_config_prefix, global_context) : std::nullopt;
|
||||||
|
if (named_collection)
|
||||||
{
|
{
|
||||||
.host = host,
|
std::string host = named_collection->host;
|
||||||
.user = config.getString(settings_config_prefix + ".user", "default"),
|
UInt16 port = named_collection->port;
|
||||||
.password = config.getString(settings_config_prefix + ".password", ""),
|
configuration = std::make_unique<ClickHouseDictionarySource::Configuration>(
|
||||||
.db = config.getString(settings_config_prefix + ".db", default_database),
|
ClickHouseDictionarySource::Configuration{
|
||||||
.table = config.getString(settings_config_prefix + ".table", ""),
|
.host = host,
|
||||||
.query = config.getString(settings_config_prefix + ".query", ""),
|
.user = named_collection->username,
|
||||||
.where = config.getString(settings_config_prefix + ".where", ""),
|
.password = named_collection->password,
|
||||||
.invalidate_query = config.getString(settings_config_prefix + ".invalidate_query", ""),
|
.db = named_collection->database,
|
||||||
.update_field = config.getString(settings_config_prefix + ".update_field", ""),
|
.table = named_collection->table,
|
||||||
.update_lag = config.getUInt64(settings_config_prefix + ".update_lag", 1),
|
.query = config.getString(settings_config_prefix + ".query", ""),
|
||||||
.port = port,
|
.where = config.getString(settings_config_prefix + ".where", ""),
|
||||||
.is_local = isLocalAddress({host, port}, default_port),
|
.invalidate_query = config.getString(settings_config_prefix + ".invalidate_query", ""),
|
||||||
.secure = config.getBool(settings_config_prefix + ".secure", false)
|
.update_field = config.getString(settings_config_prefix + ".update_field", ""),
|
||||||
};
|
.update_lag = config.getUInt64(settings_config_prefix + ".update_lag", 1),
|
||||||
|
.port = port,
|
||||||
|
.is_local = isLocalAddress({host, port}, default_port),
|
||||||
|
.secure = config.getBool(settings_config_prefix + ".secure", false)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string host = config.getString(settings_config_prefix + ".host", "localhost");
|
||||||
|
UInt16 port = static_cast<UInt16>(config.getUInt(settings_config_prefix + ".port", default_port));
|
||||||
|
configuration = std::make_unique<ClickHouseDictionarySource::Configuration>(
|
||||||
|
ClickHouseDictionarySource::Configuration{
|
||||||
|
.host = host,
|
||||||
|
.user = config.getString(settings_config_prefix + ".user", "default"),
|
||||||
|
.password = config.getString(settings_config_prefix + ".password", ""),
|
||||||
|
.db = config.getString(settings_config_prefix + ".db", default_database),
|
||||||
|
.table = config.getString(settings_config_prefix + ".table", ""),
|
||||||
|
.query = config.getString(settings_config_prefix + ".query", ""),
|
||||||
|
.where = config.getString(settings_config_prefix + ".where", ""),
|
||||||
|
.invalidate_query = config.getString(settings_config_prefix + ".invalidate_query", ""),
|
||||||
|
.update_field = config.getString(settings_config_prefix + ".update_field", ""),
|
||||||
|
.update_lag = config.getUInt64(settings_config_prefix + ".update_lag", 1),
|
||||||
|
.port = port,
|
||||||
|
.is_local = isLocalAddress({host, port}, default_port),
|
||||||
|
.secure = config.getBool(settings_config_prefix + ".secure", false)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ContextMutablePtr context;
|
ContextMutablePtr context;
|
||||||
if (configuration.is_local)
|
if (configuration->is_local)
|
||||||
{
|
{
|
||||||
/// We should set user info even for the case when the dictionary is loaded in-process (without TCP communication).
|
/// We should set user info even for the case when the dictionary is loaded in-process (without TCP communication).
|
||||||
Session session(global_context, ClientInfo::Interface::LOCAL);
|
Session session(global_context, ClientInfo::Interface::LOCAL);
|
||||||
session.authenticate(configuration.user, configuration.password, {});
|
session.authenticate(configuration->user, configuration->password, {});
|
||||||
context = session.makeQueryContext();
|
context = session.makeQueryContext();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -265,10 +294,10 @@ void registerDictionarySourceClickHouse(DictionarySourceFactory & factory)
|
|||||||
String dictionary_name = config.getString(".dictionary.name", "");
|
String dictionary_name = config.getString(".dictionary.name", "");
|
||||||
String dictionary_database = config.getString(".dictionary.database", "");
|
String dictionary_database = config.getString(".dictionary.database", "");
|
||||||
|
|
||||||
if (dictionary_name == configuration.table && dictionary_database == configuration.db)
|
if (dictionary_name == configuration->table && dictionary_database == configuration->db)
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "ClickHouseDictionarySource table cannot be dictionary table");
|
throw Exception(ErrorCodes::BAD_ARGUMENTS, "ClickHouseDictionarySource table cannot be dictionary table");
|
||||||
|
|
||||||
return std::make_unique<ClickHouseDictionarySource>(dict_struct, configuration, sample_block, context);
|
return std::make_unique<ClickHouseDictionarySource>(dict_struct, *configuration, sample_block, context);
|
||||||
};
|
};
|
||||||
|
|
||||||
factory.registerSource("clickhouse", create_table_source);
|
factory.registerSource("clickhouse", create_table_source);
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include <Parsers/queryToString.h>
|
#include <Parsers/queryToString.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
#include <Parsers/ASTIdentifier.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
|
#include <Parsers/ASTLiteral.h>
|
||||||
#include <Core/Names.h>
|
#include <Core/Names.h>
|
||||||
#include <Common/FieldVisitorToString.h>
|
#include <Common/FieldVisitorToString.h>
|
||||||
#include <Parsers/ASTFunctionWithKeyValueArguments.h>
|
#include <Parsers/ASTFunctionWithKeyValueArguments.h>
|
||||||
|
@ -58,7 +58,7 @@ struct EmptyImpl
|
|||||||
static void uuid(const ColumnUUID::Container & container, size_t n, PaddedPODArray<UInt8> & res)
|
static void uuid(const ColumnUUID::Container & container, size_t n, PaddedPODArray<UInt8> & res)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < n; ++i)
|
for (size_t i = 0; i < n; ++i)
|
||||||
res[i] = negative ^ (container.data()->toUnderType() == 0);
|
res[i] = negative ^ (container[i].toUnderType() == 0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
#include <Common/assert_cast.h>
|
#include <Common/assert_cast.h>
|
||||||
#include <Common/FieldVisitorsAccurateComparison.h>
|
#include <Common/FieldVisitorsAccurateComparison.h>
|
||||||
#include <base/Typelist.h>
|
#include <base/TypeList.h>
|
||||||
#include <base/map.h>
|
#include <base/map.h>
|
||||||
|
|
||||||
#include <Common/config.h>
|
#include <Common/config.h>
|
||||||
@ -625,17 +625,17 @@ class FunctionBinaryArithmetic : public IFunction
|
|||||||
|
|
||||||
static bool castType(const IDataType * type, auto && f)
|
static bool castType(const IDataType * type, auto && f)
|
||||||
{
|
{
|
||||||
using Types = Typelist<
|
using Types = TypeList<
|
||||||
DataTypeUInt8, DataTypeUInt16, DataTypeUInt32, DataTypeUInt64, DataTypeUInt128, DataTypeUInt256,
|
DataTypeUInt8, DataTypeUInt16, DataTypeUInt32, DataTypeUInt64, DataTypeUInt128, DataTypeUInt256,
|
||||||
DataTypeInt8, DataTypeInt16, DataTypeInt32, DataTypeInt64, DataTypeInt128, DataTypeInt256,
|
DataTypeInt8, DataTypeInt16, DataTypeInt32, DataTypeInt64, DataTypeInt128, DataTypeInt256,
|
||||||
DataTypeDecimal32, DataTypeDecimal64, DataTypeDecimal128, DataTypeDecimal256,
|
DataTypeDecimal32, DataTypeDecimal64, DataTypeDecimal128, DataTypeDecimal256,
|
||||||
DataTypeDate, DataTypeDateTime,
|
DataTypeDate, DataTypeDateTime,
|
||||||
DataTypeFixedString, DataTypeString>;
|
DataTypeFixedString, DataTypeString>;
|
||||||
|
|
||||||
using Floats = Typelist<DataTypeFloat32, DataTypeFloat64>;
|
using Floats = TypeList<DataTypeFloat32, DataTypeFloat64>;
|
||||||
|
|
||||||
using ValidTypes = std::conditional_t<valid_on_float_arguments,
|
using ValidTypes = std::conditional_t<valid_on_float_arguments,
|
||||||
TLConcat<Types, Floats>,
|
TypeListConcat<Types, Floats>,
|
||||||
Types>;
|
Types>;
|
||||||
|
|
||||||
return castTypeToEither(ValidTypes{}, type, std::forward<decltype(f)>(f));
|
return castTypeToEither(ValidTypes{}, type, std::forward<decltype(f)>(f));
|
||||||
|
@ -279,37 +279,33 @@ private:
|
|||||||
// That may lead later to reading unallocated data from underlying PaddedPODArray
|
// That may lead later to reading unallocated data from underlying PaddedPODArray
|
||||||
// due to assumption that it is safe to read up to 15 bytes past end.
|
// due to assumption that it is safe to read up to 15 bytes past end.
|
||||||
const auto pad_to_next_block = block_size == 1 ? 0 : 1;
|
const auto pad_to_next_block = block_size == 1 ? 0 : 1;
|
||||||
for (size_t r = 0; r < input_rows_count; ++r)
|
for (size_t row_idx = 0; row_idx < input_rows_count; ++row_idx)
|
||||||
{
|
{
|
||||||
resulting_size += (input_column->getDataAt(r).size / block_size + pad_to_next_block) * block_size + 1;
|
resulting_size += (input_column->getDataAt(row_idx).size / block_size + pad_to_next_block) * block_size + 1;
|
||||||
if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM)
|
if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM)
|
||||||
resulting_size += tag_size;
|
resulting_size += tag_size;
|
||||||
}
|
}
|
||||||
#if defined(MEMORY_SANITIZER)
|
|
||||||
encrypted_result_column_data.resize_fill(resulting_size, 0xFF);
|
|
||||||
#else
|
|
||||||
encrypted_result_column_data.resize(resulting_size);
|
encrypted_result_column_data.resize(resulting_size);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto * encrypted = encrypted_result_column_data.data();
|
auto * encrypted = encrypted_result_column_data.data();
|
||||||
|
|
||||||
KeyHolder<mode> key_holder;
|
KeyHolder<mode> key_holder;
|
||||||
|
|
||||||
for (size_t r = 0; r < input_rows_count; ++r)
|
for (size_t row_idx = 0; row_idx < input_rows_count; ++row_idx)
|
||||||
{
|
{
|
||||||
const auto key_value = key_holder.setKey(key_size, key_column->getDataAt(r));
|
const auto key_value = key_holder.setKey(key_size, key_column->getDataAt(row_idx));
|
||||||
auto iv_value = StringRef{};
|
auto iv_value = StringRef{};
|
||||||
if (iv_column)
|
if (iv_column)
|
||||||
{
|
{
|
||||||
iv_value = iv_column->getDataAt(r);
|
iv_value = iv_column->getDataAt(row_idx);
|
||||||
|
|
||||||
/// If the length is zero (empty string is passed) it should be treat as no IV.
|
/// If the length is zero (empty string is passed) it should be treat as no IV.
|
||||||
if (iv_value.size == 0)
|
if (iv_value.size == 0)
|
||||||
iv_value.data = nullptr;
|
iv_value.data = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const StringRef input_value = input_column->getDataAt(r);
|
const StringRef input_value = input_column->getDataAt(row_idx);
|
||||||
|
|
||||||
if constexpr (mode != CipherMode::MySQLCompatibility)
|
if constexpr (mode != CipherMode::MySQLCompatibility)
|
||||||
{
|
{
|
||||||
@ -348,7 +344,7 @@ private:
|
|||||||
// 1.a.2 Set AAD
|
// 1.a.2 Set AAD
|
||||||
if (aad_column)
|
if (aad_column)
|
||||||
{
|
{
|
||||||
const auto aad_data = aad_column->getDataAt(r);
|
const auto aad_data = aad_column->getDataAt(row_idx);
|
||||||
int tmp_len = 0;
|
int tmp_len = 0;
|
||||||
if (aad_data.size != 0 && EVP_EncryptUpdate(evp_ctx, nullptr, &tmp_len,
|
if (aad_data.size != 0 && EVP_EncryptUpdate(evp_ctx, nullptr, &tmp_len,
|
||||||
reinterpret_cast<const unsigned char *>(aad_data.data), aad_data.size) != 1)
|
reinterpret_cast<const unsigned char *>(aad_data.data), aad_data.size) != 1)
|
||||||
@ -408,7 +404,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/// AES_decrypt(string, key, block_mode[, init_vector])
|
/// decrypt(string, key, block_mode[, init_vector])
|
||||||
template <typename Impl>
|
template <typename Impl>
|
||||||
class FunctionDecrypt : public IFunction
|
class FunctionDecrypt : public IFunction
|
||||||
{
|
{
|
||||||
@ -471,7 +467,9 @@ private:
|
|||||||
|
|
||||||
ColumnPtr result_column;
|
ColumnPtr result_column;
|
||||||
if (arguments.size() <= 3)
|
if (arguments.size() <= 3)
|
||||||
|
{
|
||||||
result_column = doDecrypt(evp_cipher, input_rows_count, input_column, key_column, nullptr, nullptr);
|
result_column = doDecrypt(evp_cipher, input_rows_count, input_column, key_column, nullptr, nullptr);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const auto iv_column = arguments[3].column;
|
const auto iv_column = arguments[3].column;
|
||||||
@ -548,59 +546,58 @@ private:
|
|||||||
|
|
||||||
{
|
{
|
||||||
size_t resulting_size = 0;
|
size_t resulting_size = 0;
|
||||||
for (size_t r = 0; r < input_rows_count; ++r)
|
for (size_t row_idx = 0; row_idx < input_rows_count; ++row_idx)
|
||||||
{
|
{
|
||||||
size_t string_size = input_column->getDataAt(r).size;
|
size_t string_size = input_column->getDataAt(row_idx).size;
|
||||||
resulting_size += string_size + 1; /// With terminating zero.
|
resulting_size += string_size + 1; /// With terminating zero.
|
||||||
|
|
||||||
if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM)
|
if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM)
|
||||||
{
|
{
|
||||||
if (string_size < tag_size)
|
if (string_size > 0)
|
||||||
throw Exception("Encrypted data is smaller than the size of additional data for AEAD mode, cannot decrypt.",
|
{
|
||||||
ErrorCodes::BAD_ARGUMENTS);
|
if (string_size < tag_size)
|
||||||
|
throw Exception("Encrypted data is smaller than the size of additional data for AEAD mode, cannot decrypt.",
|
||||||
|
ErrorCodes::BAD_ARGUMENTS);
|
||||||
|
|
||||||
resulting_size -= tag_size;
|
resulting_size -= tag_size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(MEMORY_SANITIZER)
|
|
||||||
// Pre-fill result column with values to prevent MSAN from dropping dead on
|
|
||||||
// aes-X-ecb mode with "WARNING: MemorySanitizer: use-of-uninitialized-value".
|
|
||||||
// This is most likely to be caused by the underlying assembler implementation:
|
|
||||||
// see crypto/aes/aesni-x86_64.s, function aesni_ecb_encrypt
|
|
||||||
// which msan seems to fail instrument correctly.
|
|
||||||
decrypted_result_column_data.resize_fill(resulting_size, 0xFF);
|
|
||||||
#else
|
|
||||||
decrypted_result_column_data.resize(resulting_size);
|
decrypted_result_column_data.resize(resulting_size);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto * decrypted = decrypted_result_column_data.data();
|
auto * decrypted = decrypted_result_column_data.data();
|
||||||
|
|
||||||
KeyHolder<mode> key_holder;
|
KeyHolder<mode> key_holder;
|
||||||
for (size_t r = 0; r < input_rows_count; ++r)
|
for (size_t row_idx = 0; row_idx < input_rows_count; ++row_idx)
|
||||||
{
|
{
|
||||||
// 0: prepare key if required
|
// 0: prepare key if required
|
||||||
auto key_value = key_holder.setKey(key_size, key_column->getDataAt(r));
|
auto key_value = key_holder.setKey(key_size, key_column->getDataAt(row_idx));
|
||||||
auto iv_value = StringRef{};
|
auto iv_value = StringRef{};
|
||||||
if (iv_column)
|
if (iv_column)
|
||||||
{
|
{
|
||||||
iv_value = iv_column->getDataAt(r);
|
iv_value = iv_column->getDataAt(row_idx);
|
||||||
|
|
||||||
/// If the length is zero (empty string is passed) it should be treat as no IV.
|
/// If the length is zero (empty string is passed) it should be treat as no IV.
|
||||||
if (iv_value.size == 0)
|
if (iv_value.size == 0)
|
||||||
iv_value.data = nullptr;
|
iv_value.data = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto input_value = input_column->getDataAt(r);
|
auto input_value = input_column->getDataAt(row_idx);
|
||||||
|
|
||||||
if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM)
|
if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM)
|
||||||
{
|
{
|
||||||
// empty plaintext results in empty ciphertext + tag, means there should be at least tag_size bytes.
|
if (input_value.size > 0)
|
||||||
if (input_value.size < tag_size)
|
{
|
||||||
throw Exception(fmt::format("Encrypted data is too short: only {} bytes, "
|
// empty plaintext results in empty ciphertext + tag, means there should be at least tag_size bytes.
|
||||||
"should contain at least {} bytes of a tag.",
|
if (input_value.size < tag_size)
|
||||||
input_value.size, block_size, tag_size), ErrorCodes::BAD_ARGUMENTS);
|
throw Exception(fmt::format("Encrypted data is too short: only {} bytes, "
|
||||||
input_value.size -= tag_size;
|
"should contain at least {} bytes of a tag.",
|
||||||
|
input_value.size, block_size, tag_size), ErrorCodes::BAD_ARGUMENTS);
|
||||||
|
|
||||||
|
input_value.size -= tag_size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if constexpr (mode != CipherMode::MySQLCompatibility)
|
if constexpr (mode != CipherMode::MySQLCompatibility)
|
||||||
@ -619,8 +616,9 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoid extra work on empty ciphertext/plaintext for some ciphers
|
/// Avoid extra work on empty ciphertext/plaintext. Always decrypt empty to empty.
|
||||||
if (!(input_value.size == 0 && block_size == 1 && mode != CipherMode::RFC5116_AEAD_AES_GCM))
|
/// This makes sense for default implementation for NULLs.
|
||||||
|
if (input_value.size > 0)
|
||||||
{
|
{
|
||||||
// 1: Init CTX
|
// 1: Init CTX
|
||||||
if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM)
|
if constexpr (mode == CipherMode::RFC5116_AEAD_AES_GCM)
|
||||||
@ -641,7 +639,7 @@ private:
|
|||||||
// 1.a.2: Set AAD if present
|
// 1.a.2: Set AAD if present
|
||||||
if (aad_column)
|
if (aad_column)
|
||||||
{
|
{
|
||||||
StringRef aad_data = aad_column->getDataAt(r);
|
StringRef aad_data = aad_column->getDataAt(row_idx);
|
||||||
int tmp_len = 0;
|
int tmp_len = 0;
|
||||||
if (aad_data.size != 0 && EVP_DecryptUpdate(evp_ctx, nullptr, &tmp_len,
|
if (aad_data.size != 0 && EVP_DecryptUpdate(evp_ctx, nullptr, &tmp_len,
|
||||||
reinterpret_cast<const unsigned char *>(aad_data.data), aad_data.size) != 1)
|
reinterpret_cast<const unsigned char *>(aad_data.data), aad_data.size) != 1)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Common/Visitor.h>
|
#include <Common/Visitor.h>
|
||||||
#include <base/Typelists.h>
|
#include <base/TypeLists.h>
|
||||||
|
|
||||||
namespace DB::GatherUtils
|
namespace DB::GatherUtils
|
||||||
{
|
{
|
||||||
@ -14,12 +14,12 @@ struct GenericArraySink;
|
|||||||
template <typename ArraySink>
|
template <typename ArraySink>
|
||||||
struct NullableArraySink;
|
struct NullableArraySink;
|
||||||
|
|
||||||
using NumericArraySinks = TLMap<NumericArraySink, TLNumbersWithUUID>;
|
using NumericArraySinks = TypeListMap<NumericArraySink, TypeListNumberWithUUID>;
|
||||||
using BasicArraySinks = TLAppend<GenericArraySink, NumericArraySinks>;
|
using BasicArraySinks = TypeListAppend<GenericArraySink, NumericArraySinks>;
|
||||||
using NullableArraySinks = TLMap<NullableArraySink, BasicArraySinks>;
|
using NullableArraySinks = TypeListMap<NullableArraySink, BasicArraySinks>;
|
||||||
using TLArraySinks = TLConcat<BasicArraySinks, NullableArraySinks>;
|
using TLArraySinks = TypeListConcat<BasicArraySinks, NullableArraySinks>;
|
||||||
|
|
||||||
class ArraySinkVisitor : public TLChangeRoot<Visitor, TLArraySinks>
|
class ArraySinkVisitor : public TypeListChangeRoot<Visitor, TLArraySinks>
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
~ArraySinkVisitor() = default;
|
~ArraySinkVisitor() = default;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Common/Visitor.h>
|
#include <Common/Visitor.h>
|
||||||
#include <base/Typelists.h>
|
#include <base/TypeLists.h>
|
||||||
|
|
||||||
namespace DB::GatherUtils
|
namespace DB::GatherUtils
|
||||||
{
|
{
|
||||||
@ -17,10 +17,10 @@ struct NullableArraySource;
|
|||||||
template <typename Base>
|
template <typename Base>
|
||||||
struct ConstSource;
|
struct ConstSource;
|
||||||
|
|
||||||
using NumericArraySources = TLMap<NumericArraySource, TLNumbersWithUUID>;
|
using NumericArraySources = TypeListMap<NumericArraySource, TypeListNumberWithUUID>;
|
||||||
using BasicArraySources = TLAppend<GenericArraySource, NumericArraySources>;
|
using BasicArraySources = TypeListAppend<GenericArraySource, NumericArraySources>;
|
||||||
|
|
||||||
class ArraySourceVisitor : public TLChangeRoot<Visitor, BasicArraySources>
|
class ArraySourceVisitor : public TypeListChangeRoot<Visitor, BasicArraySources>
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
~ArraySourceVisitor() = default;
|
~ArraySourceVisitor() = default;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Common/Visitor.h>
|
#include <Common/Visitor.h>
|
||||||
#include <base/Typelists.h>
|
#include <base/TypeLists.h>
|
||||||
|
|
||||||
namespace DB::GatherUtils
|
namespace DB::GatherUtils
|
||||||
{
|
{
|
||||||
@ -17,14 +17,14 @@ struct NullableValueSource;
|
|||||||
template <typename Base>
|
template <typename Base>
|
||||||
struct ConstSource;
|
struct ConstSource;
|
||||||
|
|
||||||
using NumericValueSources = TLMap<NumericValueSource, TLNumbersWithUUID>;
|
using NumericValueSources = TypeListMap<NumericValueSource, TypeListNumberWithUUID>;
|
||||||
using BasicValueSources = TLAppend<GenericValueSource, NumericValueSources>;
|
using BasicValueSources = TypeListAppend<GenericValueSource, NumericValueSources>;
|
||||||
using NullableValueSources = TLMap<NullableValueSource, BasicValueSources>;
|
using NullableValueSources = TypeListMap<NullableValueSource, BasicValueSources>;
|
||||||
using BasicAndNullableValueSources = TLConcat<BasicValueSources, NullableValueSources>;
|
using BasicAndNullableValueSources = TypeListConcat<BasicValueSources, NullableValueSources>;
|
||||||
using ConstValueSources = TLMap<ConstSource, BasicAndNullableValueSources>;
|
using ConstValueSources = TypeListMap<ConstSource, BasicAndNullableValueSources>;
|
||||||
using TypeListValueSources = TLConcat<BasicAndNullableValueSources, ConstValueSources>;
|
using TypeListValueSources = TypeListConcat<BasicAndNullableValueSources, ConstValueSources>;
|
||||||
|
|
||||||
class ValueSourceVisitor : public TLChangeRoot<Visitor, TypeListValueSources>
|
class ValueSourceVisitor : public TypeListChangeRoot<Visitor, TypeListValueSources>
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
~ValueSourceVisitor() = default;
|
~ValueSourceVisitor() = default;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "GatherUtils.h"
|
#include "GatherUtils.h"
|
||||||
#include "Sinks.h"
|
#include "Sinks.h"
|
||||||
#include "Sources.h"
|
#include "Sources.h"
|
||||||
#include <base/Typelists.h>
|
#include <base/TypeLists.h>
|
||||||
|
|
||||||
namespace DB::GatherUtils
|
namespace DB::GatherUtils
|
||||||
{
|
{
|
||||||
@ -55,7 +55,7 @@ struct ArraySinkCreator<>
|
|||||||
|
|
||||||
std::unique_ptr<IArraySink> createArraySink(ColumnArray & col, size_t column_size)
|
std::unique_ptr<IArraySink> createArraySink(ColumnArray & col, size_t column_size)
|
||||||
{
|
{
|
||||||
using Creator = TLChangeRoot<ArraySinkCreator, TLNumbersWithUUID>;
|
using Creator = TypeListChangeRoot<ArraySinkCreator, TypeListNumberWithUUID>;
|
||||||
return Creator::create(col.getData(), col.getOffsets(), column_size);
|
return Creator::create(col.getData(), col.getOffsets(), column_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "GatherUtils.h"
|
#include "GatherUtils.h"
|
||||||
#include "Sinks.h"
|
#include "Sinks.h"
|
||||||
#include "Sources.h"
|
#include "Sources.h"
|
||||||
#include <base/Typelists.h>
|
#include <base/TypeLists.h>
|
||||||
|
|
||||||
namespace DB::GatherUtils
|
namespace DB::GatherUtils
|
||||||
{
|
{
|
||||||
@ -58,7 +58,7 @@ struct ArraySourceCreator<>
|
|||||||
|
|
||||||
std::unique_ptr<IArraySource> createArraySource(const ColumnArray & col, bool is_const, size_t total_rows)
|
std::unique_ptr<IArraySource> createArraySource(const ColumnArray & col, bool is_const, size_t total_rows)
|
||||||
{
|
{
|
||||||
using Creator = TLChangeRoot<ArraySourceCreator, TLNumbersWithUUID>;
|
using Creator = TypeListChangeRoot<ArraySourceCreator, TypeListNumberWithUUID>;
|
||||||
if (const auto * column_nullable = typeid_cast<const ColumnNullable *>(&col.getData()))
|
if (const auto * column_nullable = typeid_cast<const ColumnNullable *>(&col.getData()))
|
||||||
{
|
{
|
||||||
auto column = ColumnArray::create(column_nullable->getNestedColumnPtr(), col.getOffsetsPtr());
|
auto column = ColumnArray::create(column_nullable->getNestedColumnPtr(), col.getOffsetsPtr());
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "GatherUtils.h"
|
#include "GatherUtils.h"
|
||||||
#include "Sinks.h"
|
#include "Sinks.h"
|
||||||
#include "Sources.h"
|
#include "Sources.h"
|
||||||
#include <base/Typelists.h>
|
#include <base/TypeLists.h>
|
||||||
|
|
||||||
namespace DB::GatherUtils
|
namespace DB::GatherUtils
|
||||||
{
|
{
|
||||||
@ -58,7 +58,7 @@ struct ValueSourceCreator<>
|
|||||||
|
|
||||||
std::unique_ptr<IValueSource> createValueSource(const IColumn & col, bool is_const, size_t total_rows)
|
std::unique_ptr<IValueSource> createValueSource(const IColumn & col, bool is_const, size_t total_rows)
|
||||||
{
|
{
|
||||||
using Creator = TLChangeRoot<ValueSourceCreator, TLNumbersWithUUID>;
|
using Creator = TypeListChangeRoot<ValueSourceCreator, TypeListNumberWithUUID>;
|
||||||
if (const auto * column_nullable = typeid_cast<const ColumnNullable *>(&col))
|
if (const auto * column_nullable = typeid_cast<const ColumnNullable *>(&col))
|
||||||
{
|
{
|
||||||
return Creator::create(column_nullable->getNestedColumn(), &column_nullable->getNullMapData(), is_const, total_rows);
|
return Creator::create(column_nullable->getNestedColumn(), &column_nullable->getNullMapData(), is_const, total_rows);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include <Functions/JSONPath/ASTs/ASTJSONPathMemberAccess.h>
|
#include <Functions/JSONPath/ASTs/ASTJSONPathMemberAccess.h>
|
||||||
#include <Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.h>
|
#include <Functions/JSONPath/Parsers/ParserJSONPathMemberAccess.h>
|
||||||
|
|
||||||
#include <Parsers/ASTIdentifier.h>
|
#include <Parsers/ASTIdentifier_fwd.h>
|
||||||
#include <Parsers/ExpressionElementParsers.h>
|
#include <Parsers/ExpressionElementParsers.h>
|
||||||
#include <Parsers/Lexer.h>
|
#include <Parsers/Lexer.h>
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <base/types.h>
|
#include <base/types.h>
|
||||||
#include <Core/Defines.h>
|
#include <Core/Defines.h>
|
||||||
#include <base/Typelists.h>
|
#include <base/TypeLists.h>
|
||||||
#include <Columns/IColumn.h>
|
#include <Columns/IColumn.h>
|
||||||
#include <Columns/ColumnVector.h>
|
#include <Columns/ColumnVector.h>
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
@ -604,7 +604,7 @@ struct CallPointInPolygon<Type, Types ...>
|
|||||||
template <typename PointInPolygonImpl>
|
template <typename PointInPolygonImpl>
|
||||||
static ColumnPtr call(const IColumn & x, const IColumn & y, PointInPolygonImpl && impl)
|
static ColumnPtr call(const IColumn & x, const IColumn & y, PointInPolygonImpl && impl)
|
||||||
{
|
{
|
||||||
using Impl = TLChangeRoot<CallPointInPolygon, TLIntegral>;
|
using Impl = TypeListChangeRoot<CallPointInPolygon, TypeListIntAndFloat>;
|
||||||
if (auto column = typeid_cast<const ColumnVector<Type> *>(&x))
|
if (auto column = typeid_cast<const ColumnVector<Type> *>(&x))
|
||||||
return Impl::template call<Type>(*column, y, impl);
|
return Impl::template call<Type>(*column, y, impl);
|
||||||
return CallPointInPolygon<Types ...>::call(x, y, impl);
|
return CallPointInPolygon<Types ...>::call(x, y, impl);
|
||||||
@ -630,7 +630,7 @@ struct CallPointInPolygon<>
|
|||||||
template <typename PointInPolygonImpl>
|
template <typename PointInPolygonImpl>
|
||||||
NO_INLINE ColumnPtr pointInPolygon(const IColumn & x, const IColumn & y, PointInPolygonImpl && impl)
|
NO_INLINE ColumnPtr pointInPolygon(const IColumn & x, const IColumn & y, PointInPolygonImpl && impl)
|
||||||
{
|
{
|
||||||
using Impl = TLChangeRoot<CallPointInPolygon, TLIntegral>;
|
using Impl = TypeListChangeRoot<CallPointInPolygon, TypeListIntAndFloat>;
|
||||||
return Impl::call(x, y, impl);
|
return Impl::call(x, y, impl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include <Columns/ColumnTuple.h>
|
#include <Columns/ColumnTuple.h>
|
||||||
#include <Common/HashTable/ClearableHashMap.h>
|
#include <Common/HashTable/ClearableHashMap.h>
|
||||||
#include <Common/assert_cast.h>
|
#include <Common/assert_cast.h>
|
||||||
#include <base/Typelists.h>
|
#include <base/TypeLists.h>
|
||||||
#include <Interpreters/castColumn.h>
|
#include <Interpreters/castColumn.h>
|
||||||
#include <base/range.h>
|
#include <base/range.h>
|
||||||
|
|
||||||
@ -403,8 +403,8 @@ ColumnPtr FunctionArrayIntersect::executeImpl(const ColumnsWithTypeAndName & arg
|
|||||||
|
|
||||||
ColumnPtr result_column;
|
ColumnPtr result_column;
|
||||||
auto not_nullable_nested_return_type = removeNullable(nested_return_type);
|
auto not_nullable_nested_return_type = removeNullable(nested_return_type);
|
||||||
TLUtils::forEach(TLIntegral{}, NumberExecutor(arrays, not_nullable_nested_return_type, result_column));
|
TypeListUtils::forEach(TypeListIntAndFloat{}, NumberExecutor(arrays, not_nullable_nested_return_type, result_column));
|
||||||
TLUtils::forEach(TLDecimals{}, DecimalExecutor(arrays, not_nullable_nested_return_type, result_column));
|
TypeListUtils::forEach(TypeListDecimal{}, DecimalExecutor(arrays, not_nullable_nested_return_type, result_column));
|
||||||
|
|
||||||
using DateMap = ClearableHashMapWithStackMemory<DataTypeDate::FieldType,
|
using DateMap = ClearableHashMapWithStackMemory<DataTypeDate::FieldType,
|
||||||
size_t, DefaultHash<DataTypeDate::FieldType>, INITIAL_SIZE_DEGREE>;
|
size_t, DefaultHash<DataTypeDate::FieldType>, INITIAL_SIZE_DEGREE>;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
#include <base/Typelist.h>
|
#include <base/TypeList.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
@ -13,7 +13,7 @@ static bool castTypeToEither(const T * type, F && f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class ...Args>
|
template <class ...Args>
|
||||||
constexpr bool castTypeToEither(Typelist<Args...>, const auto * type, auto && f)
|
constexpr bool castTypeToEither(TypeList<Args...>, const auto * type, auto && f)
|
||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
(typeid_cast<const Args *>(type) != nullptr
|
(typeid_cast<const Args *>(type) != nullptr
|
||||||
|
@ -68,17 +68,9 @@ public:
|
|||||||
"Function {} second argument type should be constant UInt. Actual {}",
|
"Function {} second argument type should be constant UInt. Actual {}",
|
||||||
getName(),
|
getName(),
|
||||||
arguments[1].type->getName());
|
arguments[1].type->getName());
|
||||||
|
|
||||||
Field ngram_argument_value;
|
|
||||||
ngram_argument_column->get(0, ngram_argument_value);
|
|
||||||
auto ngram_value = ngram_argument_value.safeGet<UInt64>();
|
|
||||||
|
|
||||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeFixedString>(ngram_value));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>());
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const override
|
ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const override
|
||||||
@ -93,16 +85,16 @@ public:
|
|||||||
|
|
||||||
NgramTokenExtractor extractor(ngram_value);
|
NgramTokenExtractor extractor(ngram_value);
|
||||||
|
|
||||||
auto result_column_fixed_string = ColumnFixedString::create(ngram_value);
|
auto result_column_string = ColumnString::create();
|
||||||
|
|
||||||
auto input_column = arguments[0].column;
|
auto input_column = arguments[0].column;
|
||||||
|
|
||||||
if (const auto * column_string = checkAndGetColumn<ColumnString>(input_column.get()))
|
if (const auto * column_string = checkAndGetColumn<ColumnString>(input_column.get()))
|
||||||
executeImpl(extractor, *column_string, *result_column_fixed_string, *column_offsets);
|
executeImpl(extractor, *column_string, *result_column_string, *column_offsets);
|
||||||
else if (const auto * column_fixed_string = checkAndGetColumn<ColumnFixedString>(input_column.get()))
|
else if (const auto * column_fixed_string = checkAndGetColumn<ColumnFixedString>(input_column.get()))
|
||||||
executeImpl(extractor, *column_fixed_string, *result_column_fixed_string, *column_offsets);
|
executeImpl(extractor, *column_fixed_string, *result_column_string, *column_offsets);
|
||||||
|
|
||||||
return ColumnArray::create(std::move(result_column_fixed_string), std::move(column_offsets));
|
return ColumnArray::create(std::move(result_column_string), std::move(column_offsets));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -4,8 +4,6 @@
|
|||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <Interpreters/InDepthNodeVisitor.h>
|
#include <Interpreters/InDepthNodeVisitor.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ASTLiteral.h>
|
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
|
||||||
#include <Parsers/ASTSetQuery.h>
|
#include <Parsers/ASTSetQuery.h>
|
||||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||||
#include <Parsers/IAST.h>
|
#include <Parsers/IAST.h>
|
||||||
|
@ -3,7 +3,9 @@
|
|||||||
#include <Interpreters/StorageID.h>
|
#include <Interpreters/StorageID.h>
|
||||||
#include <Interpreters/misc.h>
|
#include <Interpreters/misc.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
|
#include <Parsers/ASTIdentifier.h>
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
#include <Parsers/ASTSelectQuery.h>
|
||||||
|
#include <Parsers/ASTSelectWithUnionQuery.h>
|
||||||
#include <Parsers/ASTSubquery.h>
|
#include <Parsers/ASTSubquery.h>
|
||||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||||
#include <Parsers/ASTWithElement.h>
|
#include <Parsers/ASTWithElement.h>
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <Parsers/ASTIdentifier.h>
|
||||||
#include <Parsers/queryToString.h>
|
#include <Parsers/queryToString.h>
|
||||||
|
|
||||||
#include <Interpreters/CollectJoinOnKeysVisitor.h>
|
#include <Interpreters/CollectJoinOnKeysVisitor.h>
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Parsers/IAST_fwd.h>
|
#include <Parsers/IAST_fwd.h>
|
||||||
#include <Parsers/ASTLiteral.h>
|
|
||||||
#include <Interpreters/TreeCNFConverter.h>
|
#include <Interpreters/TreeCNFConverter.h>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
#include <Interpreters/DuplicateOrderByVisitor.h>
|
#include <Interpreters/DuplicateOrderByVisitor.h>
|
||||||
#include <Functions/FunctionFactory.h>
|
#include <Functions/FunctionFactory.h>
|
||||||
#include <AggregateFunctions/AggregateFunctionFactory.h>
|
#include <AggregateFunctions/AggregateFunctionFactory.h>
|
||||||
#include <IO/WriteHelpers.h>
|
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ASTLiteral.h>
|
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
#include <Parsers/ASTSelectQuery.h>
|
||||||
#include <Parsers/ASTSetQuery.h>
|
#include <Parsers/ASTSetQuery.h>
|
||||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
#include <Functions/FunctionFactory.h>
|
#include <Functions/FunctionFactory.h>
|
||||||
#include <AggregateFunctions/AggregateFunctionFactory.h>
|
#include <AggregateFunctions/AggregateFunctionFactory.h>
|
||||||
#include <Interpreters/IdentifierSemantic.h>
|
#include <Interpreters/IdentifierSemantic.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
|
#include <Parsers/ASTIdentifier.h>
|
||||||
#include <Parsers/ASTSubquery.h>
|
#include <Parsers/ASTSubquery.h>
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,13 +3,14 @@
|
|||||||
#include <Interpreters/Context_fwd.h>
|
#include <Interpreters/Context_fwd.h>
|
||||||
#include <Interpreters/DatabaseAndTableWithAlias.h>
|
#include <Interpreters/DatabaseAndTableWithAlias.h>
|
||||||
#include <Interpreters/InDepthNodeVisitor.h>
|
#include <Interpreters/InDepthNodeVisitor.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
#include <Parsers/IAST_fwd.h>
|
#include <Parsers/IAST_fwd.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
class ASTFunction;
|
||||||
|
class ASTIdentifier;
|
||||||
|
|
||||||
|
|
||||||
struct ExpressionInfoMatcher
|
struct ExpressionInfoMatcher
|
||||||
{
|
{
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <Parsers/ASTColumnDeclaration.h>
|
#include <Parsers/ASTColumnDeclaration.h>
|
||||||
#include <Parsers/ASTCreateQuery.h>
|
#include <Parsers/ASTCreateQuery.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Parsers/IAST.h>
|
#include <Parsers/IAST_fwd.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <Interpreters/GatherFunctionQuantileVisitor.h>
|
#include <Interpreters/GatherFunctionQuantileVisitor.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Common/Exception.h>
|
#include <Common/Exception.h>
|
||||||
#include <base/types.h>
|
#include <base/types.h>
|
||||||
|
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Parsers/ASTFunction.h>
|
|
||||||
#include <Parsers/IAST.h>
|
|
||||||
#include <Interpreters/InDepthNodeVisitor.h>
|
|
||||||
#include <AggregateFunctions/AggregateFunctionQuantile.h>
|
#include <AggregateFunctions/AggregateFunctionQuantile.h>
|
||||||
|
#include <Interpreters/InDepthNodeVisitor.h>
|
||||||
|
#include <Parsers/IAST_fwd.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
class ASTFunction;
|
||||||
|
|
||||||
/// Gather all the `quantile*` functions
|
/// Gather all the `quantile*` functions
|
||||||
class GatherFunctionQuantileData
|
class GatherFunctionQuantileData
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include <Interpreters/interpretSubquery.h>
|
#include <Interpreters/interpretSubquery.h>
|
||||||
#include <Interpreters/SubqueryForSet.h>
|
#include <Interpreters/SubqueryForSet.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
#include <Parsers/ASTLiteral.h>
|
#include <Parsers/ASTLiteral.h>
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
#include <Parsers/ASTSelectQuery.h>
|
||||||
#include <Parsers/ASTSubquery.h>
|
#include <Parsers/ASTSubquery.h>
|
||||||
|
@ -4,8 +4,6 @@
|
|||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <Interpreters/InDepthNodeVisitor.h>
|
#include <Interpreters/InDepthNodeVisitor.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ASTLiteral.h>
|
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
|
||||||
#include <Parsers/ASTSetQuery.h>
|
#include <Parsers/ASTSetQuery.h>
|
||||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
#include <Parsers/ASTIdentifier.h>
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#include <Interpreters/StorageID.h>
|
#include <Interpreters/StorageID.h>
|
||||||
|
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
|
#include <Parsers/ASTIdentifier.h>
|
||||||
|
#include <Parsers/ASTSelectQuery.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
@ -6,12 +6,13 @@
|
|||||||
#include <Interpreters/QueryAliasesVisitor.h>
|
#include <Interpreters/QueryAliasesVisitor.h>
|
||||||
#include <Interpreters/getHeaderForProcessingStage.h>
|
#include <Interpreters/getHeaderForProcessingStage.h>
|
||||||
#include <Interpreters/getTableExpressions.h>
|
#include <Interpreters/getTableExpressions.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
|
class ASTIdentifier;
|
||||||
|
class ASTSelectQuery;
|
||||||
|
|
||||||
struct IdentifierSemanticImpl
|
struct IdentifierSemanticImpl
|
||||||
{
|
{
|
||||||
bool special = false; /// for now it's 'not a column': tables, subselects and some special stuff like FORMAT
|
bool special = false; /// for now it's 'not a column': tables, subselects and some special stuff like FORMAT
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <Interpreters/executeDDLQueryOnCluster.h>
|
#include <Interpreters/executeDDLQueryOnCluster.h>
|
||||||
#include <Parsers/ASTAlterQuery.h>
|
#include <Parsers/ASTAlterQuery.h>
|
||||||
#include <Parsers/ASTAssignment.h>
|
#include <Parsers/ASTAssignment.h>
|
||||||
|
#include <Parsers/ASTIdentifier_fwd.h>
|
||||||
#include <Storages/AlterCommands.h>
|
#include <Storages/AlterCommands.h>
|
||||||
#include <Storages/IStorage.h>
|
#include <Storages/IStorage.h>
|
||||||
#include <Storages/LiveView/LiveViewCommands.h>
|
#include <Storages/LiveView/LiveViewCommands.h>
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
#include <Interpreters/InterpreterCreateFunctionQuery.h>
|
#include <Interpreters/InterpreterCreateFunctionQuery.h>
|
||||||
|
|
||||||
#include <Access/ContextAccess.h>
|
#include <Access/ContextAccess.h>
|
||||||
#include <Parsers/ASTCreateFunctionQuery.h>
|
|
||||||
#include <Parsers/ASTIdentifier.h>
|
|
||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
#include <Interpreters/ExpressionActions.h>
|
#include <Interpreters/ExpressionActions.h>
|
||||||
#include <Interpreters/ExpressionAnalyzer.h>
|
#include <Interpreters/ExpressionAnalyzer.h>
|
||||||
#include <Interpreters/FunctionNameNormalizer.h>
|
#include <Interpreters/FunctionNameNormalizer.h>
|
||||||
#include <Interpreters/UserDefinedSQLObjectsLoader.h>
|
|
||||||
#include <Interpreters/UserDefinedSQLFunctionFactory.h>
|
#include <Interpreters/UserDefinedSQLFunctionFactory.h>
|
||||||
|
#include <Interpreters/UserDefinedSQLObjectsLoader.h>
|
||||||
#include <Interpreters/executeDDLQueryOnCluster.h>
|
#include <Interpreters/executeDDLQueryOnCluster.h>
|
||||||
|
#include <Parsers/ASTCreateFunctionQuery.h>
|
||||||
|
#include <Parsers/ASTFunction.h>
|
||||||
|
#include <Parsers/ASTIdentifier.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <Parsers/queryToString.h>
|
#include <Parsers/queryToString.h>
|
||||||
#include <Parsers/ASTExplainQuery.h>
|
#include <Parsers/ASTExplainQuery.h>
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
#include <Parsers/ASTSelectQuery.h>
|
||||||
|
#include <Parsers/ASTSelectWithUnionQuery.h>
|
||||||
|
|
||||||
#include <Storages/StorageView.h>
|
#include <Storages/StorageView.h>
|
||||||
#include <Processors/QueryPlan/QueryPlan.h>
|
#include <Processors/QueryPlan/QueryPlan.h>
|
||||||
|
@ -297,7 +297,7 @@ BlockIO InterpreterInsertQuery::execute()
|
|||||||
const auto & union_modes = select_query.list_of_modes;
|
const auto & union_modes = select_query.list_of_modes;
|
||||||
|
|
||||||
/// ASTSelectWithUnionQuery is not normalized now, so it may pass some queries which can be Trivial select queries
|
/// ASTSelectWithUnionQuery is not normalized now, so it may pass some queries which can be Trivial select queries
|
||||||
const auto mode_is_all = [](const auto & mode) { return mode == ASTSelectWithUnionQuery::Mode::ALL; };
|
const auto mode_is_all = [](const auto & mode) { return mode == SelectUnionMode::ALL; };
|
||||||
|
|
||||||
is_trivial_insert_select =
|
is_trivial_insert_select =
|
||||||
std::all_of(union_modes.begin(), union_modes.end(), std::move(mode_is_all))
|
std::all_of(union_modes.begin(), union_modes.end(), std::move(mode_is_all))
|
||||||
|
@ -293,7 +293,7 @@ void InterpreterSelectWithUnionQuery::buildQueryPlan(QueryPlan & query_plan)
|
|||||||
query_plan.unitePlans(std::move(union_step), std::move(plans));
|
query_plan.unitePlans(std::move(union_step), std::move(plans));
|
||||||
|
|
||||||
const auto & query = query_ptr->as<ASTSelectWithUnionQuery &>();
|
const auto & query = query_ptr->as<ASTSelectWithUnionQuery &>();
|
||||||
if (query.union_mode == ASTSelectWithUnionQuery::Mode::DISTINCT)
|
if (query.union_mode == SelectUnionMode::DISTINCT)
|
||||||
{
|
{
|
||||||
/// Add distinct transform
|
/// Add distinct transform
|
||||||
SizeLimits limits(settings.max_rows_in_distinct, settings.max_bytes_in_distinct, settings.distinct_overflow_mode);
|
SizeLimits limits(settings.max_rows_in_distinct, settings.max_bytes_in_distinct, settings.distinct_overflow_mode);
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <Interpreters/IdentifierSemantic.h>
|
#include <Interpreters/IdentifierSemantic.h>
|
||||||
#include <Interpreters/misc.h>
|
#include <Interpreters/misc.h>
|
||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
|
#include <Parsers/ASTIdentifier.h>
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
#include <Parsers/ASTSelectQuery.h>
|
||||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
#include <Parsers/ASTIdentifier.h>
|
||||||
#include <Parsers/ASTOrderByElement.h>
|
#include <Parsers/ASTOrderByElement.h>
|
||||||
#include <Parsers/ASTSelectQuery.h>
|
|
||||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||||
#include <Parsers/IAST.h>
|
#include <Parsers/IAST.h>
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <Interpreters/NormalizeSelectWithUnionQueryVisitor.h>
|
#include <Interpreters/NormalizeSelectWithUnionQueryVisitor.h>
|
||||||
#include <Parsers/ASTExpressionList.h>
|
#include <Parsers/ASTExpressionList.h>
|
||||||
#include <Parsers/ASTSelectIntersectExceptQuery.h>
|
#include <Parsers/ASTSelectIntersectExceptQuery.h>
|
||||||
|
#include <Parsers/ASTSelectWithUnionQuery.h>
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -41,7 +42,7 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast,
|
|||||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "Got empty list of selects for ASTSelectWithUnionQuery");
|
throw Exception(ErrorCodes::LOGICAL_ERROR, "Got empty list of selects for ASTSelectWithUnionQuery");
|
||||||
|
|
||||||
/// Since nodes are traversed from bottom to top, we can also collect union modes from children up to parents.
|
/// Since nodes are traversed from bottom to top, we can also collect union modes from children up to parents.
|
||||||
ASTSelectWithUnionQuery::UnionModesSet current_set_of_modes;
|
SelectUnionModesSet current_set_of_modes;
|
||||||
bool distinct_found = false;
|
bool distinct_found = false;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
@ -58,22 +59,22 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
/// Rewrite UNION Mode
|
/// Rewrite UNION Mode
|
||||||
if (union_modes[i] == ASTSelectWithUnionQuery::Mode::Unspecified)
|
if (union_modes[i] == SelectUnionMode::Unspecified)
|
||||||
{
|
{
|
||||||
if (data.union_default_mode == UnionMode::ALL)
|
if (data.union_default_mode == UnionMode::ALL)
|
||||||
union_modes[i] = ASTSelectWithUnionQuery::Mode::ALL;
|
union_modes[i] = SelectUnionMode::ALL;
|
||||||
else if (data.union_default_mode == UnionMode::DISTINCT)
|
else if (data.union_default_mode == UnionMode::DISTINCT)
|
||||||
union_modes[i] = ASTSelectWithUnionQuery::Mode::DISTINCT;
|
union_modes[i] = SelectUnionMode::DISTINCT;
|
||||||
else
|
else
|
||||||
throw Exception(
|
throw Exception(
|
||||||
"Expected ALL or DISTINCT in SelectWithUnion query, because setting (union_default_mode) is empty",
|
"Expected ALL or DISTINCT in SelectWithUnion query, because setting (union_default_mode) is empty",
|
||||||
DB::ErrorCodes::EXPECTED_ALL_OR_DISTINCT);
|
DB::ErrorCodes::EXPECTED_ALL_OR_DISTINCT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (union_modes[i] == ASTSelectWithUnionQuery::Mode::ALL)
|
if (union_modes[i] == SelectUnionMode::ALL)
|
||||||
{
|
{
|
||||||
if (auto * inner_union = select_list[i + 1]->as<ASTSelectWithUnionQuery>();
|
if (auto * inner_union = select_list[i + 1]->as<ASTSelectWithUnionQuery>();
|
||||||
inner_union && inner_union->union_mode == ASTSelectWithUnionQuery::Mode::ALL)
|
inner_union && inner_union->union_mode == SelectUnionMode::ALL)
|
||||||
{
|
{
|
||||||
/// Inner_union is an UNION ALL list, just lift up
|
/// Inner_union is an UNION ALL list, just lift up
|
||||||
for (auto child = inner_union->list_of_selects->children.rbegin(); child != inner_union->list_of_selects->children.rend();
|
for (auto child = inner_union->list_of_selects->children.rbegin(); child != inner_union->list_of_selects->children.rend();
|
||||||
@ -84,7 +85,7 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast,
|
|||||||
selects.push_back(select_list[i + 1]);
|
selects.push_back(select_list[i + 1]);
|
||||||
}
|
}
|
||||||
/// flatten all left nodes and current node to a UNION DISTINCT list
|
/// flatten all left nodes and current node to a UNION DISTINCT list
|
||||||
else if (union_modes[i] == ASTSelectWithUnionQuery::Mode::DISTINCT)
|
else if (union_modes[i] == SelectUnionMode::DISTINCT)
|
||||||
{
|
{
|
||||||
auto distinct_list = std::make_shared<ASTSelectWithUnionQuery>();
|
auto distinct_list = std::make_shared<ASTSelectWithUnionQuery>();
|
||||||
distinct_list->list_of_selects = std::make_shared<ASTExpressionList>();
|
distinct_list->list_of_selects = std::make_shared<ASTExpressionList>();
|
||||||
@ -95,7 +96,7 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast,
|
|||||||
getSelectsFromUnionListNode(select_list[j], distinct_list->list_of_selects->children);
|
getSelectsFromUnionListNode(select_list[j], distinct_list->list_of_selects->children);
|
||||||
}
|
}
|
||||||
|
|
||||||
distinct_list->union_mode = ASTSelectWithUnionQuery::Mode::DISTINCT;
|
distinct_list->union_mode = SelectUnionMode::DISTINCT;
|
||||||
distinct_list->is_normalized = true;
|
distinct_list->is_normalized = true;
|
||||||
selects.push_back(std::move(distinct_list));
|
selects.push_back(std::move(distinct_list));
|
||||||
distinct_found = true;
|
distinct_found = true;
|
||||||
@ -112,7 +113,7 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast,
|
|||||||
if (!distinct_found)
|
if (!distinct_found)
|
||||||
{
|
{
|
||||||
if (auto * inner_union = select_list[0]->as<ASTSelectWithUnionQuery>();
|
if (auto * inner_union = select_list[0]->as<ASTSelectWithUnionQuery>();
|
||||||
inner_union && inner_union->union_mode == ASTSelectWithUnionQuery::Mode::ALL)
|
inner_union && inner_union->union_mode == SelectUnionMode::ALL)
|
||||||
{
|
{
|
||||||
/// Inner_union is an UNION ALL list, just lift it up
|
/// Inner_union is an UNION ALL list, just lift it up
|
||||||
for (auto child = inner_union->list_of_selects->children.rbegin(); child != inner_union->list_of_selects->children.rend();
|
for (auto child = inner_union->list_of_selects->children.rbegin(); child != inner_union->list_of_selects->children.rend();
|
||||||
@ -135,7 +136,7 @@ void NormalizeSelectWithUnionQueryMatcher::visit(ASTSelectWithUnionQuery & ast,
|
|||||||
std::reverse(selects.begin(), selects.end());
|
std::reverse(selects.begin(), selects.end());
|
||||||
|
|
||||||
ast.is_normalized = true;
|
ast.is_normalized = true;
|
||||||
ast.union_mode = ASTSelectWithUnionQuery::Mode::ALL;
|
ast.union_mode = SelectUnionMode::ALL;
|
||||||
ast.set_of_modes = std::move(current_set_of_modes);
|
ast.set_of_modes = std::move(current_set_of_modes);
|
||||||
|
|
||||||
ast.list_of_selects->children = std::move(selects);
|
ast.list_of_selects->children = std::move(selects);
|
||||||
|
@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|
||||||
#include <Parsers/IAST.h>
|
|
||||||
#include <Interpreters/InDepthNodeVisitor.h>
|
#include <Interpreters/InDepthNodeVisitor.h>
|
||||||
|
#include <Parsers/IAST_fwd.h>
|
||||||
|
|
||||||
#include <Core/Settings.h>
|
#include <Core/Settings.h>
|
||||||
#include <Parsers/ASTSelectWithUnionQuery.h>
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
class ASTFunction;
|
class ASTFunction;
|
||||||
|
class ASTSelectWithUnionQuery;
|
||||||
|
|
||||||
class NormalizeSelectWithUnionQueryMatcher
|
class NormalizeSelectWithUnionQueryMatcher
|
||||||
{
|
{
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user