mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 16:50:48 +00:00
Merge branch 'master' of github.com:yandex/ClickHouse
This commit is contained in:
commit
24b071e017
@ -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)
|
||||||
|
2
contrib/CMakeLists.txt
vendored
2
contrib/CMakeLists.txt
vendored
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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; }
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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`.
|
||||||
|
2
debian/clickhouse-server.service
vendored
2
debian/clickhouse-server.service
vendored
@ -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
|
||||||
|
61
debian/pbuilder-hooks/B90test-server
vendored
61
debian/pbuilder-hooks/B90test-server
vendored
@ -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}
|
||||||
|
@ -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 ..
|
||||||
```
|
```
|
||||||
|
@ -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'
|
||||||
|
@ -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)).
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="csvwithnames"></a>
|
||||||
|
|
||||||
# CSVWithNames
|
# CSVWithNames
|
||||||
|
|
||||||
Выводит также заголовок, аналогично `TabSeparatedWithNames`.
|
Выводит также заголовок, аналогично `TabSeparatedWithNames`.
|
||||||
|
@ -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) | ✔ | ✔ |
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="json"></a>
|
||||||
|
|
||||||
# JSON
|
# JSON
|
||||||
|
|
||||||
Выводит данные в формате JSON. Кроме таблицы с данными, также выводятся имена и типы столбцов, и некоторая дополнительная информация - общее количество выведенных строк, а также количество строк, которое могло бы быть выведено, если бы не было LIMIT-а. Пример:
|
Выводит данные в формате JSON. Кроме таблицы с данными, также выводятся имена и типы столбцов, и некоторая дополнительная информация - общее количество выведенных строк, а также количество строк, которое могло бы быть выведено, если бы не было LIMIT-а. Пример:
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="jsoncompact"></a>
|
||||||
|
|
||||||
# JSONCompact
|
# JSONCompact
|
||||||
|
|
||||||
Отличается от JSON только тем, что строчки данных выводятся в массивах, а не в object-ах.
|
Отличается от JSON только тем, что строчки данных выводятся в массивах, а не в object-ах.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="jsoneachrow"></a>
|
||||||
|
|
||||||
# JSONEachRow
|
# JSONEachRow
|
||||||
|
|
||||||
Выводит данные в виде отдельных JSON объектов для каждой строки (newline delimited JSON).
|
Выводит данные в виде отдельных JSON объектов для каждой строки (newline delimited JSON).
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="native"></a>
|
||||||
|
|
||||||
# Native
|
# Native
|
||||||
|
|
||||||
Самый эффективный формат. Данные пишутся и читаются блоками в бинарном виде. Для каждого блока пишется количество строк, количество столбцов, имена и типы столбцов, а затем кусочки столбцов этого блока, один за другим. То есть, этот формат является "столбцовым" - не преобразует столбцы в строки. Именно этот формат используется в родном интерфейсе - при межсерверном взаимодействии, при использовании клиента командной строки, при работе клиентов, написанных на C++.
|
Самый эффективный формат. Данные пишутся и читаются блоками в бинарном виде. Для каждого блока пишется количество строк, количество столбцов, имена и типы столбцов, а затем кусочки столбцов этого блока, один за другим. То есть, этот формат является "столбцовым" - не преобразует столбцы в строки. Именно этот формат используется в родном интерфейсе - при межсерверном взаимодействии, при использовании клиента командной строки, при работе клиентов, написанных на C++.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="null"></a>
|
||||||
|
|
||||||
# Null
|
# Null
|
||||||
|
|
||||||
Ничего не выводит. При этом, запрос обрабатывается, а при использовании клиента командной строки, данные ещё и передаются на клиент. Используется для тестов, в том числе, тестов производительности.
|
Ничего не выводит. При этом, запрос обрабатывается, а при использовании клиента командной строки, данные ещё и передаются на клиент. Используется для тестов, в том числе, тестов производительности.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="pretty"></a>
|
||||||
|
|
||||||
# Pretty
|
# Pretty
|
||||||
|
|
||||||
Выводит данные в виде Unicode-art табличек, также используя ANSI-escape последовательности для установки цветов в терминале.
|
Выводит данные в виде Unicode-art табличек, также используя ANSI-escape последовательности для установки цветов в терминале.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="prettycompact"></a>
|
||||||
|
|
||||||
# PrettyCompact
|
# PrettyCompact
|
||||||
|
|
||||||
Отличается от `Pretty` тем, что не рисуется сетка между строками - результат более компактный.
|
Отличается от `Pretty` тем, что не рисуется сетка между строками - результат более компактный.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="prettycompactmonoblock"></a>
|
||||||
|
|
||||||
# PrettyCompactMonoBlock
|
# PrettyCompactMonoBlock
|
||||||
|
|
||||||
Отличается от `PrettyCompact` тем, что строки (до 10 000 штук) буферизуются и затем выводятся в виде одной таблицы, а не по блокам.
|
Отличается от [PrettyCompact](prettycompact.md#prettycompact) тем, что строки (до 10 000 штук) буферизуются и затем выводятся в виде одной таблицы, а не по блокам.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="prettynoescapes"></a>
|
||||||
|
|
||||||
# PrettyNoEscapes
|
# PrettyNoEscapes
|
||||||
|
|
||||||
Отличается от Pretty тем, что не используются ANSI-escape последовательности. Это нужно для отображения этого формата в браузере, а также при использовании утилиты командной строки watch.
|
Отличается от Pretty тем, что не используются ANSI-escape последовательности. Это нужно для отображения этого формата в браузере, а также при использовании утилиты командной строки watch.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="prettyspace"></a>
|
||||||
|
|
||||||
# PrettySpace
|
# PrettySpace
|
||||||
|
|
||||||
Отличается от `PrettyCompact` тем, что вместо сетки используется пустое пространство (пробелы).
|
Отличается от [PrettyCompact](prettycompact.md#prettycompact) тем, что вместо сетки используется пустое пространство (пробелы).
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="rowbinary"></a>
|
||||||
|
|
||||||
# RowBinary
|
# RowBinary
|
||||||
|
|
||||||
Форматирует и парсит данные по строкам, в бинарном виде. Строки и значения уложены подряд, без разделителей.
|
Форматирует и парсит данные по строкам, в бинарном виде. Строки и значения уложены подряд, без разделителей.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="tabseparated"></a>
|
||||||
|
|
||||||
# TabSeparated
|
# TabSeparated
|
||||||
|
|
||||||
В TabSeparated формате данные пишутся по строкам. Каждая строчка содержит значения, разделённые табами. После каждого значения идёт таб, кроме последнего значения в строке, после которого идёт перевод строки. Везде подразумеваются исключительно unix-переводы строк. Последняя строка также обязана содержать перевод строки на конце. Значения пишутся в текстовом виде, без обрамляющих кавычек, с экранированием служебных символов.
|
В TabSeparated формате данные пишутся по строкам. Каждая строчка содержит значения, разделённые табами. После каждого значения идёт таб, кроме последнего значения в строке, после которого идёт перевод строки. Везде подразумеваются исключительно unix-переводы строк. Последняя строка также обязана содержать перевод строки на конце. Значения пишутся в текстовом виде, без обрамляющих кавычек, с экранированием служебных символов.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="tabseparatedraw"></a>
|
||||||
|
|
||||||
# TabSeparatedRaw
|
# TabSeparatedRaw
|
||||||
|
|
||||||
Отличается от формата `TabSeparated` тем, что строки выводятся без экранирования.
|
Отличается от формата `TabSeparated` тем, что строки выводятся без экранирования.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="tabseparatedwithnames"></a>
|
||||||
|
|
||||||
# TabSeparatedWithNames
|
# TabSeparatedWithNames
|
||||||
|
|
||||||
Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов.
|
Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="tabseparatedwithnamesandtypes"></a>
|
||||||
|
|
||||||
# TabSeparatedWithNamesAndTypes
|
# TabSeparatedWithNamesAndTypes
|
||||||
|
|
||||||
Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов, а во второй - типы столбцов.
|
Отличается от формата `TabSeparated` тем, что в первой строке пишутся имена столбцов, а во второй - типы столбцов.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="tskv"></a>
|
||||||
|
|
||||||
# TSKV
|
# TSKV
|
||||||
|
|
||||||
Похож на TabSeparated, но выводит значения в формате name=value. Имена экранируются так же, как строки в формате TabSeparated и, дополнительно, экранируется также символ =.
|
Похож на TabSeparated, но выводит значения в формате name=value. Имена экранируются так же, как строки в формате TabSeparated и, дополнительно, экранируется также символ =.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="values"></a>
|
||||||
|
|
||||||
# Values
|
# Values
|
||||||
|
|
||||||
Выводит каждую строку в скобках. Строки разделены запятыми. После последней строки запятой нет. Значения внутри скобок также разделены запятыми. Числа выводятся в десятичном виде без кавычек. Массивы выводятся в квадратных скобках. Строки, даты, даты-с-временем выводятся в кавычках. Правила экранирования и особенности парсинга аналогичны формату TabSeparated. При форматировании, лишние пробелы не ставятся, а при парсинге - допустимы и пропускаются (за исключением пробелов внутри значений типа массив, которые недопустимы).
|
Выводит каждую строку в скобках. Строки разделены запятыми. После последней строки запятой нет. Значения внутри скобок также разделены запятыми. Числа выводятся в десятичном виде без кавычек. Массивы выводятся в квадратных скобках. Строки, даты, даты-с-временем выводятся в кавычках. Правила экранирования и особенности парсинга аналогичны формату TabSeparated. При форматировании, лишние пробелы не ставятся, а при парсинге - допустимы и пропускаются (за исключением пробелов внутри значений типа массив, которые недопустимы).
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="vertical"></a>
|
||||||
|
|
||||||
# Vertical
|
# Vertical
|
||||||
|
|
||||||
Выводит каждое значение на отдельной строке, с указанием имени столбца. Формат удобно использовать для вывода одной-нескольких строк, если каждая строка состоит из большого количества столбцов.
|
Выводит каждое значение на отдельной строке, с указанием имени столбца. Формат удобно использовать для вывода одной-нескольких строк, если каждая строка состоит из большого количества столбцов.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="verticalraw"></a>
|
||||||
|
|
||||||
# VerticalRaw
|
# VerticalRaw
|
||||||
|
|
||||||
Отличается от формата `Vertical` тем, что строки выводятся без экранирования.
|
Отличается от формата `Vertical` тем, что строки выводятся без экранирования.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="xml"></a>
|
||||||
|
|
||||||
# XML
|
# XML
|
||||||
|
|
||||||
Формат XML подходит только для вывода данных, не для парсинга. Пример:
|
Формат XML подходит только для вывода данных, не для парсинга. Пример:
|
||||||
|
70
docs/ru/functions/geo.md
Normal file
70
docs/ru/functions/geo.md
Normal 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 │
|
||||||
|
└─────────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
@ -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
|
||||||
|
@ -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`;
|
||||||
|
- индексы;
|
||||||
|
- репликация.
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
<a name="table_engines"></a>
|
||||||
|
|
||||||
# Движки таблиц
|
# Движки таблиц
|
||||||
|
|
||||||
Движок таблицы (тип таблицы) определяет:
|
Движок таблицы (тип таблицы) определяет:
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user