mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 00:52:02 +00:00
Merge branch 'master' into revert-34211-revert-34153-add_func_tests_over_s3
This commit is contained in:
commit
2a9bc7cba8
38
.github/workflows/tags_stable.yml
vendored
Normal file
38
.github/workflows/tags_stable.yml
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
name: TagsStableWorkflow
|
||||
# - Gets artifacts from S3
|
||||
# - Sends it to JFROG Artifactory
|
||||
# - Adds them to the release assets
|
||||
|
||||
on: # yamllint disable-line rule:truthy
|
||||
push:
|
||||
tags:
|
||||
- 'v*-stable'
|
||||
- 'v*-lts'
|
||||
|
||||
|
||||
jobs:
|
||||
UpdateVersions:
|
||||
runs-on: [self-hosted, style-checker]
|
||||
steps:
|
||||
- name: Get tag name
|
||||
run: echo "GITHUB_TAG=${GITHUB_REF#refs/tags/}" >> "$GITHUB_ENV"
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
ref: master
|
||||
- name: Generate versions
|
||||
run: |
|
||||
git fetch --tags
|
||||
./utils/list-versions/list-versions.sh > ./utils/list-versions/version_date.tsv
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
with:
|
||||
commit-message: Update version_date.tsv after ${{ env.GITHUB_TAG }}
|
||||
branch: auto/${{ env.GITHUB_TAG }}
|
||||
delete-branch: true
|
||||
title: Update version_date.tsv after ${{ env.GITHUB_TAG }}
|
||||
body: |
|
||||
Update version_date.tsv after ${{ env.GITHUB_TAG }}
|
||||
|
||||
Changelog category (leave one):
|
||||
- Not for changelog (changelog entry is not required)
|
@ -67,7 +67,7 @@ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git" AND NOT EXISTS "${ClickHouse_SOURC
|
||||
message (FATAL_ERROR "Submodules are not initialized. Run\n\tgit submodule update --init --recursive")
|
||||
endif ()
|
||||
|
||||
include (cmake/find/ccache.cmake)
|
||||
include (cmake/ccache.cmake)
|
||||
|
||||
# Take care to add prlimit in command line before ccache, or else ccache thinks that
|
||||
# prlimit is compiler, and clang++ is its input file, and refuses to work with
|
||||
|
@ -22,9 +22,10 @@ The following versions of ClickHouse server are currently being supported with s
|
||||
| 21.7 | :x: |
|
||||
| 21.8 | ✅ |
|
||||
| 21.9 | :x: |
|
||||
| 21.10 | ✅ |
|
||||
| 21.10 | :x: |
|
||||
| 21.11 | ✅ |
|
||||
| 21.12 | ✅ |
|
||||
| 22.1 | ✅ |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
|
@ -22,7 +22,7 @@ set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15)
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
include (cmake/find/cxx.cmake)
|
||||
include (cmake/cxx.cmake)
|
||||
|
||||
target_link_libraries(global-group INTERFACE
|
||||
$<TARGET_PROPERTY:global-libs,INTERFACE_LINK_LIBRARIES>
|
||||
|
@ -22,8 +22,8 @@ set(CMAKE_C_STANDARD_LIBRARIES ${DEFAULT_LIBS})
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
include (cmake/find/unwind.cmake)
|
||||
include (cmake/find/cxx.cmake)
|
||||
include (cmake/unwind.cmake)
|
||||
include (cmake/cxx.cmake)
|
||||
|
||||
target_link_libraries(global-group INTERFACE
|
||||
$<TARGET_PROPERTY:global-libs,INTERFACE_LINK_LIBRARIES>
|
||||
|
@ -42,8 +42,8 @@ if (NOT OS_ANDROID)
|
||||
add_subdirectory(base/harmful)
|
||||
endif ()
|
||||
|
||||
include (cmake/find/unwind.cmake)
|
||||
include (cmake/find/cxx.cmake)
|
||||
include (cmake/unwind.cmake)
|
||||
include (cmake/cxx.cmake)
|
||||
|
||||
target_link_libraries(global-group INTERFACE
|
||||
-Wl,--start-group
|
||||
|
@ -29,12 +29,6 @@ if (OS_FREEBSD)
|
||||
message (FATAL_ERROR "Using internal parquet library on FreeBSD is not supported")
|
||||
endif()
|
||||
|
||||
if(USE_STATIC_LIBRARIES)
|
||||
set(FLATBUFFERS_LIBRARY flatbuffers)
|
||||
else()
|
||||
set(FLATBUFFERS_LIBRARY flatbuffers_shared)
|
||||
endif()
|
||||
|
||||
set (CMAKE_CXX_STANDARD 17)
|
||||
|
||||
set(ARROW_VERSION "6.0.1")
|
||||
@ -95,9 +89,16 @@ set(FLATBUFFERS_BUILD_TESTS OFF CACHE BOOL "Skip flatbuffers tests")
|
||||
|
||||
add_subdirectory(${FLATBUFFERS_SRC_DIR} "${FLATBUFFERS_BINARY_DIR}")
|
||||
|
||||
message(STATUS "FLATBUFFERS_LIBRARY: ${FLATBUFFERS_LIBRARY}")
|
||||
add_library(_flatbuffers INTERFACE)
|
||||
if(USE_STATIC_LIBRARIES)
|
||||
target_link_libraries(_flatbuffers INTERFACE flatbuffers)
|
||||
else()
|
||||
target_link_libraries(_flatbuffers INTERFACE flatbuffers_shared)
|
||||
endif()
|
||||
target_include_directories(_flatbuffers INTERFACE ${FLATBUFFERS_INCLUDE_DIR})
|
||||
|
||||
# === hdfs
|
||||
# NOTE: cannot use ch_contrib::hdfs since it's INCLUDE_DIRECTORIES does not includes trailing "hdfs/"
|
||||
set(HDFS_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/libhdfs3/include/hdfs/")
|
||||
|
||||
# arrow-cmake cmake file calling orc cmake subroutine which detects certain compiler features.
|
||||
@ -123,8 +124,6 @@ configure_file("${ORC_SOURCE_SRC_DIR}/Adaptor.hh.in" "${ORC_BUILD_INCLUDE_DIR}/A
|
||||
|
||||
# ARROW_ORC + adapters/orc/CMakefiles
|
||||
set(ORC_SRCS
|
||||
"${ARROW_SRC_DIR}/arrow/adapters/orc/adapter.cc"
|
||||
"${ARROW_SRC_DIR}/arrow/adapters/orc/adapter_util.cc"
|
||||
"${ORC_SOURCE_SRC_DIR}/Exceptions.cc"
|
||||
"${ORC_SOURCE_SRC_DIR}/OrcFile.cc"
|
||||
"${ORC_SOURCE_SRC_DIR}/Reader.cc"
|
||||
@ -151,6 +150,22 @@ set(ORC_SRCS
|
||||
"${ORC_ADDITION_SOURCE_DIR}/orc_proto.pb.cc"
|
||||
)
|
||||
|
||||
add_library(_orc ${ORC_SRCS})
|
||||
target_link_libraries(_orc PRIVATE
|
||||
ch_contrib::protobuf
|
||||
ch_contrib::lz4
|
||||
ch_contrib::snappy
|
||||
ch_contrib::zlib
|
||||
ch_contrib::zstd)
|
||||
target_include_directories(_orc SYSTEM BEFORE PUBLIC ${ORC_INCLUDE_DIR})
|
||||
target_include_directories(_orc SYSTEM BEFORE PUBLIC ${ORC_BUILD_INCLUDE_DIR})
|
||||
target_include_directories(_orc SYSTEM PRIVATE
|
||||
${ORC_SOURCE_SRC_DIR}
|
||||
${ORC_SOURCE_WRAP_DIR}
|
||||
${ORC_BUILD_SRC_DIR}
|
||||
${ORC_ADDITION_SOURCE_DIR}
|
||||
${ARROW_SRC_DIR})
|
||||
|
||||
|
||||
# === arrow
|
||||
|
||||
@ -336,7 +351,8 @@ set(ARROW_SRCS
|
||||
"${LIBRARY_DIR}/ipc/reader.cc"
|
||||
"${LIBRARY_DIR}/ipc/writer.cc"
|
||||
|
||||
${ORC_SRCS}
|
||||
"${ARROW_SRC_DIR}/arrow/adapters/orc/adapter.cc"
|
||||
"${ARROW_SRC_DIR}/arrow/adapters/orc/adapter_util.cc"
|
||||
)
|
||||
|
||||
add_definitions(-DARROW_WITH_LZ4)
|
||||
@ -356,30 +372,27 @@ endif ()
|
||||
|
||||
add_library(_arrow ${ARROW_SRCS})
|
||||
|
||||
# Arrow dependencies
|
||||
add_dependencies(_arrow ${FLATBUFFERS_LIBRARY})
|
||||
target_link_libraries(_arrow PRIVATE
|
||||
boost::filesystem
|
||||
|
||||
target_link_libraries(_arrow PRIVATE ${FLATBUFFERS_LIBRARY} boost::filesystem)
|
||||
_flatbuffers
|
||||
|
||||
ch_contrib::double_conversion
|
||||
|
||||
ch_contrib::lz4
|
||||
ch_contrib::snappy
|
||||
ch_contrib::zlib
|
||||
ch_contrib::zstd
|
||||
ch_contrib::zstd
|
||||
)
|
||||
target_link_libraries(_arrow PUBLIC _orc)
|
||||
|
||||
add_dependencies(_arrow protoc)
|
||||
|
||||
target_include_directories(_arrow SYSTEM BEFORE PUBLIC ${ARROW_SRC_DIR})
|
||||
target_include_directories(_arrow SYSTEM BEFORE PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/cpp/src")
|
||||
target_link_libraries(_arrow PRIVATE ch_contrib::double_conversion)
|
||||
target_link_libraries(_arrow PRIVATE ch_contrib::protobuf)
|
||||
target_link_libraries(_arrow PRIVATE ch_contrib::lz4)
|
||||
target_link_libraries(_arrow PRIVATE ch_contrib::snappy)
|
||||
target_link_libraries(_arrow PRIVATE ch_contrib::zlib)
|
||||
target_link_libraries(_arrow PRIVATE ch_contrib::zstd)
|
||||
|
||||
target_include_directories(_arrow SYSTEM BEFORE PUBLIC ${ORC_INCLUDE_DIR})
|
||||
target_include_directories(_arrow SYSTEM BEFORE PUBLIC ${ORC_BUILD_INCLUDE_DIR})
|
||||
target_include_directories(_arrow SYSTEM PRIVATE ${ORC_SOURCE_SRC_DIR})
|
||||
target_include_directories(_arrow SYSTEM PRIVATE ${ORC_SOURCE_WRAP_DIR})
|
||||
target_include_directories(_arrow SYSTEM PRIVATE ${ORC_BUILD_SRC_DIR})
|
||||
target_include_directories(_arrow SYSTEM PRIVATE ${ORC_ADDITION_SOURCE_DIR})
|
||||
target_include_directories(_arrow SYSTEM PRIVATE ${ARROW_SRC_DIR})
|
||||
target_include_directories(_arrow SYSTEM PRIVATE ${FLATBUFFERS_INCLUDE_DIR})
|
||||
target_include_directories(_arrow SYSTEM PRIVATE ${HDFS_INCLUDE_DIR})
|
||||
|
||||
# === parquet
|
||||
|
@ -72,11 +72,6 @@ else()
|
||||
|
||||
if(WITH_ZSTD)
|
||||
add_definitions(-DZSTD)
|
||||
include_directories(${ZSTD_INCLUDE_DIR})
|
||||
include_directories("${ZSTD_INCLUDE_DIR}/common")
|
||||
include_directories("${ZSTD_INCLUDE_DIR}/dictBuilder")
|
||||
include_directories("${ZSTD_INCLUDE_DIR}/deprecated")
|
||||
|
||||
list(APPEND THIRDPARTY_LIBS ch_contrib::zstd)
|
||||
endif()
|
||||
endif()
|
||||
|
@ -22,7 +22,7 @@ cmake .. \
|
||||
|
||||
1. ClickHouse's source CMake files (located in the root directory and in `/src`).
|
||||
2. Arch-dependent CMake files (located in `/cmake/*os_name*`).
|
||||
3. Libraries finders (search for contrib libraries, located in `/cmake/find`).
|
||||
3. Libraries finders (search for contrib libraries, located in `/contrib/*/CMakeLists.txt`).
|
||||
3. Contrib build CMake files (used instead of libraries' own CMake files, located in `/cmake/modules`)
|
||||
|
||||
## List of CMake flags
|
||||
|
@ -8,4 +8,4 @@ sudo apt-get update
|
||||
sudo apt-get install -y clickhouse-server clickhouse-client
|
||||
|
||||
sudo service clickhouse-server start
|
||||
clickhouse-client
|
||||
clickhouse-client # or "clickhouse-client --password" if you set up a password.
|
||||
|
@ -4,4 +4,4 @@ sudo yum-config-manager --add-repo https://repo.clickhouse.com/rpm/clickhouse.re
|
||||
sudo yum install clickhouse-server clickhouse-client
|
||||
|
||||
sudo /etc/init.d/clickhouse-server start
|
||||
clickhouse-client
|
||||
clickhouse-client # or "clickhouse-client --password" if you set up a password.
|
||||
|
@ -90,7 +90,10 @@ def concatenate(lang, docs_path, single_page_file, nav):
|
||||
line)
|
||||
|
||||
# If failed to replace the relative link, print to log
|
||||
if '../' in line:
|
||||
# But with some exceptions:
|
||||
# - "../src/" -- for cmake-in-clickhouse.md (link to sources)
|
||||
# - "../usr/share" -- changelog entry that has "../usr/share/zoneinfo"
|
||||
if '../' in line and (not '../usr/share' in line) and (not '../src/' in line):
|
||||
logging.info('Failed to resolve relative link:')
|
||||
logging.info(path)
|
||||
logging.info(line)
|
||||
|
@ -286,7 +286,7 @@ bool Client::executeMultiQuery(const String & all_queries_text)
|
||||
// , where the inline data is delimited by semicolon and not by a
|
||||
// newline.
|
||||
auto * insert_ast = parsed_query->as<ASTInsertQuery>();
|
||||
if (insert_ast && insert_ast->data)
|
||||
if (insert_ast && isSyncInsertWithData(*insert_ast, global_context))
|
||||
{
|
||||
this_query_end = insert_ast->end;
|
||||
adjustQueryEnd(this_query_end, all_queries_end, global_context->getSettingsRef().max_parser_depth);
|
||||
|
44
src/Access/CachedAccessChecking.cpp
Normal file
44
src/Access/CachedAccessChecking.cpp
Normal file
@ -0,0 +1,44 @@
|
||||
#include <Access/CachedAccessChecking.h>
|
||||
#include <Access/ContextAccess.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
CachedAccessChecking::CachedAccessChecking(const std::shared_ptr<const ContextAccess> & access_, AccessFlags access_flags_)
|
||||
: CachedAccessChecking(access_, AccessRightsElement{access_flags_})
|
||||
{
|
||||
}
|
||||
|
||||
CachedAccessChecking::CachedAccessChecking(const std::shared_ptr<const ContextAccess> & access_, const AccessRightsElement & element_)
|
||||
: access(access_), element(element_)
|
||||
{
|
||||
}
|
||||
|
||||
CachedAccessChecking::~CachedAccessChecking() = default;
|
||||
|
||||
bool CachedAccessChecking::checkAccess(bool throw_if_denied)
|
||||
{
|
||||
if (checked)
|
||||
return result;
|
||||
if (throw_if_denied)
|
||||
{
|
||||
try
|
||||
{
|
||||
access->checkAccess(element);
|
||||
result = true;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
result = false;
|
||||
throw;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = access->isGranted(element);
|
||||
}
|
||||
checked = true;
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
29
src/Access/CachedAccessChecking.h
Normal file
29
src/Access/CachedAccessChecking.h
Normal file
@ -0,0 +1,29 @@
|
||||
#pragma once
|
||||
|
||||
#include <Access/Common/AccessRightsElement.h>
|
||||
#include <memory>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
class ContextAccess;
|
||||
|
||||
/// Checks if the current user has a specified access type granted,
|
||||
/// and if it's checked another time later, it will just return the first result.
|
||||
class CachedAccessChecking
|
||||
{
|
||||
public:
|
||||
CachedAccessChecking(const std::shared_ptr<const ContextAccess> & access_, AccessFlags access_flags_);
|
||||
CachedAccessChecking(const std::shared_ptr<const ContextAccess> & access_, const AccessRightsElement & element_);
|
||||
~CachedAccessChecking();
|
||||
|
||||
bool checkAccess(bool throw_if_denied = true);
|
||||
|
||||
private:
|
||||
const std::shared_ptr<const ContextAccess> access;
|
||||
const AccessRightsElement element;
|
||||
bool checked = false;
|
||||
bool result = false;
|
||||
};
|
||||
|
||||
}
|
@ -475,11 +475,6 @@ if (TARGET ch_contrib::sqlite)
|
||||
dbms_target_link_libraries(PUBLIC ch_contrib::sqlite)
|
||||
endif()
|
||||
|
||||
if (USE_CASSANDRA)
|
||||
dbms_target_link_libraries(PUBLIC ${CASSANDRA_LIBRARY})
|
||||
dbms_target_include_directories (SYSTEM BEFORE PUBLIC ${CASS_INCLUDE_DIR})
|
||||
endif()
|
||||
|
||||
if (TARGET ch_contrib::msgpack)
|
||||
target_link_libraries (clickhouse_common_io PUBLIC ch_contrib::msgpack)
|
||||
endif()
|
||||
|
@ -573,6 +573,18 @@ void ClientBase::updateSuggest(const ASTCreateQuery & ast_create)
|
||||
suggest->addWords(std::move(new_words));
|
||||
}
|
||||
|
||||
bool ClientBase::isSyncInsertWithData(const ASTInsertQuery & insert_query, const ContextPtr & context)
|
||||
{
|
||||
if (!insert_query.data)
|
||||
return false;
|
||||
|
||||
auto settings = context->getSettings();
|
||||
if (insert_query.settings_ast)
|
||||
settings.applyChanges(insert_query.settings_ast->as<ASTSetQuery>()->changes);
|
||||
|
||||
return !settings.async_insert;
|
||||
}
|
||||
|
||||
void ClientBase::processTextAsSingleQuery(const String & full_query)
|
||||
{
|
||||
/// Some parts of a query (result output and formatting) are executed
|
||||
@ -597,10 +609,12 @@ void ClientBase::processTextAsSingleQuery(const String & full_query)
|
||||
updateSuggest(*create);
|
||||
}
|
||||
|
||||
// An INSERT query may have the data that follow query text. Remove the
|
||||
/// Send part of query without data, because data will be sent separately.
|
||||
auto * insert = parsed_query->as<ASTInsertQuery>();
|
||||
if (insert && insert->data)
|
||||
/// An INSERT query may have the data that follows query text.
|
||||
/// Send part of the query without data, because data will be sent separately.
|
||||
/// But for asynchronous inserts we don't extract data, because it's needed
|
||||
/// to be done on server side in that case (for coalescing the data from multiple inserts on server side).
|
||||
const auto * insert = parsed_query->as<ASTInsertQuery>();
|
||||
if (insert && isSyncInsertWithData(*insert, global_context))
|
||||
query_to_execute = full_query.substr(0, insert->data - full_query.data());
|
||||
else
|
||||
query_to_execute = full_query;
|
||||
@ -1303,8 +1317,10 @@ void ClientBase::processParsedSingleQuery(const String & full_query, const Strin
|
||||
if (insert && insert->select)
|
||||
insert->tryFindInputFunction(input_function);
|
||||
|
||||
bool is_async_insert = global_context->getSettings().async_insert && insert && insert->hasInlinedData();
|
||||
|
||||
/// INSERT query for which data transfer is needed (not an INSERT SELECT or input()) is processed separately.
|
||||
if (insert && (!insert->select || input_function) && !insert->watch)
|
||||
if (insert && (!insert->select || input_function) && !insert->watch && !is_async_insert)
|
||||
{
|
||||
if (input_function && insert->format.empty())
|
||||
throw Exception("FORMAT must be specified for function input()", ErrorCodes::INVALID_USAGE_OF_INPUT);
|
||||
@ -1434,17 +1450,17 @@ MultiQueryProcessingStage ClientBase::analyzeMultiQueryText(
|
||||
// row input formats (e.g. TSV) can't tell when the input stops,
|
||||
// unlike VALUES.
|
||||
auto * insert_ast = parsed_query->as<ASTInsertQuery>();
|
||||
const char * query_to_execute_end = this_query_end;
|
||||
|
||||
if (insert_ast && insert_ast->data)
|
||||
{
|
||||
this_query_end = find_first_symbols<'\n'>(insert_ast->data, all_queries_end);
|
||||
insert_ast->end = this_query_end;
|
||||
query_to_execute = all_queries_text.substr(this_query_begin - all_queries_text.data(), insert_ast->data - this_query_begin);
|
||||
}
|
||||
else
|
||||
{
|
||||
query_to_execute = all_queries_text.substr(this_query_begin - all_queries_text.data(), this_query_end - this_query_begin);
|
||||
query_to_execute_end = isSyncInsertWithData(*insert_ast, global_context) ? insert_ast->data : this_query_end;
|
||||
}
|
||||
|
||||
query_to_execute = all_queries_text.substr(this_query_begin - all_queries_text.data(), query_to_execute_end - this_query_begin);
|
||||
|
||||
// Try to include the trailing comment with test hints. It is just
|
||||
// a guess for now, because we don't yet know where the query ends
|
||||
// if it is an INSERT query with inline data. We will do it again
|
||||
|
@ -139,6 +139,8 @@ private:
|
||||
void updateSuggest(const ASTCreateQuery & ast_create);
|
||||
|
||||
protected:
|
||||
static bool isSyncInsertWithData(const ASTInsertQuery & insert_query, const ContextPtr & context);
|
||||
|
||||
bool is_interactive = false; /// Use either interactive line editing interface or batch mode.
|
||||
bool is_multiquery = false;
|
||||
bool delayed_interactive = false;
|
||||
|
@ -80,6 +80,7 @@
|
||||
M(SyncDrainedConnections, "Number of connections drained synchronously.") \
|
||||
M(ActiveSyncDrainedConnections, "Number of active connections drained synchronously.") \
|
||||
M(AsynchronousReadWait, "Number of threads waiting for asynchronous read.") \
|
||||
M(PendingAsyncInsert, "Number of asynchronous inserts that are waiting for flush.") \
|
||||
|
||||
namespace CurrentMetrics
|
||||
{
|
||||
|
@ -8,6 +8,7 @@
|
||||
M(Query, "Number of queries to be interpreted and potentially executed. Does not include queries that failed to parse or were rejected due to AST size limits, quota limits or limits on the number of simultaneously running queries. May include internal queries initiated by ClickHouse itself. Does not count subqueries.") \
|
||||
M(SelectQuery, "Same as Query, but only for SELECT queries.") \
|
||||
M(InsertQuery, "Same as Query, but only for INSERT queries.") \
|
||||
M(AsyncInsertQuery, "Same as InsertQuery, but only for asynchronous INSERT queries.") \
|
||||
M(FailedQuery, "Number of failed queries.") \
|
||||
M(FailedSelectQuery, "Same as FailedQuery, but only for SELECT queries.") \
|
||||
M(FailedInsertQuery, "Same as FailedQuery, but only for INSERT queries.") \
|
||||
|
@ -243,7 +243,7 @@ void ProgressIndication::writeProgress()
|
||||
|
||||
if (width_of_progress_bar > 0)
|
||||
{
|
||||
size_t bar_width = UnicodeBar::getWidth(current_count, 0, max_count, width_of_progress_bar);
|
||||
double bar_width = UnicodeBar::getWidth(current_count, 0, max_count, width_of_progress_bar);
|
||||
std::string bar = UnicodeBar::render(bar_width);
|
||||
|
||||
/// Render profiling_msg at left on top of the progress bar.
|
||||
|
@ -170,6 +170,7 @@ class IColumn;
|
||||
M(Bool, force_index_by_date, false, "Throw an exception if there is a partition key in a table, and it is not used.", 0) \
|
||||
M(Bool, force_primary_key, false, "Throw an exception if there is primary key in a table, and it is not used.", 0) \
|
||||
M(Bool, use_skip_indexes, true, "Use data skipping indexes during query execution.", 0) \
|
||||
M(Bool, use_skip_indexes_if_final, false, "If query has FINAL, then skipping data based on indexes may produce incorrect result, hence disabled by default.", 0) \
|
||||
M(String, force_data_skipping_indices, "", "Comma separated list of strings or literals with the name of the data skipping indices that should be used during query execution, otherwise an exception will be thrown.", 0) \
|
||||
\
|
||||
M(Float, max_streams_to_max_threads_ratio, 1, "Allows you to use more sources than the number of threads - to more evenly distribute work across threads. It is assumed that this is a temporary solution, since it will be possible in the future to make the number of sources equal to the number of threads, but for each source to dynamically select available work for itself.", 0) \
|
||||
|
@ -4,6 +4,8 @@
|
||||
#include <Parsers/Access/ASTShowGrantsQuery.h>
|
||||
#include <Parsers/formatAST.h>
|
||||
#include <Access/AccessControl.h>
|
||||
#include <Access/CachedAccessChecking.h>
|
||||
#include <Access/ContextAccess.h>
|
||||
#include <Access/Role.h>
|
||||
#include <Access/RolesOrUsersSet.h>
|
||||
#include <Access/User.h>
|
||||
@ -135,15 +137,25 @@ QueryPipeline InterpreterShowGrantsQuery::executeImpl()
|
||||
|
||||
std::vector<AccessEntityPtr> InterpreterShowGrantsQuery::getEntities() const
|
||||
{
|
||||
const auto & show_query = query_ptr->as<ASTShowGrantsQuery &>();
|
||||
const auto & access = getContext()->getAccess();
|
||||
const auto & access_control = getContext()->getAccessControl();
|
||||
|
||||
const auto & show_query = query_ptr->as<ASTShowGrantsQuery &>();
|
||||
auto ids = RolesOrUsersSet{*show_query.for_roles, access_control, getContext()->getUserID()}.getMatchingIDs(access_control);
|
||||
|
||||
CachedAccessChecking show_users(access, AccessType::SHOW_USERS);
|
||||
CachedAccessChecking show_roles(access, AccessType::SHOW_ROLES);
|
||||
bool throw_if_access_denied = !show_query.for_roles->all;
|
||||
|
||||
std::vector<AccessEntityPtr> entities;
|
||||
for (const auto & id : ids)
|
||||
{
|
||||
auto entity = access_control.tryRead(id);
|
||||
if (entity)
|
||||
if (!entity)
|
||||
continue;
|
||||
if ((id == access->getUserID() /* Any user can see his own grants */)
|
||||
|| (entity->isTypeOf<User>() && show_users.checkAccess(throw_if_access_denied))
|
||||
|| (entity->isTypeOf<Role>() && show_roles.checkAccess(throw_if_access_denied)))
|
||||
entities.push_back(entity);
|
||||
}
|
||||
|
||||
|
@ -24,6 +24,16 @@
|
||||
#include <base/logger_useful.h>
|
||||
|
||||
|
||||
namespace CurrentMetrics
|
||||
{
|
||||
extern const Metric PendingAsyncInsert;
|
||||
}
|
||||
|
||||
namespace ProfileEvents
|
||||
{
|
||||
extern const Event AsyncInsertQuery;
|
||||
}
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
@ -223,6 +233,9 @@ void AsynchronousInsertQueue::pushImpl(InsertData::EntryPtr entry, QueueIterator
|
||||
|
||||
if (data->size > max_data_size)
|
||||
scheduleDataProcessingJob(it->first, std::move(data), getContext());
|
||||
|
||||
CurrentMetrics::add(CurrentMetrics::PendingAsyncInsert);
|
||||
ProfileEvents::increment(ProfileEvents::AsyncInsertQuery);
|
||||
}
|
||||
|
||||
void AsynchronousInsertQueue::waitForProcessingQuery(const String & query_id, const Milliseconds & timeout)
|
||||
@ -437,6 +450,8 @@ try
|
||||
for (const auto & entry : data->entries)
|
||||
if (!entry->isFinished())
|
||||
entry->finish();
|
||||
|
||||
CurrentMetrics::sub(CurrentMetrics::PendingAsyncInsert, data->entries.size());
|
||||
}
|
||||
catch (const Exception & e)
|
||||
{
|
||||
|
@ -912,6 +912,11 @@ MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
|
||||
parts_before_pk = parts.size();
|
||||
|
||||
auto reader_settings = getMergeTreeReaderSettings(context);
|
||||
|
||||
bool use_skip_indexes = context->getSettings().use_skip_indexes;
|
||||
if (select.final() && !context->getSettings().use_skip_indexes_if_final)
|
||||
use_skip_indexes = false;
|
||||
|
||||
result.parts_with_ranges = MergeTreeDataSelectExecutor::filterPartsByPrimaryKeyAndSkipIndexes(
|
||||
std::move(parts),
|
||||
metadata_snapshot,
|
||||
@ -922,7 +927,7 @@ MergeTreeDataSelectAnalysisResultPtr ReadFromMergeTree::selectRangesToRead(
|
||||
log,
|
||||
num_streams,
|
||||
result.index_stats,
|
||||
context->getSettings().use_skip_indexes);
|
||||
use_skip_indexes);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -1392,6 +1392,12 @@ void TCPHandler::receiveQuery()
|
||||
if (is_interserver_mode)
|
||||
{
|
||||
ClientInfo original_session_client_info = session->getClientInfo();
|
||||
|
||||
/// Cleanup fields that should not be reused from previous query.
|
||||
original_session_client_info.current_user.clear();
|
||||
original_session_client_info.current_query_id.clear();
|
||||
original_session_client_info.current_address = {};
|
||||
|
||||
session = std::make_unique<Session>(server.context(), ClientInfo::Interface::TCP_INTERSERVER);
|
||||
session->getClientInfo() = original_session_client_info;
|
||||
}
|
||||
|
@ -1199,15 +1199,31 @@ bool ReplicatedMergeTreeQueue::shouldExecuteLogEntry(
|
||||
return false;
|
||||
}
|
||||
|
||||
if (merge_strategy_picker.shouldMergeOnSingleReplica(entry))
|
||||
bool should_execute_on_single_replica = merge_strategy_picker.shouldMergeOnSingleReplica(entry);
|
||||
if (!should_execute_on_single_replica)
|
||||
{
|
||||
/// Separate check. If we use only s3, check remote_fs_execute_merges_on_single_replica_time_threshold as well.
|
||||
auto disks = storage.getDisks();
|
||||
bool only_s3_storage = true;
|
||||
for (const auto & disk : disks)
|
||||
if (disk->getType() != DB::DiskType::S3)
|
||||
only_s3_storage = false;
|
||||
|
||||
if (!disks.empty() && only_s3_storage)
|
||||
should_execute_on_single_replica = merge_strategy_picker.shouldMergeOnSingleReplicaShared(entry);
|
||||
}
|
||||
|
||||
if (should_execute_on_single_replica)
|
||||
{
|
||||
|
||||
auto replica_to_execute_merge = merge_strategy_picker.pickReplicaToExecuteMerge(entry);
|
||||
|
||||
if (replica_to_execute_merge && !merge_strategy_picker.isMergeFinishedByReplica(replica_to_execute_merge.value(), entry))
|
||||
{
|
||||
String reason = "Not executing merge for the part " + entry.new_part_name
|
||||
+ ", waiting for " + replica_to_execute_merge.value() + " to execute merge.";
|
||||
out_postpone_reason = reason;
|
||||
out_postpone_reason = fmt::format(
|
||||
"Not executing merge for the part {}, waiting for {} to execute merge.",
|
||||
entry.new_part_name, replica_to_execute_merge.value());
|
||||
LOG_DEBUG(log, fmt::runtime(out_postpone_reason));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -87,6 +87,17 @@ def get_query_user_info(node, query_pattern):
|
||||
type = 'QueryFinish'
|
||||
""".format(query_pattern)).strip().split('\t')
|
||||
|
||||
# @return -- [user, initial_user]
|
||||
def get_query_user_info_by_id(node, query_id):
|
||||
node.query("SYSTEM FLUSH LOGS")
|
||||
return node.query("""
|
||||
SELECT user, initial_user
|
||||
FROM system.query_log
|
||||
WHERE
|
||||
query_id = '{}' AND
|
||||
type = 'QueryFinish'
|
||||
""".format(query_id)).strip().split('\t')
|
||||
|
||||
# @return -- settings
|
||||
def get_query_setting_on_shard(node, query_pattern, setting):
|
||||
node.query("SYSTEM FLUSH LOGS")
|
||||
@ -183,6 +194,7 @@ def test_secure_insert_buffer_async():
|
||||
# previous connection that was instantiated with "ro" user (using
|
||||
# interserver secret)
|
||||
assert not n1.contains_in_log('{' + query_id + '} <Trace> Connection (n2:9000): Connecting.')
|
||||
assert get_query_user_info_by_id(n1, query_id) == ['default', 'default']
|
||||
|
||||
# And before the bug was fixed this query will fail with the following error:
|
||||
#
|
||||
@ -191,6 +203,18 @@ def test_secure_insert_buffer_async():
|
||||
n1.query('OPTIMIZE TABLE dist_secure_buffer')
|
||||
n1.query('SYSTEM FLUSH DISTRIBUTED ON CLUSTER secure dist_secure_from_buffer')
|
||||
|
||||
# Check user from which the INSERT on the remote node will be executed
|
||||
#
|
||||
# Incorrect example:
|
||||
#
|
||||
# {2c55669f-71ad-48fe-98fa-7b475b80718e} <Debug> executeQuery: (from 172.16.1.1:44636, user: ro) INSERT INTO default.data_from_buffer (key) VALUES
|
||||
#
|
||||
# Correct example:
|
||||
#
|
||||
# {2c55669f-71ad-48fe-98fa-7b475b80718e} <Debug> executeQuery: (from 0.0.0.0:0, user: ) INSERT INTO default.data_from_buffer (key) VALUES
|
||||
#
|
||||
assert n2.contains_in_log('executeQuery: (from 0.0.0.0:0, user: ) INSERT INTO default.data_from_buffer (key) VALUES')
|
||||
|
||||
assert int(n1.query('SELECT count() FROM dist_secure_from_buffer')) == 2
|
||||
n1.query('TRUNCATE TABLE data_from_buffer ON CLUSTER secure')
|
||||
|
||||
|
@ -250,6 +250,15 @@ def test_introspection():
|
||||
assert instance.query("SHOW GRANTS", user='A') == TSV(["GRANT SELECT ON test.table TO A"])
|
||||
assert instance.query("SHOW GRANTS", user='B') == TSV(["GRANT CREATE ON *.* TO B WITH GRANT OPTION"])
|
||||
|
||||
assert instance.query("SHOW GRANTS FOR ALL", user='A') == TSV(["GRANT SELECT ON test.table TO A"])
|
||||
assert instance.query("SHOW GRANTS FOR ALL", user='B') == TSV(["GRANT CREATE ON *.* TO B WITH GRANT OPTION"])
|
||||
assert instance.query("SHOW GRANTS FOR ALL") == TSV(["GRANT SELECT ON test.table TO A",
|
||||
"GRANT CREATE ON *.* TO B WITH GRANT OPTION",
|
||||
"GRANT ALL ON *.* TO default WITH GRANT OPTION"])
|
||||
|
||||
expected_error = "necessary to have grant SHOW USERS"
|
||||
assert expected_error in instance.query_and_get_error("SHOW GRANTS FOR B", user='A')
|
||||
|
||||
expected_access1 = "CREATE USER A\n" \
|
||||
"CREATE USER B\n" \
|
||||
"CREATE USER default IDENTIFIED WITH plaintext_password SETTINGS PROFILE default"
|
||||
|
@ -0,0 +1,5 @@
|
||||
1 aaa
|
||||
2 bbb
|
||||
3 ccc
|
||||
4 ddd
|
||||
4 4
|
@ -0,0 +1,27 @@
|
||||
DROP TABLE IF EXISTS t_async_insert_02193_1;
|
||||
|
||||
CREATE TABLE t_async_insert_02193_1 (id UInt32, s String) ENGINE = Memory;
|
||||
|
||||
INSERT INTO t_async_insert_02193_1 FORMAT CSV SETTINGS async_insert = 1
|
||||
1,aaa
|
||||
;
|
||||
|
||||
INSERT INTO t_async_insert_02193_1 FORMAT Values SETTINGS async_insert = 1 (2, 'bbb');
|
||||
|
||||
SET async_insert = 1;
|
||||
|
||||
INSERT INTO t_async_insert_02193_1 VALUES (3, 'ccc');
|
||||
INSERT INTO t_async_insert_02193_1 FORMAT JSONEachRow {"id": 4, "s": "ddd"};
|
||||
|
||||
SELECT * FROM t_async_insert_02193_1 ORDER BY id;
|
||||
|
||||
SYSTEM FLUSH LOGS;
|
||||
|
||||
SELECT count(), sum(ProfileEvents['AsyncInsertQuery']) FROM system.query_log
|
||||
WHERE
|
||||
event_date >= yesterday() AND
|
||||
type = 'QueryFinish' AND
|
||||
current_database = currentDatabase() AND
|
||||
query ILIKE 'INSERT INTO t_async_insert_02193_1%';
|
||||
|
||||
DROP TABLE IF EXISTS t_async_insert_02193_1;
|
@ -0,0 +1,4 @@
|
||||
1 aaa
|
||||
2 bbb
|
||||
3 ccc
|
||||
4 ddd
|
21
tests/queries/0_stateless/02193_async_insert_tcp_client_2.sh
Executable file
21
tests/queries/0_stateless/02193_async_insert_tcp_client_2.sh
Executable file
@ -0,0 +1,21 @@
|
||||
#!/usr/bin/env bash
|
||||
# Tags: long
|
||||
|
||||
CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CUR_DIR"/../shell_config.sh
|
||||
|
||||
${CLICKHOUSE_CLIENT} -q "DROP TABLE IF EXISTS t_async_insert_02193_2"
|
||||
|
||||
${CLICKHOUSE_CLIENT} -q "CREATE TABLE t_async_insert_02193_2 (id UInt32, s String) ENGINE = Memory"
|
||||
|
||||
${CLICKHOUSE_CLIENT} -q "INSERT INTO t_async_insert_02193_2 FORMAT CSV SETTINGS async_insert = 1 1,aaa"
|
||||
${CLICKHOUSE_CLIENT} -q "INSERT INTO t_async_insert_02193_2 FORMAT Values SETTINGS async_insert = 1 (2, 'bbb')"
|
||||
|
||||
${CLICKHOUSE_CLIENT} -q "INSERT INTO t_async_insert_02193_2 VALUES (3, 'ccc')"
|
||||
${CLICKHOUSE_CLIENT} -q 'INSERT INTO t_async_insert_02193_2 FORMAT JSONEachRow {"id": 4, "s": "ddd"}'
|
||||
|
||||
${CLICKHOUSE_CLIENT} -q "SELECT * FROM t_async_insert_02193_2 ORDER BY id"
|
||||
${CLICKHOUSE_CLIENT} -q "TRUNCATE TABLE t_async_insert_02193_2"
|
||||
|
||||
${CLICKHOUSE_CLIENT} -q "DROP TABLE IF EXISTS t_async_insert_02193_2"
|
@ -0,0 +1,4 @@
|
||||
-- { echoOn }
|
||||
SELECT * FROM data_02200 WHERE value = 1 SETTINGS use_skip_indexes=1, max_rows_to_read=1;
|
||||
1 1
|
||||
SELECT * FROM data_02200 WHERE value = 1 SETTINGS use_skip_indexes=0, max_rows_to_read=1; -- { serverError TOO_MANY_ROWS }
|
14
tests/queries/0_stateless/02200_use_skip_indexes.sql
Normal file
14
tests/queries/0_stateless/02200_use_skip_indexes.sql
Normal file
@ -0,0 +1,14 @@
|
||||
CREATE TABLE data_02200 (
|
||||
key Int,
|
||||
value Int,
|
||||
INDEX idx value TYPE minmax GRANULARITY 1
|
||||
)
|
||||
Engine=MergeTree()
|
||||
ORDER BY key
|
||||
PARTITION BY key;
|
||||
|
||||
INSERT INTO data_02200 SELECT number, number FROM numbers(10);
|
||||
|
||||
-- { echoOn }
|
||||
SELECT * FROM data_02200 WHERE value = 1 SETTINGS use_skip_indexes=1, max_rows_to_read=1;
|
||||
SELECT * FROM data_02200 WHERE value = 1 SETTINGS use_skip_indexes=0, max_rows_to_read=1; -- { serverError TOO_MANY_ROWS }
|
@ -0,0 +1,6 @@
|
||||
-- { echoOn }
|
||||
SELECT * FROM data_02201 FINAL WHERE value = 1 SETTINGS use_skip_indexes=0, use_skip_indexes_if_final=0, max_rows_to_read=1; -- { serverError TOO_MANY_ROWS }
|
||||
SELECT * FROM data_02201 FINAL WHERE value = 1 SETTINGS use_skip_indexes=1, use_skip_indexes_if_final=0, max_rows_to_read=1; -- { serverError TOO_MANY_ROWS }
|
||||
SELECT * FROM data_02201 FINAL WHERE value = 1 SETTINGS use_skip_indexes=0, use_skip_indexes_if_final=1, max_rows_to_read=1; -- { serverError TOO_MANY_ROWS }
|
||||
SELECT * FROM data_02201 FINAL WHERE value = 1 SETTINGS use_skip_indexes=1, use_skip_indexes_if_final=1, max_rows_to_read=1;
|
||||
1 1
|
@ -0,0 +1,16 @@
|
||||
CREATE TABLE data_02201 (
|
||||
key Int,
|
||||
value Int,
|
||||
INDEX idx value TYPE minmax GRANULARITY 1
|
||||
)
|
||||
Engine=AggregatingMergeTree()
|
||||
ORDER BY key
|
||||
PARTITION BY key;
|
||||
|
||||
INSERT INTO data_02201 SELECT number, number FROM numbers(10);
|
||||
|
||||
-- { echoOn }
|
||||
SELECT * FROM data_02201 FINAL WHERE value = 1 SETTINGS use_skip_indexes=0, use_skip_indexes_if_final=0, max_rows_to_read=1; -- { serverError TOO_MANY_ROWS }
|
||||
SELECT * FROM data_02201 FINAL WHERE value = 1 SETTINGS use_skip_indexes=1, use_skip_indexes_if_final=0, max_rows_to_read=1; -- { serverError TOO_MANY_ROWS }
|
||||
SELECT * FROM data_02201 FINAL WHERE value = 1 SETTINGS use_skip_indexes=0, use_skip_indexes_if_final=1, max_rows_to_read=1; -- { serverError TOO_MANY_ROWS }
|
||||
SELECT * FROM data_02201 FINAL WHERE value = 1 SETTINGS use_skip_indexes=1, use_skip_indexes_if_final=1, max_rows_to_read=1;
|
@ -0,0 +1,6 @@
|
||||
-- { echoOn }
|
||||
SELECT * FROM data_02201 FINAL WHERE value_max = 1 ORDER BY key, value_max SETTINGS use_skip_indexes=1, use_skip_indexes_if_final=0;
|
||||
0 1
|
||||
SELECT * FROM data_02201 FINAL WHERE value_max = 1 ORDER BY key, value_max SETTINGS use_skip_indexes=1, use_skip_indexes_if_final=1;
|
||||
0 1
|
||||
1 1
|
@ -0,0 +1,19 @@
|
||||
-- This tests will show the difference in data with use_skip_indexes_if_final and w/o
|
||||
|
||||
CREATE TABLE data_02201 (
|
||||
key Int,
|
||||
value_max SimpleAggregateFunction(max, Int),
|
||||
INDEX idx value_max TYPE minmax GRANULARITY 1
|
||||
)
|
||||
Engine=AggregatingMergeTree()
|
||||
ORDER BY key
|
||||
PARTITION BY key;
|
||||
|
||||
SYSTEM STOP MERGES data_02201;
|
||||
|
||||
INSERT INTO data_02201 SELECT number, number FROM numbers(10);
|
||||
INSERT INTO data_02201 SELECT number, number+1 FROM numbers(10);
|
||||
|
||||
-- { echoOn }
|
||||
SELECT * FROM data_02201 FINAL WHERE value_max = 1 ORDER BY key, value_max SETTINGS use_skip_indexes=1, use_skip_indexes_if_final=0;
|
||||
SELECT * FROM data_02201 FINAL WHERE value_max = 1 ORDER BY key, value_max SETTINGS use_skip_indexes=1, use_skip_indexes_if_final=1;
|
3
tests/queries/0_stateless/02203_shebang
Executable file
3
tests/queries/0_stateless/02203_shebang
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/clickhouse-local --queries-file
|
||||
|
||||
SELECT 1;
|
1
tests/queries/0_stateless/02203_shebang.reference
Normal file
1
tests/queries/0_stateless/02203_shebang.reference
Normal file
@ -0,0 +1 @@
|
||||
1
|
8
tests/queries/0_stateless/02203_shebang.sh
Executable file
8
tests/queries/0_stateless/02203_shebang.sh
Executable file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
# shellcheck source=../shell_config.sh
|
||||
. "$CUR_DIR"/../shell_config.sh
|
||||
|
||||
sed -i.bak "s!/usr/bin/clickhouse-local!$(command -v ${CLICKHOUSE_LOCAL})!" "${CUR_DIR}/02203_shebang"
|
||||
"${CUR_DIR}/02203_shebang"
|
20
tests/queries/0_stateless/02204_fractional_progress_bar.sh
Executable file
20
tests/queries/0_stateless/02204_fractional_progress_bar.sh
Executable file
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/expect -f
|
||||
# Tags: no-fasttest
|
||||
|
||||
log_user 0
|
||||
set timeout 60
|
||||
match_max 100000
|
||||
|
||||
spawn clickhouse-local --progress --query "SELECT sum(number % 100000000 = 12345678 ? sleep(0.1) : 1) FROM numbers(1000000000)"
|
||||
|
||||
expect {
|
||||
"▏" { exit 0 }
|
||||
"▎" { exit 0 }
|
||||
"▍" { exit 0 }
|
||||
"▌" { exit 0 }
|
||||
"▋" { exit 0 }
|
||||
"▋" { exit 0 }
|
||||
"▊" { exit 0 }
|
||||
"▉" { exit 0 }
|
||||
timeout { exit 1 }
|
||||
}
|
@ -1,3 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
git tag --list | grep -P 'v.+-(stable|lts)' | sort -V | xargs git show --format='%ai' | awk '/^v/ { version = $1 } /^[0-9]+/ { if (version) { date = $1 } } { if (version && date) { print version "\t" date; version = ""; date = ""; } }' | tac
|
||||
# refname:strip=2: default tag name when format is not set
|
||||
# creatordate is always defined for all tags
|
||||
git tag --list 'v*-lts' 'v*-stable' --format='%(refname:short) %(creatordate:short)' | sort -rV
|
||||
|
@ -1,56 +1,87 @@
|
||||
v21.9.4.35-stable 2021-09-22
|
||||
v21.9.3.30-stable 2021-09-16
|
||||
v22.1.3.7-stable 2022-01-23
|
||||
v22.1.2.2-stable 2022-01-19
|
||||
v21.12.4.1-stable 2022-01-23
|
||||
v21.12.3.32-stable 2021-12-27
|
||||
v21.12.2.17-stable 2021-12-16
|
||||
v21.11.11.1-stable 2022-01-23
|
||||
v21.11.10.1-stable 2022-01-12
|
||||
v21.11.9.1-stable 2021-12-27
|
||||
v21.11.8.4-stable 2021-12-22
|
||||
v21.11.7.9-stable 2021-12-15
|
||||
v21.11.6.7-stable 2021-12-10
|
||||
v21.11.5.33-stable 2021-12-02
|
||||
v21.11.4.14-stable 2021-11-17
|
||||
v21.11.3.6-stable 2021-11-11
|
||||
v21.11.2.2-stable 2021-11-09
|
||||
v21.10.6.2-stable 2022-01-24
|
||||
v21.10.5.3-stable 2021-12-10
|
||||
v21.10.4.26-stable 2021-12-02
|
||||
v21.10.3.9-stable 2021-11-17
|
||||
v21.10.2.15-stable 2021-10-18
|
||||
v21.9.6.24-stable 2021-12-02
|
||||
v21.9.5.16-stable 2021-10-19
|
||||
v21.9.4.35-stable 2021-09-24
|
||||
v21.9.3.30-stable 2021-09-17
|
||||
v21.9.2.17-stable 2021-09-09
|
||||
v21.8.8.29-lts 2021-09-28
|
||||
v21.8.7.22-lts 2021-09-22
|
||||
v21.8.6.15-lts 2021-09-16
|
||||
v21.8.14.5-lts 2022-01-26
|
||||
v21.8.13.6-lts 2021-12-27
|
||||
v21.8.12.29-lts 2021-12-02
|
||||
v21.8.11.4-lts 2021-11-17
|
||||
v21.8.10.19-lts 2021-10-21
|
||||
v21.8.9.13-lts 2021-10-19
|
||||
v21.8.8.29-lts 2021-09-29
|
||||
v21.8.7.22-lts 2021-09-24
|
||||
v21.8.6.15-lts 2021-09-17
|
||||
v21.8.5.7-lts 2021-09-02
|
||||
v21.8.4.51-lts 2021-08-17
|
||||
v21.8.4.51-lts 2021-08-18
|
||||
v21.8.3.44-lts 2021-08-12
|
||||
v21.7.11.3-stable 2021-09-23
|
||||
v21.7.10.4-stable 2021-09-16
|
||||
v21.7.11.3-stable 2021-09-24
|
||||
v21.7.10.4-stable 2021-09-18
|
||||
v21.7.9.7-stable 2021-09-02
|
||||
v21.7.8.58-stable 2021-08-17
|
||||
v21.7.7.47-stable 2021-08-09
|
||||
v21.7.8.58-stable 2021-08-18
|
||||
v21.7.7.47-stable 2021-08-10
|
||||
v21.7.6.39-stable 2021-08-06
|
||||
v21.7.5.29-stable 2021-07-28
|
||||
v21.7.4.18-stable 2021-07-17
|
||||
v21.7.3.14-stable 2021-07-13
|
||||
v21.7.5.29-stable 2021-07-29
|
||||
v21.7.4.18-stable 2021-07-19
|
||||
v21.7.3.14-stable 2021-07-14
|
||||
v21.7.2.7-stable 2021-07-09
|
||||
v21.6.9.7-stable 2021-09-02
|
||||
v21.6.8.62-stable 2021-07-13
|
||||
v21.6.7.57-stable 2021-07-09
|
||||
v21.6.6.51-stable 2021-07-02
|
||||
v21.6.9.7-stable 2021-09-03
|
||||
v21.6.8.62-stable 2021-07-16
|
||||
v21.6.7.57-stable 2021-07-10
|
||||
v21.6.6.51-stable 2021-07-04
|
||||
v21.6.5.37-stable 2021-06-19
|
||||
v21.6.4.26-stable 2021-06-11
|
||||
v21.6.3.14-stable 2021-06-04
|
||||
v21.6.3.14-stable 2021-06-05
|
||||
v21.5.9.4-stable 2021-07-10
|
||||
v21.5.8.21-stable 2021-07-02
|
||||
v21.5.7.9-stable 2021-06-22
|
||||
v21.5.6.6-stable 2021-05-29
|
||||
v21.5.8.21-stable 2021-07-04
|
||||
v21.5.7.9-stable 2021-06-23
|
||||
v21.5.6.6-stable 2021-05-30
|
||||
v21.5.5.12-stable 2021-05-20
|
||||
v21.4.7.3-stable 2021-05-19
|
||||
v21.4.6.55-stable 2021-04-30
|
||||
v21.4.7.3-stable 2021-05-20
|
||||
v21.4.6.55-stable 2021-05-01
|
||||
v21.4.5.46-stable 2021-04-24
|
||||
v21.4.4.30-stable 2021-04-16
|
||||
v21.4.3.21-stable 2021-04-12
|
||||
v21.3.17.2-lts 2021-09-16
|
||||
v21.3.16.5-lts 2021-09-03
|
||||
v21.3.20.1-lts 2022-01-26
|
||||
v21.3.19.1-lts 2021-12-10
|
||||
v21.3.18.4-lts 2021-10-21
|
||||
v21.3.17.2-lts 2021-09-17
|
||||
v21.3.16.5-lts 2021-09-04
|
||||
v21.3.15.4-stable 2021-07-10
|
||||
v21.3.14.1-lts 2021-07-01
|
||||
v21.3.13.9-lts 2021-06-22
|
||||
v21.3.12.2-lts 2021-05-25
|
||||
v21.3.11.5-lts 2021-05-14
|
||||
v21.3.10.1-lts 2021-05-09
|
||||
v21.3.9.83-lts 2021-04-28
|
||||
v21.3.14.1-lts 2021-07-04
|
||||
v21.3.13.9-lts 2021-06-23
|
||||
v21.3.12.2-lts 2021-05-26
|
||||
v21.3.11.5-lts 2021-05-16
|
||||
v21.3.10.1-lts 2021-05-10
|
||||
v21.3.9.83-lts 2021-05-01
|
||||
v21.3.8.76-lts 2021-04-24
|
||||
v21.3.7.62-stable 2021-04-16
|
||||
v21.3.7.62-stable 2021-04-17
|
||||
v21.3.6.55-lts 2021-04-12
|
||||
v21.3.5.42-lts 2021-04-07
|
||||
v21.3.4.25-lts 2021-03-28
|
||||
v21.3.3.14-lts 2021-03-19
|
||||
v21.3.2.5-lts 2021-03-12
|
||||
v21.2.10.48-stable 2021-04-16
|
||||
v21.2.10.48-stable 2021-04-17
|
||||
v21.2.9.41-stable 2021-04-12
|
||||
v21.2.8.31-stable 2021-04-07
|
||||
v21.2.7.11-stable 2021-03-28
|
||||
@ -93,8 +124,8 @@ v20.9.5.5-stable 2020-11-13
|
||||
v20.9.4.76-stable 2020-10-29
|
||||
v20.9.3.45-stable 2020-10-09
|
||||
v20.9.2.20-stable 2020-09-22
|
||||
v20.8.19.4-stable 2021-07-10
|
||||
v20.8.18.32-lts 2021-04-16
|
||||
v20.8.19.4-stable 2021-07-11
|
||||
v20.8.18.32-lts 2021-04-17
|
||||
v20.8.17.25-lts 2021-04-08
|
||||
v20.8.16.20-lts 2021-04-06
|
||||
v20.8.15.11-lts 2021-04-01
|
||||
@ -239,97 +270,104 @@ v19.9.2.4-stable 2019-06-24
|
||||
v19.8.3.8-stable 2019-06-11
|
||||
v19.7.5.29-stable 2019-07-05
|
||||
v19.7.5.27-stable 2019-06-09
|
||||
v19.7.3.9-stable 2019-05-05
|
||||
v19.7.3.9-stable 2019-05-27
|
||||
v19.6.3.18-stable 2019-06-15
|
||||
v19.6.2.11-stable 2019-04-30
|
||||
v19.5.4.22-stable 2019-04-30
|
||||
v19.5.3.8-stable 2019-04-17
|
||||
v19.6.2.11-stable 2019-05-14
|
||||
v19.5.4.22-stable 2019-05-13
|
||||
v19.5.3.8-stable 2019-04-18
|
||||
v19.5.2.6-stable 2019-04-15
|
||||
v19.4.5.35-stable 2019-05-05
|
||||
v19.4.4.33-stable 2019-04-16
|
||||
v19.4.3.11-stable 2019-04-01
|
||||
v19.4.2.7-stable 2019-03-29
|
||||
v19.4.5.35-stable 2019-05-13
|
||||
v19.4.4.33-stable 2019-04-17
|
||||
v19.4.3.11-stable 2019-04-02
|
||||
v19.4.2.7-stable 2019-03-30
|
||||
v19.4.1.3-stable 2019-03-19
|
||||
v19.4.0.49-stable 2019-03-09
|
||||
v19.3.9.12-stable 2019-04-01
|
||||
v19.3.8.6-stable 2019-03-04
|
||||
v19.3.7-stable 2019-03-11
|
||||
v19.3.9.12-stable 2019-04-02
|
||||
v19.3.8.6-stable 2019-03-19
|
||||
v19.3.7-stable 2019-03-12
|
||||
v19.3.6-stable 2019-03-02
|
||||
v19.3.5-stable 2019-02-20
|
||||
v19.3.4-stable 2019-02-15
|
||||
v19.3.5-stable 2019-02-21
|
||||
v19.3.4-stable 2019-02-16
|
||||
v19.3.3-stable 2019-02-13
|
||||
v19.1.16.79-stable 2019-03-22
|
||||
v19.1.15.73-stable 2019-03-04
|
||||
v19.1.16.79-stable 2019-04-02
|
||||
v19.1.15.73-stable 2019-03-19
|
||||
v19.1.14-stable 2019-03-14
|
||||
v19.1.13-stable 2019-03-12
|
||||
v19.1.10-stable 2019-03-03
|
||||
v19.1.9-stable 2019-02-20
|
||||
v19.1.8-stable 2019-02-15
|
||||
v19.1.7-stable 2019-02-13
|
||||
v19.1.9-stable 2019-02-21
|
||||
v19.1.8-stable 2019-02-16
|
||||
v19.1.7-stable 2019-02-15
|
||||
v19.1.6-stable 2019-01-24
|
||||
v19.1.5-stable 2019-01-22
|
||||
v18.16.1-stable 2018-12-20
|
||||
v18.16.0-stable 2018-12-14
|
||||
v19.1.5-stable 2019-01-23
|
||||
v18.16.1-stable 2018-12-21
|
||||
v18.16.0-stable 2018-12-15
|
||||
v18.14.19-stable 2018-12-19
|
||||
v18.14.18-stable 2018-12-04
|
||||
v18.14.17-stable 2018-11-29
|
||||
v18.14.17-stable 2018-11-30
|
||||
v18.14.15-stable 2018-11-21
|
||||
v18.14.14-stable 2018-11-20
|
||||
v18.14.13-stable 2018-11-07
|
||||
v18.14.12-stable 2018-11-01
|
||||
v18.14.11-stable 2018-10-26
|
||||
v18.14.10-stable 2018-10-23
|
||||
v18.14.14-stable 2018-11-21
|
||||
v18.14.13-stable 2018-11-08
|
||||
v18.14.12-stable 2018-11-02
|
||||
v18.14.11-stable 2018-10-29
|
||||
v18.14.10-stable 2018-10-24
|
||||
v18.14.9-stable 2018-10-16
|
||||
v18.14.8-stable 2018-10-13
|
||||
v18.12.17-stable 2018-09-16
|
||||
v18.12.14-stable 2018-09-13
|
||||
v18.12.13-stable 2018-09-10
|
||||
v1.1.54390-stable 2018-07-06
|
||||
v1.1.54388-stable 2018-06-27
|
||||
v18.12.13-stable 2018-09-11
|
||||
v18.10.3-stable 2018-08-13
|
||||
v18.6.0-stable 2018-08-01
|
||||
v18.5.1-stable 2018-07-31
|
||||
v18.4.0-stable 2018-07-28
|
||||
v18.1.0-stable 2018-07-20
|
||||
v1.1.54394-stable 2018-07-12
|
||||
v1.1.54390-stable 2018-07-09
|
||||
v1.1.54388-stable 2018-06-28
|
||||
v1.1.54385-stable 2018-06-01
|
||||
v1.1.54383-stable 2018-05-18
|
||||
v1.1.54381-stable 2018-04-26
|
||||
v1.1.54380-stable 2018-04-20
|
||||
v1.1.54378-stable 2018-04-13
|
||||
v1.1.54383-stable 2018-05-22
|
||||
v1.1.54381-stable 2018-05-14
|
||||
v1.1.54380-stable 2018-04-21
|
||||
v1.1.54378-stable 2018-04-16
|
||||
v1.1.54370-stable 2018-03-16
|
||||
v1.1.54362-stable 2018-03-10
|
||||
v1.1.54362-stable 2018-03-11
|
||||
v1.1.54358-stable 2018-03-08
|
||||
v1.1.54343-stable 2018-01-24
|
||||
v1.1.54343-stable 2018-02-08
|
||||
v1.1.54342-stable 2018-01-22
|
||||
v1.1.54337-stable 2018-01-17
|
||||
v1.1.54336-stable 2018-01-16
|
||||
v1.1.54335-stable 2018-01-16
|
||||
v1.1.54327-stable 2017-12-20
|
||||
v1.1.54318-stable 2017-11-30
|
||||
v1.1.54337-stable 2018-01-18
|
||||
v1.1.54336-stable 2018-01-17
|
||||
v1.1.54335-stable 2018-01-17
|
||||
v1.1.54327-stable 2017-12-21
|
||||
v1.1.54318-stable 2017-12-01
|
||||
v1.1.54310-stable 2017-11-01
|
||||
v1.1.54304-stable 2017-10-19
|
||||
v1.1.54292-stable 2017-09-20
|
||||
v1.1.54289-stable 2017-09-13
|
||||
v1.1.54284-stable 2017-08-29
|
||||
v1.1.54304-stable 2017-10-24
|
||||
v1.1.54292-stable 2017-09-27
|
||||
v1.1.54289-stable 2017-09-14
|
||||
v1.1.54284-stable 2017-08-30
|
||||
v1.1.54282-stable 2017-08-23
|
||||
v1.1.54276-stable 2017-08-16
|
||||
v1.1.54245-stable 2017-07-04
|
||||
v1.1.54242-stable 2017-06-26
|
||||
v1.1.54236-stable 2017-05-23
|
||||
v1.1.54231-stable 2017-04-29
|
||||
v1.1.54198-stable 2017-03-28
|
||||
v1.1.54190-stable 2017-03-21
|
||||
v1.1.54245-stable 2017-07-05
|
||||
v1.1.54242-stable 2017-06-27
|
||||
v1.1.54236-stable 2017-05-25
|
||||
v1.1.54231-stable 2017-05-15
|
||||
v1.1.54198-stable 2017-03-29
|
||||
v1.1.54190-stable 2017-03-22
|
||||
v1.1.54188-stable 2017-03-17
|
||||
v1.1.54181-stable 2017-03-09
|
||||
v1.1.54165-stable 2017-02-14
|
||||
v1.1.54159-stable 2017-02-03
|
||||
v1.1.54144-stable 2017-01-31
|
||||
v1.1.54181-stable 2017-03-11
|
||||
v1.1.54165-stable 2017-02-15
|
||||
v1.1.54159-stable 2017-02-07
|
||||
v1.1.54144-stable 2017-02-01
|
||||
v1.1.54135-stable 2017-01-20
|
||||
v1.1.54134-stable 2017-01-14
|
||||
v1.1.54133-stable 2017-01-12
|
||||
v1.1.54127-stable 2016-12-22
|
||||
v1.1.54112-stable 2016-12-08
|
||||
v1.1.54083-stable 2016-11-28
|
||||
v1.1.54134-stable 2017-01-16
|
||||
v1.1.54133-stable 2017-01-13
|
||||
v1.1.54127-stable 2016-12-23
|
||||
v1.1.54112-stable 2016-12-13
|
||||
v1.1.54083-stable 2016-12-01
|
||||
v1.1.54080-stable 2016-11-25
|
||||
v1.1.54074-stable 2016-11-23
|
||||
v1.1.54046-stable 2016-10-27
|
||||
v1.1.54030-stable 2016-10-24
|
||||
v1.1.54023-stable 2016-10-07
|
||||
v1.1.54022-stable 2016-09-26
|
||||
v1.1.54020-stable 2016-09-19
|
||||
v1.1.54019-stable 2016-09-07
|
||||
v1.1.54074-stable 2016-11-24
|
||||
v1.1.54046-stable 2016-11-08
|
||||
v1.1.54030-stable 2016-10-25
|
||||
v1.1.54023-stable 2016-10-10
|
||||
v1.1.54022-stable 2016-09-28
|
||||
v1.1.54020-stable 2016-09-21
|
||||
v1.1.54019-stable 2016-09-14
|
||||
v1.1.54011-stable 2016-08-18
|
||||
|
|
BIN
website/images/photos/artur-filatenkov.jpg
Normal file
BIN
website/images/photos/artur-filatenkov.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
BIN
website/images/photos/bastian-spanneberg.jpg
Normal file
BIN
website/images/photos/bastian-spanneberg.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.9 KiB |
BIN
website/images/photos/manas-alekar.jpg
Normal file
BIN
website/images/photos/manas-alekar.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
website/images/photos/marcelo-rodriguez.jpg
Normal file
BIN
website/images/photos/marcelo-rodriguez.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
BIN
website/images/photos/martin-choluj.jpg
Normal file
BIN
website/images/photos/martin-choluj.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
BIN
website/images/photos/mikhail-fursov.jpg
Normal file
BIN
website/images/photos/mikhail-fursov.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
@ -9,6 +9,19 @@
|
||||
<div class="row mb-8">
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
<a href="https://www.linkedin.com/in/manas-alekar-42b6a62a/" target="_blank" class="photo-frame mx-auto" rel="external nofollow">
|
||||
<img src="/images/photos/manas-alekar.jpg">
|
||||
</a>
|
||||
<h3 class="display-4">
|
||||
{{ _('Manas Alekar') }}
|
||||
</h3>
|
||||
<p class="font-lg text-muted mb-0 mx-auto w-75">
|
||||
{{ _('Senior Cloud SWE') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
<a href="https://github.com/vitlibar" target="_blank" class="photo-frame mx-auto" rel="external nofollow">
|
||||
<img src="/images/photos/vitaly-baranov.jpg">
|
||||
</a>
|
||||
@ -43,7 +56,7 @@
|
||||
{{ _('Ivan Blinkov') }}
|
||||
</h3>
|
||||
<p class="font-lg text-muted mb-0 mx-auto w-75">
|
||||
{{ _('VP, Product') }}
|
||||
{{ _('VP, Technical Program Management') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
@ -99,6 +112,19 @@
|
||||
{{ _('Software Engineer') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
<a href="https://www.linkedin.com/in/martincholuj/" target="_blank" class="photo-frame mx-auto" rel="external nofollow">
|
||||
<img src="/images/photos/martin-choluj.jpg">
|
||||
</a>
|
||||
<h3 class="display-4">
|
||||
{{ _('Martin Choluj') }}
|
||||
</h3>
|
||||
<p class="font-lg text-muted mb-0 mx-auto w-75">
|
||||
{{ _('Vice President, Security') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
@ -125,6 +151,19 @@
|
||||
{{ _('Core SWE') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
<a href="https://www.linkedin.com/in/artur-filatenkov-5a51a8217/" target="_blank" class="photo-frame mx-auto" rel="external nofollow">
|
||||
<img src="/images/photos/artur-filatenkov.jpg">
|
||||
</a>
|
||||
<h3 class="display-4">
|
||||
{{ _('Artur Filatenkov') }}
|
||||
</h3>
|
||||
<p class="font-lg text-muted mb-0 mx-auto w-75">
|
||||
{{ _('Associate Core Software Engineer') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
@ -138,6 +177,19 @@
|
||||
{{ _('Senior Director, Business Technology') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
<div class="photo-frame mx-auto">
|
||||
<img src="/images/photos/mikhail-fursov.jpg">
|
||||
</div>
|
||||
<h3 class="display-4">
|
||||
{{ _('Mikhail Fursov') }}
|
||||
</h3>
|
||||
<p class="font-lg text-muted mb-0 mx-auto w-75">
|
||||
{{ _('Principal UX/UI Engineer') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
@ -437,6 +489,19 @@
|
||||
{{ _('Director, Global Learning') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
<a href="https://www.linkedin.com/in/rodriguezmarcelo/" target="_blank" class="photo-frame mx-auto" rel="external nofollow">
|
||||
<img src="/images/photos/marcelo-rodriguez.jpg">
|
||||
</a>
|
||||
<h3 class="display-4">
|
||||
{{ _('Marcelo Rodriguez') }}
|
||||
</h3>
|
||||
<p class="font-lg text-muted mb-0 mx-auto w-75">
|
||||
{{ _('Sr Support Engineer') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
@ -476,6 +541,19 @@
|
||||
{{ _('Site Reliability Engineer') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
<a href="https://www.linkedin.com/in/bastian-spanneberg/" target="_blank" class="photo-frame mx-auto" rel="external nofollow">
|
||||
<img src="/images/photos/bastian-spanneberg.jpg">
|
||||
</a>
|
||||
<h3 class="display-4">
|
||||
{{ _('Bastian Spanneberg') }}
|
||||
</h3>
|
||||
<p class="font-lg text-muted mb-0 mx-auto w-75">
|
||||
{{ _('Site Reliability Engineer') }}
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6 mb-3 mb-md-8 text-center">
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user