diff --git a/CMakeLists.txt b/CMakeLists.txt index 4056bd84cf0..e7b7f3ff6c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -128,14 +128,14 @@ endif () #endif () if (CMAKE_VERSION VERSION_LESS "3.8.0") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z") + if (NOT MSVC) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z") + endif () else () set (CMAKE_CXX_STANDARD 17) set (CMAKE_CXX_EXTENSIONS 0) # https://cmake.org/cmake/help/latest/prop_tgt/CXX_EXTENSIONS.html#prop_tgt:CXX_EXTENSIONS set (CMAKE_CXX_STANDARD_REQUIRED ON) set (CXX_FLAGS_INTERNAL_COMPILER "-std=c++1z") - # This needs to propagate to vendored projects in contrib - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") endif () set (CMAKE_BUILD_COLOR_MAKEFILE ON) diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index 2966d5b26f8..98a7a9f6144 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -1,5 +1,5 @@ if (NOT MSVC) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-old-style-cast") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-old-style-cast -std=c++1z") endif () if (USE_INTERNAL_BOOST_LIBRARY) diff --git a/contrib/libcityhash/src/config.h b/contrib/libcityhash/src/config.h index 61c75fca818..cca744a35c0 100644 --- a/contrib/libcityhash/src/config.h +++ b/contrib/libcityhash/src/config.h @@ -116,3 +116,10 @@ /* Define to the type of an unsigned integer type of width exactly 8 bits if such a type exists and the standard includes do not define it. */ /* #undef uint8_t */ + +#ifdef _MSC_VER + #include + typedef SSIZE_T ssize_t; +#else + #include +#endif diff --git a/copy_headers.sh b/copy_headers.sh index fa2931ee457..eced943ea37 100755 --- a/copy_headers.sh +++ b/copy_headers.sh @@ -17,7 +17,7 @@ SOURCE_PATH=${1:-.} DST=${2:-$SOURCE_PATH/../headers} -BUILD_PATH=${3:-$SOURCE_PATH/build} +BUILD_PATH=${BUILD_PATH=${3:-$SOURCE_PATH/build}} PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:$PATH" @@ -30,24 +30,29 @@ START_HEADERS=$(echo \ $SOURCE_PATH/dbms/src/Interpreters/SpecializedAggregator.h \ $SOURCE_PATH/dbms/src/AggregateFunctions/AggregateFunction*.h) +for header in $START_HEADERS; do + START_HEADERS_INCLUDE+="-include $header " +done + # Опция -mcx16 для того, чтобы выбиралось больше заголовочных файлов (с запасом). # The latter options are the same that are added while building packages. +# TODO: Does not work on macos: GCC_ROOT=`$CLANG -v 2>&1 | grep "Selected GCC installation"| sed -n -e 's/^.*: //p'` for src_file in $(echo | $CLANG -M -xc++ -std=c++1z -Wall -Werror -msse4 -mcx16 -mpopcnt -O3 -g -fPIC -fstack-protector -D_FORTIFY_SOURCE=2 \ -I $GCC_ROOT/include \ -I $GCC_ROOT/include-fixed \ $(cat "$BUILD_PATH/include_directories.txt") \ - $(echo $START_HEADERS | sed -r -e 's/[^ ]+/-include \0/g') \ + $START_HEADERS_INCLUDE \ - | tr -d '\\' | - sed -r -e 's/^-\.o://'); + sed -E -e 's/^-\.o://'); do dst_file=$src_file; - [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -r -e "s!^$DESTDIR!!") - dst_file=$(echo $dst_file | sed -r -e 's/build\///') # for simplicity reasons, will put generated headers near the rest. - mkdir -p "$DST/$(echo $dst_file | sed -r -e 's/\/[^/]*$/\//')"; + [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -E -e "s!^$DESTDIR!!") + dst_file=$(echo $dst_file | sed -E -e 's/build\///') # for simplicity reasons, will put generated headers near the rest. + mkdir -p "$DST/$(echo $dst_file | sed -E -e 's/\/[^/]*$/\//')"; cp "$src_file" "$DST/$dst_file"; done @@ -58,8 +63,8 @@ done for src_file in $(ls -1 $($CLANG -v -xc++ - <<<'' 2>&1 | grep '^ /' | grep 'include' | grep -E '/lib/clang/|/include/clang/')/*.h | grep -vE 'arm|altivec|Intrin'); do dst_file=$src_file; - [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -r -e "s!^$DESTDIR!!") - mkdir -p "$DST/$(echo $dst_file | sed -r -e 's/\/[^/]*$/\//')"; + [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -E -e "s!^$DESTDIR!!") + mkdir -p "$DST/$(echo $dst_file | sed -E -e 's/\/[^/]*$/\//')"; cp "$src_file" "$DST/$dst_file"; done @@ -67,15 +72,15 @@ done for src_file in $(ls -1 $SOURCE_PATH/contrib/boost/libs/smart_ptr/include/boost/smart_ptr/detail/*); do dst_file=$src_file; - [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -r -e "s!^$DESTDIR!!") - mkdir -p "$DST/$(echo $dst_file | sed -r -e 's/\/[^/]*$/\//')"; + [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -E -e "s!^$DESTDIR!!") + mkdir -p "$DST/$(echo $dst_file | sed -E -e 's/\/[^/]*$/\//')"; cp "$src_file" "$DST/$dst_file"; done for src_file in $(ls -1 $SOURCE_PATH/contrib/boost/boost/smart_ptr/detail/*); do dst_file=$src_file; - [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -r -e "s!^$DESTDIR!!") - mkdir -p "$DST/$(echo $dst_file | sed -r -e 's/\/[^/]*$/\//')"; + [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -E -e "s!^$DESTDIR!!") + mkdir -p "$DST/$(echo $dst_file | sed -E -e 's/\/[^/]*$/\//')"; cp "$src_file" "$DST/$dst_file"; done diff --git a/dbms/CMakeLists.txt b/dbms/CMakeLists.txt index 0b1b9c462c1..20774444a80 100644 --- a/dbms/CMakeLists.txt +++ b/dbms/CMakeLists.txt @@ -246,8 +246,9 @@ target_include_directories (clickhouse_common_io BEFORE PUBLIC ${DOUBLE_CONVERSI target_include_directories (clickhouse_common_io BEFORE PRIVATE ${COMMON_INCLUDE_DIR}) if (USE_EMBEDDED_COMPILER) - add_custom_target(copy-headers ALL env CLANG=${CMAKE_CURRENT_BINARY_DIR}/src/Server/clickhouse-clang DESTDIR=${ClickHouse_SOURCE_DIR} ${ClickHouse_SOURCE_DIR}/copy_headers.sh ${ClickHouse_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/headers DEPENDS clickhouse-clang WORKING_DIRECTORY ${ClickHouse_SOURCE_DIR} SOURCES ${ClickHouse_SOURCE_DIR}/copy_headers.sh) + add_custom_target(copy-headers ALL env CLANG=${CMAKE_CURRENT_BINARY_DIR}/src/Server/clickhouse-clang BUILD_PATH=${ClickHouse_BINARY_DIR} DESTDIR=${ClickHouse_SOURCE_DIR} ${ClickHouse_SOURCE_DIR}/copy_headers.sh ${ClickHouse_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/headers DEPENDS clickhouse-clang WORKING_DIRECTORY ${ClickHouse_SOURCE_DIR} SOURCES ${ClickHouse_SOURCE_DIR}/copy_headers.sh) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/headers DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/clickhouse COMPONENT clickhouse) + add_dependencies(clickhouse-bundle copy-headers) endif () add_subdirectory (tests) diff --git a/dbms/src/Interpreters/InterserverIOHandler.h b/dbms/src/Interpreters/InterserverIOHandler.h index 41318024c23..e1321037d2c 100644 --- a/dbms/src/Interpreters/InterserverIOHandler.h +++ b/dbms/src/Interpreters/InterserverIOHandler.h @@ -85,25 +85,27 @@ public: void addEndpoint(const String & name, InterserverIOEndpointPtr endpoint) { std::lock_guard lock(mutex); - if (endpoint_map.count(name)) + bool inserted = endpoint_map.try_emplace(name, std::move(endpoint)).second; + if (!inserted) throw Exception("Duplicate interserver IO endpoint: " + name, ErrorCodes::DUPLICATE_INTERSERVER_IO_ENDPOINT); - endpoint_map[name] = std::move(endpoint); } void removeEndpoint(const String & name) { std::lock_guard lock(mutex); - if (!endpoint_map.count(name)) + if (!endpoint_map.erase(name)) throw Exception("No interserver IO endpoint named " + name, ErrorCodes::NO_SUCH_INTERSERVER_IO_ENDPOINT); - endpoint_map.erase(name); } InterserverIOEndpointPtr getEndpoint(const String & name) + try { std::lock_guard lock(mutex); - if (!endpoint_map.count(name)) - throw Exception("No interserver IO endpoint named " + name, ErrorCodes::NO_SUCH_INTERSERVER_IO_ENDPOINT); - return endpoint_map[name]; + return endpoint_map.at(name); + } + catch (...) + { + throw Exception("No interserver IO endpoint named " + name, ErrorCodes::NO_SUCH_INTERSERVER_IO_ENDPOINT); } private: @@ -129,17 +131,15 @@ public: } ~InterserverIOEndpointHolder() + try { - try - { - handler.removeEndpoint(name); - /// After destroying the object, `endpoint` can still live, since its ownership is acquired during the processing of the request, - /// see InterserverIOHTTPHandler.cpp - } - catch (...) - { - tryLogCurrentException("~InterserverIOEndpointHolder"); - } + handler.removeEndpoint(name); + /// After destroying the object, `endpoint` can still live, since its ownership is acquired during the processing of the request, + /// see InterserverIOHTTPHandler.cpp + } + catch (...) + { + tryLogCurrentException("~InterserverIOEndpointHolder"); } ActionBlocker & getBlocker() { return endpoint->blocker; } diff --git a/dbms/src/Storages/ITableDeclaration.cpp b/dbms/src/Storages/ITableDeclaration.cpp index 9a6ac0e2538..92762046f7f 100644 --- a/dbms/src/Storages/ITableDeclaration.cpp +++ b/dbms/src/Storages/ITableDeclaration.cpp @@ -198,7 +198,7 @@ void ITableDeclaration::check(const NamesAndTypesList & provided_columns, const throw Exception("There is no column with name " + name + ". There are columns: " + listOfColumns(available_columns), ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); - if (it->second->getName() != jt->second->getName()) + if (!it->second->equals(*jt->second)) throw Exception("Type mismatch for column " + name + ". Column has type " + jt->second->getName() + ", got type " + it->second->getName(), ErrorCodes::TYPE_MISMATCH); diff --git a/dbms/tests/clickhouse-test b/dbms/tests/clickhouse-test index dc64fd56e08..37e1b53c117 100755 --- a/dbms/tests/clickhouse-test +++ b/dbms/tests/clickhouse-test @@ -359,5 +359,10 @@ if __name__ == '__main__': if args.client is None: args.client = args.binary + '-client' if args.configclient: - args.client += ' -c' + args.configclient + args.client += ' --config-file=' + args.configclient + if os.getenv("CLICKHOUSE_HOST"): + args.client += ' --host=' + os.getenv("CLICKHOUSE_HOST") + if os.getenv("CLICKHOUSE_PORT_TCP"): + args.client += ' --port=' + os.getenv("CLICKHOUSE_PORT_TCP") + main(args) diff --git a/dbms/tests/clickhouse-test-server b/dbms/tests/clickhouse-test-server index 644d0288b8f..3caa0c123d1 100755 --- a/dbms/tests/clickhouse-test-server +++ b/dbms/tests/clickhouse-test-server @@ -21,10 +21,27 @@ CONFIG_CLIENT=${CONFIG_CLIENT:=${CONFIG_CLIENT_DIR}client-test.xml} export CLICKHOUSE_CONFIG=${CLICKHOUSE_CONFIG:=${CONFIG_SERVER_DIR}server-test.xml} [ -x "$CUR_DIR/clickhouse-test" ] && TEST_DIR=${TEST_DIR=$CUR_DIR/} [ -d "$CUR_DIR/queries" ] && QUERIES_DIR=${QUERIES_DIR=$CUR_DIR/queries} -[ ! -d "$QUERIES_DIR" ] && QUERIES_DIR=${QUERIES_DIR=/usr/local/share/clickhouse-test/queries} -[ ! -d "$QUERIES_DIR" ] && QUERIES_DIR=${QUERIES_DIR=/usr/share/clickhouse-test/queries} +[ ! -d "$QUERIES_DIR" ] && [ -d "/usr/local/share/clickhouse-test/queries" ] && QUERIES_DIR=${QUERIES_DIR=/usr/local/share/clickhouse-test/queries} +[ ! -d "$QUERIES_DIR" ] && [ -d "/usr/share/clickhouse-test/queries" ] && QUERIES_DIR=${QUERIES_DIR=/usr/share/clickhouse-test/queries} CLICKHOUSE_EXTRACT_CONFIG=${CLICKHOUSE_EXTRACT_CONFIG:="${BIN_DIR}${CLICKHOUSE_BINARY}-extract-from-config --config=$CLICKHOUSE_CONFIG"} +PORT_RANDOM=${PORT_RANDOM=1} +if [ "${PORT_RANDOM}" ]; then + CLICKHOUSE_PORT_BASE=${CLICKHOUSE_PORT_BASE:=$(( ( RANDOM % 50000 ) + 10000 ))} + CLICKHOUSE_PORT_TCP=${CLICKHOUSE_PORT_TCP:=$(($CLICKHOUSE_PORT_BASE + 1))} + CLICKHOUSE_PORT_HTTP=${CLICKHOUSE_PORT_HTTP:=$(($CLICKHOUSE_PORT_BASE + 2))} + CLICKHOUSE_PORT_INTERSERVER=${CLICKHOUSE_PORT_INTERSERVER:=$(($CLICKHOUSE_PORT_BASE + 3))} + CLICKHOUSE_PORT_TCP_SECURE=${CLICKHOUSE_PORT_TCP_SECURE:=$(($CLICKHOUSE_PORT_BASE + 4))} + CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:=$(($CLICKHOUSE_PORT_BASE + 5))} +fi + +export CLICKHOUSE_PORT_TCP=${CLICKHOUSE_PORT_TCP:=`$CLICKHOUSE_EXTRACT_CONFIG --key=tcp_port`} +export CLICKHOUSE_PORT_HTTP=${CLICKHOUSE_PORT_HTTP:=`$CLICKHOUSE_EXTRACT_CONFIG --key=http_port`} +export CLICKHOUSE_PORT_INTERSERVER=${CLICKHOUSE_PORT_INTERSERVER:=`$CLICKHOUSE_EXTRACT_CONFIG --key=interserver_http_port`} +export CLICKHOUSE_PORT_TCP_SECURE=${CLICKHOUSE_PORT_TCP_SECURE:=`$CLICKHOUSE_EXTRACT_CONFIG --key=tcp_port_secure`} +export CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:=`$CLICKHOUSE_EXTRACT_CONFIG --key=https_port`} + + rm -rf $DATA_DIR mkdir -p $LOG_DIR @@ -42,7 +59,7 @@ fi # Start a local clickhouse server which will be used to run tests #PATH=$PATH:$BIN_DIR \ -$GDB ${BIN_DIR}clickhouse-server --config-file=$CLICKHOUSE_CONFIG > $LOG_DIR/stdout 2>&1 & +$GDB ${BIN_DIR}clickhouse-server --config-file=$CLICKHOUSE_CONFIG -- --http_port=$CLICKHOUSE_PORT_HTTP --tcp_port=$CLICKHOUSE_PORT_TCP --https_port=$CLICKHOUSE_PORT_HTTPS --tcp_port_secure=$CLICKHOUSE_PORT_TCP_SECURE --interserver_http_port=$CLICKHOUSE_PORT_INTERSERVER > $LOG_DIR/stdout 2>&1 & CH_PID=$! sleep 3 @@ -71,7 +88,7 @@ if [ -n "$*" ]; then else TEST_RUN=${TEST_RUN=1} TEST_PERF=${TEST_PERF=1} - ${BIN_DIR}clickhouse-client --config ${CONFIG_CLIENT} -q 'SELECT * from system.build_options;' + ${BIN_DIR}clickhouse-client --config ${CONFIG_CLIENT} --port $CLICKHOUSE_PORT_TCP -q 'SELECT * from system.build_options;' [ "$TEST_RUN" ] && env PATH=$PATH:$BIN_DIR ${TEST_DIR}clickhouse-test --binary ${BIN_DIR}clickhouse --configclient $CONFIG_CLIENT --configserver $CLICKHOUSE_CONFIG --tmp $DATA_DIR/tmp --queries $QUERIES_DIR $TEST_OPT0 $TEST_OPT - ( [ "$TEST_PERF" ] && ${BIN_DIR}clickhouse-performance-test --port `$CLICKHOUSE_EXTRACT_CONFIG --key=tcp_port` --r $CUR_DIR/performance --skip-tags=long $* ) || true + ( [ "$TEST_PERF" ] && ${BIN_DIR}clickhouse-performance-test --port $CLICKHOUSE_PORT_TCP --r $CUR_DIR/performance --skip-tags=long $* ) || true fi diff --git a/dbms/tests/integration/README.md b/dbms/tests/integration/README.md index bf0d184f134..49426fe33ba 100644 --- a/dbms/tests/integration/README.md +++ b/dbms/tests/integration/README.md @@ -16,6 +16,8 @@ Don't use Docker from your system repository. * [py.test](https://docs.pytest.org/) testing framework. To install: `sudo -H pip install pytest` * [docker-compose](https://docs.docker.com/compose/) and additional python libraries. To install: `sudo -H pip install docker-compose docker dicttoxml kazoo PyMySQL` +If you want install on modern debian/ubuntu: `sudo apt install -y docker docker-compose python-pytest python-dicttoxml python-docker python-pymysql python-kazoo` + If you want to run the tests under a non-privileged user, you must add this user to `docker` group: `sudo usermod -aG docker $USER` and re-login. (You must close all your sessions (for example, restart your computer)) To check, that you have access to Docker, run `docker ps`. diff --git a/debian/clickhouse-server.service b/debian/clickhouse-server.service index 64d2cbacf6e..b91de6f56eb 100644 --- a/debian/clickhouse-server.service +++ b/debian/clickhouse-server.service @@ -5,8 +5,10 @@ Description=ClickHouse Server (analytic DBMS for big data) Type=simple User=clickhouse Group=clickhouse +PermissionsStartOnly=true Restart=always RestartSec=30 +ExecStartPre=/usr/bin/chown clickhouse:clickhouse -R /etc/clickhouse-server ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml LimitCORE=infinity LimitNOFILE=500000 diff --git a/debian/pbuilder-hooks/B90test-server b/debian/pbuilder-hooks/B90test-server index b1c8abc1689..729b7f482e2 100755 --- a/debian/pbuilder-hooks/B90test-server +++ b/debian/pbuilder-hooks/B90test-server @@ -2,38 +2,61 @@ set -e set -x -for PKG in $(ls /tmp/buildd/*.deb | sed -e's,.*/,,;s,_.*,,' ); do - apt-get install -y --force-yes "$PKG" || true - apt-get remove -y "$PKG" || true -done +TEST_CONNECT=${TEST_CONNECT=1} +TEST_SSL=${TEST_SSL=1} +PACKAGE_INSTALL=${PACKAGE_INSTALL=1} +PORT_RANDOM=${PORT_RANDOM=1} -dpkg --auto-deconfigure -i /tmp/buildd/*.deb || true -apt install -y -f --allow-downgrades || true -dpkg -l | grep clickhouse || true +if [ "${PACKAGE_INSTALL}" ]; then + for PKG in $(ls /tmp/buildd/*.deb | sed -e's,.*/,,;s,_.*,,' ); do + apt-get install -y --force-yes "$PKG" || true + apt-get remove -y "$PKG" || true + done -# Some test references uses specific timezone -ln -fs /usr/share/zoneinfo/Europe/Moscow /etc/localtime -echo 'Europe/Moscow' > /etc/timezone -dpkg-reconfigure -f noninteractive tzdata + dpkg --auto-deconfigure -i /tmp/buildd/*.deb || true + apt install -y -f --allow-downgrades || true + dpkg -l | grep clickhouse || true + + # Some test references uses specific timezone + ln -fs /usr/share/zoneinfo/Europe/Moscow /etc/localtime + echo 'Europe/Moscow' > /etc/timezone + dpkg-reconfigure -f noninteractive tzdata +fi mkdir -p /etc/clickhouse-server/config.d /etc/clickhouse-client/config.d -TEST_CONNECT=${TEST_CONNECT=1} -if [ "${TEST_CONNECT}" ]; then +if [ "${PORT_RANDOM}" ]; then + CLICKHOUSE_PORT_BASE=${CLICKHOUSE_PORT_BASE:=$(( ( RANDOM % 50000 ) + 10000 ))} + CLICKHOUSE_PORT_TCP=${CLICKHOUSE_PORT_TCP:=$(($CLICKHOUSE_PORT_BASE + 1))} + CLICKHOUSE_PORT_HTTP=${CLICKHOUSE_PORT_HTTP:=$(($CLICKHOUSE_PORT_BASE + 2))} + CLICKHOUSE_PORT_INTERSERVER=${CLICKHOUSE_PORT_INTERSERVER:=$(($CLICKHOUSE_PORT_BASE + 3))} + CLICKHOUSE_PORT_TCP_SECURE=${CLICKHOUSE_PORT_TCP_SECURE:=$(($CLICKHOUSE_PORT_BASE + 4))} + CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:=$(($CLICKHOUSE_PORT_BASE + 5))} +fi + +export CLICKHOUSE_PORT_TCP=${CLICKHOUSE_PORT_TCP:=9000} +export CLICKHOUSE_PORT_HTTP=${CLICKHOUSE_PORT_HTTP:=8123} +export CLICKHOUSE_PORT_INTERSERVER=${CLICKHOUSE_PORT_INTERSERVER:=9009} +export CLICKHOUSE_PORT_TCP_SECURE=${CLICKHOUSE_PORT_TCP_SECURE:=9440} +export CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:=8443} + +if [ "${TEST_CONNECT}" ]; then + [ "${PORT_RANDOM}" ] && echo "${CLICKHOUSE_PORT_HTTP}${CLICKHOUSE_PORT_TCP}${CLICKHOUSE_PORT_INTERSERVER}" > /etc/clickhouse-server/config.d/port.xml - TEST_SSL=${TEST_SSL=1} if [ "${TEST_SSL}" ]; then - echo "84439440" > /etc/clickhouse-server/config.d/ssl.xml + [ "${PORT_RANDOM}" ] && echo "${CLICKHOUSE_PORT_HTTPS}${CLICKHOUSE_PORT_TCP_SECURE}" > /etc/clickhouse-server/config.d/ssl.xml echo "noneAcceptCertificateHandler" > /etc/clickhouse-client/config.d/ssl.xml openssl dhparam -out /etc/clickhouse-server/dhparam.pem 256 openssl req -subj "/CN=localhost" -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout /etc/clickhouse-server/server.key -out /etc/clickhouse-server/server.crt chmod a+r /etc/clickhouse-server/* - CLIENT_ADD="--secure" + CLIENT_ADD+="--secure --port $CLICKHOUSE_PORT_TCP_SECURE" + else + CLIENT_ADD+="--port $CLICKHOUSE_PORT_TCP" fi function finish { service clickhouse-server stop - tail -n 100 /var/log/clickhouse-server/* + tail -n 100 /var/log/clickhouse-server/*.log /var/log/stderr sleep 1 killall -9 clickhouse-server || true } @@ -43,9 +66,9 @@ if [ "${TEST_CONNECT}" ]; then sleep 3 # TODO: remove me or make only on error: - tail -n100 /var/log/clickhouse-server/* + tail -n100 /var/log/clickhouse-server/*.log /var/log/stderr - clickhouse-client -q "SELECT * from system.build_options;" + clickhouse-client --port $CLICKHOUSE_PORT_TCP -q "SELECT * from system.build_options;" clickhouse-client ${CLIENT_ADD} -q "SELECT toDateTime(1);" ( [ "${TEST_RUN}" ] && clickhouse-test --queries /usr/share/clickhouse-test/queries --tmp /tmp/clickhouse-test/ ${TEST_OPT} ) || ${TEST_TRUE:=true} diff --git a/docs/en/development/build_osx.md b/docs/en/development/build_osx.md index ca4b32a93c5..3355b21e3ee 100644 --- a/docs/en/development/build_osx.md +++ b/docs/en/development/build_osx.md @@ -12,7 +12,7 @@ With appropriate changes, it should also work on any other Linux distribution. ## Install required compilers, tools, and libraries ```bash -brew install cmake gcc icu4c mysql openssl unixodbc libtool gettext zlib readline boost --cc=gcc-7 +brew install cmake gcc icu4c mysql openssl unixodbc libtool gettext readline ``` ## Checkout ClickHouse sources @@ -34,7 +34,7 @@ For the latest release candidate, switch to the `testing` branch. ```bash mkdir build cd build -cmake .. -DCMAKE_CXX_COMPILER=`which g++-7` -DCMAKE_C_COMPILER=`which gcc-7` +cmake .. -DCMAKE_CXX_COMPILER=`which g++-8` -DCMAKE_C_COMPILER=`which gcc-8` make -j `sysctl -n hw.ncpu` cd .. ``` diff --git a/docs/mkdocs_ru.yml b/docs/mkdocs_ru.yml index 8207ebe5f53..7bc70245bad 100644 --- a/docs/mkdocs_ru.yml +++ b/docs/mkdocs_ru.yml @@ -177,7 +177,7 @@ pages: - 'Операторы': 'operators/index.md' - 'Функции': - - 'Общее описание': 'functions/index.md' + - 'Введение': 'functions/index.md' - 'Арифметические функции': 'functions/arithmetic_functions.md' - 'Функции сравнения': 'functions/comparison_functions.md' - 'Логические функции': 'functions/logical_functions.md' @@ -204,6 +204,7 @@ pages: - 'Функции для работы со словарями Яндекс.Метрики': 'functions/ym_dict_functions.md' - 'Функции для реализации оператора IN.': 'functions/in_functions.md' - 'Функция arrayJoin': 'functions/array_join.md' + - 'Функции для работы с географическими координатами': 'functions/geo.md' - 'Агрегатные функции': - 'Введение': 'agg_functions/index.md' diff --git a/docs/ru/formats/csv.md b/docs/ru/formats/csv.md index 59edd09fbc6..a1d0dee45c9 100644 --- a/docs/ru/formats/csv.md +++ b/docs/ru/formats/csv.md @@ -1,3 +1,5 @@ + + # CSV Формат comma separated values ([RFC](https://tools.ietf.org/html/rfc4180)). diff --git a/docs/ru/formats/csvwithnames.md b/docs/ru/formats/csvwithnames.md index a9f08b826db..1755713ee6e 100644 --- a/docs/ru/formats/csvwithnames.md +++ b/docs/ru/formats/csvwithnames.md @@ -1,3 +1,5 @@ + + # CSVWithNames Выводит также заголовок, аналогично `TabSeparatedWithNames`. diff --git a/docs/ru/formats/index.md b/docs/ru/formats/index.md index e9ae4a583a1..1646cce452b 100644 --- a/docs/ru/formats/index.md +++ b/docs/ru/formats/index.md @@ -1,5 +1,33 @@ -# Форматы +# Форматы входных и выходных данных -Формат определяет, в каком виде данные отдаются вам (пишутся, форматируются сервером) при SELECT-е и в каком виде принимаются (читаются, парсятся сервером) при INSERT-е. +ClickHouse может принимать (`INSERT`) и отдавать (`SELECT`) данные в различных форматах. + +Поддерживаемые форматы и возможность использовать их в запросах `INSERT` и `SELECT` перечислены в таблице ниже. + +Формат | INSERT | SELECT +-------|--------|-------- +[TabSeparated](tabseparated.md#tabseparated) | ✔ | ✔ | +[TabSeparatedRaw](tabseparatedraw.md#tabseparatedraw) | ✗ | ✔ | +[TabSeparatedWithNames](tabseparatedwithnames.md#tabseparatedwithnames) | ✔ | ✔ | +[TabSeparatedWithNamesAndTypes](tabseparatedwithnamesandtypes.md#tabseparatedwithnamesandtypes) | ✔ | ✔ | +[CSV](csv.md#csv) | ✔ | ✔ | +[CSVWithNames](csvwithnames.md#csvwithnames) | ✔ | ✔ | +[Values](values.md#values) | ✔ | ✔ | +[Vertical](vertical.md#vertical) | ✗ | ✔ | +[VerticalRaw](verticalraw.md#verticalraw) | ✗ | ✔ | +[JSON](json.md#json) | ✗ | ✔ | +[JSONCompact](jsoncompact.md#jsoncompact) | ✗ | ✔ | +[JSONEachRow](jsoneachrow.md#jsoneachrow) | ✔ | ✔ | +[TSKV](tskv.md#tskv) | ✔ | ✔ | +[Pretty](pretty.md#pretty) | ✗ | ✔ | +[PrettyCompact](prettycompact.md#prettycompact) | ✗ | ✔ | +[PrettyCompactMonoBlock](prettycompactmonoblock.md#prettycompactmonoblock) | ✗ | ✔ | +[PrettyNoEscapes](prettynoescapes.md#prettynoescapes) | ✗ | ✔ | +[PrettySpace](prettyspace.md#prettyspace) | ✗ | ✔ | +[RowBinary](rowbinary.md#rowbinary) | ✔ | ✔ | +[Native](native.md#native) | ✔ | ✔ | +[Null](null.md#null) | ✗ | ✔ | +[XML](xml.md#xml) | ✗ | ✔ | +[CapnProto](capnproto.md#capnproto) | ✔ | ✔ | diff --git a/docs/ru/formats/json.md b/docs/ru/formats/json.md index e3eae2bd63b..5664e54297f 100644 --- a/docs/ru/formats/json.md +++ b/docs/ru/formats/json.md @@ -1,3 +1,5 @@ + + # JSON Выводит данные в формате JSON. Кроме таблицы с данными, также выводятся имена и типы столбцов, и некоторая дополнительная информация - общее количество выведенных строк, а также количество строк, которое могло бы быть выведено, если бы не было LIMIT-а. Пример: diff --git a/docs/ru/formats/jsoncompact.md b/docs/ru/formats/jsoncompact.md index 10bbd530ffa..efadc42d6e7 100644 --- a/docs/ru/formats/jsoncompact.md +++ b/docs/ru/formats/jsoncompact.md @@ -1,3 +1,5 @@ + + # JSONCompact Отличается от JSON только тем, что строчки данных выводятся в массивах, а не в object-ах. diff --git a/docs/ru/formats/jsoneachrow.md b/docs/ru/formats/jsoneachrow.md index 6efd15936ff..8bf1797b2a3 100644 --- a/docs/ru/formats/jsoneachrow.md +++ b/docs/ru/formats/jsoneachrow.md @@ -1,3 +1,5 @@ + + # JSONEachRow Выводит данные в виде отдельных JSON объектов для каждой строки (newline delimited JSON). diff --git a/docs/ru/formats/native.md b/docs/ru/formats/native.md index e7aa5b323c4..0b047301fbd 100644 --- a/docs/ru/formats/native.md +++ b/docs/ru/formats/native.md @@ -1,3 +1,5 @@ + + # Native Самый эффективный формат. Данные пишутся и читаются блоками в бинарном виде. Для каждого блока пишется количество строк, количество столбцов, имена и типы столбцов, а затем кусочки столбцов этого блока, один за другим. То есть, этот формат является "столбцовым" - не преобразует столбцы в строки. Именно этот формат используется в родном интерфейсе - при межсерверном взаимодействии, при использовании клиента командной строки, при работе клиентов, написанных на C++. diff --git a/docs/ru/formats/null.md b/docs/ru/formats/null.md index ac699e493a7..eba69cf73f6 100644 --- a/docs/ru/formats/null.md +++ b/docs/ru/formats/null.md @@ -1,3 +1,5 @@ + + # Null Ничего не выводит. При этом, запрос обрабатывается, а при использовании клиента командной строки, данные ещё и передаются на клиент. Используется для тестов, в том числе, тестов производительности. diff --git a/docs/ru/formats/pretty.md b/docs/ru/formats/pretty.md index cac5b7ed1da..0f2434230f2 100644 --- a/docs/ru/formats/pretty.md +++ b/docs/ru/formats/pretty.md @@ -1,3 +1,5 @@ + + # Pretty Выводит данные в виде Unicode-art табличек, также используя ANSI-escape последовательности для установки цветов в терминале. diff --git a/docs/ru/formats/prettycompact.md b/docs/ru/formats/prettycompact.md index 5802dfbc1ef..2e10422d7bc 100644 --- a/docs/ru/formats/prettycompact.md +++ b/docs/ru/formats/prettycompact.md @@ -1,3 +1,5 @@ + + # PrettyCompact Отличается от `Pretty` тем, что не рисуется сетка между строками - результат более компактный. diff --git a/docs/ru/formats/prettycompactmonoblock.md b/docs/ru/formats/prettycompactmonoblock.md index 3ac6b4fcd76..8e5ea89aed8 100644 --- a/docs/ru/formats/prettycompactmonoblock.md +++ b/docs/ru/formats/prettycompactmonoblock.md @@ -1,3 +1,5 @@ + + # PrettyCompactMonoBlock -Отличается от `PrettyCompact` тем, что строки (до 10 000 штук) буферизуются и затем выводятся в виде одной таблицы, а не по блокам. +Отличается от [PrettyCompact](prettycompact.md#prettycompact) тем, что строки (до 10 000 штук) буферизуются и затем выводятся в виде одной таблицы, а не по блокам. diff --git a/docs/ru/formats/prettynoescapes.md b/docs/ru/formats/prettynoescapes.md index b33eebe2907..e4320358438 100644 --- a/docs/ru/formats/prettynoescapes.md +++ b/docs/ru/formats/prettynoescapes.md @@ -1,3 +1,5 @@ + + # PrettyNoEscapes Отличается от Pretty тем, что не используются ANSI-escape последовательности. Это нужно для отображения этого формата в браузере, а также при использовании утилиты командной строки watch. diff --git a/docs/ru/formats/prettyspace.md b/docs/ru/formats/prettyspace.md index 10ba36f6182..60c7bfbdd7e 100644 --- a/docs/ru/formats/prettyspace.md +++ b/docs/ru/formats/prettyspace.md @@ -1,3 +1,5 @@ + + # PrettySpace -Отличается от `PrettyCompact` тем, что вместо сетки используется пустое пространство (пробелы). +Отличается от [PrettyCompact](prettycompact.md#prettycompact) тем, что вместо сетки используется пустое пространство (пробелы). diff --git a/docs/ru/formats/rowbinary.md b/docs/ru/formats/rowbinary.md index 24b3c5c5005..d0d33c696c7 100644 --- a/docs/ru/formats/rowbinary.md +++ b/docs/ru/formats/rowbinary.md @@ -1,3 +1,5 @@ + + # RowBinary Форматирует и парсит данные по строкам, в бинарном виде. Строки и значения уложены подряд, без разделителей. diff --git a/docs/ru/formats/tabseparated.md b/docs/ru/formats/tabseparated.md index 4a2c7ea9abf..a38c418d10d 100644 --- a/docs/ru/formats/tabseparated.md +++ b/docs/ru/formats/tabseparated.md @@ -1,3 +1,5 @@ + + # TabSeparated В TabSeparated формате данные пишутся по строкам. Каждая строчка содержит значения, разделённые табами. После каждого значения идёт таб, кроме последнего значения в строке, после которого идёт перевод строки. Везде подразумеваются исключительно unix-переводы строк. Последняя строка также обязана содержать перевод строки на конце. Значения пишутся в текстовом виде, без обрамляющих кавычек, с экранированием служебных символов. diff --git a/docs/ru/formats/tabseparatedraw.md b/docs/ru/formats/tabseparatedraw.md index f05f5b64f01..a785e353b8b 100644 --- a/docs/ru/formats/tabseparatedraw.md +++ b/docs/ru/formats/tabseparatedraw.md @@ -1,3 +1,5 @@ + + # TabSeparatedRaw Отличается от формата `TabSeparated` тем, что строки выводятся без экранирования. diff --git a/docs/ru/formats/tabseparatedwithnames.md b/docs/ru/formats/tabseparatedwithnames.md index d69fef92d46..51413e3b3d8 100644 --- a/docs/ru/formats/tabseparatedwithnames.md +++ b/docs/ru/formats/tabseparatedwithnames.md @@ -1,3 +1,5 @@ + + # TabSeparatedWithNames Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов. diff --git a/docs/ru/formats/tabseparatedwithnamesandtypes.md b/docs/ru/formats/tabseparatedwithnamesandtypes.md index 8e024e28259..8a5ded88ffc 100644 --- a/docs/ru/formats/tabseparatedwithnamesandtypes.md +++ b/docs/ru/formats/tabseparatedwithnamesandtypes.md @@ -1,3 +1,5 @@ + + # TabSeparatedWithNamesAndTypes Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов, а во второй - типы столбцов. diff --git a/docs/ru/formats/tskv.md b/docs/ru/formats/tskv.md index 0f61cab26e8..50d95b928bc 100644 --- a/docs/ru/formats/tskv.md +++ b/docs/ru/formats/tskv.md @@ -1,3 +1,5 @@ + + # TSKV Похож на TabSeparated, но выводит значения в формате name=value. Имена экранируются так же, как строки в формате TabSeparated и, дополнительно, экранируется также символ =. diff --git a/docs/ru/formats/values.md b/docs/ru/formats/values.md index 9214b48b65b..a8037898a31 100644 --- a/docs/ru/formats/values.md +++ b/docs/ru/formats/values.md @@ -1,3 +1,5 @@ + + # Values Выводит каждую строку в скобках. Строки разделены запятыми. После последней строки запятой нет. Значения внутри скобок также разделены запятыми. Числа выводятся в десятичном виде без кавычек. Массивы выводятся в квадратных скобках. Строки, даты, даты-с-временем выводятся в кавычках. Правила экранирования и особенности парсинга аналогичны формату TabSeparated. При форматировании, лишние пробелы не ставятся, а при парсинге - допустимы и пропускаются (за исключением пробелов внутри значений типа массив, которые недопустимы). diff --git a/docs/ru/formats/vertical.md b/docs/ru/formats/vertical.md index 0496defb293..98da1a6686e 100644 --- a/docs/ru/formats/vertical.md +++ b/docs/ru/formats/vertical.md @@ -1,3 +1,5 @@ + + # Vertical Выводит каждое значение на отдельной строке, с указанием имени столбца. Формат удобно использовать для вывода одной-нескольких строк, если каждая строка состоит из большого количества столбцов. diff --git a/docs/ru/formats/verticalraw.md b/docs/ru/formats/verticalraw.md index fb497430fcd..62a62e9cc9d 100644 --- a/docs/ru/formats/verticalraw.md +++ b/docs/ru/formats/verticalraw.md @@ -1,3 +1,5 @@ + + # VerticalRaw Отличается от формата `Vertical` тем, что строки выводятся без экранирования. diff --git a/docs/ru/formats/xml.md b/docs/ru/formats/xml.md index 66535cf7d02..d13524bf417 100644 --- a/docs/ru/formats/xml.md +++ b/docs/ru/formats/xml.md @@ -1,3 +1,5 @@ + + # XML Формат XML подходит только для вывода данных, не для парсинга. Пример: diff --git a/docs/ru/functions/geo.md b/docs/ru/functions/geo.md new file mode 100644 index 00000000000..be1a8f918b9 --- /dev/null +++ b/docs/ru/functions/geo.md @@ -0,0 +1,70 @@ +# Функции для работы с географическими координатами + +## greatCircleDistance + +Вычисляет расстояние между двумя точками на поверхности Земли по [формуле большого круга](https://en.wikipedia.org/wiki/Great-circle_distance). + +``` +greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg) +``` + +**Входные параметры** + +- `lon1Deg` — широта первой точки в градусах. Диапазон — `[-90°, 90°]`. +- `lat1Deg` — долгота первой точки в градусах. Диапазон — `[-180°, 180°]`. +- `lon2Deg` — широта второй точки в градусах. Диапазон — `[-90°, 90°]`. +- `lat2Deg` — долгота второй точки в градусах. Диапазон — `[-180°, 180°]`. + +Положительные значения соответствуют северной широте и восточной долготе, отрицательные — южной широте и западной долготе. + +**Возвращаемое значение** + +Расстояние между двумя точками на поверхности Земли в метрах. + +Генерирует исключение, когда значения входных параметров выходят за границы диапазонов. + +**Пример** + +```sql +SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673) +``` + +```text +┌─greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)─┐ +│ 14132374.194975413 │ +└───────────────────────────────────────────────────────────────────┘ +``` + +## pointInEllipses + +Проверяет, принадлежит ли точка хотя бы одному из эллипсов. + +``` +pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ) +``` + +**Входные параметры** + +- `x` — широта точки. +- `y` — долгота точки. +- `xᵢ, yᵢ` — координаты центра `i`-го эллипса. +- `aᵢ, bᵢ` — полуоси `i`-го эллипса в метрах. + +Входных параметров должно быть `2+4⋅n`, где `n` — количество эллипсов. + +**Возвращаемые значения** + +`1`, если точка внутри хотя бы одного из эллипсов, `0`, если нет. + + +**Примеры** + +```sql +SELECT pointInEllipses(55.755831, 37.617673, 55.755831, 37.617673, 1.0, 2.0) +``` + +```text +┌─pointInEllipses(55.755831, 37.617673, 55.755831, 37.617673, 1., 2.)─┐ +│ 1 │ +└─────────────────────────────────────────────────────────────────────┘ +``` diff --git a/docs/ru/query_language/queries.md b/docs/ru/query_language/queries.md index 8abe5d61b35..58bc73bc44a 100644 --- a/docs/ru/query_language/queries.md +++ b/docs/ru/query_language/queries.md @@ -157,13 +157,17 @@ SELECT a, b, c FROM (SELECT ...) Отсутствует отдельный запрос для удаления представлений. Чтобы удалить представление, следует использовать `DROP TABLE`. + + ## ATTACH -Запрос полностью аналогичен запросу `CREATE`, но +Запрос полностью аналогичен запросу `CREATE`, но: + - вместо слова `CREATE` используется слово `ATTACH`; - запрос не создаёт данные на диске, а предполагает, что данные уже лежат в соответствующих местах, и всего лишь добавляет информацию о таблице в сервер. -После выполнения запроса ATTACH, сервер будет знать о существовании таблицы. -Если таблица перед этим была отсоединена (``DETACH``), т.е. её структура известна, то можно использовать сокращенную форму записи без определения структуры. +После выполнения `ATTACH`, сервер будет знать о существовании таблицы. + +Если таблица перед этим была отсоединена (`DETACH`), т.е. её структура известна, то можно использовать сокращенную форму записи без определения структуры. ```sql ATTACH TABLE [IF NOT EXISTS] [db.]name diff --git a/docs/ru/table_engines/file.md b/docs/ru/table_engines/file.md index e9c221c56a5..2b4e934bfcc 100644 --- a/docs/ru/table_engines/file.md +++ b/docs/ru/table_engines/file.md @@ -1,3 +1,78 @@ -# File(InputFormat) + -Источником данных является файл, хранящий данные в одном из поддерживаемых форматов входных данных (TabSeparated, Native, и т. д.) ... +# File(Format) + +Управляет данными в одном файле на диске в указанном формате. + +Примеры применения: + +- Выгрузка данных из ClickHouse в файл. +- Преобразование данных из одного формата в другой. +- Обновление данных в ClickHouse редактированием файла на диске. + +## Использование движка в сервере ClickHouse + +``` +File(Format) +``` + +`Format` должен быть таким, который ClickHouse может использовать и в запросах `INSERT` и в запросах `SELECT`. Полный список поддерживаемых форматов смотрите в разделе [Форматы](../formats/index.md#formats). + +Сервер ClickHouse не позволяет указать путь к файлу, с которым будет работать `File`. Используется путь к хранилищу, определенный параметром [path](../operations/server_settings/settings.md#server_settings-path) в конфигурации сервера. + +При создании таблицы с помощью `File(Format)` сервер ClickHouse создает в хранилище каталог с именем таблицы, а после добавления в таблицу данных помещает туда файл `data.Format`. + +Можно вручную создать в хранилище каталог таблицы, поместить туда файл, затем на сервере ClickHouse добавить ([ATTACH](../query_language/queries.md#queries-attach)) информацию о таблице, соответствующей имени каталога и прочитать из файла данные. + +
+Будьте аккуратны с этой функциональностью, поскольку сервер ClickHouse не отслеживает внешние изменения данных. Если в файл будет производиться запись одновременно со стороны сервера ClickHouse и с внешней стороны, то результат непредсказуем. +
+ +**Пример:** + +**1.** Создадим на сервере таблицу `file_engine_table`: + +```sql +CREATE TABLE file_engine_table (name String, value UInt32) ENGINE=File(TabSeparated) +``` + +В конфигурации по умолчанию сервер ClickHouse создаст каталог `/var/lib/clickhouse/data/default/file_engine_table`. + +**2.** Вручную создадим файл `/var/lib/clickhouse/data/default/file_engine_table/data.TabSeparated` с содержимым: + +```bash +$cat data.TabSeparated +one 1 +two 2 +``` + +**3.** Запросим данные: + +```sql +SELECT * FROM file_engine_table +``` + +```text +┌─name─┬─value─┐ +│ one │ 1 │ +│ two │ 2 │ +└──────┴───────┘ +``` + +## Использование движка в clickhouse-local + +В [clickhouse-local](../utils/clickhouse-local.md#utils-clickhouse-local) движок в качестве параметра принимает не только формат, но и путь к файлу. В том числе можно указать стандартные потоки ввода/вывода цифровым или буквенным обозначением `0` или `stdin`, `1` или `stdout`. + +**Пример:** + +```bash +$ echo -e "1,2\n3,4" | clickhouse-local -q "CREATE TABLE table (a Int64, b Int64) ENGINE = File(CSV, stdin); SELECT a, b FROM table; DROP TABLE table" +``` + +## Особенности использования + +- Поддерживается многопоточное чтение и однопоточная запись. +- Не поддерживается: + - использование операций `ALTER` и `SELECT...SAMPLE`; + - индексы; + - репликация. diff --git a/docs/ru/table_engines/index.md b/docs/ru/table_engines/index.md index 811045a2581..90b14f70094 100644 --- a/docs/ru/table_engines/index.md +++ b/docs/ru/table_engines/index.md @@ -1,3 +1,5 @@ + + # Движки таблиц Движок таблицы (тип таблицы) определяет: diff --git a/libs/libcommon/include/common/demangle.h b/libs/libcommon/include/common/demangle.h index 2ad24278764..87bba5bff92 100644 --- a/libs/libcommon/include/common/demangle.h +++ b/libs/libcommon/include/common/demangle.h @@ -5,6 +5,7 @@ /** Demangles C++ symbol name. * When demangling fails, returns the original name and sets status to non-zero. + * TODO: Write msvc version (now returns the same string) */ std::string demangle(const char * name, int & status); diff --git a/libs/libcommon/src/demangle.cpp b/libs/libcommon/src/demangle.cpp index f6aa06e98b6..eab8a55abe0 100644 --- a/libs/libcommon/src/demangle.cpp +++ b/libs/libcommon/src/demangle.cpp @@ -1,7 +1,17 @@ #include -#include -#include +#if _MSC_VER + +std::string demangle(const char * name, int & status) +{ + status = 0; + return name; +} + +#else + +#include +#include std::string demangle(const char * name, int & status) { @@ -26,3 +36,5 @@ std::string demangle(const char * name, int & status) return res; } + +#endif diff --git a/libs/libcommon/src/shift10.cpp b/libs/libcommon/src/shift10.cpp index 9c3fcc20596..d837fb064fb 100644 --- a/libs/libcommon/src/shift10.cpp +++ b/libs/libcommon/src/shift10.cpp @@ -1,6 +1,7 @@ #include #include #include +#include template diff --git a/utils/build/build_macos.sh b/utils/build/build_macos.sh index 3d7d76f4f87..6f1edd9bdfb 100755 --- a/utils/build/build_macos.sh +++ b/utils/build/build_macos.sh @@ -12,7 +12,7 @@ fi ## Install required compilers, tools, libraries -brew install cmake gcc icu4c mysql openssl unixodbc libtool gettext zlib readline boost --cc=gcc-7 +brew install cmake gcc icu4c mysql openssl unixodbc libtool gettext readline ## Checkout ClickHouse sources diff --git a/utils/travis/normal.sh b/utils/travis/normal.sh index ca205f6dd16..1e129ebdb06 100755 --- a/utils/travis/normal.sh +++ b/utils/travis/normal.sh @@ -5,6 +5,8 @@ # env CXX=clang++-5.0 CC=clang-5.0 utils/travis/normal.sh CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +CXX=${CXX=g++} +CC=${CC=gcc} set -e set -x