mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 08:02:02 +00:00
Merge pull request #60469 from ClickHouse/clang-18-ci
Use clang-18 in CI
This commit is contained in:
commit
f27a0d6801
16
.clang-tidy
16
.clang-tidy
@ -123,7 +123,21 @@ Checks: [
|
||||
'-readability-uppercase-literal-suffix',
|
||||
'-readability-use-anyofallof',
|
||||
|
||||
'-zircon-*'
|
||||
'-zircon-*',
|
||||
|
||||
# These are new in clang-18, and we have to sort them out:
|
||||
'-readability-avoid-nested-conditional-operator',
|
||||
'-modernize-use-designated-initializers',
|
||||
'-performance-enum-size',
|
||||
'-readability-redundant-inline-specifier',
|
||||
'-readability-redundant-member-init',
|
||||
'-bugprone-crtp-constructor-accessibility',
|
||||
'-bugprone-suspicious-stringview-data-usage',
|
||||
'-bugprone-multi-level-implicit-pointer-conversion',
|
||||
'-cert-err33-c',
|
||||
|
||||
# This is a good check, but clang-tidy crashes, see https://github.com/llvm/llvm-project/issues/91872
|
||||
'-modernize-use-constraints',
|
||||
]
|
||||
|
||||
WarningsAsErrors: '*'
|
||||
|
@ -51,11 +51,9 @@ struct DecomposedFloat
|
||||
/// Returns 0 for both +0. and -0.
|
||||
int sign() const
|
||||
{
|
||||
return (exponent() == 0 && mantissa() == 0)
|
||||
? 0
|
||||
: (isNegative()
|
||||
? -1
|
||||
: 1);
|
||||
if (exponent() == 0 && mantissa() == 0)
|
||||
return 0;
|
||||
return isNegative() ? -1 : 1;
|
||||
}
|
||||
|
||||
uint16_t exponent() const
|
||||
|
@ -11,7 +11,7 @@ namespace detail
|
||||
template <is_enum E, class F, size_t ...I>
|
||||
constexpr void static_for(F && f, std::index_sequence<I...>)
|
||||
{
|
||||
(std::forward<F>(f)(std::integral_constant<E, magic_enum::enum_value<E>(I)>()) , ...);
|
||||
(f(std::integral_constant<E, magic_enum::enum_value<E>(I)>()) , ...);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -651,7 +651,9 @@ std::string_view JSON::getRawString() const
|
||||
Pos s = ptr_begin;
|
||||
if (*s != '"')
|
||||
throw JSONException(std::string("JSON: expected \", got ") + *s);
|
||||
while (++s != ptr_end && *s != '"');
|
||||
++s;
|
||||
while (s != ptr_end && *s != '"')
|
||||
++s;
|
||||
if (s != ptr_end)
|
||||
return std::string_view(ptr_begin + 1, s - ptr_begin - 1);
|
||||
throw JSONException("JSON: incorrect syntax (expected end of string, found end of JSON).");
|
||||
|
@ -74,7 +74,7 @@ public:
|
||||
const char * data() const { return ptr_begin; }
|
||||
const char * dataEnd() const { return ptr_end; }
|
||||
|
||||
enum ElementType
|
||||
enum ElementType : uint8_t
|
||||
{
|
||||
TYPE_OBJECT,
|
||||
TYPE_ARRAY,
|
||||
|
@ -27,7 +27,7 @@ namespace TypeListUtils /// In some contexts it's more handy to use functions in
|
||||
constexpr Root<Args...> changeRoot(TypeList<Args...>) { return {}; }
|
||||
|
||||
template <typename F, typename ...Args>
|
||||
constexpr void forEach(TypeList<Args...>, F && f) { (std::forward<F>(f)(TypeList<Args>{}), ...); }
|
||||
constexpr void forEach(TypeList<Args...>, F && f) { (f(TypeList<Args>{}), ...); }
|
||||
}
|
||||
|
||||
template <typename TypeListLeft, typename TypeListRight>
|
||||
|
@ -21,7 +21,7 @@ bool func_wrapper(Func && func, Arg && arg)
|
||||
template <typename T, T Begin, typename Func, T... Is>
|
||||
constexpr bool static_for_impl(Func && f, std::integer_sequence<T, Is...>)
|
||||
{
|
||||
return (func_wrapper(std::forward<Func>(f), std::integral_constant<T, Begin + Is>{}) || ...);
|
||||
return (func_wrapper(f, std::integral_constant<T, Begin + Is>{}) || ...);
|
||||
}
|
||||
|
||||
template <auto Begin, decltype(Begin) End, typename Func>
|
||||
|
@ -147,7 +147,7 @@ constexpr uint16_t maybe_negate(uint16_t x)
|
||||
return ~x;
|
||||
}
|
||||
|
||||
enum class ReturnMode
|
||||
enum class ReturnMode : uint8_t
|
||||
{
|
||||
End,
|
||||
Nullptr,
|
||||
|
@ -77,8 +77,7 @@ uint64_t getMemoryAmountOrZero()
|
||||
{
|
||||
uint64_t limit_v1;
|
||||
if (limit_file_v1 >> limit_v1)
|
||||
if (limit_v1 < memory_amount)
|
||||
memory_amount = limit_v1;
|
||||
memory_amount = std::min(memory_amount, limit_v1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -146,7 +146,7 @@ namespace impl
|
||||
TUInt res;
|
||||
if constexpr (sizeof(TUInt) == 1)
|
||||
{
|
||||
res = static_cast<UInt8>(unhexDigit(data[0])) * 0x10 + static_cast<UInt8>(unhexDigit(data[1]));
|
||||
res = unhexDigit(data[0]) * 0x10 + unhexDigit(data[1]);
|
||||
}
|
||||
else if constexpr (sizeof(TUInt) == 2)
|
||||
{
|
||||
@ -176,17 +176,19 @@ namespace impl
|
||||
};
|
||||
|
||||
/// Helper template class to convert a value of any supported type to hexadecimal representation and back.
|
||||
template <typename T, typename SFINAE = void>
|
||||
template <typename T>
|
||||
struct HexConversion;
|
||||
|
||||
template <typename TUInt>
|
||||
struct HexConversion<TUInt, std::enable_if_t<std::is_integral_v<TUInt>>> : public HexConversionUInt<TUInt> {};
|
||||
requires(std::is_integral_v<TUInt>)
|
||||
struct HexConversion<TUInt> : public HexConversionUInt<TUInt> {};
|
||||
|
||||
template <size_t Bits, typename Signed>
|
||||
struct HexConversion<wide::integer<Bits, Signed>> : public HexConversionUInt<wide::integer<Bits, Signed>> {};
|
||||
|
||||
template <typename CityHashUInt128> /// Partial specialization here allows not to include <city.h> in this header.
|
||||
struct HexConversion<CityHashUInt128, std::enable_if_t<std::is_same_v<CityHashUInt128, typename CityHash_v1_0_2::uint128>>>
|
||||
requires(std::is_same_v<CityHashUInt128, typename CityHash_v1_0_2::uint128>)
|
||||
struct HexConversion<CityHashUInt128>
|
||||
{
|
||||
static const constexpr size_t num_hex_digits = 32;
|
||||
|
||||
|
@ -20,24 +20,26 @@ Out & dumpValue(Out &, T &&);
|
||||
|
||||
/// Catch-all case.
|
||||
template <int priority, typename Out, typename T>
|
||||
std::enable_if_t<priority == -1, Out> & dumpImpl(Out & out, T &&) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
requires(priority == -1)
|
||||
Out & dumpImpl(Out & out, T &&) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
{
|
||||
return out << "{...}";
|
||||
}
|
||||
|
||||
/// An object, that could be output with operator <<.
|
||||
template <int priority, typename Out, typename T>
|
||||
std::enable_if_t<priority == 0, Out> & dumpImpl(Out & out, T && x, std::decay_t<decltype(std::declval<Out &>() << std::declval<T>())> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
requires(priority == 0)
|
||||
Out & dumpImpl(Out & out, T && x, std::decay_t<decltype(std::declval<Out &>() << std::declval<T>())> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
{
|
||||
return out << x;
|
||||
}
|
||||
|
||||
/// A pointer-like object.
|
||||
template <int priority, typename Out, typename T>
|
||||
std::enable_if_t<priority == 1
|
||||
requires(priority == 1
|
||||
/// Protect from the case when operator * do effectively nothing (function pointer).
|
||||
&& !std::is_same_v<std::decay_t<T>, std::decay_t<decltype(*std::declval<T>())>>
|
||||
, Out> & dumpImpl(Out & out, T && x, std::decay_t<decltype(*std::declval<T>())> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
&& !std::is_same_v<std::decay_t<T>, std::decay_t<decltype(*std::declval<T>())>>)
|
||||
Out & dumpImpl(Out & out, T && x, std::decay_t<decltype(*std::declval<T>())> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
{
|
||||
if (!x)
|
||||
return out << "nullptr";
|
||||
@ -46,7 +48,8 @@ std::enable_if_t<priority == 1
|
||||
|
||||
/// Container.
|
||||
template <int priority, typename Out, typename T>
|
||||
std::enable_if_t<priority == 2, Out> & dumpImpl(Out & out, T && x, std::decay_t<decltype(std::begin(std::declval<T>()))> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
requires(priority == 2)
|
||||
Out & dumpImpl(Out & out, T && x, std::decay_t<decltype(std::begin(std::declval<T>()))> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
{
|
||||
bool first = true;
|
||||
out << "{";
|
||||
@ -63,8 +66,8 @@ std::enable_if_t<priority == 2, Out> & dumpImpl(Out & out, T && x, std::decay_t<
|
||||
|
||||
|
||||
template <int priority, typename Out, typename T>
|
||||
std::enable_if_t<priority == 3 && std::is_enum_v<std::decay_t<T>>, Out> &
|
||||
dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
requires(priority == 3 && std::is_enum_v<std::decay_t<T>>)
|
||||
Out & dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
{
|
||||
return out << magic_enum::enum_name(x);
|
||||
}
|
||||
@ -72,8 +75,8 @@ dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
/// string and const char * - output not as container or pointer.
|
||||
|
||||
template <int priority, typename Out, typename T>
|
||||
std::enable_if_t<priority == 3 && (std::is_same_v<std::decay_t<T>, std::string> || std::is_same_v<std::decay_t<T>, const char *>), Out> &
|
||||
dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
requires(priority == 3 && (std::is_same_v<std::decay_t<T>, std::string> || std::is_same_v<std::decay_t<T>, const char *>))
|
||||
Out & dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
{
|
||||
return out << std::quoted(x);
|
||||
}
|
||||
@ -81,8 +84,8 @@ dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
/// UInt8 - output as number, not char.
|
||||
|
||||
template <int priority, typename Out, typename T>
|
||||
std::enable_if_t<priority == 3 && std::is_same_v<std::decay_t<T>, unsigned char>, Out> &
|
||||
dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
requires(priority == 3 && std::is_same_v<std::decay_t<T>, unsigned char>)
|
||||
Out & dumpImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
{
|
||||
return out << int(x);
|
||||
}
|
||||
@ -108,7 +111,8 @@ Out & dumpTupleImpl(Out & out, T && x) // NOLINT(cppcoreguidelines-missing-std-f
|
||||
}
|
||||
|
||||
template <int priority, typename Out, typename T>
|
||||
std::enable_if_t<priority == 4, Out> & dumpImpl(Out & out, T && x, std::decay_t<decltype(std::get<0>(std::declval<T>()))> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
requires(priority == 4)
|
||||
Out & dumpImpl(Out & out, T && x, std::decay_t<decltype(std::get<0>(std::declval<T>()))> * = nullptr) // NOLINT(cppcoreguidelines-missing-std-forward)
|
||||
{
|
||||
return dumpTupleImpl<0>(out, x);
|
||||
}
|
||||
|
@ -250,14 +250,16 @@ ALWAYS_INLINE inline char * uitoa<UnsignedOfSize<1>, 1>(char * p, UnsignedOfSize
|
||||
//===----------------------------------------------------------===//
|
||||
|
||||
// itoa: handle unsigned integral operands (selected by SFINAE)
|
||||
template <typename U, std::enable_if_t<!std::is_signed_v<U> && std::is_integral_v<U>> * = nullptr>
|
||||
template <typename U>
|
||||
requires(!std::is_signed_v<U> && std::is_integral_v<U>)
|
||||
ALWAYS_INLINE inline char * itoa(U u, char * p)
|
||||
{
|
||||
return convert::uitoa(p, u);
|
||||
}
|
||||
|
||||
// itoa: handle signed integral operands (selected by SFINAE)
|
||||
template <typename I, size_t N = sizeof(I), std::enable_if_t<std::is_signed_v<I> && std::is_integral_v<I>> * = nullptr>
|
||||
template <typename I, size_t N = sizeof(I)>
|
||||
requires(std::is_signed_v<I> && std::is_integral_v<I>)
|
||||
ALWAYS_INLINE inline char * itoa(I i, char * p)
|
||||
{
|
||||
// Need "mask" to be filled with a copy of the sign bit.
|
||||
|
@ -19,8 +19,8 @@ auto map(const Collection<Params...> & collection, Mapper && mapper)
|
||||
using value_type = unqualified_t<decltype(mapper(*std::begin(collection)))>;
|
||||
|
||||
return Collection<value_type>(
|
||||
boost::make_transform_iterator(std::begin(collection), std::forward<Mapper>(mapper)),
|
||||
boost::make_transform_iterator(std::end(collection), std::forward<Mapper>(mapper)));
|
||||
boost::make_transform_iterator(std::begin(collection), mapper),
|
||||
boost::make_transform_iterator(std::end(collection), mapper));
|
||||
}
|
||||
|
||||
/** \brief Returns collection of specified container-type,
|
||||
@ -33,8 +33,8 @@ auto map(const Collection & collection, Mapper && mapper)
|
||||
using value_type = unqualified_t<decltype(mapper(*std::begin(collection)))>;
|
||||
|
||||
return ResultCollection<value_type>(
|
||||
boost::make_transform_iterator(std::begin(collection), std::forward<Mapper>(mapper)),
|
||||
boost::make_transform_iterator(std::end(collection), std::forward<Mapper>(mapper)));
|
||||
boost::make_transform_iterator(std::begin(collection), mapper),
|
||||
boost::make_transform_iterator(std::end(collection), mapper));
|
||||
}
|
||||
|
||||
/** \brief Returns collection of specified type,
|
||||
@ -45,8 +45,8 @@ template <typename ResultCollection, typename Collection, typename Mapper>
|
||||
auto map(const Collection & collection, Mapper && mapper)
|
||||
{
|
||||
return ResultCollection(
|
||||
boost::make_transform_iterator(std::begin(collection), std::forward<Mapper>(mapper)),
|
||||
boost::make_transform_iterator(std::end(collection), std::forward<Mapper>(mapper)));
|
||||
boost::make_transform_iterator(std::begin(collection), mapper),
|
||||
boost::make_transform_iterator(std::end(collection), mapper));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -23,12 +23,10 @@ namespace internal
|
||||
|
||||
/// For loop adaptor which is used to iterate through a half-closed interval [begin, end).
|
||||
/// The parameters `begin` and `end` can have any integral or enum types.
|
||||
template <typename BeginType,
|
||||
typename EndType,
|
||||
typename = std::enable_if_t<
|
||||
(std::is_integral_v<BeginType> || std::is_enum_v<BeginType>) &&
|
||||
(std::is_integral_v<EndType> || std::is_enum_v<EndType>) &&
|
||||
(!std::is_enum_v<BeginType> || !std::is_enum_v<EndType> || std::is_same_v<BeginType, EndType>), void>>
|
||||
template <typename BeginType, typename EndType>
|
||||
requires((std::is_integral_v<BeginType> || std::is_enum_v<BeginType>) &&
|
||||
(std::is_integral_v<EndType> || std::is_enum_v<EndType>) &&
|
||||
(!std::is_enum_v<BeginType> || !std::is_enum_v<EndType> || std::is_same_v<BeginType, EndType>))
|
||||
inline auto range(BeginType begin, EndType end)
|
||||
{
|
||||
if constexpr (std::is_integral_v<BeginType> && std::is_integral_v<EndType>)
|
||||
@ -50,8 +48,8 @@ inline auto range(BeginType begin, EndType end)
|
||||
/// For loop adaptor which is used to iterate through a half-closed interval [0, end).
|
||||
/// The parameter `end` can have any integral or enum type.
|
||||
/// The same as range(0, end).
|
||||
template <typename Type,
|
||||
typename = std::enable_if_t<std::is_integral_v<Type> || std::is_enum_v<Type>, void>>
|
||||
template <typename Type>
|
||||
requires(std::is_integral_v<Type> || std::is_enum_v<Type>)
|
||||
inline auto range(Type end)
|
||||
{
|
||||
if constexpr (std::is_integral_v<Type>)
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
#include <ctime>
|
||||
#include <cerrno>
|
||||
#include <system_error>
|
||||
|
||||
#if defined(OS_DARWIN)
|
||||
#include <mach/mach.h>
|
||||
@ -34,7 +35,8 @@ void sleepForNanoseconds(uint64_t nanoseconds)
|
||||
constexpr auto clock_type = CLOCK_MONOTONIC;
|
||||
|
||||
struct timespec current_time;
|
||||
clock_gettime(clock_type, ¤t_time);
|
||||
if (0 != clock_gettime(clock_type, ¤t_time))
|
||||
throw std::system_error(std::error_code(errno, std::system_category()));
|
||||
|
||||
constexpr uint64_t resolution = 1'000'000'000;
|
||||
struct timespec finish_time = current_time;
|
||||
|
@ -111,7 +111,8 @@ public:
|
||||
|
||||
constexpr explicit operator bool() const noexcept;
|
||||
|
||||
template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>, T>>
|
||||
template <typename T>
|
||||
requires(std::is_arithmetic_v<T>)
|
||||
constexpr operator T() const noexcept;
|
||||
|
||||
constexpr operator long double() const noexcept;
|
||||
@ -208,12 +209,14 @@ constexpr integer<Bits, Signed> operator<<(const integer<Bits, Signed> & lhs, in
|
||||
template <size_t Bits, typename Signed>
|
||||
constexpr integer<Bits, Signed> operator>>(const integer<Bits, Signed> & lhs, int n) noexcept;
|
||||
|
||||
template <size_t Bits, typename Signed, typename Int, typename = std::enable_if_t<!std::is_same_v<Int, int>>>
|
||||
template <size_t Bits, typename Signed, typename Int>
|
||||
requires(!std::is_same_v<Int, int>)
|
||||
constexpr integer<Bits, Signed> operator<<(const integer<Bits, Signed> & lhs, Int n) noexcept
|
||||
{
|
||||
return lhs << int(n);
|
||||
}
|
||||
template <size_t Bits, typename Signed, typename Int, typename = std::enable_if_t<!std::is_same_v<Int, int>>>
|
||||
template <size_t Bits, typename Signed, typename Int>
|
||||
requires(!std::is_same_v<Int, int>)
|
||||
constexpr integer<Bits, Signed> operator>>(const integer<Bits, Signed> & lhs, Int n) noexcept
|
||||
{
|
||||
return lhs >> int(n);
|
||||
@ -262,4 +265,3 @@ struct hash<wide::integer<Bits, Signed>>;
|
||||
// NOLINTEND(*)
|
||||
|
||||
#include "wide_integer_impl.h"
|
||||
|
||||
|
@ -1246,7 +1246,8 @@ constexpr integer<Bits, Signed>::operator bool() const noexcept
|
||||
}
|
||||
|
||||
template <size_t Bits, typename Signed>
|
||||
template <class T, class>
|
||||
template <class T>
|
||||
requires(std::is_arithmetic_v<T>)
|
||||
constexpr integer<Bits, Signed>::operator T() const noexcept
|
||||
{
|
||||
static_assert(std::numeric_limits<T>::is_integer);
|
||||
|
@ -5,14 +5,14 @@ if (ENABLE_CLANG_TIDY)
|
||||
|
||||
find_program (CLANG_TIDY_CACHE_PATH NAMES "clang-tidy-cache")
|
||||
if (CLANG_TIDY_CACHE_PATH)
|
||||
find_program (_CLANG_TIDY_PATH NAMES "clang-tidy-17" "clang-tidy-16" "clang-tidy")
|
||||
find_program (_CLANG_TIDY_PATH NAMES "clang-tidy-18" "clang-tidy-17" "clang-tidy-16" "clang-tidy")
|
||||
|
||||
# Why do we use ';' here?
|
||||
# It's a cmake black magic: https://cmake.org/cmake/help/latest/prop_tgt/LANG_CLANG_TIDY.html#prop_tgt:%3CLANG%3E_CLANG_TIDY
|
||||
# The CLANG_TIDY_PATH is passed to CMAKE_CXX_CLANG_TIDY, which follows CXX_CLANG_TIDY syntax.
|
||||
set (CLANG_TIDY_PATH "${CLANG_TIDY_CACHE_PATH};${_CLANG_TIDY_PATH}" CACHE STRING "A combined command to run clang-tidy with caching wrapper")
|
||||
else ()
|
||||
find_program (CLANG_TIDY_PATH NAMES "clang-tidy-17" "clang-tidy-16" "clang-tidy")
|
||||
find_program (CLANG_TIDY_PATH NAMES "clang-tidy-18" "clang-tidy-17" "clang-tidy-16" "clang-tidy")
|
||||
endif ()
|
||||
|
||||
if (CLANG_TIDY_PATH)
|
||||
|
@ -9,7 +9,7 @@ execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE COMPILER
|
||||
message (STATUS "Using compiler:\n${COMPILER_SELF_IDENTIFICATION}")
|
||||
|
||||
# Require minimum compiler versions
|
||||
set (CLANG_MINIMUM_VERSION 16)
|
||||
set (CLANG_MINIMUM_VERSION 17)
|
||||
set (XCODE_MINIMUM_VERSION 12.0)
|
||||
set (APPLE_CLANG_MINIMUM_VERSION 12.0.0)
|
||||
|
||||
|
@ -52,7 +52,7 @@ function(absl_cc_library)
|
||||
)
|
||||
|
||||
target_include_directories(${_NAME}
|
||||
PUBLIC "${ABSL_COMMON_INCLUDE_DIRS}")
|
||||
SYSTEM PUBLIC "${ABSL_COMMON_INCLUDE_DIRS}")
|
||||
target_compile_options(${_NAME}
|
||||
PRIVATE ${ABSL_CC_LIB_COPTS})
|
||||
target_compile_definitions(${_NAME} PUBLIC ${ABSL_CC_LIB_DEFINES})
|
||||
@ -61,7 +61,7 @@ function(absl_cc_library)
|
||||
# Generating header-only library
|
||||
add_library(${_NAME} INTERFACE)
|
||||
target_include_directories(${_NAME}
|
||||
INTERFACE "${ABSL_COMMON_INCLUDE_DIRS}")
|
||||
SYSTEM INTERFACE "${ABSL_COMMON_INCLUDE_DIRS}")
|
||||
|
||||
target_link_libraries(${_NAME}
|
||||
INTERFACE
|
||||
|
@ -3,10 +3,10 @@ compilers and build settings. Correctly configured Docker daemon is single depen
|
||||
|
||||
Usage:
|
||||
|
||||
Build deb package with `clang-17` in `debug` mode:
|
||||
Build deb package with `clang-18` in `debug` mode:
|
||||
```
|
||||
$ mkdir deb/test_output
|
||||
$ ./packager --output-dir deb/test_output/ --package-type deb --compiler=clang-17 --debug-build
|
||||
$ ./packager --output-dir deb/test_output/ --package-type deb --compiler=clang-18 --debug-build
|
||||
$ ls -l deb/test_output
|
||||
-rw-r--r-- 1 root root 3730 clickhouse-client_22.2.2+debug_all.deb
|
||||
-rw-r--r-- 1 root root 84221888 clickhouse-common-static_22.2.2+debug_amd64.deb
|
||||
@ -17,11 +17,11 @@ $ ls -l deb/test_output
|
||||
|
||||
```
|
||||
|
||||
Build ClickHouse binary with `clang-17` and `address` sanitizer in `relwithdebuginfo`
|
||||
Build ClickHouse binary with `clang-18` and `address` sanitizer in `relwithdebuginfo`
|
||||
mode:
|
||||
```
|
||||
$ mkdir $HOME/some_clickhouse
|
||||
$ ./packager --output-dir=$HOME/some_clickhouse --package-type binary --compiler=clang-17 --sanitizer=address
|
||||
$ ./packager --output-dir=$HOME/some_clickhouse --package-type binary --compiler=clang-18 --sanitizer=address
|
||||
$ ls -l $HOME/some_clickhouse
|
||||
-rwxr-xr-x 1 root root 787061952 clickhouse
|
||||
lrwxrwxrwx 1 root root 10 clickhouse-benchmark -> clickhouse
|
||||
|
@ -403,19 +403,19 @@ def parse_args() -> argparse.Namespace:
|
||||
parser.add_argument(
|
||||
"--compiler",
|
||||
choices=(
|
||||
"clang-17",
|
||||
"clang-17-darwin",
|
||||
"clang-17-darwin-aarch64",
|
||||
"clang-17-aarch64",
|
||||
"clang-17-aarch64-v80compat",
|
||||
"clang-17-ppc64le",
|
||||
"clang-17-riscv64",
|
||||
"clang-17-s390x",
|
||||
"clang-17-amd64-compat",
|
||||
"clang-17-amd64-musl",
|
||||
"clang-17-freebsd",
|
||||
"clang-18",
|
||||
"clang-18-darwin",
|
||||
"clang-18-darwin-aarch64",
|
||||
"clang-18-aarch64",
|
||||
"clang-18-aarch64-v80compat",
|
||||
"clang-18-ppc64le",
|
||||
"clang-18-riscv64",
|
||||
"clang-18-s390x",
|
||||
"clang-18-amd64-compat",
|
||||
"clang-18-amd64-musl",
|
||||
"clang-18-freebsd",
|
||||
),
|
||||
default="clang-17",
|
||||
default="clang-18",
|
||||
help="a compiler to use",
|
||||
)
|
||||
parser.add_argument(
|
||||
|
@ -17,7 +17,7 @@ stage=${stage:-}
|
||||
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||
echo "$script_dir"
|
||||
repo_dir=ch
|
||||
BINARY_TO_DOWNLOAD=${BINARY_TO_DOWNLOAD:="clang-17_debug_none_unsplitted_disable_False_binary"}
|
||||
BINARY_TO_DOWNLOAD=${BINARY_TO_DOWNLOAD:="clang-18_debug_none_unsplitted_disable_False_binary"}
|
||||
BINARY_URL_TO_DOWNLOAD=${BINARY_URL_TO_DOWNLOAD:="https://clickhouse-builds.s3.amazonaws.com/$PR_TO_TEST/$SHA_TO_TEST/clickhouse_build_check/$BINARY_TO_DOWNLOAD/clickhouse"}
|
||||
|
||||
function git_clone_with_retry
|
||||
|
@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
|
||||
CLICKHOUSE_PACKAGE=${CLICKHOUSE_PACKAGE:="https://clickhouse-builds.s3.amazonaws.com/$PR_TO_TEST/$SHA_TO_TEST/clickhouse_build_check/clang-17_relwithdebuginfo_none_unsplitted_disable_False_binary/clickhouse"}
|
||||
CLICKHOUSE_PACKAGE=${CLICKHOUSE_PACKAGE:="https://clickhouse-builds.s3.amazonaws.com/$PR_TO_TEST/$SHA_TO_TEST/clickhouse_build_check/clang-18_relwithdebuginfo_none_unsplitted_disable_False_binary/clickhouse"}
|
||||
CLICKHOUSE_REPO_PATH=${CLICKHOUSE_REPO_PATH:=""}
|
||||
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
|
||||
CLICKHOUSE_PACKAGE=${CLICKHOUSE_PACKAGE:="https://clickhouse-builds.s3.amazonaws.com/$PR_TO_TEST/$SHA_TO_TEST/clickhouse_build_check/clang-17_relwithdebuginfo_none_unsplitted_disable_False_binary/clickhouse"}
|
||||
CLICKHOUSE_PACKAGE=${CLICKHOUSE_PACKAGE:="https://clickhouse-builds.s3.amazonaws.com/$PR_TO_TEST/$SHA_TO_TEST/clickhouse_build_check/clang-18_relwithdebuginfo_none_unsplitted_disable_False_binary/clickhouse"}
|
||||
CLICKHOUSE_REPO_PATH=${CLICKHOUSE_REPO_PATH:=""}
|
||||
|
||||
|
||||
|
@ -6,7 +6,7 @@ set -e
|
||||
set -u
|
||||
set -o pipefail
|
||||
|
||||
BINARY_TO_DOWNLOAD=${BINARY_TO_DOWNLOAD:="clang-17_debug_none_unsplitted_disable_False_binary"}
|
||||
BINARY_TO_DOWNLOAD=${BINARY_TO_DOWNLOAD:="clang-18_debug_none_unsplitted_disable_False_binary"}
|
||||
BINARY_URL_TO_DOWNLOAD=${BINARY_URL_TO_DOWNLOAD:="https://clickhouse-builds.s3.amazonaws.com/$PR_TO_TEST/$SHA_TO_TEST/clickhouse_build_check/$BINARY_TO_DOWNLOAD/clickhouse"}
|
||||
|
||||
function wget_with_retry
|
||||
|
@ -5,7 +5,7 @@ FROM ubuntu:22.04
|
||||
ARG apt_archive="http://archive.ubuntu.com"
|
||||
RUN sed -i "s|http://archive.ubuntu.com|$apt_archive|g" /etc/apt/sources.list
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=17
|
||||
ENV DEBIAN_FRONTEND=noninteractive LLVM_VERSION=18
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install \
|
||||
|
@ -13,14 +13,14 @@ The cross-build for macOS is based on the [Build instructions](../development/bu
|
||||
|
||||
The following sections provide a walk-through for building ClickHouse for `x86_64` macOS. If you’re targeting ARM architecture, simply substitute all occurrences of `x86_64` with `aarch64`. For example, replace `x86_64-apple-darwin` with `aarch64-apple-darwin` throughout the steps.
|
||||
|
||||
## Install Clang-17
|
||||
## Install clang-18
|
||||
|
||||
Follow the instructions from https://apt.llvm.org/ for your Ubuntu or Debian setup.
|
||||
For example the commands for Bionic are like:
|
||||
|
||||
``` bash
|
||||
sudo echo "deb [trusted=yes] http://apt.llvm.org/bionic/ llvm-toolchain-bionic-17 main" >> /etc/apt/sources.list
|
||||
sudo apt-get install clang-17
|
||||
sudo apt-get install clang-18
|
||||
```
|
||||
|
||||
## Install Cross-Compilation Toolset {#install-cross-compilation-toolset}
|
||||
@ -59,7 +59,7 @@ curl -L 'https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11
|
||||
cd ClickHouse
|
||||
mkdir build-darwin
|
||||
cd build-darwin
|
||||
CC=clang-17 CXX=clang++-17 cmake -DCMAKE_AR:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ar -DCMAKE_INSTALL_NAME_TOOL=${CCTOOLS}/bin/x86_64-apple-darwin-install_name_tool -DCMAKE_RANLIB:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ranlib -DLINKER_NAME=${CCTOOLS}/bin/x86_64-apple-darwin-ld -DCMAKE_TOOLCHAIN_FILE=cmake/darwin/toolchain-x86_64.cmake ..
|
||||
CC=clang-18 CXX=clang++-18 cmake -DCMAKE_AR:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ar -DCMAKE_INSTALL_NAME_TOOL=${CCTOOLS}/bin/x86_64-apple-darwin-install_name_tool -DCMAKE_RANLIB:FILEPATH=${CCTOOLS}/bin/x86_64-apple-darwin-ranlib -DLINKER_NAME=${CCTOOLS}/bin/x86_64-apple-darwin-ld -DCMAKE_TOOLCHAIN_FILE=cmake/darwin/toolchain-x86_64.cmake ..
|
||||
ninja
|
||||
```
|
||||
|
||||
|
@ -23,7 +23,7 @@ sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
|
||||
``` bash
|
||||
cd ClickHouse
|
||||
mkdir build-riscv64
|
||||
CC=clang-17 CXX=clang++-17 cmake . -Bbuild-riscv64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-riscv64.cmake -DGLIBC_COMPATIBILITY=OFF -DENABLE_LDAP=OFF -DOPENSSL_NO_ASM=ON -DENABLE_JEMALLOC=ON -DENABLE_PARQUET=OFF -DENABLE_GRPC=OFF -DENABLE_HDFS=OFF -DENABLE_MYSQL=OFF
|
||||
CC=clang-18 CXX=clang++-18 cmake . -Bbuild-riscv64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-riscv64.cmake -DGLIBC_COMPATIBILITY=OFF -DENABLE_LDAP=OFF -DOPENSSL_NO_ASM=ON -DENABLE_JEMALLOC=ON -DENABLE_PARQUET=OFF -DENABLE_GRPC=OFF -DENABLE_HDFS=OFF -DENABLE_MYSQL=OFF
|
||||
ninja -C build-riscv64
|
||||
```
|
||||
|
||||
|
@ -109,7 +109,7 @@ The build requires the following components:
|
||||
|
||||
- Git (used to checkout the sources, not needed for the build)
|
||||
- CMake 3.20 or newer
|
||||
- Compiler: clang-17 or newer
|
||||
- Compiler: clang-18 or newer
|
||||
- Linker: lld-17 or newer
|
||||
- Ninja
|
||||
- Yasm
|
||||
|
@ -153,7 +153,7 @@ Builds ClickHouse in various configurations for use in further steps. You have t
|
||||
|
||||
### Report Details
|
||||
|
||||
- **Compiler**: `clang-17`, optionally with the name of a target platform
|
||||
- **Compiler**: `clang-18`, optionally with the name of a target platform
|
||||
- **Build type**: `Debug` or `RelWithDebInfo` (cmake).
|
||||
- **Sanitizer**: `none` (without sanitizers), `address` (ASan), `memory` (MSan), `undefined` (UBSan), or `thread` (TSan).
|
||||
- **Status**: `success` or `fail`
|
||||
@ -177,7 +177,7 @@ Performs static analysis and code style checks using `clang-tidy`. The report is
|
||||
There is a convenience `packager` script that runs the clang-tidy build in docker
|
||||
```sh
|
||||
mkdir build_tidy
|
||||
./docker/packager/packager --output-dir=./build_tidy --package-type=binary --compiler=clang-17 --debug-build --clang-tidy
|
||||
./docker/packager/packager --output-dir=./build_tidy --package-type=binary --compiler=clang-18 --debug-build --clang-tidy
|
||||
```
|
||||
|
||||
|
||||
|
@ -121,7 +121,7 @@ While inside the `build` directory, configure your build by running CMake. Befor
|
||||
export CC=clang CXX=clang++
|
||||
cmake ..
|
||||
|
||||
If you installed clang using the automatic installation script above, also specify the version of clang installed in the first command, e.g. `export CC=clang-17 CXX=clang++-17`. The clang version will be in the script output.
|
||||
If you installed clang using the automatic installation script above, also specify the version of clang installed in the first command, e.g. `export CC=clang-18 CXX=clang++-18`. The clang version will be in the script output.
|
||||
|
||||
The `CC` variable specifies the compiler for C (short for C Compiler), and `CXX` variable instructs which C++ compiler is to be used for building.
|
||||
|
||||
|
@ -233,7 +233,7 @@ struct Commit
|
||||
};
|
||||
|
||||
|
||||
enum class FileChangeType
|
||||
enum class FileChangeType : uint8_t
|
||||
{
|
||||
Add,
|
||||
Delete,
|
||||
@ -291,7 +291,7 @@ struct FileChange
|
||||
};
|
||||
|
||||
|
||||
enum class LineType
|
||||
enum class LineType : uint8_t
|
||||
{
|
||||
Empty,
|
||||
Comment,
|
||||
|
@ -323,7 +323,7 @@ int mainEntryClickHouseInstall(int argc, char ** argv)
|
||||
{
|
||||
fmt::print("Symlink {} already exists but it points to {}. Will replace the old symlink to {}.\n",
|
||||
main_bin_path.string(), points_to.string(), binary_self_canonical_path.string());
|
||||
fs::remove(main_bin_path);
|
||||
(void)fs::remove(main_bin_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -489,7 +489,7 @@ int mainEntryClickHouseInstall(int argc, char ** argv)
|
||||
{
|
||||
fmt::print("Symlink {} already exists but it points to {}. Will replace the old symlink to {}.\n",
|
||||
symlink_path.string(), points_to.string(), main_bin_path.string());
|
||||
fs::remove(symlink_path);
|
||||
(void)fs::remove(symlink_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1006,7 +1006,7 @@ namespace
|
||||
else
|
||||
{
|
||||
fmt::print("{} file exists but damaged, ignoring.\n", pid_file.string());
|
||||
fs::remove(pid_file);
|
||||
(void)fs::remove(pid_file);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1014,7 +1014,7 @@ namespace
|
||||
/// Create a directory for pid file.
|
||||
/// It's created by "install" but we also support cases when ClickHouse is already installed different way.
|
||||
fs::path pid_path = pid_file;
|
||||
pid_path.remove_filename();
|
||||
pid_path = pid_path.remove_filename();
|
||||
fs::create_directories(pid_path);
|
||||
/// All users are allowed to read pid file (for clickhouse status command).
|
||||
fs::permissions(pid_path, fs::perms::owner_all | fs::perms::group_read | fs::perms::others_read, fs::perm_options::replace);
|
||||
@ -1098,7 +1098,7 @@ namespace
|
||||
else
|
||||
{
|
||||
fmt::print("{} file exists but damaged, ignoring.\n", pid_file.string());
|
||||
fs::remove(pid_file);
|
||||
(void)fs::remove(pid_file);
|
||||
}
|
||||
}
|
||||
catch (const Exception & e)
|
||||
|
@ -86,7 +86,10 @@ std::vector<String> KeeperClient::getCompletions(const String & prefix) const
|
||||
void KeeperClient::askConfirmation(const String & prompt, std::function<void()> && callback)
|
||||
{
|
||||
if (!ask_confirmation)
|
||||
return callback();
|
||||
{
|
||||
callback();
|
||||
return;
|
||||
}
|
||||
|
||||
std::cout << prompt << " Continue?\n";
|
||||
waiting_confirmation = true;
|
||||
|
@ -284,7 +284,6 @@ void ExternalDictionaryLibraryBridgeRequestHandler::handleRequest(HTTPServerRequ
|
||||
else if (method == "extDict_loadIds")
|
||||
{
|
||||
LOG_DEBUG(log, "Getting diciontary ids for dictionary with id: {}", dictionary_id);
|
||||
String ids_string;
|
||||
std::vector<uint64_t> ids = parseIdsFromBinary(request.getStream());
|
||||
|
||||
auto library_handler = ExternalDictionaryLibraryHandlerFactory::instance().get(dictionary_id);
|
||||
|
@ -14,7 +14,7 @@ namespace ErrorCodes
|
||||
|
||||
SharedLibrary::SharedLibrary(std::string_view path, int flags)
|
||||
{
|
||||
handle = dlopen(path.data(), flags);
|
||||
handle = dlopen(path.data(), flags); // NOLINT
|
||||
if (!handle)
|
||||
throw Exception(ErrorCodes::CANNOT_DLOPEN, "Cannot dlopen: ({})", dlerror()); // NOLINT(concurrency-mt-unsafe) // MT-Safe on Linux, see man dlerror
|
||||
|
||||
@ -34,7 +34,7 @@ void * SharedLibrary::getImpl(std::string_view name, bool no_throw)
|
||||
{
|
||||
dlerror(); // NOLINT(concurrency-mt-unsafe) // MT-Safe on Linux, see man dlerror
|
||||
|
||||
auto * res = dlsym(handle, name.data());
|
||||
auto * res = dlsym(handle, name.data()); // NOLINT
|
||||
|
||||
if (char * error = dlerror()) // NOLINT(concurrency-mt-unsafe) // MT-Safe on Linux, see man dlerror
|
||||
{
|
||||
|
@ -119,7 +119,7 @@ std::pair<std::string_view, std::string_view> clickhouse_short_names[] =
|
||||
};
|
||||
|
||||
|
||||
enum class InstructionFail
|
||||
enum class InstructionFail : uint8_t
|
||||
{
|
||||
NONE = 0,
|
||||
SSE3 = 1,
|
||||
|
@ -674,8 +674,7 @@ private:
|
||||
|
||||
if (pos + length > end)
|
||||
length = end - pos;
|
||||
if (length > sizeof(CodePoint))
|
||||
length = sizeof(CodePoint);
|
||||
length = std::min(length, sizeof(CodePoint));
|
||||
|
||||
CodePoint res = 0;
|
||||
memcpy(&res, pos, length);
|
||||
@ -883,9 +882,7 @@ public:
|
||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "Logical error in markov model");
|
||||
|
||||
size_t offset_from_begin_of_string = pos - data;
|
||||
size_t determinator_sliding_window_size = params.determinator_sliding_window_size;
|
||||
if (determinator_sliding_window_size > determinator_size)
|
||||
determinator_sliding_window_size = determinator_size;
|
||||
size_t determinator_sliding_window_size = std::min(params.determinator_sliding_window_size, determinator_size);
|
||||
|
||||
size_t determinator_sliding_window_overflow = offset_from_begin_of_string + determinator_sliding_window_size > determinator_size
|
||||
? offset_from_begin_of_string + determinator_sliding_window_size - determinator_size : 0;
|
||||
|
@ -119,8 +119,7 @@ void ODBCSource::insertValue(
|
||||
time_t time = 0;
|
||||
const DataTypeDateTime & datetime_type = assert_cast<const DataTypeDateTime &>(*data_type);
|
||||
readDateTimeText(time, in, datetime_type.getTimeZone());
|
||||
if (time < 0)
|
||||
time = 0;
|
||||
time = std::max<time_t>(time, 0);
|
||||
column.insert(static_cast<UInt32>(time));
|
||||
break;
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ std::string getIdentifierQuote(nanodbc::ConnectionHolderPtr connection_holder)
|
||||
IdentifierQuotingStyle getQuotingStyle(nanodbc::ConnectionHolderPtr connection)
|
||||
{
|
||||
auto identifier_quote = getIdentifierQuote(connection);
|
||||
if (identifier_quote.length() == 0)
|
||||
if (identifier_quote.empty())
|
||||
return IdentifierQuotingStyle::None;
|
||||
else if (identifier_quote[0] == '`')
|
||||
return IdentifierQuotingStyle::Backticks;
|
||||
|
@ -111,13 +111,11 @@ void processTableFiles(const fs::path & data_path, fs::path dst_path, bool test_
|
||||
std::shared_ptr<WriteBuffer> directory_meta;
|
||||
if (test_mode)
|
||||
{
|
||||
auto files_root = dst_path / prefix;
|
||||
directory_meta = std::make_shared<WriteBufferFromHTTP>(HTTPConnectionGroupType::HTTP, Poco::URI(dst_path / directory_prefix / ".index"), Poco::Net::HTTPRequest::HTTP_PUT);
|
||||
}
|
||||
else
|
||||
{
|
||||
dst_path = fs::canonical(dst_path);
|
||||
auto files_root = dst_path / prefix;
|
||||
fs::create_directories(dst_path / directory_prefix);
|
||||
directory_meta = std::make_shared<WriteBufferFromFile>(dst_path / directory_prefix / ".index");
|
||||
}
|
||||
|
@ -93,8 +93,6 @@ namespace
|
||||
break;
|
||||
}
|
||||
|
||||
size_t id_endpos = line.find('\t');
|
||||
String id_as_string = line.substr(0, id_endpos);
|
||||
UUID id = parse<UUID>(line);
|
||||
line.clear();
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
namespace DB
|
||||
{
|
||||
class AccessControl;
|
||||
enum class AccessEntityType;
|
||||
enum class AccessEntityType : uint8_t;
|
||||
struct IAccessEntity;
|
||||
using AccessEntityPtr = std::shared_ptr<const IAccessEntity>;
|
||||
class AccessRightsElements;
|
||||
|
@ -233,7 +233,7 @@ namespace
|
||||
|
||||
/**
|
||||
* Levels:
|
||||
* 1. GLOBAL
|
||||
* 1. GLOBAL
|
||||
* 2. DATABASE_LEVEL 2. GLOBAL_WITH_PARAMETER (parameter example: named collection)
|
||||
* 3. TABLE_LEVEL
|
||||
* 4. COLUMN_LEVEL
|
||||
@ -241,11 +241,12 @@ namespace
|
||||
|
||||
enum Level
|
||||
{
|
||||
GLOBAL_LEVEL,
|
||||
DATABASE_LEVEL,
|
||||
GLOBAL_LEVEL = 0,
|
||||
DATABASE_LEVEL = 1,
|
||||
GLOBAL_WITH_PARAMETER = DATABASE_LEVEL,
|
||||
TABLE_LEVEL,
|
||||
COLUMN_LEVEL,
|
||||
TABLE_LEVEL = 2,
|
||||
COLUMN_LEVEL = 3,
|
||||
MAX = COLUMN_LEVEL,
|
||||
};
|
||||
|
||||
AccessFlags getAllGrantableFlags(Level level)
|
||||
@ -520,7 +521,7 @@ public:
|
||||
|
||||
private:
|
||||
AccessFlags getAllGrantableFlags() const { return ::DB::getAllGrantableFlags(level); }
|
||||
AccessFlags getChildAllGrantableFlags() const { return ::DB::getAllGrantableFlags(static_cast<Level>(level + 1)); }
|
||||
AccessFlags getChildAllGrantableFlags() const { return ::DB::getAllGrantableFlags(static_cast<Level>(level == Level::MAX ? level : (level + 1))); }
|
||||
|
||||
Node * tryGetChild(std::string_view name) const
|
||||
{
|
||||
|
@ -118,13 +118,16 @@ void AuthenticationData::setPassword(const String & password_)
|
||||
switch (type)
|
||||
{
|
||||
case AuthenticationType::PLAINTEXT_PASSWORD:
|
||||
return setPasswordHashBinary(Util::stringToDigest(password_));
|
||||
setPasswordHashBinary(Util::stringToDigest(password_));
|
||||
return;
|
||||
|
||||
case AuthenticationType::SHA256_PASSWORD:
|
||||
return setPasswordHashBinary(Util::encodeSHA256(password_));
|
||||
setPasswordHashBinary(Util::encodeSHA256(password_));
|
||||
return;
|
||||
|
||||
case AuthenticationType::DOUBLE_SHA1_PASSWORD:
|
||||
return setPasswordHashBinary(Util::encodeDoubleSHA1(password_));
|
||||
setPasswordHashBinary(Util::encodeDoubleSHA1(password_));
|
||||
return;
|
||||
|
||||
case AuthenticationType::BCRYPT_PASSWORD:
|
||||
case AuthenticationType::NO_PASSWORD:
|
||||
@ -146,7 +149,7 @@ void AuthenticationData::setPasswordBcrypt(const String & password_, int workfac
|
||||
if (type != AuthenticationType::BCRYPT_PASSWORD)
|
||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "Cannot specify bcrypt password for authentication type {}", toString(type));
|
||||
|
||||
return setPasswordHashBinary(Util::encodeBcrypt(password_, workfactor_));
|
||||
setPasswordHashBinary(Util::encodeBcrypt(password_, workfactor_));
|
||||
}
|
||||
|
||||
String AuthenticationData::getPassword() const
|
||||
|
@ -7,7 +7,7 @@ namespace DB
|
||||
{
|
||||
|
||||
/// Represents the type of an access entity (see the IAccessEntity class).
|
||||
enum class AccessEntityType
|
||||
enum class AccessEntityType : uint8_t
|
||||
{
|
||||
USER,
|
||||
ROLE,
|
||||
|
@ -115,15 +115,15 @@ namespace
|
||||
{
|
||||
UNKNOWN = -2,
|
||||
GROUP = -1,
|
||||
GLOBAL,
|
||||
DATABASE,
|
||||
TABLE,
|
||||
GLOBAL = 0,
|
||||
DATABASE = 1,
|
||||
TABLE = 2,
|
||||
VIEW = TABLE,
|
||||
COLUMN,
|
||||
DICTIONARY,
|
||||
NAMED_COLLECTION,
|
||||
USER_NAME,
|
||||
TABLE_ENGINE,
|
||||
COLUMN = 3,
|
||||
DICTIONARY = 4,
|
||||
NAMED_COLLECTION = 5,
|
||||
USER_NAME = 6,
|
||||
TABLE_ENGINE = 7,
|
||||
};
|
||||
|
||||
struct Node;
|
||||
|
@ -245,7 +245,7 @@ bool AccessRightsElements::sameOptions() const
|
||||
|
||||
void AccessRightsElements::eraseNonGrantable()
|
||||
{
|
||||
boost::range::remove_erase_if(*this, [](AccessRightsElement & element)
|
||||
std::erase_if(*this, [](AccessRightsElement & element)
|
||||
{
|
||||
element.eraseNonGrantable();
|
||||
return element.empty();
|
||||
|
@ -7,7 +7,7 @@ namespace DB
|
||||
{
|
||||
|
||||
/// Represents an access type which can be granted on databases, tables, columns, etc.
|
||||
enum class AccessType
|
||||
enum class AccessType : uint8_t
|
||||
{
|
||||
/// Macro M should be defined as M(name, aliases, node_type, parent_group_name)
|
||||
/// where name is identifier with underscores (instead of spaces);
|
||||
|
@ -308,7 +308,7 @@ void AllowedClientHosts::removeAddress(const IPAddress & address)
|
||||
if (address.isLoopback())
|
||||
local_host = false;
|
||||
else
|
||||
boost::range::remove_erase(addresses, address);
|
||||
std::erase(addresses, address);
|
||||
}
|
||||
|
||||
void AllowedClientHosts::addSubnet(const IPSubnet & subnet)
|
||||
@ -328,7 +328,7 @@ void AllowedClientHosts::removeSubnet(const IPSubnet & subnet)
|
||||
else if (subnet.isMaskAllBitsOne())
|
||||
removeAddress(subnet.getPrefix());
|
||||
else
|
||||
boost::range::remove_erase(subnets, subnet);
|
||||
std::erase(subnets, subnet);
|
||||
}
|
||||
|
||||
void AllowedClientHosts::addName(const String & name)
|
||||
@ -344,7 +344,7 @@ void AllowedClientHosts::removeName(const String & name)
|
||||
if (boost::iequals(name, "localhost"))
|
||||
local_host = false;
|
||||
else
|
||||
boost::range::remove_erase(names, name);
|
||||
std::erase(names, name);
|
||||
}
|
||||
|
||||
void AllowedClientHosts::addNameRegexp(const String & name_regexp)
|
||||
@ -364,7 +364,7 @@ void AllowedClientHosts::removeNameRegexp(const String & name_regexp)
|
||||
else if (name_regexp == ".*")
|
||||
any_host = false;
|
||||
else
|
||||
boost::range::remove_erase(name_regexps, name_regexp);
|
||||
std::erase(name_regexps, name_regexp);
|
||||
}
|
||||
|
||||
void AllowedClientHosts::addLikePattern(const String & pattern)
|
||||
@ -384,7 +384,7 @@ void AllowedClientHosts::removeLikePattern(const String & pattern)
|
||||
else if ((pattern == "%") || (pattern == "0.0.0.0/0") || (pattern == "::/0"))
|
||||
any_host = false;
|
||||
else
|
||||
boost::range::remove_erase(like_patterns, pattern);
|
||||
std::erase(like_patterns, pattern);
|
||||
}
|
||||
|
||||
void AllowedClientHosts::addLocalHost()
|
||||
|
@ -6,7 +6,7 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
enum class AuthenticationType
|
||||
enum class AuthenticationType : uint8_t
|
||||
{
|
||||
/// User doesn't have to enter password.
|
||||
NO_PASSWORD,
|
||||
|
@ -9,7 +9,7 @@ namespace DB
|
||||
using QuotaValue = UInt64;
|
||||
|
||||
/// Kinds of resource what we wish to quota.
|
||||
enum class QuotaType
|
||||
enum class QuotaType : uint8_t
|
||||
{
|
||||
QUERIES, /// Number of queries.
|
||||
QUERY_SELECTS, /// Number of select queries.
|
||||
@ -45,7 +45,7 @@ struct QuotaTypeInfo
|
||||
|
||||
/// Key to share quota consumption.
|
||||
/// Users with the same key share the same amount of resource.
|
||||
enum class QuotaKeyType
|
||||
enum class QuotaKeyType : uint8_t
|
||||
{
|
||||
NONE, /// All users share the same quota.
|
||||
USER_NAME, /// Connections with the same user name share the same quota.
|
||||
|
@ -25,7 +25,7 @@ struct RowPolicyName
|
||||
|
||||
/// Types of the filters of row policies.
|
||||
/// Currently only RowPolicyFilterType::SELECT is supported.
|
||||
enum class RowPolicyFilterType
|
||||
enum class RowPolicyFilterType : uint8_t
|
||||
{
|
||||
/// Filter is a SQL conditional expression used to figure out which rows should be visible
|
||||
/// for user or available for modification. If the expression returns NULL or false for some rows
|
||||
|
@ -71,7 +71,7 @@ namespace
|
||||
SCOPE_EXIT(
|
||||
{
|
||||
if (!succeeded)
|
||||
std::filesystem::remove(tmp_file_path);
|
||||
(void)std::filesystem::remove(tmp_file_path);
|
||||
});
|
||||
|
||||
/// Write the file.
|
||||
@ -302,7 +302,7 @@ void DiskAccessStorage::writeLists()
|
||||
}
|
||||
|
||||
/// The list files was successfully written, we don't need the 'need_rebuild_lists.mark' file any longer.
|
||||
std::filesystem::remove(getNeedRebuildListsMarkFilePath(directory_path));
|
||||
(void)std::filesystem::remove(getNeedRebuildListsMarkFilePath(directory_path));
|
||||
types_of_lists_to_write.clear();
|
||||
}
|
||||
|
||||
@ -419,7 +419,7 @@ void DiskAccessStorage::removeAllExceptInMemory(const boost::container::flat_set
|
||||
const auto & id = it->first;
|
||||
++it; /// We must go to the next element in the map `entries_by_id` here because otherwise removeNoLock() can invalidate our iterator.
|
||||
if (!ids_to_keep.contains(id))
|
||||
removeNoLock(id, /* throw_if_not_exists */ true, /* write_on_disk= */ false);
|
||||
(void)removeNoLock(id, /* throw_if_not_exists */ true, /* write_on_disk= */ false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -549,7 +549,7 @@ bool DiskAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr & ne
|
||||
if (name_collision && (id_by_name != id))
|
||||
{
|
||||
assert(replace_if_exists);
|
||||
removeNoLock(id_by_name, /* throw_if_not_exists= */ false, write_on_disk);
|
||||
removeNoLock(id_by_name, /* throw_if_not_exists= */ false, write_on_disk); // NOLINT
|
||||
}
|
||||
|
||||
if (id_collision)
|
||||
@ -574,7 +574,7 @@ bool DiskAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr & ne
|
||||
return true;
|
||||
}
|
||||
|
||||
removeNoLock(id, /* throw_if_not_exists= */ false, write_on_disk);
|
||||
removeNoLock(id, /* throw_if_not_exists= */ false, write_on_disk); // NOLINT
|
||||
}
|
||||
|
||||
/// Do insertion.
|
||||
|
@ -161,9 +161,9 @@ void GrantedRoles::makeUnion(const GrantedRoles & other)
|
||||
|
||||
void GrantedRoles::makeIntersection(const GrantedRoles & other)
|
||||
{
|
||||
boost::range::remove_erase_if(roles, [&other](const UUID & id) { return other.roles.find(id) == other.roles.end(); });
|
||||
boost::range::remove_erase_if(roles, [&other](const UUID & id) { return other.roles.find(id) == other.roles.end(); }); // NOLINT
|
||||
|
||||
boost::range::remove_erase_if(roles_with_admin_option, [&other](const UUID & id)
|
||||
boost::range::remove_erase_if(roles_with_admin_option, [&other](const UUID & id) // NOLINT
|
||||
{
|
||||
return other.roles_with_admin_option.find(id) == other.roles_with_admin_option.end();
|
||||
});
|
||||
|
@ -583,7 +583,7 @@ void IAccessStorage::backup(BackupEntriesCollector & backup_entries_collector, c
|
||||
throwBackupNotAllowed();
|
||||
|
||||
auto entities = readAllWithIDs(type);
|
||||
boost::range::remove_erase_if(entities, [](const std::pair<UUID, AccessEntityPtr> & x) { return !x.second->isBackupAllowed(); });
|
||||
std::erase_if(entities, [](const std::pair<UUID, AccessEntityPtr> & x) { return !x.second->isBackupAllowed(); });
|
||||
|
||||
if (entities.empty())
|
||||
return;
|
||||
|
@ -24,7 +24,7 @@ namespace DB
|
||||
struct User;
|
||||
class Credentials;
|
||||
class ExternalAuthenticators;
|
||||
enum class AuthenticationType;
|
||||
enum class AuthenticationType : uint8_t;
|
||||
class BackupEntriesCollector;
|
||||
class RestorerFromBackup;
|
||||
|
||||
|
@ -76,7 +76,7 @@ void LDAPAccessStorage::setConfiguration(const Poco::Util::AbstractConfiguration
|
||||
config.keys(prefix, all_keys);
|
||||
for (const auto & key : all_keys)
|
||||
{
|
||||
if (key == "role_mapping" || key.find("role_mapping[") == 0)
|
||||
if (key == "role_mapping" || key.starts_with("role_mapping["))
|
||||
parseLDAPRoleSearchParams(role_search_params_cfg.emplace_back(), config, prefix_str + key);
|
||||
}
|
||||
}
|
||||
@ -94,7 +94,7 @@ void LDAPAccessStorage::setConfiguration(const Poco::Util::AbstractConfiguration
|
||||
role_change_subscription = access_control.subscribeForChanges<Role>(
|
||||
[this] (const UUID & id, const AccessEntityPtr & entity)
|
||||
{
|
||||
return this->processRoleChange(id, entity);
|
||||
this->processRoleChange(id, entity);
|
||||
}
|
||||
);
|
||||
}
|
||||
@ -200,7 +200,7 @@ void LDAPAccessStorage::applyRoleChangeNoLock(bool grant, const UUID & role_id,
|
||||
void LDAPAccessStorage::assignRolesNoLock(User & user, const LDAPClient::SearchResultsList & external_roles) const
|
||||
{
|
||||
const auto external_roles_hash = boost::hash<LDAPClient::SearchResultsList>{}(external_roles);
|
||||
return assignRolesNoLock(user, external_roles, external_roles_hash);
|
||||
assignRolesNoLock(user, external_roles, external_roles_hash);
|
||||
}
|
||||
|
||||
|
||||
|
@ -26,7 +26,7 @@ class LDAPClient
|
||||
public:
|
||||
struct SearchParams
|
||||
{
|
||||
enum class Scope
|
||||
enum class Scope : uint8_t
|
||||
{
|
||||
BASE,
|
||||
ONE_LEVEL,
|
||||
@ -57,20 +57,20 @@ public:
|
||||
|
||||
struct Params
|
||||
{
|
||||
enum class ProtocolVersion
|
||||
enum class ProtocolVersion : uint8_t
|
||||
{
|
||||
V2,
|
||||
V3
|
||||
};
|
||||
|
||||
enum class TLSEnable
|
||||
enum class TLSEnable : uint8_t
|
||||
{
|
||||
NO,
|
||||
YES_STARTTLS,
|
||||
YES
|
||||
};
|
||||
|
||||
enum class TLSProtocolVersion
|
||||
enum class TLSProtocolVersion : uint8_t
|
||||
{
|
||||
SSL2,
|
||||
SSL3,
|
||||
@ -79,7 +79,7 @@ public:
|
||||
TLS1_2
|
||||
};
|
||||
|
||||
enum class TLSRequireCert
|
||||
enum class TLSRequireCert : uint8_t
|
||||
{
|
||||
NEVER,
|
||||
ALLOW,
|
||||
@ -87,7 +87,7 @@ public:
|
||||
DEMAND
|
||||
};
|
||||
|
||||
enum class SASLMechanism
|
||||
enum class SASLMechanism : uint8_t
|
||||
{
|
||||
UNKNOWN,
|
||||
SIMPLE
|
||||
|
@ -106,7 +106,7 @@ bool MemoryAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr &
|
||||
if (name_collision && (id_by_name != id))
|
||||
{
|
||||
assert(replace_if_exists);
|
||||
removeNoLock(id_by_name, /* throw_if_not_exists= */ true);
|
||||
removeNoLock(id_by_name, /* throw_if_not_exists= */ true); // NOLINT
|
||||
}
|
||||
|
||||
if (id_collision)
|
||||
@ -128,7 +128,7 @@ bool MemoryAccessStorage::insertNoLock(const UUID & id, const AccessEntityPtr &
|
||||
}
|
||||
return true;
|
||||
}
|
||||
removeNoLock(id, /* throw_if_not_exists= */ true);
|
||||
removeNoLock(id, /* throw_if_not_exists= */ true); // NOLINT
|
||||
}
|
||||
|
||||
/// Do insertion.
|
||||
@ -238,7 +238,7 @@ void MemoryAccessStorage::removeAllExceptNoLock(const boost::container::flat_set
|
||||
const auto & id = it->first;
|
||||
++it; /// We must go to the next element in the map `entries_by_id` here because otherwise removeNoLock() can invalidate our iterator.
|
||||
if (!ids_to_keep.contains(id))
|
||||
removeNoLock(id, /* throw_if_not_exists */ true);
|
||||
removeNoLock(id, /* throw_if_not_exists */ true); // NOLINT
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -238,7 +238,7 @@ void MultipleAccessStorage::moveAccessEntities(const std::vector<UUID> & ids, co
|
||||
|
||||
try
|
||||
{
|
||||
source_storage->remove(ids);
|
||||
source_storage->remove(ids); // NOLINT
|
||||
need_rollback = true;
|
||||
destination_storage->insert(to_move, ids);
|
||||
}
|
||||
|
@ -616,7 +616,7 @@ void ReplicatedAccessStorage::setEntityNoLock(const UUID & id, const AccessEntit
|
||||
void ReplicatedAccessStorage::removeEntityNoLock(const UUID & id)
|
||||
{
|
||||
LOG_DEBUG(getLogger(), "Removing entity with id {}", toString(id));
|
||||
memory_storage.remove(id, /* throw_if_not_exists= */ false);
|
||||
memory_storage.remove(id, /* throw_if_not_exists= */ false); // NOLINT
|
||||
}
|
||||
|
||||
|
||||
@ -654,7 +654,7 @@ void ReplicatedAccessStorage::backup(BackupEntriesCollector & backup_entries_col
|
||||
throwBackupNotAllowed();
|
||||
|
||||
auto entities = readAllWithIDs(type);
|
||||
boost::range::remove_erase_if(entities, [](const std::pair<UUID, AccessEntityPtr> & x) { return !x.second->isBackupAllowed(); });
|
||||
std::erase_if(entities, [](const std::pair<UUID, AccessEntityPtr> & x) { return !x.second->isBackupAllowed(); });
|
||||
|
||||
if (entities.empty())
|
||||
return;
|
||||
|
@ -190,11 +190,11 @@ void SettingsConstraints::check(const Settings & current_settings, const Setting
|
||||
|
||||
void SettingsConstraints::check(const Settings & current_settings, SettingsChanges & changes, SettingSource source) const
|
||||
{
|
||||
boost::range::remove_erase_if(
|
||||
std::erase_if(
|
||||
changes,
|
||||
[&](SettingChange & change) -> bool
|
||||
{
|
||||
return !checkImpl(current_settings, const_cast<SettingChange &>(change), THROW_ON_VIOLATION, source);
|
||||
return !checkImpl(current_settings, change, THROW_ON_VIOLATION, source);
|
||||
});
|
||||
}
|
||||
|
||||
@ -211,7 +211,7 @@ void SettingsConstraints::check(const MergeTreeSettings & current_settings, cons
|
||||
|
||||
void SettingsConstraints::clamp(const Settings & current_settings, SettingsChanges & changes, SettingSource source) const
|
||||
{
|
||||
boost::range::remove_erase_if(
|
||||
std::erase_if(
|
||||
changes,
|
||||
[&](SettingChange & change) -> bool
|
||||
{
|
||||
|
@ -269,9 +269,9 @@ struct AggregateFunctionFlameGraphData
|
||||
|
||||
using Entries = HashMap<UInt64, Pair>;
|
||||
|
||||
AggregateFunctionFlameGraphTree tree;
|
||||
Entries entries;
|
||||
Entry * free_list = nullptr;
|
||||
AggregateFunctionFlameGraphTree tree;
|
||||
|
||||
Entry * alloc(Arena * arena)
|
||||
{
|
||||
|
@ -43,7 +43,7 @@ namespace ErrorCodes
|
||||
namespace
|
||||
{
|
||||
|
||||
enum class Sampler
|
||||
enum class Sampler : uint8_t
|
||||
{
|
||||
NONE,
|
||||
RNG,
|
||||
@ -735,14 +735,14 @@ IAggregateFunction * createWithNumericOrTimeType(const IDataType & argument_type
|
||||
template <typename Trait, typename ... TArgs>
|
||||
inline AggregateFunctionPtr createAggregateFunctionGroupArrayImpl(const DataTypePtr & argument_type, const Array & parameters, TArgs ... args)
|
||||
{
|
||||
if (auto res = createWithNumericOrTimeType<GroupArrayNumericImpl, Trait>(*argument_type, argument_type, parameters, std::forward<TArgs>(args)...))
|
||||
if (auto res = createWithNumericOrTimeType<GroupArrayNumericImpl, Trait>(*argument_type, argument_type, parameters, args...))
|
||||
return AggregateFunctionPtr(res);
|
||||
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::String)
|
||||
return std::make_shared<GroupArrayGeneralImpl<GroupArrayNodeString, Trait>>(argument_type, parameters, std::forward<TArgs>(args)...);
|
||||
return std::make_shared<GroupArrayGeneralImpl<GroupArrayNodeString, Trait>>(argument_type, parameters, args...);
|
||||
|
||||
return std::make_shared<GroupArrayGeneralImpl<GroupArrayNodeGeneral, Trait>>(argument_type, parameters, std::forward<TArgs>(args)...);
|
||||
return std::make_shared<GroupArrayGeneralImpl<GroupArrayNodeGeneral, Trait>>(argument_type, parameters, args...);
|
||||
}
|
||||
|
||||
size_t getMaxArraySize()
|
||||
|
@ -47,7 +47,7 @@ namespace ErrorCodes
|
||||
namespace
|
||||
{
|
||||
|
||||
enum class GroupArraySortedStrategy
|
||||
enum class GroupArraySortedStrategy : uint8_t
|
||||
{
|
||||
heap,
|
||||
sort
|
||||
@ -374,10 +374,10 @@ AggregateFunctionPtr createWithNumericOrTimeType(const IDataType & argument_type
|
||||
template <template <typename> class AggregateFunctionTemplate, typename ... TArgs>
|
||||
inline AggregateFunctionPtr createAggregateFunctionGroupArraySortedImpl(const DataTypePtr & argument_type, const Array & parameters, TArgs ... args)
|
||||
{
|
||||
if (auto res = createWithNumericOrTimeType<AggregateFunctionTemplate>(*argument_type, argument_type, parameters, std::forward<TArgs>(args)...))
|
||||
if (auto res = createWithNumericOrTimeType<AggregateFunctionTemplate>(*argument_type, argument_type, parameters, args...))
|
||||
return AggregateFunctionPtr(res);
|
||||
|
||||
return std::make_shared<AggregateFunctionTemplate<Field>>(argument_type, parameters, std::forward<TArgs>(args)...);
|
||||
return std::make_shared<AggregateFunctionTemplate<Field>>(argument_type, parameters, args...);
|
||||
}
|
||||
|
||||
AggregateFunctionPtr createAggregateFunctionGroupArray(
|
||||
|
@ -275,16 +275,16 @@ template <typename HasLimit, typename ... TArgs>
|
||||
IAggregateFunction * createWithExtraTypes(const DataTypePtr & argument_type, TArgs && ... args)
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionGroupUniqArrayDate<HasLimit>(argument_type, std::forward<TArgs>(args)...);
|
||||
else if (which.idx == TypeIndex::DateTime) return new AggregateFunctionGroupUniqArrayDateTime<HasLimit>(argument_type, std::forward<TArgs>(args)...);
|
||||
else if (which.idx == TypeIndex::IPv4) return new AggregateFunctionGroupUniqArrayIPv4<HasLimit>(argument_type, std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionGroupUniqArrayDate<HasLimit>(argument_type, args...);
|
||||
else if (which.idx == TypeIndex::DateTime) return new AggregateFunctionGroupUniqArrayDateTime<HasLimit>(argument_type, args...);
|
||||
else if (which.idx == TypeIndex::IPv4) return new AggregateFunctionGroupUniqArrayIPv4<HasLimit>(argument_type, args...);
|
||||
else
|
||||
{
|
||||
/// Check that we can use plain version of AggregateFunctionGroupUniqArrayGeneric
|
||||
if (argument_type->isValueUnambiguouslyRepresentedInContiguousMemoryRegion())
|
||||
return new AggregateFunctionGroupUniqArrayGeneric<true, HasLimit>(argument_type, std::forward<TArgs>(args)...);
|
||||
return new AggregateFunctionGroupUniqArrayGeneric<true, HasLimit>(argument_type, args...);
|
||||
else
|
||||
return new AggregateFunctionGroupUniqArrayGeneric<false, HasLimit>(argument_type, std::forward<TArgs>(args)...);
|
||||
return new AggregateFunctionGroupUniqArrayGeneric<false, HasLimit>(argument_type, args...);
|
||||
}
|
||||
}
|
||||
|
||||
@ -292,10 +292,10 @@ template <typename HasLimit, typename ... TArgs>
|
||||
inline AggregateFunctionPtr createAggregateFunctionGroupUniqArrayImpl(const std::string & name, const DataTypePtr & argument_type, TArgs ... args)
|
||||
{
|
||||
|
||||
AggregateFunctionPtr res(createWithNumericType<AggregateFunctionGroupUniqArray, HasLimit, const DataTypePtr &, TArgs...>(*argument_type, argument_type, std::forward<TArgs>(args)...));
|
||||
AggregateFunctionPtr res(createWithNumericType<AggregateFunctionGroupUniqArray, HasLimit, const DataTypePtr &>(*argument_type, argument_type, args...));
|
||||
|
||||
if (!res)
|
||||
res = AggregateFunctionPtr(createWithExtraTypes<HasLimit>(argument_type, std::forward<TArgs>(args)...));
|
||||
res = AggregateFunctionPtr(createWithExtraTypes<HasLimit>(argument_type, args...));
|
||||
|
||||
if (!res)
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of argument for aggregate function {}",
|
||||
|
@ -31,7 +31,7 @@ namespace
|
||||
|
||||
struct KolmogorovSmirnov : public StatisticalSample<Float64, Float64>
|
||||
{
|
||||
enum class Alternative
|
||||
enum class Alternative : uint8_t
|
||||
{
|
||||
TwoSided,
|
||||
Less,
|
||||
|
@ -120,8 +120,7 @@ struct LargestTriangleThreeBucketsData : public StatisticalSample<Float64, Float
|
||||
// the end index of next bucket
|
||||
size_t end_index = 1 + static_cast<int>(floor(single_bucket_size * (i + 2)));
|
||||
// current bucket is the last bucket
|
||||
if (end_index > this->x.size())
|
||||
end_index = this->x.size();
|
||||
end_index = std::min(end_index, this->x.size());
|
||||
|
||||
// Compute the average point in the next bucket
|
||||
Float64 avg_x = 0;
|
||||
|
@ -39,7 +39,7 @@ struct MannWhitneyData : public StatisticalSample<Float64, Float64>
|
||||
*the probability of X being greater than Y is equal to the probability of Y being greater than X".
|
||||
*Or "the distribution F of first sample equals to the distribution G of second sample".
|
||||
*Then alternative for this hypothesis (H1) is "two-sided"(F != G), "less"(F < G), "greater" (F > G). */
|
||||
enum class Alternative
|
||||
enum class Alternative : uint8_t
|
||||
{
|
||||
TwoSided,
|
||||
Less,
|
||||
|
@ -48,7 +48,7 @@ struct MaxIntersectionsData
|
||||
Array value;
|
||||
};
|
||||
|
||||
enum class AggregateFunctionIntersectionsKind
|
||||
enum class AggregateFunctionIntersectionsKind : uint8_t
|
||||
{
|
||||
Count,
|
||||
Position
|
||||
|
@ -184,7 +184,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
enum class PatternActionType
|
||||
enum class PatternActionType : uint8_t
|
||||
{
|
||||
SpecificEvent,
|
||||
AnyEvent,
|
||||
@ -577,7 +577,7 @@ protected:
|
||||
}
|
||||
|
||||
private:
|
||||
enum class DFATransition : char
|
||||
enum class DFATransition : uint8_t
|
||||
{
|
||||
/// .-------.
|
||||
/// | |
|
||||
|
@ -41,13 +41,13 @@ namespace ErrorCodes
|
||||
namespace
|
||||
{
|
||||
|
||||
enum class SequenceDirection
|
||||
enum class SequenceDirection : uint8_t
|
||||
{
|
||||
Forward,
|
||||
Backward,
|
||||
};
|
||||
|
||||
enum SequenceBase
|
||||
enum SequenceBase : uint8_t
|
||||
{
|
||||
Head,
|
||||
Tail,
|
||||
|
@ -104,7 +104,7 @@ struct AggregateFunctionVarianceData
|
||||
Float64 m2 = 0.0;
|
||||
};
|
||||
|
||||
enum class VarKind
|
||||
enum class VarKind : uint8_t
|
||||
{
|
||||
varSampStable,
|
||||
stddevSampStable,
|
||||
@ -343,7 +343,7 @@ struct CovarianceData : public BaseCovarianceData<compute_marginal_moments>
|
||||
Float64 co_moment = 0.0;
|
||||
};
|
||||
|
||||
enum class CovarKind
|
||||
enum class CovarKind : uint8_t
|
||||
{
|
||||
covarSampStable,
|
||||
covarPopStable,
|
||||
|
@ -35,7 +35,7 @@ namespace DB
|
||||
|
||||
struct Settings;
|
||||
|
||||
enum class StatisticsFunctionKind
|
||||
enum class StatisticsFunctionKind : uint8_t
|
||||
{
|
||||
varPop, varSamp,
|
||||
stddevPop, stddevSamp,
|
||||
|
@ -20,7 +20,7 @@ namespace ErrorCodes
|
||||
namespace
|
||||
{
|
||||
|
||||
enum class StatisticsMatrixFunctionKind
|
||||
enum class StatisticsMatrixFunctionKind : uint8_t
|
||||
{
|
||||
covarPopMatrix,
|
||||
covarSampMatrix,
|
||||
|
@ -7,7 +7,7 @@ namespace DB
|
||||
namespace
|
||||
{
|
||||
|
||||
enum class Kind
|
||||
enum class Kind : uint8_t
|
||||
{
|
||||
OrNull,
|
||||
OrDefault
|
||||
|
@ -200,7 +200,7 @@ public:
|
||||
throw Exception(ErrorCodes::INCORRECT_DATA, "Invalid flag for zero count");
|
||||
}
|
||||
readBinary(zero_count, buf);
|
||||
count = static_cast<Float64>(negative_store->count + zero_count + store->count);
|
||||
count = negative_store->count + zero_count + store->count;
|
||||
}
|
||||
|
||||
/// NOLINTEND(readability-static-accessed-through-instance)
|
||||
|
@ -14,11 +14,11 @@ static IAggregateFunction * createWithNumericType(const IDataType & argument_typ
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE>(args...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8>(args...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -27,11 +27,11 @@ static IAggregateFunction * createWithNumericType(const IDataType & argument_typ
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<Data<TYPE>>(std::forward<TArgs>(args)...); /// NOLINT
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<Data<TYPE>>(args...); /// NOLINT
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Data<Int8>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Data<Int16>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Data<Int8>>(args...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Data<Int16>>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -40,11 +40,11 @@ static IAggregateFunction * createWithNumericType(const IDataType & argument_typ
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, bool_param>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, bool_param>(args...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8, bool_param>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16, bool_param>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8, bool_param>(args...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16, bool_param>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -53,11 +53,11 @@ static IAggregateFunction * createWithNumericType(const IDataType & argument_typ
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, Data>(args...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8, Data>(args...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16, Data>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -66,11 +66,11 @@ static IAggregateFunction * createWithNumericType(const IDataType & argument_typ
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, Data<TYPE>>(std::forward<TArgs>(args)...); /// NOLINT
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, Data<TYPE>>(args...); /// NOLINT
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8, Data<Int8>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16, Data<Int16>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8, Data<Int8>>(args...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16, Data<Int16>>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -79,11 +79,11 @@ static IAggregateFunction * createWithNumericType(const IDataType & argument_typ
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, Data<TYPE, bool_param>>(std::forward<TArgs>(args)...); /// NOLINT
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<TYPE, Data<TYPE, bool_param>>(args...); /// NOLINT
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8, Data<Int8, bool_param>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16, Data<Int16, bool_param>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<Int8, Data<Int8, bool_param>>(args...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<Int16, Data<Int16, bool_param>>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -91,12 +91,12 @@ template <template <typename, typename> class AggregateFunctionTemplate, templat
|
||||
static IAggregateFunction * createWithUnsignedIntegerType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::UInt8) return new AggregateFunctionTemplate<UInt8, Data<UInt8>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UInt16) return new AggregateFunctionTemplate<UInt16, Data<UInt16>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UInt32) return new AggregateFunctionTemplate<UInt32, Data<UInt32>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UInt64) return new AggregateFunctionTemplate<UInt64, Data<UInt64>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UInt128) return new AggregateFunctionTemplate<UInt128, Data<UInt128>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UInt256) return new AggregateFunctionTemplate<UInt256, Data<UInt256>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UInt8) return new AggregateFunctionTemplate<UInt8, Data<UInt8>>(args...);
|
||||
if (which.idx == TypeIndex::UInt16) return new AggregateFunctionTemplate<UInt16, Data<UInt16>>(args...);
|
||||
if (which.idx == TypeIndex::UInt32) return new AggregateFunctionTemplate<UInt32, Data<UInt32>>(args...);
|
||||
if (which.idx == TypeIndex::UInt64) return new AggregateFunctionTemplate<UInt64, Data<UInt64>>(args...);
|
||||
if (which.idx == TypeIndex::UInt128) return new AggregateFunctionTemplate<UInt128, Data<UInt128>>(args...);
|
||||
if (which.idx == TypeIndex::UInt256) return new AggregateFunctionTemplate<UInt256, Data<UInt256>>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -104,22 +104,22 @@ template <template <typename, typename> class AggregateFunctionTemplate, templat
|
||||
static IAggregateFunction * createWithSignedIntegerType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::Int8) return new AggregateFunctionTemplate<Int8, Data<Int8>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Int16) return new AggregateFunctionTemplate<Int16, Data<Int16>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Int32) return new AggregateFunctionTemplate<Int32, Data<Int32>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Int64) return new AggregateFunctionTemplate<Int64, Data<Int64>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Int128) return new AggregateFunctionTemplate<Int128, Data<Int128>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Int256) return new AggregateFunctionTemplate<Int256, Data<Int256>>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Int8) return new AggregateFunctionTemplate<Int8, Data<Int8>>(args...);
|
||||
if (which.idx == TypeIndex::Int16) return new AggregateFunctionTemplate<Int16, Data<Int16>>(args...);
|
||||
if (which.idx == TypeIndex::Int32) return new AggregateFunctionTemplate<Int32, Data<Int32>>(args...);
|
||||
if (which.idx == TypeIndex::Int64) return new AggregateFunctionTemplate<Int64, Data<Int64>>(args...);
|
||||
if (which.idx == TypeIndex::Int128) return new AggregateFunctionTemplate<Int128, Data<Int128>>(args...);
|
||||
if (which.idx == TypeIndex::Int256) return new AggregateFunctionTemplate<Int256, Data<Int256>>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template <template <typename, typename> class AggregateFunctionTemplate, template <typename> class Data, typename... TArgs>
|
||||
static IAggregateFunction * createWithIntegerType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
IAggregateFunction * f = createWithUnsignedIntegerType<AggregateFunctionTemplate, Data>(argument_type, std::forward<TArgs>(args)...);
|
||||
IAggregateFunction * f = createWithUnsignedIntegerType<AggregateFunctionTemplate, Data>(argument_type, args...);
|
||||
if (f)
|
||||
return f;
|
||||
return createWithSignedIntegerType<AggregateFunctionTemplate, Data>(argument_type, std::forward<TArgs>(args)...);
|
||||
return createWithSignedIntegerType<AggregateFunctionTemplate, Data>(argument_type, args...);
|
||||
}
|
||||
|
||||
template <template <typename, typename> class AggregateFunctionTemplate, template <typename> class Data, typename... TArgs>
|
||||
@ -128,14 +128,14 @@ static IAggregateFunction * createWithBasicNumberOrDateOrDateTime(const IDataTyp
|
||||
WhichDataType which(argument_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) \
|
||||
return new AggregateFunctionTemplate<TYPE, Data<TYPE>>(std::forward<TArgs>(args)...); /// NOLINT
|
||||
return new AggregateFunctionTemplate<TYPE, Data<TYPE>>(args...); /// NOLINT
|
||||
FOR_BASIC_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
|
||||
if (which.idx == TypeIndex::Date)
|
||||
return new AggregateFunctionTemplate<UInt16, Data<UInt16>>(std::forward<TArgs>(args)...);
|
||||
return new AggregateFunctionTemplate<UInt16, Data<UInt16>>(args...);
|
||||
if (which.idx == TypeIndex::DateTime)
|
||||
return new AggregateFunctionTemplate<UInt32, Data<UInt32>>(std::forward<TArgs>(args)...);
|
||||
return new AggregateFunctionTemplate<UInt32, Data<UInt32>>(args...);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
@ -143,17 +143,17 @@ static IAggregateFunction * createWithBasicNumberOrDateOrDateTime(const IDataTyp
|
||||
template <template <typename> class AggregateFunctionTemplate, typename... TArgs>
|
||||
static IAggregateFunction * createWithNumericBasedType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
IAggregateFunction * f = createWithNumericType<AggregateFunctionTemplate>(argument_type, std::forward<TArgs>(args)...);
|
||||
IAggregateFunction * f = createWithNumericType<AggregateFunctionTemplate>(argument_type, args...);
|
||||
if (f)
|
||||
return f;
|
||||
|
||||
/// expects that DataTypeDate based on UInt16, DataTypeDateTime based on UInt32
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionTemplate<UInt16>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::DateTime) return new AggregateFunctionTemplate<UInt32>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::UUID) return new AggregateFunctionTemplate<UUID>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::IPv4) return new AggregateFunctionTemplate<IPv4>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::IPv6) return new AggregateFunctionTemplate<IPv6>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionTemplate<UInt16>(args...);
|
||||
if (which.idx == TypeIndex::DateTime) return new AggregateFunctionTemplate<UInt32>(args...);
|
||||
if (which.idx == TypeIndex::UUID) return new AggregateFunctionTemplate<UUID>(args...);
|
||||
if (which.idx == TypeIndex::IPv4) return new AggregateFunctionTemplate<IPv4>(args...);
|
||||
if (which.idx == TypeIndex::IPv6) return new AggregateFunctionTemplate<IPv6>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -161,12 +161,12 @@ template <template <typename> class AggregateFunctionTemplate, typename... TArgs
|
||||
static IAggregateFunction * createWithDecimalType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::Decimal32) return new AggregateFunctionTemplate<Decimal32>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Decimal64) return new AggregateFunctionTemplate<Decimal64>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Decimal128) return new AggregateFunctionTemplate<Decimal128>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Decimal256) return new AggregateFunctionTemplate<Decimal256>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Decimal32) return new AggregateFunctionTemplate<Decimal32>(args...);
|
||||
if (which.idx == TypeIndex::Decimal64) return new AggregateFunctionTemplate<Decimal64>(args...);
|
||||
if (which.idx == TypeIndex::Decimal128) return new AggregateFunctionTemplate<Decimal128>(args...);
|
||||
if (which.idx == TypeIndex::Decimal256) return new AggregateFunctionTemplate<Decimal256>(args...);
|
||||
if constexpr (AggregateFunctionTemplate<DateTime64>::DateTime64Supported)
|
||||
if (which.idx == TypeIndex::DateTime64) return new AggregateFunctionTemplate<DateTime64>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::DateTime64) return new AggregateFunctionTemplate<DateTime64>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -174,12 +174,12 @@ template <template <typename, typename> class AggregateFunctionTemplate, typenam
|
||||
static IAggregateFunction * createWithDecimalType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::Decimal32) return new AggregateFunctionTemplate<Decimal32, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Decimal64) return new AggregateFunctionTemplate<Decimal64, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Decimal128) return new AggregateFunctionTemplate<Decimal128, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Decimal256) return new AggregateFunctionTemplate<Decimal256, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Decimal32) return new AggregateFunctionTemplate<Decimal32, Data>(args...);
|
||||
if (which.idx == TypeIndex::Decimal64) return new AggregateFunctionTemplate<Decimal64, Data>(args...);
|
||||
if (which.idx == TypeIndex::Decimal128) return new AggregateFunctionTemplate<Decimal128, Data>(args...);
|
||||
if (which.idx == TypeIndex::Decimal256) return new AggregateFunctionTemplate<Decimal256, Data>(args...);
|
||||
if constexpr (AggregateFunctionTemplate<DateTime64, Data>::DateTime64Supported)
|
||||
if (which.idx == TypeIndex::DateTime64) return new AggregateFunctionTemplate<DateTime64, Data>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::DateTime64) return new AggregateFunctionTemplate<DateTime64, Data>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -190,11 +190,11 @@ static IAggregateFunction * createWithTwoNumericTypesSecond(const IDataType & se
|
||||
{
|
||||
WhichDataType which(second_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<FirstType, TYPE>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<FirstType, TYPE>(args...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<FirstType, Int8>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<FirstType, Int16>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<FirstType, Int8>(args...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<FirstType, Int16>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -204,13 +204,13 @@ static IAggregateFunction * createWithTwoNumericTypes(const IDataType & first_ty
|
||||
WhichDataType which(first_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) \
|
||||
return createWithTwoNumericTypesSecond<TYPE, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return createWithTwoNumericTypesSecond<TYPE, AggregateFunctionTemplate>(second_type, args...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8)
|
||||
return createWithTwoNumericTypesSecond<Int8, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return createWithTwoNumericTypesSecond<Int8, AggregateFunctionTemplate>(second_type, args...);
|
||||
if (which.idx == TypeIndex::Enum16)
|
||||
return createWithTwoNumericTypesSecond<Int16, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return createWithTwoNumericTypesSecond<Int16, AggregateFunctionTemplate>(second_type, args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -219,7 +219,7 @@ static IAggregateFunction * createWithTwoBasicNumericTypesSecond(const IDataType
|
||||
{
|
||||
WhichDataType which(second_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<FirstType, TYPE>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<FirstType, TYPE>(args...);
|
||||
FOR_BASIC_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
return nullptr;
|
||||
@ -231,7 +231,7 @@ static IAggregateFunction * createWithTwoBasicNumericTypes(const IDataType & fir
|
||||
WhichDataType which(first_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) \
|
||||
return createWithTwoBasicNumericTypesSecond<TYPE, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return createWithTwoBasicNumericTypesSecond<TYPE, AggregateFunctionTemplate>(second_type, args...);
|
||||
FOR_BASIC_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
return nullptr;
|
||||
@ -242,15 +242,15 @@ static IAggregateFunction * createWithTwoNumericOrDateTypesSecond(const IDataTyp
|
||||
{
|
||||
WhichDataType which(second_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<FirstType, TYPE>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::TYPE) return new AggregateFunctionTemplate<FirstType, TYPE>(args...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<FirstType, Int8>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<FirstType, Int16>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Enum8) return new AggregateFunctionTemplate<FirstType, Int8>(args...);
|
||||
if (which.idx == TypeIndex::Enum16) return new AggregateFunctionTemplate<FirstType, Int16>(args...);
|
||||
|
||||
/// expects that DataTypeDate based on UInt16, DataTypeDateTime based on UInt32
|
||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionTemplate<FirstType, UInt16>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::DateTime) return new AggregateFunctionTemplate<FirstType, UInt32>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionTemplate<FirstType, UInt16>(args...);
|
||||
if (which.idx == TypeIndex::DateTime) return new AggregateFunctionTemplate<FirstType, UInt32>(args...);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
@ -261,19 +261,19 @@ static IAggregateFunction * createWithTwoNumericOrDateTypes(const IDataType & fi
|
||||
WhichDataType which(first_type);
|
||||
#define DISPATCH(TYPE) \
|
||||
if (which.idx == TypeIndex::TYPE) \
|
||||
return createWithTwoNumericOrDateTypesSecond<TYPE, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return createWithTwoNumericOrDateTypesSecond<TYPE, AggregateFunctionTemplate>(second_type, args...);
|
||||
FOR_NUMERIC_TYPES(DISPATCH)
|
||||
#undef DISPATCH
|
||||
if (which.idx == TypeIndex::Enum8)
|
||||
return createWithTwoNumericOrDateTypesSecond<Int8, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return createWithTwoNumericOrDateTypesSecond<Int8, AggregateFunctionTemplate>(second_type, args...);
|
||||
if (which.idx == TypeIndex::Enum16)
|
||||
return createWithTwoNumericOrDateTypesSecond<Int16, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return createWithTwoNumericOrDateTypesSecond<Int16, AggregateFunctionTemplate>(second_type, args...);
|
||||
|
||||
/// expects that DataTypeDate based on UInt16, DataTypeDateTime based on UInt32
|
||||
if (which.idx == TypeIndex::Date)
|
||||
return createWithTwoNumericOrDateTypesSecond<UInt16, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return createWithTwoNumericOrDateTypesSecond<UInt16, AggregateFunctionTemplate>(second_type, args...);
|
||||
if (which.idx == TypeIndex::DateTime)
|
||||
return createWithTwoNumericOrDateTypesSecond<UInt32, AggregateFunctionTemplate>(second_type, std::forward<TArgs>(args)...);
|
||||
return createWithTwoNumericOrDateTypesSecond<UInt32, AggregateFunctionTemplate>(second_type, args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -281,8 +281,8 @@ template <template <typename> class AggregateFunctionTemplate, typename... TArgs
|
||||
static IAggregateFunction * createWithStringType(const IDataType & argument_type, TArgs && ... args)
|
||||
{
|
||||
WhichDataType which(argument_type);
|
||||
if (which.idx == TypeIndex::String) return new AggregateFunctionTemplate<String>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::FixedString) return new AggregateFunctionTemplate<String>(std::forward<TArgs>(args)...);
|
||||
if (which.idx == TypeIndex::String) return new AggregateFunctionTemplate<String>(args...);
|
||||
if (which.idx == TypeIndex::FixedString) return new AggregateFunctionTemplate<String>(args...);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -234,8 +234,7 @@ public:
|
||||
BetterFloat qr = (sum + l_count + r->count * 0.5) / count;
|
||||
BetterFloat err2 = qr * (1 - qr);
|
||||
|
||||
if (err > err2)
|
||||
err = err2;
|
||||
err = std::min(err, err2);
|
||||
|
||||
BetterFloat k = count_epsilon_4 * err;
|
||||
|
||||
|
@ -50,7 +50,7 @@ namespace detail
|
||||
}
|
||||
|
||||
/// What if there is not a single value - throw an exception, or return 0 or NaN in the case of double?
|
||||
enum class ReservoirSamplerDeterministicOnEmpty
|
||||
enum class ReservoirSamplerDeterministicOnEmpty : uint8_t
|
||||
{
|
||||
THROW,
|
||||
RETURN_NAN_OR_ZERO,
|
||||
@ -161,8 +161,7 @@ public:
|
||||
readBinaryLittleEndian(total_values, buf);
|
||||
|
||||
/// Compatibility with old versions.
|
||||
if (size > total_values)
|
||||
size = total_values;
|
||||
size = std::min(size, total_values);
|
||||
|
||||
static constexpr size_t MAX_RESERVOIR_SIZE = 1_GiB;
|
||||
if (unlikely(size > MAX_RESERVOIR_SIZE))
|
||||
|
@ -61,7 +61,7 @@ namespace DB
|
||||
*/
|
||||
|
||||
/// Column transformer type
|
||||
enum class ColumnTransfomerType
|
||||
enum class ColumnTransfomerType : uint8_t
|
||||
{
|
||||
APPLY,
|
||||
EXCEPT,
|
||||
@ -98,7 +98,7 @@ protected:
|
||||
explicit IColumnTransformerNode(size_t children_size);
|
||||
};
|
||||
|
||||
enum class ApplyColumnTransformerType
|
||||
enum class ApplyColumnTransformerType : uint8_t
|
||||
{
|
||||
LAMBDA,
|
||||
FUNCTION
|
||||
@ -153,7 +153,7 @@ private:
|
||||
};
|
||||
|
||||
/// Except column transformer type
|
||||
enum class ExceptColumnTransformerType
|
||||
enum class ExceptColumnTransformerType : uint8_t
|
||||
{
|
||||
REGEXP,
|
||||
COLUMN_LIST,
|
||||
|
@ -25,7 +25,7 @@ namespace ErrorCodes
|
||||
class WriteBuffer;
|
||||
|
||||
/// Query tree node type
|
||||
enum class QueryTreeNodeType
|
||||
enum class QueryTreeNodeType : uint8_t
|
||||
{
|
||||
IDENTIFIER,
|
||||
MATCHER,
|
||||
|
@ -149,12 +149,12 @@ public:
|
||||
|
||||
void popFirst()
|
||||
{
|
||||
return popFirst(1);
|
||||
popFirst(1);
|
||||
}
|
||||
|
||||
void pop_front() /// NOLINT
|
||||
{
|
||||
return popFirst();
|
||||
popFirst();
|
||||
}
|
||||
|
||||
void popLast(size_t parts_to_remove_size)
|
||||
@ -172,7 +172,7 @@ public:
|
||||
|
||||
void popLast()
|
||||
{
|
||||
return popLast(1);
|
||||
popLast(1);
|
||||
}
|
||||
|
||||
void pop_back() /// NOLINT
|
||||
|
@ -37,7 +37,7 @@ namespace DB
|
||||
* Additionally each matcher can contain transformers, check ColumnTransformers.h.
|
||||
* In query tree matchers column transformers are represended as ListNode.
|
||||
*/
|
||||
enum class MatcherNodeType
|
||||
enum class MatcherNodeType : uint8_t
|
||||
{
|
||||
ASTERISK,
|
||||
COLUMNS_REGEXP,
|
||||
|
@ -24,7 +24,7 @@ namespace ErrorCodes
|
||||
namespace
|
||||
{
|
||||
|
||||
enum class GroupByKind
|
||||
enum class GroupByKind : uint8_t
|
||||
{
|
||||
ORDINARY,
|
||||
ROLLUP,
|
||||
@ -256,4 +256,3 @@ void GroupingFunctionsResolvePass::run(QueryTreeNodePtr & query_tree_node, Conte
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -1284,8 +1284,7 @@ private:
|
||||
resolved_identifier->formatASTForErrorMessage(),
|
||||
join_node.formatASTForErrorMessage());
|
||||
}
|
||||
if (table_side)
|
||||
result = *table_side;
|
||||
result = table_side;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -85,9 +85,9 @@ public:
|
||||
void visitImpl(QueryTreeNodePtr & node) const
|
||||
{
|
||||
if (auto * column = node->as<ColumnNode>())
|
||||
return visitColumn(column);
|
||||
visitColumn(column);
|
||||
else if (auto * function = node->as<FunctionNode>())
|
||||
return visitFunction(function);
|
||||
visitFunction(function);
|
||||
}
|
||||
private:
|
||||
void visitColumn(ColumnNode * column) const
|
||||
@ -290,7 +290,6 @@ void addQueryTreePasses(QueryTreePassManager & manager, bool only_analyze)
|
||||
|
||||
manager.addPass(std::make_unique<FuseFunctionsPass>());
|
||||
|
||||
|
||||
manager.addPass(std::make_unique<ConvertOrLikeChainPass>());
|
||||
|
||||
manager.addPass(std::make_unique<LogicalExpressionOptimizerPass>());
|
||||
@ -300,7 +299,6 @@ void addQueryTreePasses(QueryTreePassManager & manager, bool only_analyze)
|
||||
manager.addPass(std::make_unique<ShardNumColumnToFunctionPass>());
|
||||
|
||||
manager.addPass(std::make_unique<OptimizeDateOrDateTimeConverterWithPreimagePass>());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ namespace DB
|
||||
class SortNode;
|
||||
using SortNodePtr = std::shared_ptr<SortNode>;
|
||||
|
||||
enum class SortDirection
|
||||
enum class SortDirection : uint8_t
|
||||
{
|
||||
ASCENDING = 0,
|
||||
DESCENDING = 1
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
namespace DB
|
||||
{
|
||||
enum class AccessEntityType;
|
||||
enum class AccessEntityType : uint8_t;
|
||||
|
||||
/// This class is used by hosts to coordinate the access entities of ReplicatedAccessStorage they're writing to a backup.
|
||||
/// It's designed to make all hosts save the same access entities to the backup even in case the ReplicatedAccessStorage changes
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
namespace DB
|
||||
{
|
||||
enum class UserDefinedSQLObjectType;
|
||||
enum class UserDefinedSQLObjectType : uint8_t;
|
||||
|
||||
/// This class is used by hosts to coordinate the user-defined SQL objects they're going to write to a backup.
|
||||
/// It's designed to make all hosts save the same objects to the backup even in case some objects change while
|
||||
|
@ -689,7 +689,13 @@ bool BackupEntriesCollector::compareWithPrevious(String & mismatch_description)
|
||||
previous_tables_metadata = std::move(tables_metadata);
|
||||
});
|
||||
|
||||
enum class MismatchType { ADDED, REMOVED, CHANGED, NONE };
|
||||
enum class MismatchType : uint8_t
|
||||
{
|
||||
ADDED,
|
||||
REMOVED,
|
||||
CHANGED,
|
||||
NONE
|
||||
};
|
||||
|
||||
/// Helper function - used to compare the metadata of databases and tables.
|
||||
auto find_mismatch = [](const auto & metadata, const auto & previous_metadata)
|
||||
|
@ -21,7 +21,7 @@ class IBackupCoordination;
|
||||
class IDatabase;
|
||||
using DatabasePtr = std::shared_ptr<IDatabase>;
|
||||
struct StorageID;
|
||||
enum class AccessEntityType;
|
||||
enum class AccessEntityType : uint8_t;
|
||||
class QueryStatus;
|
||||
using QueryStatusPtr = std::shared_ptr<QueryStatus>;
|
||||
|
||||
|
@ -27,7 +27,7 @@ namespace
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
enum class CheckBackupResult
|
||||
enum class CheckBackupResult : uint8_t
|
||||
{
|
||||
HasPrefix,
|
||||
HasFull,
|
||||
|
@ -9,7 +9,7 @@ class IDisk;
|
||||
using DiskPtr = std::shared_ptr<IDisk>;
|
||||
class SeekableReadBuffer;
|
||||
class WriteBuffer;
|
||||
enum class WriteMode;
|
||||
enum class WriteMode : uint8_t;
|
||||
struct WriteSettings;
|
||||
struct ReadSettings;
|
||||
|
||||
|
@ -13,7 +13,7 @@ using DiskPtr = std::shared_ptr<IDisk>;
|
||||
class ReadBuffer;
|
||||
class SeekableReadBuffer;
|
||||
class WriteBuffer;
|
||||
enum class WriteMode;
|
||||
enum class WriteMode : uint8_t;
|
||||
|
||||
/// Represents operations of loading from disk or downloading for reading a backup.
|
||||
class BackupReaderDefault : public IBackupReader
|
||||
|
@ -105,17 +105,17 @@ std::unique_ptr<WriteBuffer> BackupWriterFile::writeFile(const String & file_nam
|
||||
|
||||
void BackupWriterFile::removeFile(const String & file_name)
|
||||
{
|
||||
fs::remove(root_path / file_name);
|
||||
(void)fs::remove(root_path / file_name);
|
||||
if (fs::is_directory(root_path) && fs::is_empty(root_path))
|
||||
fs::remove(root_path);
|
||||
(void)fs::remove(root_path);
|
||||
}
|
||||
|
||||
void BackupWriterFile::removeFiles(const Strings & file_names)
|
||||
{
|
||||
for (const auto & file_name : file_names)
|
||||
fs::remove(root_path / file_name);
|
||||
(void)fs::remove(root_path / file_name);
|
||||
if (fs::is_directory(root_path) && fs::is_empty(root_path))
|
||||
fs::remove(root_path);
|
||||
(void)fs::remove(root_path);
|
||||
}
|
||||
|
||||
void BackupWriterFile::copyFileFromDisk(const String & path_in_backup, DiskPtr src_disk, const String & src_path,
|
||||
|
@ -6,7 +6,7 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
enum class BackupStatus
|
||||
enum class BackupStatus : uint8_t
|
||||
{
|
||||
/// Statuses of making backups
|
||||
CREATING_BACKUP,
|
||||
|
@ -256,26 +256,26 @@ namespace
|
||||
/// 1) there should be separate thread pools for BACKUP and RESTORE;
|
||||
/// 2) a task from a thread pool can't wait another task from the same thread pool. (Because if it schedules and waits
|
||||
/// while the thread pool is still occupied with the waiting task then a scheduled task can be never executed).
|
||||
enum class BackupsWorker::ThreadPoolId
|
||||
enum class BackupsWorker::ThreadPoolId : uint8_t
|
||||
{
|
||||
/// "BACKUP ON CLUSTER ASYNC" waits in background while "BACKUP ASYNC" is finished on the nodes of the cluster, then finalizes the backup.
|
||||
BACKUP_ASYNC_ON_CLUSTER,
|
||||
BACKUP_ASYNC_ON_CLUSTER = 0,
|
||||
|
||||
/// "BACKUP ASYNC" waits in background while all file infos are built and then it copies the backup's files.
|
||||
BACKUP_ASYNC,
|
||||
BACKUP_ASYNC = 1,
|
||||
|
||||
/// Making a list of files to copy and copying of those files is always sequential, so those operations can share one thread pool.
|
||||
BACKUP_MAKE_FILES_LIST,
|
||||
BACKUP_MAKE_FILES_LIST = 2,
|
||||
BACKUP_COPY_FILES = BACKUP_MAKE_FILES_LIST,
|
||||
|
||||
/// "RESTORE ON CLUSTER ASYNC" waits in background while "BACKUP ASYNC" is finished on the nodes of the cluster, then finalizes the backup.
|
||||
RESTORE_ASYNC_ON_CLUSTER,
|
||||
RESTORE_ASYNC_ON_CLUSTER = 3,
|
||||
|
||||
/// "RESTORE ASYNC" waits in background while the data of all tables are restored.
|
||||
RESTORE_ASYNC,
|
||||
RESTORE_ASYNC = 4,
|
||||
|
||||
/// Restores from backups.
|
||||
RESTORE,
|
||||
RESTORE = 5,
|
||||
};
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user