Merge branch 'master' of github.com:yandex/ClickHouse

This commit is contained in:
Alexey Milovidov 2018-05-26 02:55:29 +03:00
commit 24b071e017
46 changed files with 377 additions and 75 deletions

View File

@ -128,14 +128,14 @@ endif ()
#endif () #endif ()
if (CMAKE_VERSION VERSION_LESS "3.8.0") 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 () else ()
set (CMAKE_CXX_STANDARD 17) 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_EXTENSIONS 0) # https://cmake.org/cmake/help/latest/prop_tgt/CXX_EXTENSIONS.html#prop_tgt:CXX_EXTENSIONS
set (CMAKE_CXX_STANDARD_REQUIRED ON) set (CMAKE_CXX_STANDARD_REQUIRED ON)
set (CXX_FLAGS_INTERNAL_COMPILER "-std=c++1z") 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 () endif ()
set (CMAKE_BUILD_COLOR_MAKEFILE ON) set (CMAKE_BUILD_COLOR_MAKEFILE ON)

View File

@ -1,5 +1,5 @@
if (NOT MSVC) 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 () endif ()
if (USE_INTERNAL_BOOST_LIBRARY) if (USE_INTERNAL_BOOST_LIBRARY)

View File

@ -116,3 +116,10 @@
/* Define to the type of an unsigned integer type of width exactly 8 bits if /* 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. */ such a type exists and the standard includes do not define it. */
/* #undef uint8_t */ /* #undef uint8_t */
#ifdef _MSC_VER
#include <basetsd.h>
typedef SSIZE_T ssize_t;
#else
#include <sys/types.h>
#endif

View File

@ -17,7 +17,7 @@
SOURCE_PATH=${1:-.} SOURCE_PATH=${1:-.}
DST=${2:-$SOURCE_PATH/../headers} 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" 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/Interpreters/SpecializedAggregator.h \
$SOURCE_PATH/dbms/src/AggregateFunctions/AggregateFunction*.h) $SOURCE_PATH/dbms/src/AggregateFunctions/AggregateFunction*.h)
for header in $START_HEADERS; do
START_HEADERS_INCLUDE+="-include $header "
done
# Опция -mcx16 для того, чтобы выбиралось больше заголовочных файлов (с запасом). # Опция -mcx16 для того, чтобы выбиралось больше заголовочных файлов (с запасом).
# The latter options are the same that are added while building packages. # 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'` 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 \ 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 \
-I $GCC_ROOT/include-fixed \ -I $GCC_ROOT/include-fixed \
$(cat "$BUILD_PATH/include_directories.txt") \ $(cat "$BUILD_PATH/include_directories.txt") \
$(echo $START_HEADERS | sed -r -e 's/[^ ]+/-include \0/g') \ $START_HEADERS_INCLUDE \
- | - |
tr -d '\\' | tr -d '\\' |
sed -r -e 's/^-\.o://'); sed -E -e 's/^-\.o://');
do do
dst_file=$src_file; dst_file=$src_file;
[ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -r -e "s!^$DESTDIR!!") [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -E -e "s!^$DESTDIR!!")
dst_file=$(echo $dst_file | sed -r -e 's/build\///') # for simplicity reasons, will put generated headers near the rest. 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 -r -e 's/\/[^/]*$/\//')"; mkdir -p "$DST/$(echo $dst_file | sed -E -e 's/\/[^/]*$/\//')";
cp "$src_file" "$DST/$dst_file"; cp "$src_file" "$DST/$dst_file";
done 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'); 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 do
dst_file=$src_file; dst_file=$src_file;
[ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -r -e "s!^$DESTDIR!!") [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -E -e "s!^$DESTDIR!!")
mkdir -p "$DST/$(echo $dst_file | sed -r -e 's/\/[^/]*$/\//')"; mkdir -p "$DST/$(echo $dst_file | sed -E -e 's/\/[^/]*$/\//')";
cp "$src_file" "$DST/$dst_file"; cp "$src_file" "$DST/$dst_file";
done done
@ -67,15 +72,15 @@ done
for src_file in $(ls -1 $SOURCE_PATH/contrib/boost/libs/smart_ptr/include/boost/smart_ptr/detail/*); for src_file in $(ls -1 $SOURCE_PATH/contrib/boost/libs/smart_ptr/include/boost/smart_ptr/detail/*);
do do
dst_file=$src_file; dst_file=$src_file;
[ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -r -e "s!^$DESTDIR!!") [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -E -e "s!^$DESTDIR!!")
mkdir -p "$DST/$(echo $dst_file | sed -r -e 's/\/[^/]*$/\//')"; mkdir -p "$DST/$(echo $dst_file | sed -E -e 's/\/[^/]*$/\//')";
cp "$src_file" "$DST/$dst_file"; cp "$src_file" "$DST/$dst_file";
done done
for src_file in $(ls -1 $SOURCE_PATH/contrib/boost/boost/smart_ptr/detail/*); for src_file in $(ls -1 $SOURCE_PATH/contrib/boost/boost/smart_ptr/detail/*);
do do
dst_file=$src_file; dst_file=$src_file;
[ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -r -e "s!^$DESTDIR!!") [ -n $DESTDIR ] && dst_file=$(echo $dst_file | sed -E -e "s!^$DESTDIR!!")
mkdir -p "$DST/$(echo $dst_file | sed -r -e 's/\/[^/]*$/\//')"; mkdir -p "$DST/$(echo $dst_file | sed -E -e 's/\/[^/]*$/\//')";
cp "$src_file" "$DST/$dst_file"; cp "$src_file" "$DST/$dst_file";
done done

View File

@ -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}) target_include_directories (clickhouse_common_io BEFORE PRIVATE ${COMMON_INCLUDE_DIR})
if (USE_EMBEDDED_COMPILER) 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) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/headers DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/clickhouse COMPONENT clickhouse)
add_dependencies(clickhouse-bundle copy-headers)
endif () endif ()
add_subdirectory (tests) add_subdirectory (tests)

View File

@ -85,25 +85,27 @@ public:
void addEndpoint(const String & name, InterserverIOEndpointPtr endpoint) void addEndpoint(const String & name, InterserverIOEndpointPtr endpoint)
{ {
std::lock_guard<std::mutex> lock(mutex); std::lock_guard<std::mutex> 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); throw Exception("Duplicate interserver IO endpoint: " + name, ErrorCodes::DUPLICATE_INTERSERVER_IO_ENDPOINT);
endpoint_map[name] = std::move(endpoint);
} }
void removeEndpoint(const String & name) void removeEndpoint(const String & name)
{ {
std::lock_guard<std::mutex> lock(mutex); std::lock_guard<std::mutex> 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); throw Exception("No interserver IO endpoint named " + name, ErrorCodes::NO_SUCH_INTERSERVER_IO_ENDPOINT);
endpoint_map.erase(name);
} }
InterserverIOEndpointPtr getEndpoint(const String & name) InterserverIOEndpointPtr getEndpoint(const String & name)
try
{ {
std::lock_guard<std::mutex> lock(mutex); std::lock_guard<std::mutex> lock(mutex);
if (!endpoint_map.count(name)) return endpoint_map.at(name);
throw Exception("No interserver IO endpoint named " + name, ErrorCodes::NO_SUCH_INTERSERVER_IO_ENDPOINT); }
return endpoint_map[name]; catch (...)
{
throw Exception("No interserver IO endpoint named " + name, ErrorCodes::NO_SUCH_INTERSERVER_IO_ENDPOINT);
} }
private: private:
@ -129,17 +131,15 @@ public:
} }
~InterserverIOEndpointHolder() ~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,
handler.removeEndpoint(name); /// see InterserverIOHTTPHandler.cpp
/// After destroying the object, `endpoint` can still live, since its ownership is acquired during the processing of the request, }
/// see InterserverIOHTTPHandler.cpp catch (...)
} {
catch (...) tryLogCurrentException("~InterserverIOEndpointHolder");
{
tryLogCurrentException("~InterserverIOEndpointHolder");
}
} }
ActionBlocker & getBlocker() { return endpoint->blocker; } ActionBlocker & getBlocker() { return endpoint->blocker; }

View File

@ -198,7 +198,7 @@ void ITableDeclaration::check(const NamesAndTypesList & provided_columns, const
throw Exception("There is no column with name " + name + ". There are columns: " throw Exception("There is no column with name " + name + ". There are columns: "
+ listOfColumns(available_columns), ErrorCodes::NO_SUCH_COLUMN_IN_TABLE); + 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 " throw Exception("Type mismatch for column " + name + ". Column has type "
+ jt->second->getName() + ", got type " + it->second->getName(), ErrorCodes::TYPE_MISMATCH); + jt->second->getName() + ", got type " + it->second->getName(), ErrorCodes::TYPE_MISMATCH);

View File

@ -359,5 +359,10 @@ if __name__ == '__main__':
if args.client is None: if args.client is None:
args.client = args.binary + '-client' args.client = args.binary + '-client'
if args.configclient: 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) main(args)

View File

@ -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} export CLICKHOUSE_CONFIG=${CLICKHOUSE_CONFIG:=${CONFIG_SERVER_DIR}server-test.xml}
[ -x "$CUR_DIR/clickhouse-test" ] && TEST_DIR=${TEST_DIR=$CUR_DIR/} [ -x "$CUR_DIR/clickhouse-test" ] && TEST_DIR=${TEST_DIR=$CUR_DIR/}
[ -d "$CUR_DIR/queries" ] && QUERIES_DIR=${QUERIES_DIR=$CUR_DIR/queries} [ -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" ] && [ -d "/usr/local/share/clickhouse-test/queries" ] && 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/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"} 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 rm -rf $DATA_DIR
mkdir -p $LOG_DIR mkdir -p $LOG_DIR
@ -42,7 +59,7 @@ fi
# Start a local clickhouse server which will be used to run tests # Start a local clickhouse server which will be used to run tests
#PATH=$PATH:$BIN_DIR \ #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=$! CH_PID=$!
sleep 3 sleep 3
@ -71,7 +88,7 @@ if [ -n "$*" ]; then
else else
TEST_RUN=${TEST_RUN=1} TEST_RUN=${TEST_RUN=1}
TEST_PERF=${TEST_PERF=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_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 fi

View File

@ -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` * [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` * [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. 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)) (You must close all your sessions (for example, restart your computer))
To check, that you have access to Docker, run `docker ps`. To check, that you have access to Docker, run `docker ps`.

View File

@ -5,8 +5,10 @@ Description=ClickHouse Server (analytic DBMS for big data)
Type=simple Type=simple
User=clickhouse User=clickhouse
Group=clickhouse Group=clickhouse
PermissionsStartOnly=true
Restart=always Restart=always
RestartSec=30 RestartSec=30
ExecStartPre=/usr/bin/chown clickhouse:clickhouse -R /etc/clickhouse-server
ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml ExecStart=/usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml
LimitCORE=infinity LimitCORE=infinity
LimitNOFILE=500000 LimitNOFILE=500000

View File

@ -2,38 +2,61 @@
set -e set -e
set -x set -x
for PKG in $(ls /tmp/buildd/*.deb | sed -e's,.*/,,;s,_.*,,' ); do TEST_CONNECT=${TEST_CONNECT=1}
apt-get install -y --force-yes "$PKG" || true TEST_SSL=${TEST_SSL=1}
apt-get remove -y "$PKG" || true PACKAGE_INSTALL=${PACKAGE_INSTALL=1}
done PORT_RANDOM=${PORT_RANDOM=1}
dpkg --auto-deconfigure -i /tmp/buildd/*.deb || true if [ "${PACKAGE_INSTALL}" ]; then
apt install -y -f --allow-downgrades || true for PKG in $(ls /tmp/buildd/*.deb | sed -e's,.*/,,;s,_.*,,' ); do
dpkg -l | grep clickhouse || true apt-get install -y --force-yes "$PKG" || true
apt-get remove -y "$PKG" || true
done
# Some test references uses specific timezone dpkg --auto-deconfigure -i /tmp/buildd/*.deb || true
ln -fs /usr/share/zoneinfo/Europe/Moscow /etc/localtime apt install -y -f --allow-downgrades || true
echo 'Europe/Moscow' > /etc/timezone dpkg -l | grep clickhouse || true
dpkg-reconfigure -f noninteractive tzdata
# 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 mkdir -p /etc/clickhouse-server/config.d /etc/clickhouse-client/config.d
TEST_CONNECT=${TEST_CONNECT=1} if [ "${PORT_RANDOM}" ]; then
if [ "${TEST_CONNECT}" ]; 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 "<yandex><http_port>${CLICKHOUSE_PORT_HTTP}</http_port><tcp_port>${CLICKHOUSE_PORT_TCP}</tcp_port><interserver_http_port>${CLICKHOUSE_PORT_INTERSERVER}</interserver_http_port></yandex>" > /etc/clickhouse-server/config.d/port.xml
TEST_SSL=${TEST_SSL=1}
if [ "${TEST_SSL}" ]; then if [ "${TEST_SSL}" ]; then
echo "<yandex><https_port>8443</https_port><tcp_port_secure>9440</tcp_port_secure></yandex>" > /etc/clickhouse-server/config.d/ssl.xml [ "${PORT_RANDOM}" ] && echo "<yandex><https_port>${CLICKHOUSE_PORT_HTTPS}</https_port><tcp_port_secure>${CLICKHOUSE_PORT_TCP_SECURE}</tcp_port_secure></yandex>" > /etc/clickhouse-server/config.d/ssl.xml
echo "<yandex><openSSL><client><verificationMode>none</verificationMode><invalidCertificateHandler><name>AcceptCertificateHandler</name></invalidCertificateHandler></client></openSSL></yandex>" > /etc/clickhouse-client/config.d/ssl.xml echo "<yandex><openSSL><client><verificationMode>none</verificationMode><invalidCertificateHandler><name>AcceptCertificateHandler</name></invalidCertificateHandler></client></openSSL></yandex>" > /etc/clickhouse-client/config.d/ssl.xml
openssl dhparam -out /etc/clickhouse-server/dhparam.pem 256 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 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/* 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 fi
function finish { function finish {
service clickhouse-server stop service clickhouse-server stop
tail -n 100 /var/log/clickhouse-server/* tail -n 100 /var/log/clickhouse-server/*.log /var/log/stderr
sleep 1 sleep 1
killall -9 clickhouse-server || true killall -9 clickhouse-server || true
} }
@ -43,9 +66,9 @@ if [ "${TEST_CONNECT}" ]; then
sleep 3 sleep 3
# TODO: remove me or make only on error: # 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);" 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} ( [ "${TEST_RUN}" ] && clickhouse-test --queries /usr/share/clickhouse-test/queries --tmp /tmp/clickhouse-test/ ${TEST_OPT} ) || ${TEST_TRUE:=true}

View File

@ -12,7 +12,7 @@ With appropriate changes, it should also work on any other Linux distribution.
## Install required compilers, tools, and libraries ## Install required compilers, tools, and libraries
```bash ```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 ## Checkout ClickHouse sources
@ -34,7 +34,7 @@ For the latest release candidate, switch to the `testing` branch.
```bash ```bash
mkdir build mkdir build
cd 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` make -j `sysctl -n hw.ncpu`
cd .. cd ..
``` ```

View File

@ -177,7 +177,7 @@ pages:
- 'Операторы': 'operators/index.md' - 'Операторы': 'operators/index.md'
- 'Функции': - 'Функции':
- 'Общее описание': 'functions/index.md' - 'Введение': 'functions/index.md'
- 'Арифметические функции': 'functions/arithmetic_functions.md' - 'Арифметические функции': 'functions/arithmetic_functions.md'
- 'Функции сравнения': 'functions/comparison_functions.md' - 'Функции сравнения': 'functions/comparison_functions.md'
- 'Логические функции': 'functions/logical_functions.md' - 'Логические функции': 'functions/logical_functions.md'
@ -204,6 +204,7 @@ pages:
- 'Функции для работы со словарями Яндекс.Метрики': 'functions/ym_dict_functions.md' - 'Функции для работы со словарями Яндекс.Метрики': 'functions/ym_dict_functions.md'
- 'Функции для реализации оператора IN.': 'functions/in_functions.md' - 'Функции для реализации оператора IN.': 'functions/in_functions.md'
- 'Функция arrayJoin': 'functions/array_join.md' - 'Функция arrayJoin': 'functions/array_join.md'
- 'Функции для работы с географическими координатами': 'functions/geo.md'
- 'Агрегатные функции': - 'Агрегатные функции':
- 'Введение': 'agg_functions/index.md' - 'Введение': 'agg_functions/index.md'

View File

@ -1,3 +1,5 @@
<a name="csv"></a>
# CSV # CSV
Формат comma separated values ([RFC](https://tools.ietf.org/html/rfc4180)). Формат comma separated values ([RFC](https://tools.ietf.org/html/rfc4180)).

View File

@ -1,3 +1,5 @@
<a name="csvwithnames"></a>
# CSVWithNames # CSVWithNames
Выводит также заголовок, аналогично `TabSeparatedWithNames`. Выводит также заголовок, аналогично `TabSeparatedWithNames`.

View File

@ -1,5 +1,33 @@
<a name="formats"></a> <a name="formats"></a>
# Форматы # Форматы входных и выходных данных
Формат определяет, в каком виде данные отдаются вам (пишутся, форматируются сервером) при 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) | ✔ | ✔ |

View File

@ -1,3 +1,5 @@
<a name="json"></a>
# JSON # JSON
Выводит данные в формате JSON. Кроме таблицы с данными, также выводятся имена и типы столбцов, и некоторая дополнительная информация - общее количество выведенных строк, а также количество строк, которое могло бы быть выведено, если бы не было LIMIT-а. Пример: Выводит данные в формате JSON. Кроме таблицы с данными, также выводятся имена и типы столбцов, и некоторая дополнительная информация - общее количество выведенных строк, а также количество строк, которое могло бы быть выведено, если бы не было LIMIT-а. Пример:

View File

@ -1,3 +1,5 @@
<a name="jsoncompact"></a>
# JSONCompact # JSONCompact
Отличается от JSON только тем, что строчки данных выводятся в массивах, а не в object-ах. Отличается от JSON только тем, что строчки данных выводятся в массивах, а не в object-ах.

View File

@ -1,3 +1,5 @@
<a name="jsoneachrow"></a>
# JSONEachRow # JSONEachRow
Выводит данные в виде отдельных JSON объектов для каждой строки (newline delimited JSON). Выводит данные в виде отдельных JSON объектов для каждой строки (newline delimited JSON).

View File

@ -1,3 +1,5 @@
<a name="native"></a>
# Native # Native
Самый эффективный формат. Данные пишутся и читаются блоками в бинарном виде. Для каждого блока пишется количество строк, количество столбцов, имена и типы столбцов, а затем кусочки столбцов этого блока, один за другим. То есть, этот формат является "столбцовым" - не преобразует столбцы в строки. Именно этот формат используется в родном интерфейсе - при межсерверном взаимодействии, при использовании клиента командной строки, при работе клиентов, написанных на C++. Самый эффективный формат. Данные пишутся и читаются блоками в бинарном виде. Для каждого блока пишется количество строк, количество столбцов, имена и типы столбцов, а затем кусочки столбцов этого блока, один за другим. То есть, этот формат является "столбцовым" - не преобразует столбцы в строки. Именно этот формат используется в родном интерфейсе - при межсерверном взаимодействии, при использовании клиента командной строки, при работе клиентов, написанных на C++.

View File

@ -1,3 +1,5 @@
<a name="null"></a>
# Null # Null
Ничего не выводит. При этом, запрос обрабатывается, а при использовании клиента командной строки, данные ещё и передаются на клиент. Используется для тестов, в том числе, тестов производительности. Ничего не выводит. При этом, запрос обрабатывается, а при использовании клиента командной строки, данные ещё и передаются на клиент. Используется для тестов, в том числе, тестов производительности.

View File

@ -1,3 +1,5 @@
<a name="pretty"></a>
# Pretty # Pretty
Выводит данные в виде Unicode-art табличек, также используя ANSI-escape последовательности для установки цветов в терминале. Выводит данные в виде Unicode-art табличек, также используя ANSI-escape последовательности для установки цветов в терминале.

View File

@ -1,3 +1,5 @@
<a name="prettycompact"></a>
# PrettyCompact # PrettyCompact
Отличается от `Pretty` тем, что не рисуется сетка между строками - результат более компактный. Отличается от `Pretty` тем, что не рисуется сетка между строками - результат более компактный.

View File

@ -1,3 +1,5 @@
<a name="prettycompactmonoblock"></a>
# PrettyCompactMonoBlock # PrettyCompactMonoBlock
Отличается от `PrettyCompact` тем, что строки (до 10 000 штук) буферизуются и затем выводятся в виде одной таблицы, а не по блокам. Отличается от [PrettyCompact](prettycompact.md#prettycompact) тем, что строки (до 10 000 штук) буферизуются и затем выводятся в виде одной таблицы, а не по блокам.

View File

@ -1,3 +1,5 @@
<a name="prettynoescapes"></a>
# PrettyNoEscapes # PrettyNoEscapes
Отличается от Pretty тем, что не используются ANSI-escape последовательности. Это нужно для отображения этого формата в браузере, а также при использовании утилиты командной строки watch. Отличается от Pretty тем, что не используются ANSI-escape последовательности. Это нужно для отображения этого формата в браузере, а также при использовании утилиты командной строки watch.

View File

@ -1,3 +1,5 @@
<a name="prettyspace"></a>
# PrettySpace # PrettySpace
Отличается от `PrettyCompact` тем, что вместо сетки используется пустое пространство (пробелы). Отличается от [PrettyCompact](prettycompact.md#prettycompact) тем, что вместо сетки используется пустое пространство (пробелы).

View File

@ -1,3 +1,5 @@
<a name="rowbinary"></a>
# RowBinary # RowBinary
Форматирует и парсит данные по строкам, в бинарном виде. Строки и значения уложены подряд, без разделителей. Форматирует и парсит данные по строкам, в бинарном виде. Строки и значения уложены подряд, без разделителей.

View File

@ -1,3 +1,5 @@
<a name="tabseparated"></a>
# TabSeparated # TabSeparated
В TabSeparated формате данные пишутся по строкам. Каждая строчка содержит значения, разделённые табами. После каждого значения идёт таб, кроме последнего значения в строке, после которого идёт перевод строки. Везде подразумеваются исключительно unix-переводы строк. Последняя строка также обязана содержать перевод строки на конце. Значения пишутся в текстовом виде, без обрамляющих кавычек, с экранированием служебных символов. В TabSeparated формате данные пишутся по строкам. Каждая строчка содержит значения, разделённые табами. После каждого значения идёт таб, кроме последнего значения в строке, после которого идёт перевод строки. Везде подразумеваются исключительно unix-переводы строк. Последняя строка также обязана содержать перевод строки на конце. Значения пишутся в текстовом виде, без обрамляющих кавычек, с экранированием служебных символов.

View File

@ -1,3 +1,5 @@
<a name="tabseparatedraw"></a>
# TabSeparatedRaw # TabSeparatedRaw
Отличается от формата `TabSeparated` тем, что строки выводятся без экранирования. Отличается от формата `TabSeparated` тем, что строки выводятся без экранирования.

View File

@ -1,3 +1,5 @@
<a name="tabseparatedwithnames"></a>
# TabSeparatedWithNames # TabSeparatedWithNames
Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов. Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов.

View File

@ -1,3 +1,5 @@
<a name="tabseparatedwithnamesandtypes"></a>
# TabSeparatedWithNamesAndTypes # TabSeparatedWithNamesAndTypes
Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов, а во второй - типы столбцов. Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов, а во второй - типы столбцов.

View File

@ -1,3 +1,5 @@
<a name="tskv"></a>
# TSKV # TSKV
Похож на TabSeparated, но выводит значения в формате name=value. Имена экранируются так же, как строки в формате TabSeparated и, дополнительно, экранируется также символ =. Похож на TabSeparated, но выводит значения в формате name=value. Имена экранируются так же, как строки в формате TabSeparated и, дополнительно, экранируется также символ =.

View File

@ -1,3 +1,5 @@
<a name="values"></a>
# Values # Values
Выводит каждую строку в скобках. Строки разделены запятыми. После последней строки запятой нет. Значения внутри скобок также разделены запятыми. Числа выводятся в десятичном виде без кавычек. Массивы выводятся в квадратных скобках. Строки, даты, даты-с-временем выводятся в кавычках. Правила экранирования и особенности парсинга аналогичны формату TabSeparated. При форматировании, лишние пробелы не ставятся, а при парсинге - допустимы и пропускаются (за исключением пробелов внутри значений типа массив, которые недопустимы). Выводит каждую строку в скобках. Строки разделены запятыми. После последней строки запятой нет. Значения внутри скобок также разделены запятыми. Числа выводятся в десятичном виде без кавычек. Массивы выводятся в квадратных скобках. Строки, даты, даты-с-временем выводятся в кавычках. Правила экранирования и особенности парсинга аналогичны формату TabSeparated. При форматировании, лишние пробелы не ставятся, а при парсинге - допустимы и пропускаются (за исключением пробелов внутри значений типа массив, которые недопустимы).

View File

@ -1,3 +1,5 @@
<a name="vertical"></a>
# Vertical # Vertical
Выводит каждое значение на отдельной строке, с указанием имени столбца. Формат удобно использовать для вывода одной-нескольких строк, если каждая строка состоит из большого количества столбцов. Выводит каждое значение на отдельной строке, с указанием имени столбца. Формат удобно использовать для вывода одной-нескольких строк, если каждая строка состоит из большого количества столбцов.

View File

@ -1,3 +1,5 @@
<a name="verticalraw"></a>
# VerticalRaw # VerticalRaw
Отличается от формата `Vertical` тем, что строки выводятся без экранирования. Отличается от формата `Vertical` тем, что строки выводятся без экранирования.

View File

@ -1,3 +1,5 @@
<a name="xml"></a>
# XML # XML
Формат XML подходит только для вывода данных, не для парсинга. Пример: Формат XML подходит только для вывода данных, не для парсинга. Пример:

70
docs/ru/functions/geo.md Normal file
View File

@ -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 │
└─────────────────────────────────────────────────────────────────────┘
```

View File

@ -157,13 +157,17 @@ SELECT a, b, c FROM (SELECT ...)
Отсутствует отдельный запрос для удаления представлений. Чтобы удалить представление, следует использовать `DROP TABLE`. Отсутствует отдельный запрос для удаления представлений. Чтобы удалить представление, следует использовать `DROP TABLE`.
<a name="queries-attach"></a>
## ATTACH ## ATTACH
Запрос полностью аналогичен запросу `CREATE`, но Запрос полностью аналогичен запросу `CREATE`, но:
- вместо слова `CREATE` используется слово `ATTACH`; - вместо слова `CREATE` используется слово `ATTACH`;
- запрос не создаёт данные на диске, а предполагает, что данные уже лежат в соответствующих местах, и всего лишь добавляет информацию о таблице в сервер. - запрос не создаёт данные на диске, а предполагает, что данные уже лежат в соответствующих местах, и всего лишь добавляет информацию о таблице в сервер.
После выполнения запроса ATTACH, сервер будет знать о существовании таблицы.
Если таблица перед этим была отсоединена (``DETACH``), т.е. её структура известна, то можно использовать сокращенную форму записи без определения структуры. После выполнения `ATTACH`, сервер будет знать о существовании таблицы.
Если таблица перед этим была отсоединена (`DETACH`), т.е. её структура известна, то можно использовать сокращенную форму записи без определения структуры.
```sql ```sql
ATTACH TABLE [IF NOT EXISTS] [db.]name ATTACH TABLE [IF NOT EXISTS] [db.]name

View File

@ -1,3 +1,78 @@
# File(InputFormat) <a name="table_engines-file"></a>
Источником данных является файл, хранящий данные в одном из поддерживаемых форматов входных данных (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)) информацию о таблице, соответствующей имени каталога и прочитать из файла данные.
<div class="admonition warning">
Будьте аккуратны с этой функциональностью, поскольку сервер ClickHouse не отслеживает внешние изменения данных. Если в файл будет производиться запись одновременно со стороны сервера ClickHouse и с внешней стороны, то результат непредсказуем.
</div>
**Пример:**
**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`;
- индексы;
- репликация.

View File

@ -1,3 +1,5 @@
<a name="table_engines"></a>
# Движки таблиц # Движки таблиц
Движок таблицы (тип таблицы) определяет: Движок таблицы (тип таблицы) определяет:

View File

@ -5,6 +5,7 @@
/** Demangles C++ symbol name. /** Demangles C++ symbol name.
* When demangling fails, returns the original name and sets status to non-zero. * 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); std::string demangle(const char * name, int & status);

View File

@ -1,7 +1,17 @@
#include <common/demangle.h> #include <common/demangle.h>
#include <cxxabi.h>
#include <stdlib.h>
#if _MSC_VER
std::string demangle(const char * name, int & status)
{
status = 0;
return name;
}
#else
#include <stdlib.h>
#include <cxxabi.h>
std::string demangle(const char * name, int & status) std::string demangle(const char * name, int & status)
{ {
@ -26,3 +36,5 @@ std::string demangle(const char * name, int & status)
return res; return res;
} }
#endif

View File

@ -1,6 +1,7 @@
#include <common/shift10.h> #include <common/shift10.h>
#include <common/likely.h> #include <common/likely.h>
#include <limits> #include <limits>
#include <port/ssize_t.h>
template <typename T> template <typename T>

View File

@ -12,7 +12,7 @@ fi
## Install required compilers, tools, libraries ## 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 ## Checkout ClickHouse sources

View File

@ -5,6 +5,8 @@
# env CXX=clang++-5.0 CC=clang-5.0 utils/travis/normal.sh # env CXX=clang++-5.0 CC=clang-5.0 utils/travis/normal.sh
CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
CXX=${CXX=g++}
CC=${CC=gcc}
set -e set -e
set -x set -x