mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-17 20:02:05 +00:00
Clang Tidy, part 7 (#9799)
* Attempt to enable identifier naming check * Attempt to enable identifier naming check, continue * Progress on identifier names * Adopt identifier names check * Fixed error * Merge with master * Fixed build * Fixed build * Fixed build * Fixed build * Fixed build * Fixed error * Fixed error * Fixed error
This commit is contained in:
parent
296fade014
commit
c7863e1ac6
41
.clang-tidy
41
.clang-tidy
@ -57,6 +57,7 @@ Checks: '-*,
|
|||||||
readability-simplify-subscript-expr,
|
readability-simplify-subscript-expr,
|
||||||
readability-simplify-boolean-expr,
|
readability-simplify-boolean-expr,
|
||||||
readability-inconsistent-declaration-parameter-name,
|
readability-inconsistent-declaration-parameter-name,
|
||||||
|
readability-identifier-naming,
|
||||||
|
|
||||||
bugprone-undelegated-constructor,
|
bugprone-undelegated-constructor,
|
||||||
bugprone-argument-comment,
|
bugprone-argument-comment,
|
||||||
@ -162,3 +163,43 @@ Checks: '-*,
|
|||||||
boost-use-to-string,
|
boost-use-to-string,
|
||||||
'
|
'
|
||||||
WarningsAsErrors: '*'
|
WarningsAsErrors: '*'
|
||||||
|
|
||||||
|
CheckOptions:
|
||||||
|
- key: readability-identifier-naming.ClassCase
|
||||||
|
value: CamelCase
|
||||||
|
- key: readability-identifier-naming.EnumCase
|
||||||
|
value: CamelCase
|
||||||
|
- key: readability-identifier-naming.LocalVariableCase
|
||||||
|
value: lower_case
|
||||||
|
- key: readability-identifier-naming.StaticConstantCase
|
||||||
|
value: aNy_CasE
|
||||||
|
- key: readability-identifier-naming.MemberCase
|
||||||
|
value: lower_case
|
||||||
|
- key: readability-identifier-naming.PrivateMemberPrefix
|
||||||
|
value: ''
|
||||||
|
- key: readability-identifier-naming.ProtectedMemberPrefix
|
||||||
|
value: ''
|
||||||
|
- key: readability-identifier-naming.PublicMemberCase
|
||||||
|
value: lower_case
|
||||||
|
- key: readability-identifier-naming.MethodCase
|
||||||
|
value: camelBack
|
||||||
|
- key: readability-identifier-naming.PrivateMethodPrefix
|
||||||
|
value: ''
|
||||||
|
- key: readability-identifier-naming.ProtectedMethodPrefix
|
||||||
|
value: ''
|
||||||
|
- key: readability-identifier-naming.ParameterPackCase
|
||||||
|
value: lower_case
|
||||||
|
- key: readability-identifier-naming.StructCase
|
||||||
|
value: CamelCase
|
||||||
|
- key: readability-identifier-naming.TemplateTemplateParameterCase
|
||||||
|
value: CamelCase
|
||||||
|
- key: readability-identifier-naming.TemplateUsingCase
|
||||||
|
value: lower_case
|
||||||
|
- key: readability-identifier-naming.TypeTemplateParameterCase
|
||||||
|
value: CamelCase
|
||||||
|
- key: readability-identifier-naming.TypedefCase
|
||||||
|
value: CamelCase
|
||||||
|
- key: readability-identifier-naming.UnionCase
|
||||||
|
value: CamelCase
|
||||||
|
- key: readability-identifier-naming.UsingCase
|
||||||
|
value: CamelCase
|
||||||
|
@ -8,8 +8,8 @@
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
static T shift10Impl(T x, int exponent)
|
static T shift10Impl(T x, int exponent)
|
||||||
{
|
{
|
||||||
static constexpr ssize_t MIN_EXPONENT = -323;
|
static constexpr ssize_t min_exponent = -323;
|
||||||
static constexpr ssize_t MAX_EXPONENT = 308;
|
static constexpr ssize_t max_exponent = 308;
|
||||||
|
|
||||||
static const long double powers10[] =
|
static const long double powers10[] =
|
||||||
{
|
{
|
||||||
@ -47,12 +47,12 @@ static T shift10Impl(T x, int exponent)
|
|||||||
1e291L,1e292L,1e293L,1e294L,1e295L,1e296L,1e297L,1e298L,1e299L,1e300L,1e301L,1e302L,1e303L,1e304L,1e305L,1e306L,1e307L,1e308L
|
1e291L,1e292L,1e293L,1e294L,1e295L,1e296L,1e297L,1e298L,1e299L,1e300L,1e301L,1e302L,1e303L,1e304L,1e305L,1e306L,1e307L,1e308L
|
||||||
};
|
};
|
||||||
|
|
||||||
if (unlikely(exponent < MIN_EXPONENT)) /// Note: there are some values below MIN_EXPONENT that is greater than zero.
|
if (unlikely(exponent < min_exponent)) /// Note: there are some values below MIN_EXPONENT that is greater than zero.
|
||||||
x *= 0; /// Multiplying to keep the sign of zero.
|
x *= 0; /// Multiplying to keep the sign of zero.
|
||||||
else if (unlikely(exponent > MAX_EXPONENT))
|
else if (unlikely(exponent > max_exponent))
|
||||||
x *= std::numeric_limits<T>::infinity(); /// Multiplying to keep the sign of infinity.
|
x *= std::numeric_limits<T>::infinity(); /// Multiplying to keep the sign of infinity.
|
||||||
else
|
else
|
||||||
x *= powers10[exponent - MIN_EXPONENT];
|
x *= powers10[exponent - min_exponent];
|
||||||
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,12 @@
|
|||||||
int main(int, char **)
|
int main(int, char **)
|
||||||
{
|
{
|
||||||
/** В DateLUT был глюк - для времён из дня 1970-01-01, возвращался номер часа больше 23. */
|
/** В DateLUT был глюк - для времён из дня 1970-01-01, возвращался номер часа больше 23. */
|
||||||
static const time_t TIME = 66130;
|
static const time_t time = 66130;
|
||||||
|
|
||||||
const auto & date_lut = DateLUT::instance();
|
const auto & date_lut = DateLUT::instance();
|
||||||
|
|
||||||
std::cerr << date_lut.toHour(TIME) << std::endl;
|
std::cerr << date_lut.toHour(time) << std::endl;
|
||||||
std::cerr << date_lut.toDayNum(TIME) << std::endl;
|
std::cerr << date_lut.toDayNum(time) << std::endl;
|
||||||
|
|
||||||
const auto * values = reinterpret_cast<const DateLUTImpl::Values *>(&date_lut);
|
const auto * values = reinterpret_cast<const DateLUTImpl::Values *>(&date_lut);
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ Pool::~Pool()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Pool::Entry Pool::Get()
|
Pool::Entry Pool::get()
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lock(mutex);
|
std::unique_lock<std::mutex> lock(mutex);
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ public:
|
|||||||
~Pool();
|
~Pool();
|
||||||
|
|
||||||
/// Allocates connection.
|
/// Allocates connection.
|
||||||
Entry Get();
|
Entry get();
|
||||||
|
|
||||||
/// Allocates connection.
|
/// Allocates connection.
|
||||||
/// If database is not accessible, returns empty Entry object.
|
/// If database is not accessible, returns empty Entry object.
|
||||||
|
@ -17,10 +17,10 @@ struct PoolFactory::Impl
|
|||||||
std::mutex mutex;
|
std::mutex mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
PoolWithFailover PoolFactory::Get(const std::string & config_name, unsigned default_connections,
|
PoolWithFailover PoolFactory::get(const std::string & config_name, unsigned default_connections,
|
||||||
unsigned max_connections, size_t max_tries)
|
unsigned max_connections, size_t max_tries)
|
||||||
{
|
{
|
||||||
return Get(Poco::Util::Application::instance().config(), config_name, default_connections, max_connections, max_tries);
|
return get(Poco::Util::Application::instance().config(), config_name, default_connections, max_connections, max_tries);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Duplicate of code from StringUtils.h. Copied here for less dependencies.
|
/// Duplicate of code from StringUtils.h. Copied here for less dependencies.
|
||||||
@ -72,7 +72,7 @@ static std::string getPoolEntryName(const Poco::Util::AbstractConfiguration & co
|
|||||||
return entry_name;
|
return entry_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
PoolWithFailover PoolFactory::Get(const Poco::Util::AbstractConfiguration & config,
|
PoolWithFailover PoolFactory::get(const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_name, unsigned default_connections, unsigned max_connections, size_t max_tries)
|
const std::string & config_name, unsigned default_connections, unsigned max_connections, size_t max_tries)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -27,13 +27,13 @@ public:
|
|||||||
PoolFactory(const PoolFactory &) = delete;
|
PoolFactory(const PoolFactory &) = delete;
|
||||||
|
|
||||||
/** Allocates a PoolWithFailover to connect to MySQL. */
|
/** Allocates a PoolWithFailover to connect to MySQL. */
|
||||||
PoolWithFailover Get(const std::string & config_name,
|
PoolWithFailover get(const std::string & config_name,
|
||||||
unsigned default_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS,
|
unsigned default_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS,
|
||||||
unsigned max_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS,
|
unsigned max_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS,
|
||||||
size_t max_tries = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES);
|
size_t max_tries = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_TRIES);
|
||||||
|
|
||||||
/** Allocates a PoolWithFailover to connect to MySQL. */
|
/** Allocates a PoolWithFailover to connect to MySQL. */
|
||||||
PoolWithFailover Get(const Poco::Util::AbstractConfiguration & config,
|
PoolWithFailover get(const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_name,
|
const std::string & config_name,
|
||||||
unsigned default_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS,
|
unsigned default_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_START_CONNECTIONS,
|
||||||
unsigned max_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS,
|
unsigned max_connections = MYSQLXX_POOL_WITH_FAILOVER_DEFAULT_MAX_CONNECTIONS,
|
||||||
|
@ -68,7 +68,7 @@ PoolWithFailover::PoolWithFailover(const PoolWithFailover & other)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PoolWithFailover::Entry PoolWithFailover::Get()
|
PoolWithFailover::Entry PoolWithFailover::get()
|
||||||
{
|
{
|
||||||
Poco::Util::Application & app = Poco::Util::Application::instance();
|
Poco::Util::Application & app = Poco::Util::Application::instance();
|
||||||
std::lock_guard<std::mutex> locker(mutex);
|
std::lock_guard<std::mutex> locker(mutex);
|
||||||
@ -89,7 +89,7 @@ PoolWithFailover::Entry PoolWithFailover::Get()
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Entry entry = shareable ? pool->Get() : pool->tryGet();
|
Entry entry = shareable ? pool->get() : pool->tryGet();
|
||||||
|
|
||||||
if (!entry.isNull())
|
if (!entry.isNull())
|
||||||
{
|
{
|
||||||
@ -121,7 +121,7 @@ PoolWithFailover::Entry PoolWithFailover::Get()
|
|||||||
if (full_pool)
|
if (full_pool)
|
||||||
{
|
{
|
||||||
app.logger().error("All connections failed, trying to wait on a full pool " + (*full_pool)->getDescription());
|
app.logger().error("All connections failed, trying to wait on a full pool " + (*full_pool)->getDescription());
|
||||||
return (*full_pool)->Get();
|
return (*full_pool)->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::stringstream message;
|
std::stringstream message;
|
||||||
|
@ -105,6 +105,6 @@ namespace mysqlxx
|
|||||||
PoolWithFailover(const PoolWithFailover & other);
|
PoolWithFailover(const PoolWithFailover & other);
|
||||||
|
|
||||||
/** Allocates a connection to use. */
|
/** Allocates a connection to use. */
|
||||||
Entry Get();
|
Entry get();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ double Value::readFloatText(const char * buf, size_t length) const
|
|||||||
|
|
||||||
void Value::throwException(const char * text) const
|
void Value::throwException(const char * text) const
|
||||||
{
|
{
|
||||||
static constexpr size_t MYSQLXX_QUERY_PREVIEW_LENGTH = 1000;
|
static constexpr size_t preview_length = 1000;
|
||||||
|
|
||||||
std::stringstream info;
|
std::stringstream info;
|
||||||
info << text;
|
info << text;
|
||||||
@ -166,7 +166,7 @@ void Value::throwException(const char * text) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (res && res->getQuery())
|
if (res && res->getQuery())
|
||||||
info << ", query: " << res->getQuery()->str().substr(0, MYSQLXX_QUERY_PREVIEW_LENGTH);
|
info << ", query: " << res->getQuery()->str().substr(0, preview_length);
|
||||||
|
|
||||||
throw CannotParseValue(info.str());
|
throw CannotParseValue(info.str());
|
||||||
}
|
}
|
||||||
|
@ -1122,7 +1122,7 @@ private:
|
|||||||
/// to avoid losing sync.
|
/// to avoid losing sync.
|
||||||
if (!cancelled)
|
if (!cancelled)
|
||||||
{
|
{
|
||||||
auto cancelQuery = [&] {
|
auto cancel_query = [&] {
|
||||||
connection->sendCancel();
|
connection->sendCancel();
|
||||||
cancelled = true;
|
cancelled = true;
|
||||||
if (is_interactive)
|
if (is_interactive)
|
||||||
@ -1134,7 +1134,7 @@ private:
|
|||||||
|
|
||||||
if (interrupt_listener.check())
|
if (interrupt_listener.check())
|
||||||
{
|
{
|
||||||
cancelQuery();
|
cancel_query();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1145,7 +1145,7 @@ private:
|
|||||||
<< " Waited for " << static_cast<size_t>(elapsed) << " seconds,"
|
<< " Waited for " << static_cast<size_t>(elapsed) << " seconds,"
|
||||||
<< " timeout is " << receive_timeout.totalSeconds() << " seconds." << std::endl;
|
<< " timeout is " << receive_timeout.totalSeconds() << " seconds." << std::endl;
|
||||||
|
|
||||||
cancelQuery();
|
cancel_query();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,11 +43,11 @@ void ClusterCopierApp::initialize(Poco::Util::Application & self)
|
|||||||
|
|
||||||
void ClusterCopierApp::handleHelp(const std::string &, const std::string &)
|
void ClusterCopierApp::handleHelp(const std::string &, const std::string &)
|
||||||
{
|
{
|
||||||
Poco::Util::HelpFormatter helpFormatter(options());
|
Poco::Util::HelpFormatter help_formatter(options());
|
||||||
helpFormatter.setCommand(commandName());
|
help_formatter.setCommand(commandName());
|
||||||
helpFormatter.setHeader("Copies tables from one cluster to another");
|
help_formatter.setHeader("Copies tables from one cluster to another");
|
||||||
helpFormatter.setUsage("--config-file <config-file> --task-path <task-path>");
|
help_formatter.setUsage("--config-file <config-file> --task-path <task-path>");
|
||||||
helpFormatter.format(std::cerr);
|
help_formatter.format(std::cerr);
|
||||||
|
|
||||||
stopOptionsProcessing();
|
stopOptionsProcessing();
|
||||||
}
|
}
|
||||||
|
@ -79,11 +79,11 @@ namespace
|
|||||||
|
|
||||||
void ODBCBridge::handleHelp(const std::string &, const std::string &)
|
void ODBCBridge::handleHelp(const std::string &, const std::string &)
|
||||||
{
|
{
|
||||||
Poco::Util::HelpFormatter helpFormatter(options());
|
Poco::Util::HelpFormatter help_formatter(options());
|
||||||
helpFormatter.setCommand(commandName());
|
help_formatter.setCommand(commandName());
|
||||||
helpFormatter.setHeader("HTTP-proxy for odbc requests");
|
help_formatter.setHeader("HTTP-proxy for odbc requests");
|
||||||
helpFormatter.setUsage("--http-port <port>");
|
help_formatter.setUsage("--http-port <port>");
|
||||||
helpFormatter.format(std::cerr);
|
help_formatter.format(std::cerr);
|
||||||
|
|
||||||
stopOptionsProcessing();
|
stopOptionsProcessing();
|
||||||
}
|
}
|
||||||
|
@ -546,7 +546,7 @@ void HTTPHandler::processQuery(
|
|||||||
client_info.http_method = http_method;
|
client_info.http_method = http_method;
|
||||||
client_info.http_user_agent = request.get("User-Agent", "");
|
client_info.http_user_agent = request.get("User-Agent", "");
|
||||||
|
|
||||||
auto appendCallback = [&context] (ProgressCallback callback)
|
auto append_callback = [&context] (ProgressCallback callback)
|
||||||
{
|
{
|
||||||
auto prev = context.getProgressCallback();
|
auto prev = context.getProgressCallback();
|
||||||
|
|
||||||
@ -561,13 +561,13 @@ void HTTPHandler::processQuery(
|
|||||||
|
|
||||||
/// While still no data has been sent, we will report about query execution progress by sending HTTP headers.
|
/// While still no data has been sent, we will report about query execution progress by sending HTTP headers.
|
||||||
if (settings.send_progress_in_http_headers)
|
if (settings.send_progress_in_http_headers)
|
||||||
appendCallback([&used_output] (const Progress & progress) { used_output.out->onProgress(progress); });
|
append_callback([&used_output] (const Progress & progress) { used_output.out->onProgress(progress); });
|
||||||
|
|
||||||
if (settings.readonly > 0 && settings.cancel_http_readonly_queries_on_client_close)
|
if (settings.readonly > 0 && settings.cancel_http_readonly_queries_on_client_close)
|
||||||
{
|
{
|
||||||
Poco::Net::StreamSocket & socket = dynamic_cast<Poco::Net::HTTPServerRequestImpl &>(request).socket();
|
Poco::Net::StreamSocket & socket = dynamic_cast<Poco::Net::HTTPServerRequestImpl &>(request).socket();
|
||||||
|
|
||||||
appendCallback([&context, &socket](const Progress &)
|
append_callback([&context, &socket](const Progress &)
|
||||||
{
|
{
|
||||||
/// Assume that at the point this method is called no one is reading data from the socket any more.
|
/// Assume that at the point this method is called no one is reading data from the socket any more.
|
||||||
/// True for read-only queries.
|
/// True for read-only queries.
|
||||||
|
@ -23,9 +23,9 @@ Poco::Net::HTTPRequestHandler * HTTPRequestHandlerFactoryMain::createRequestHand
|
|||||||
<< ", Content Type: " << request.getContentType()
|
<< ", Content Type: " << request.getContentType()
|
||||||
<< ", Transfer Encoding: " << request.getTransferEncoding());
|
<< ", Transfer Encoding: " << request.getTransferEncoding());
|
||||||
|
|
||||||
for (auto & handlerFactory: child_handler_factories)
|
for (auto & handler_factory : child_handler_factories)
|
||||||
{
|
{
|
||||||
auto handler = handlerFactory->createRequestHandler(request);
|
auto handler = handler_factory->createRequestHandler(request);
|
||||||
if (handler != nullptr)
|
if (handler != nullptr)
|
||||||
return handler;
|
return handler;
|
||||||
}
|
}
|
||||||
|
@ -252,8 +252,8 @@ void MySQLHandler::comFieldList(ReadBuffer & payload)
|
|||||||
ComFieldList packet;
|
ComFieldList packet;
|
||||||
packet.readPayload(payload);
|
packet.readPayload(payload);
|
||||||
String database = connection_context.getCurrentDatabase();
|
String database = connection_context.getCurrentDatabase();
|
||||||
StoragePtr tablePtr = DatabaseCatalog::instance().getTable({database, packet.table});
|
StoragePtr table_ptr = DatabaseCatalog::instance().getTable({database, packet.table});
|
||||||
for (const NameAndTypePair & column: tablePtr->getColumns().getAll())
|
for (const NameAndTypePair & column: table_ptr->getColumns().getAll())
|
||||||
{
|
{
|
||||||
ColumnDefinition column_definition(
|
ColumnDefinition column_definition(
|
||||||
database, packet.table, packet.table, column.name, column.name, CharacterSet::binary, 100, ColumnType::MYSQL_TYPE_STRING, 0, 0
|
database, packet.table, packet.table, column.name, column.name, CharacterSet::binary, 100, ColumnType::MYSQL_TYPE_STRING, 0, 0
|
||||||
|
@ -56,26 +56,26 @@ MySQLHandlerFactory::MySQLHandlerFactory(IServer & server_)
|
|||||||
void MySQLHandlerFactory::readRSAKeys()
|
void MySQLHandlerFactory::readRSAKeys()
|
||||||
{
|
{
|
||||||
const Poco::Util::LayeredConfiguration & config = Poco::Util::Application::instance().config();
|
const Poco::Util::LayeredConfiguration & config = Poco::Util::Application::instance().config();
|
||||||
String certificateFileProperty = "openSSL.server.certificateFile";
|
String certificate_file_property = "openSSL.server.certificateFile";
|
||||||
String privateKeyFileProperty = "openSSL.server.privateKeyFile";
|
String private_key_file_property = "openSSL.server.privateKeyFile";
|
||||||
|
|
||||||
if (!config.has(certificateFileProperty))
|
if (!config.has(certificate_file_property))
|
||||||
throw Exception("Certificate file is not set.", ErrorCodes::NO_ELEMENTS_IN_CONFIG);
|
throw Exception("Certificate file is not set.", ErrorCodes::NO_ELEMENTS_IN_CONFIG);
|
||||||
|
|
||||||
if (!config.has(privateKeyFileProperty))
|
if (!config.has(private_key_file_property))
|
||||||
throw Exception("Private key file is not set.", ErrorCodes::NO_ELEMENTS_IN_CONFIG);
|
throw Exception("Private key file is not set.", ErrorCodes::NO_ELEMENTS_IN_CONFIG);
|
||||||
|
|
||||||
{
|
{
|
||||||
String certificateFile = config.getString(certificateFileProperty);
|
String certificate_file = config.getString(certificate_file_property);
|
||||||
FILE * fp = fopen(certificateFile.data(), "r");
|
FILE * fp = fopen(certificate_file.data(), "r");
|
||||||
if (fp == nullptr)
|
if (fp == nullptr)
|
||||||
throw Exception("Cannot open certificate file: " + certificateFile + ".", ErrorCodes::CANNOT_OPEN_FILE);
|
throw Exception("Cannot open certificate file: " + certificate_file + ".", ErrorCodes::CANNOT_OPEN_FILE);
|
||||||
SCOPE_EXIT(fclose(fp));
|
SCOPE_EXIT(fclose(fp));
|
||||||
|
|
||||||
X509 * x509 = PEM_read_X509(fp, nullptr, nullptr, nullptr);
|
X509 * x509 = PEM_read_X509(fp, nullptr, nullptr, nullptr);
|
||||||
SCOPE_EXIT(X509_free(x509));
|
SCOPE_EXIT(X509_free(x509));
|
||||||
if (x509 == nullptr)
|
if (x509 == nullptr)
|
||||||
throw Exception("Failed to read PEM certificate from " + certificateFile + ". Error: " + getOpenSSLErrors(), ErrorCodes::OPENSSL_ERROR);
|
throw Exception("Failed to read PEM certificate from " + certificate_file + ". Error: " + getOpenSSLErrors(), ErrorCodes::OPENSSL_ERROR);
|
||||||
|
|
||||||
EVP_PKEY * p = X509_get_pubkey(x509);
|
EVP_PKEY * p = X509_get_pubkey(x509);
|
||||||
if (p == nullptr)
|
if (p == nullptr)
|
||||||
@ -88,16 +88,16 @@ void MySQLHandlerFactory::readRSAKeys()
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
String privateKeyFile = config.getString(privateKeyFileProperty);
|
String private_key_file = config.getString(private_key_file_property);
|
||||||
|
|
||||||
FILE * fp = fopen(privateKeyFile.data(), "r");
|
FILE * fp = fopen(private_key_file.data(), "r");
|
||||||
if (fp == nullptr)
|
if (fp == nullptr)
|
||||||
throw Exception ("Cannot open private key file " + privateKeyFile + ".", ErrorCodes::CANNOT_OPEN_FILE);
|
throw Exception ("Cannot open private key file " + private_key_file + ".", ErrorCodes::CANNOT_OPEN_FILE);
|
||||||
SCOPE_EXIT(fclose(fp));
|
SCOPE_EXIT(fclose(fp));
|
||||||
|
|
||||||
private_key.reset(PEM_read_RSAPrivateKey(fp, nullptr, nullptr, nullptr));
|
private_key.reset(PEM_read_RSAPrivateKey(fp, nullptr, nullptr, nullptr));
|
||||||
if (!private_key)
|
if (!private_key)
|
||||||
throw Exception("Failed to read RSA private key from " + privateKeyFile + ". Error: " + getOpenSSLErrors(), ErrorCodes::OPENSSL_ERROR);
|
throw Exception("Failed to read RSA private key from " + private_key_file + ". Error: " + getOpenSSLErrors(), ErrorCodes::OPENSSL_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,12 +162,12 @@ int Server::run()
|
|||||||
{
|
{
|
||||||
if (config().hasOption("help"))
|
if (config().hasOption("help"))
|
||||||
{
|
{
|
||||||
Poco::Util::HelpFormatter helpFormatter(Server::options());
|
Poco::Util::HelpFormatter help_formatter(Server::options());
|
||||||
std::stringstream header;
|
std::stringstream header;
|
||||||
header << commandName() << " [OPTION] [-- [ARG]...]\n";
|
header << commandName() << " [OPTION] [-- [ARG]...]\n";
|
||||||
header << "positional arguments can be used to rewrite config.xml properties, for example, --http_port=8010";
|
header << "positional arguments can be used to rewrite config.xml properties, for example, --http_port=8010";
|
||||||
helpFormatter.setHeader(header.str());
|
help_formatter.setHeader(header.str());
|
||||||
helpFormatter.format(std::cout);
|
help_formatter.format(std::cout);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (config().hasOption("version"))
|
if (config().hasOption("version"))
|
||||||
|
@ -101,7 +101,7 @@ boost::shared_ptr<const EnabledQuota::Intervals> QuotaCache::QuotaInfo::rebuildI
|
|||||||
new_intervals->quota_key = key;
|
new_intervals->quota_key = key;
|
||||||
auto & intervals = new_intervals->intervals;
|
auto & intervals = new_intervals->intervals;
|
||||||
intervals.reserve(quota->all_limits.size());
|
intervals.reserve(quota->all_limits.size());
|
||||||
constexpr size_t MAX_RESOURCE_TYPE = Quota::MAX_RESOURCE_TYPE;
|
static constexpr size_t MAX_RESOURCE_TYPE = Quota::MAX_RESOURCE_TYPE;
|
||||||
for (const auto & limits : quota->all_limits)
|
for (const auto & limits : quota->all_limits)
|
||||||
{
|
{
|
||||||
intervals.emplace_back();
|
intervals.emplace_back();
|
||||||
|
@ -20,32 +20,32 @@ namespace ErrorCodes
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
|
||||||
template <typename T, typename Tlimit_num_elems>
|
template <typename T, typename LimitNumberOfElements>
|
||||||
struct MovingSum
|
struct MovingSum
|
||||||
{
|
{
|
||||||
using DataType = MovingSumData<T>;
|
using DataType = MovingSumData<T>;
|
||||||
using Function = MovingImpl<T, Tlimit_num_elems, DataType>;
|
using Function = MovingImpl<T, LimitNumberOfElements, DataType>;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, typename Tlimit_num_elems>
|
template <typename T, typename LimitNumberOfElements>
|
||||||
struct MovingAvg
|
struct MovingAvg
|
||||||
{
|
{
|
||||||
using DataType = MovingAvgData<T>;
|
using DataType = MovingAvgData<T>;
|
||||||
using Function = MovingImpl<T, Tlimit_num_elems, DataType>;
|
using Function = MovingImpl<T, LimitNumberOfElements, DataType>;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, typename Tlimit_num_elems> using MovingSumTemplate = typename MovingSum<T, Tlimit_num_elems>::Function;
|
template <typename T, typename LimitNumberOfElements> using MovingSumTemplate = typename MovingSum<T, LimitNumberOfElements>::Function;
|
||||||
template <typename T, typename Tlimit_num_elems> using MovingAvgTemplate = typename MovingAvg<T, Tlimit_num_elems>::Function;
|
template <typename T, typename LimitNumberOfElements> using MovingAvgTemplate = typename MovingAvg<T, LimitNumberOfElements>::Function;
|
||||||
|
|
||||||
template <template <typename, typename> class Function, typename has_limit, typename ... TArgs>
|
template <template <typename, typename> class Function, typename HasLimit, typename ... TArgs>
|
||||||
inline AggregateFunctionPtr createAggregateFunctionMovingImpl(const std::string & name, const DataTypePtr & argument_type, TArgs ... args)
|
inline AggregateFunctionPtr createAggregateFunctionMovingImpl(const std::string & name, const DataTypePtr & argument_type, TArgs ... args)
|
||||||
{
|
{
|
||||||
AggregateFunctionPtr res;
|
AggregateFunctionPtr res;
|
||||||
|
|
||||||
if (isDecimal(argument_type))
|
if (isDecimal(argument_type))
|
||||||
res.reset(createWithDecimalType<Function, has_limit>(*argument_type, argument_type, std::forward<TArgs>(args)...));
|
res.reset(createWithDecimalType<Function, HasLimit>(*argument_type, argument_type, std::forward<TArgs>(args)...));
|
||||||
else
|
else
|
||||||
res.reset(createWithNumericType<Function, has_limit>(*argument_type, argument_type, std::forward<TArgs>(args)...));
|
res.reset(createWithNumericType<Function, HasLimit>(*argument_type, argument_type, std::forward<TArgs>(args)...));
|
||||||
|
|
||||||
if (!res)
|
if (!res)
|
||||||
throw Exception("Illegal type " + argument_type->getName() + " of argument for aggregate function " + name,
|
throw Exception("Illegal type " + argument_type->getName() + " of argument for aggregate function " + name,
|
||||||
|
@ -21,48 +21,48 @@ namespace
|
|||||||
{
|
{
|
||||||
|
|
||||||
/// Substitute return type for Date and DateTime
|
/// Substitute return type for Date and DateTime
|
||||||
template <typename has_limit>
|
template <typename HasLimit>
|
||||||
class AggregateFunctionGroupUniqArrayDate : public AggregateFunctionGroupUniqArray<DataTypeDate::FieldType, has_limit>
|
class AggregateFunctionGroupUniqArrayDate : public AggregateFunctionGroupUniqArray<DataTypeDate::FieldType, HasLimit>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit AggregateFunctionGroupUniqArrayDate(const DataTypePtr & argument_type, UInt64 max_elems_ = std::numeric_limits<UInt64>::max())
|
explicit AggregateFunctionGroupUniqArrayDate(const DataTypePtr & argument_type, UInt64 max_elems_ = std::numeric_limits<UInt64>::max())
|
||||||
: AggregateFunctionGroupUniqArray<DataTypeDate::FieldType, has_limit>(argument_type, max_elems_) {}
|
: AggregateFunctionGroupUniqArray<DataTypeDate::FieldType, HasLimit>(argument_type, max_elems_) {}
|
||||||
DataTypePtr getReturnType() const override { return std::make_shared<DataTypeArray>(std::make_shared<DataTypeDate>()); }
|
DataTypePtr getReturnType() const override { return std::make_shared<DataTypeArray>(std::make_shared<DataTypeDate>()); }
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename has_limit>
|
template <typename HasLimit>
|
||||||
class AggregateFunctionGroupUniqArrayDateTime : public AggregateFunctionGroupUniqArray<DataTypeDateTime::FieldType, has_limit>
|
class AggregateFunctionGroupUniqArrayDateTime : public AggregateFunctionGroupUniqArray<DataTypeDateTime::FieldType, HasLimit>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit AggregateFunctionGroupUniqArrayDateTime(const DataTypePtr & argument_type, UInt64 max_elems_ = std::numeric_limits<UInt64>::max())
|
explicit AggregateFunctionGroupUniqArrayDateTime(const DataTypePtr & argument_type, UInt64 max_elems_ = std::numeric_limits<UInt64>::max())
|
||||||
: AggregateFunctionGroupUniqArray<DataTypeDateTime::FieldType, has_limit>(argument_type, max_elems_) {}
|
: AggregateFunctionGroupUniqArray<DataTypeDateTime::FieldType, HasLimit>(argument_type, max_elems_) {}
|
||||||
DataTypePtr getReturnType() const override { return std::make_shared<DataTypeArray>(std::make_shared<DataTypeDateTime>()); }
|
DataTypePtr getReturnType() const override { return std::make_shared<DataTypeArray>(std::make_shared<DataTypeDateTime>()); }
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename has_limit, typename ... TArgs>
|
template <typename HasLimit, typename ... TArgs>
|
||||||
static IAggregateFunction * createWithExtraTypes(const DataTypePtr & argument_type, TArgs && ... args)
|
static IAggregateFunction * createWithExtraTypes(const DataTypePtr & argument_type, TArgs && ... args)
|
||||||
{
|
{
|
||||||
WhichDataType which(argument_type);
|
WhichDataType which(argument_type);
|
||||||
if (which.idx == TypeIndex::Date) return new AggregateFunctionGroupUniqArrayDate<has_limit>(argument_type, std::forward<TArgs>(args)...);
|
if (which.idx == TypeIndex::Date) return new AggregateFunctionGroupUniqArrayDate<HasLimit>(argument_type, std::forward<TArgs>(args)...);
|
||||||
else if (which.idx == TypeIndex::DateTime) return new AggregateFunctionGroupUniqArrayDateTime<has_limit>(argument_type, std::forward<TArgs>(args)...);
|
else if (which.idx == TypeIndex::DateTime) return new AggregateFunctionGroupUniqArrayDateTime<HasLimit>(argument_type, std::forward<TArgs>(args)...);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/// Check that we can use plain version of AggregateFunctionGroupUniqArrayGeneric
|
/// Check that we can use plain version of AggregateFunctionGroupUniqArrayGeneric
|
||||||
if (argument_type->isValueUnambiguouslyRepresentedInContiguousMemoryRegion())
|
if (argument_type->isValueUnambiguouslyRepresentedInContiguousMemoryRegion())
|
||||||
return new AggregateFunctionGroupUniqArrayGeneric<true, has_limit>(argument_type, std::forward<TArgs>(args)...);
|
return new AggregateFunctionGroupUniqArrayGeneric<true, HasLimit>(argument_type, std::forward<TArgs>(args)...);
|
||||||
else
|
else
|
||||||
return new AggregateFunctionGroupUniqArrayGeneric<false, has_limit>(argument_type, std::forward<TArgs>(args)...);
|
return new AggregateFunctionGroupUniqArrayGeneric<false, HasLimit>(argument_type, std::forward<TArgs>(args)...);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename has_limit, typename ... TArgs>
|
template <typename HasLimit, typename ... TArgs>
|
||||||
inline AggregateFunctionPtr createAggregateFunctionGroupUniqArrayImpl(const std::string & name, const DataTypePtr & argument_type, TArgs ... args)
|
inline AggregateFunctionPtr createAggregateFunctionGroupUniqArrayImpl(const std::string & name, const DataTypePtr & argument_type, TArgs ... args)
|
||||||
{
|
{
|
||||||
|
|
||||||
AggregateFunctionPtr res(createWithNumericType<AggregateFunctionGroupUniqArray, has_limit, const DataTypePtr &, TArgs...>(*argument_type, argument_type, std::forward<TArgs>(args)...));
|
AggregateFunctionPtr res(createWithNumericType<AggregateFunctionGroupUniqArray, HasLimit, const DataTypePtr &, TArgs...>(*argument_type, argument_type, std::forward<TArgs>(args)...));
|
||||||
|
|
||||||
if (!res)
|
if (!res)
|
||||||
res = AggregateFunctionPtr(createWithExtraTypes<has_limit>(argument_type, std::forward<TArgs>(args)...));
|
res = AggregateFunctionPtr(createWithExtraTypes<HasLimit>(argument_type, std::forward<TArgs>(args)...));
|
||||||
|
|
||||||
if (!res)
|
if (!res)
|
||||||
throw Exception("Illegal type " + argument_type->getName() +
|
throw Exception("Illegal type " + argument_type->getName() +
|
||||||
|
@ -130,7 +130,7 @@ LinearModelData::LinearModelData(
|
|||||||
gradient_batch.resize(param_num_ + 1, Float64{0.0});
|
gradient_batch.resize(param_num_ + 1, Float64{0.0});
|
||||||
}
|
}
|
||||||
|
|
||||||
void LinearModelData::update_state()
|
void LinearModelData::updateState()
|
||||||
{
|
{
|
||||||
if (batch_size == 0)
|
if (batch_size == 0)
|
||||||
return;
|
return;
|
||||||
@ -197,7 +197,7 @@ void LinearModelData::merge(const DB::LinearModelData & rhs)
|
|||||||
if (iter_num == 0 && rhs.iter_num == 0)
|
if (iter_num == 0 && rhs.iter_num == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
update_state();
|
updateState();
|
||||||
/// can't update rhs state because it's constant
|
/// can't update rhs state because it's constant
|
||||||
|
|
||||||
/// squared mean is more stable (in sence of quality of prediction) when two states with quietly different number of learning steps are merged
|
/// squared mean is more stable (in sence of quality of prediction) when two states with quietly different number of learning steps are merged
|
||||||
@ -219,13 +219,13 @@ void LinearModelData::add(const IColumn ** columns, size_t row_num)
|
|||||||
Float64 target = (*columns[0]).getFloat64(row_num);
|
Float64 target = (*columns[0]).getFloat64(row_num);
|
||||||
|
|
||||||
/// Here we have columns + 1 as first column corresponds to target value, and others - to features
|
/// Here we have columns + 1 as first column corresponds to target value, and others - to features
|
||||||
weights_updater->add_to_batch(
|
weights_updater->addToBatch(
|
||||||
gradient_batch, *gradient_computer, weights, bias, l2_reg_coef, target, columns + 1, row_num);
|
gradient_batch, *gradient_computer, weights, bias, l2_reg_coef, target, columns + 1, row_num);
|
||||||
|
|
||||||
++batch_size;
|
++batch_size;
|
||||||
if (batch_size == batch_capacity)
|
if (batch_size == batch_capacity)
|
||||||
{
|
{
|
||||||
update_state();
|
updateState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -300,7 +300,7 @@ void Adam::update(UInt64 batch_size, std::vector<Float64> & weights, Float64 & b
|
|||||||
beta2_powered_ *= beta2_;
|
beta2_powered_ *= beta2_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Adam::add_to_batch(
|
void Adam::addToBatch(
|
||||||
std::vector<Float64> & batch_gradient,
|
std::vector<Float64> & batch_gradient,
|
||||||
IGradientComputer & gradient_computer,
|
IGradientComputer & gradient_computer,
|
||||||
const std::vector<Float64> & weights,
|
const std::vector<Float64> & weights,
|
||||||
@ -358,7 +358,7 @@ void Nesterov::update(UInt64 batch_size, std::vector<Float64> & weights, Float64
|
|||||||
bias += accumulated_gradient[weights.size()];
|
bias += accumulated_gradient[weights.size()];
|
||||||
}
|
}
|
||||||
|
|
||||||
void Nesterov::add_to_batch(
|
void Nesterov::addToBatch(
|
||||||
std::vector<Float64> & batch_gradient,
|
std::vector<Float64> & batch_gradient,
|
||||||
IGradientComputer & gradient_computer,
|
IGradientComputer & gradient_computer,
|
||||||
const std::vector<Float64> & weights,
|
const std::vector<Float64> & weights,
|
||||||
@ -432,7 +432,7 @@ void StochasticGradientDescent::update(
|
|||||||
bias += (learning_rate * batch_gradient[weights.size()]) / batch_size;
|
bias += (learning_rate * batch_gradient[weights.size()]) / batch_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IWeightsUpdater::add_to_batch(
|
void IWeightsUpdater::addToBatch(
|
||||||
std::vector<Float64> & batch_gradient,
|
std::vector<Float64> & batch_gradient,
|
||||||
IGradientComputer & gradient_computer,
|
IGradientComputer & gradient_computer,
|
||||||
const std::vector<Float64> & weights,
|
const std::vector<Float64> & weights,
|
||||||
|
@ -112,7 +112,7 @@ public:
|
|||||||
virtual ~IWeightsUpdater() = default;
|
virtual ~IWeightsUpdater() = default;
|
||||||
|
|
||||||
/// Calls GradientComputer to update current mini-batch
|
/// Calls GradientComputer to update current mini-batch
|
||||||
virtual void add_to_batch(
|
virtual void addToBatch(
|
||||||
std::vector<Float64> & batch_gradient,
|
std::vector<Float64> & batch_gradient,
|
||||||
IGradientComputer & gradient_computer,
|
IGradientComputer & gradient_computer,
|
||||||
const std::vector<Float64> & weights,
|
const std::vector<Float64> & weights,
|
||||||
@ -176,7 +176,7 @@ public:
|
|||||||
|
|
||||||
Nesterov(Float64 alpha) : alpha_(alpha) {}
|
Nesterov(Float64 alpha) : alpha_(alpha) {}
|
||||||
|
|
||||||
void add_to_batch(
|
void addToBatch(
|
||||||
std::vector<Float64> & batch_gradient,
|
std::vector<Float64> & batch_gradient,
|
||||||
IGradientComputer & gradient_computer,
|
IGradientComputer & gradient_computer,
|
||||||
const std::vector<Float64> & weights,
|
const std::vector<Float64> & weights,
|
||||||
@ -209,7 +209,7 @@ public:
|
|||||||
beta2_powered_ = beta2_;
|
beta2_powered_ = beta2_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_to_batch(
|
void addToBatch(
|
||||||
std::vector<Float64> & batch_gradient,
|
std::vector<Float64> & batch_gradient,
|
||||||
IGradientComputer & gradient_computer,
|
IGradientComputer & gradient_computer,
|
||||||
const std::vector<Float64> & weights,
|
const std::vector<Float64> & weights,
|
||||||
@ -289,7 +289,7 @@ private:
|
|||||||
|
|
||||||
/** The function is called when we want to flush current batch and update our weights
|
/** The function is called when we want to flush current batch and update our weights
|
||||||
*/
|
*/
|
||||||
void update_state();
|
void updateState();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,13 +91,13 @@ MutableColumnPtr ColumnAggregateFunction::predictValues(Block & block, const Col
|
|||||||
MutableColumnPtr res = func->getReturnTypeToPredict()->createColumn();
|
MutableColumnPtr res = func->getReturnTypeToPredict()->createColumn();
|
||||||
res->reserve(data.size());
|
res->reserve(data.size());
|
||||||
|
|
||||||
auto ML_function = func.get();
|
auto machine_learning_function = func.get();
|
||||||
if (ML_function)
|
if (machine_learning_function)
|
||||||
{
|
{
|
||||||
if (data.size() == 1)
|
if (data.size() == 1)
|
||||||
{
|
{
|
||||||
/// Case for const column. Predict using single model.
|
/// Case for const column. Predict using single model.
|
||||||
ML_function->predictValues(data[0], *res, block, 0, block.rows(), arguments, context);
|
machine_learning_function->predictValues(data[0], *res, block, 0, block.rows(), arguments, context);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -105,7 +105,7 @@ MutableColumnPtr ColumnAggregateFunction::predictValues(Block & block, const Col
|
|||||||
size_t row_num = 0;
|
size_t row_num = 0;
|
||||||
for (auto val : data)
|
for (auto val : data)
|
||||||
{
|
{
|
||||||
ML_function->predictValues(val, *res, block, row_num, 1, arguments, context);
|
machine_learning_function->predictValues(val, *res, block, row_num, 1, arguments, context);
|
||||||
++row_num;
|
++row_num;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,16 +152,15 @@ void ColumnArray::insertData(const char * pos, size_t length)
|
|||||||
{
|
{
|
||||||
/** Similarly - only for arrays of fixed length values.
|
/** Similarly - only for arrays of fixed length values.
|
||||||
*/
|
*/
|
||||||
IColumn * data_ = &getData();
|
if (!data->isFixedAndContiguous())
|
||||||
if (!data_->isFixedAndContiguous())
|
|
||||||
throw Exception("Method insertData is not supported for " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
throw Exception("Method insertData is not supported for " + getName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
|
||||||
size_t field_size = data_->sizeOfValueIfFixed();
|
size_t field_size = data->sizeOfValueIfFixed();
|
||||||
|
|
||||||
const char * end = pos + length;
|
const char * end = pos + length;
|
||||||
size_t elems = 0;
|
size_t elems = 0;
|
||||||
for (; pos + field_size <= end; pos += field_size, ++elems)
|
for (; pos + field_size <= end; pos += field_size, ++elems)
|
||||||
data_->insertData(pos, field_size);
|
data->insertData(pos, field_size);
|
||||||
|
|
||||||
if (pos != end)
|
if (pos != end)
|
||||||
throw Exception("Incorrect length argument for method ColumnArray::insertData", ErrorCodes::BAD_ARGUMENTS);
|
throw Exception("Incorrect length argument for method ColumnArray::insertData", ErrorCodes::BAD_ARGUMENTS);
|
||||||
@ -278,12 +277,12 @@ int ColumnArray::compareAt(size_t n, size_t m, const IColumn & rhs_, int nan_dir
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
template <bool positive>
|
template <bool positive>
|
||||||
struct less
|
struct Less
|
||||||
{
|
{
|
||||||
const ColumnArray & parent;
|
const ColumnArray & parent;
|
||||||
int nan_direction_hint;
|
int nan_direction_hint;
|
||||||
|
|
||||||
less(const ColumnArray & parent_, int nan_direction_hint_)
|
Less(const ColumnArray & parent_, int nan_direction_hint_)
|
||||||
: parent(parent_), nan_direction_hint(nan_direction_hint_) {}
|
: parent(parent_), nan_direction_hint(nan_direction_hint_) {}
|
||||||
|
|
||||||
bool operator()(size_t lhs, size_t rhs) const
|
bool operator()(size_t lhs, size_t rhs) const
|
||||||
@ -300,7 +299,7 @@ namespace
|
|||||||
void ColumnArray::reserve(size_t n)
|
void ColumnArray::reserve(size_t n)
|
||||||
{
|
{
|
||||||
getOffsets().reserve(n);
|
getOffsets().reserve(n);
|
||||||
getData().reserve(n); /// The average size of arrays is not taken into account here. Or it is considered to be no more than 1.
|
getData().reserve(n); /// The average size of arrays is not taken into account here. Or it is considered to be no more than 1.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -689,16 +688,16 @@ void ColumnArray::getPermutation(bool reverse, size_t limit, int nan_direction_h
|
|||||||
if (limit)
|
if (limit)
|
||||||
{
|
{
|
||||||
if (reverse)
|
if (reverse)
|
||||||
std::partial_sort(res.begin(), res.begin() + limit, res.end(), less<false>(*this, nan_direction_hint));
|
std::partial_sort(res.begin(), res.begin() + limit, res.end(), Less<false>(*this, nan_direction_hint));
|
||||||
else
|
else
|
||||||
std::partial_sort(res.begin(), res.begin() + limit, res.end(), less<true>(*this, nan_direction_hint));
|
std::partial_sort(res.begin(), res.begin() + limit, res.end(), Less<true>(*this, nan_direction_hint));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (reverse)
|
if (reverse)
|
||||||
std::sort(res.begin(), res.end(), less<false>(*this, nan_direction_hint));
|
std::sort(res.begin(), res.end(), Less<false>(*this, nan_direction_hint));
|
||||||
else
|
else
|
||||||
std::sort(res.begin(), res.end(), less<true>(*this, nan_direction_hint));
|
std::sort(res.begin(), res.end(), Less<true>(*this, nan_direction_hint));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -738,13 +737,13 @@ ColumnPtr ColumnArray::replicateNumber(const Offsets & replicate_offsets) const
|
|||||||
if (0 == col_size)
|
if (0 == col_size)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
ColumnArray & res_ = typeid_cast<ColumnArray &>(*res);
|
ColumnArray & res_arr = typeid_cast<ColumnArray &>(*res);
|
||||||
|
|
||||||
const typename ColumnVector<T>::Container & src_data = typeid_cast<const ColumnVector<T> &>(*data).getData();
|
const typename ColumnVector<T>::Container & src_data = typeid_cast<const ColumnVector<T> &>(*data).getData();
|
||||||
const Offsets & src_offsets = getOffsets();
|
const Offsets & src_offsets = getOffsets();
|
||||||
|
|
||||||
typename ColumnVector<T>::Container & res_data = typeid_cast<ColumnVector<T> &>(res_.getData()).getData();
|
typename ColumnVector<T>::Container & res_data = typeid_cast<ColumnVector<T> &>(res_arr.getData()).getData();
|
||||||
Offsets & res_offsets = res_.getOffsets();
|
Offsets & res_offsets = res_arr.getOffsets();
|
||||||
|
|
||||||
res_data.reserve(data->size() / col_size * replicate_offsets.back());
|
res_data.reserve(data->size() / col_size * replicate_offsets.back());
|
||||||
res_offsets.reserve(replicate_offsets.back());
|
res_offsets.reserve(replicate_offsets.back());
|
||||||
@ -789,16 +788,16 @@ ColumnPtr ColumnArray::replicateString(const Offsets & replicate_offsets) const
|
|||||||
if (0 == col_size)
|
if (0 == col_size)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
ColumnArray & res_ = assert_cast<ColumnArray &>(*res);
|
ColumnArray & res_arr = assert_cast<ColumnArray &>(*res);
|
||||||
|
|
||||||
const ColumnString & src_string = typeid_cast<const ColumnString &>(*data);
|
const ColumnString & src_string = typeid_cast<const ColumnString &>(*data);
|
||||||
const ColumnString::Chars & src_chars = src_string.getChars();
|
const ColumnString::Chars & src_chars = src_string.getChars();
|
||||||
const Offsets & src_string_offsets = src_string.getOffsets();
|
const Offsets & src_string_offsets = src_string.getOffsets();
|
||||||
const Offsets & src_offsets = getOffsets();
|
const Offsets & src_offsets = getOffsets();
|
||||||
|
|
||||||
ColumnString::Chars & res_chars = typeid_cast<ColumnString &>(res_.getData()).getChars();
|
ColumnString::Chars & res_chars = typeid_cast<ColumnString &>(res_arr.getData()).getChars();
|
||||||
Offsets & res_string_offsets = typeid_cast<ColumnString &>(res_.getData()).getOffsets();
|
Offsets & res_string_offsets = typeid_cast<ColumnString &>(res_arr.getData()).getOffsets();
|
||||||
Offsets & res_offsets = res_.getOffsets();
|
Offsets & res_offsets = res_arr.getOffsets();
|
||||||
|
|
||||||
res_chars.reserve(src_chars.size() / col_size * replicate_offsets.back());
|
res_chars.reserve(src_chars.size() / col_size * replicate_offsets.back());
|
||||||
res_string_offsets.reserve(src_string_offsets.size() / col_size * replicate_offsets.back());
|
res_string_offsets.reserve(src_string_offsets.size() / col_size * replicate_offsets.back());
|
||||||
|
@ -124,8 +124,8 @@ std::vector<MutableColumnPtr> ColumnFunction::scatter(IColumn::ColumnIndex num_c
|
|||||||
for (IColumn::ColumnIndex part = 0; part < num_columns; ++part)
|
for (IColumn::ColumnIndex part = 0; part < num_columns; ++part)
|
||||||
{
|
{
|
||||||
auto & capture = captures[part];
|
auto & capture = captures[part];
|
||||||
size_t size__ = capture.empty() ? counts[part] : capture.front().column->size();
|
size_t capture_size = capture.empty() ? counts[part] : capture.front().column->size();
|
||||||
columns.emplace_back(ColumnFunction::create(size__, function, std::move(capture)));
|
columns.emplace_back(ColumnFunction::create(capture_size, function, std::move(capture)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return columns;
|
return columns;
|
||||||
|
@ -401,25 +401,25 @@ void ColumnLowCardinality::Index::callForType(Callback && callback, size_t size_
|
|||||||
|
|
||||||
size_t ColumnLowCardinality::Index::getSizeOfIndexType(const IColumn & column, size_t hint)
|
size_t ColumnLowCardinality::Index::getSizeOfIndexType(const IColumn & column, size_t hint)
|
||||||
{
|
{
|
||||||
auto checkFor = [&](auto type) { return typeid_cast<const ColumnVector<decltype(type)> *>(&column) != nullptr; };
|
auto check_for = [&](auto type) { return typeid_cast<const ColumnVector<decltype(type)> *>(&column) != nullptr; };
|
||||||
auto tryGetSizeFor = [&](auto type) -> size_t { return checkFor(type) ? sizeof(decltype(type)) : 0; };
|
auto try_get_size_for = [&](auto type) -> size_t { return check_for(type) ? sizeof(decltype(type)) : 0; };
|
||||||
|
|
||||||
if (hint)
|
if (hint)
|
||||||
{
|
{
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
callForType([&](auto type) { size = tryGetSizeFor(type); }, hint);
|
callForType([&](auto type) { size = try_get_size_for(type); }, hint);
|
||||||
|
|
||||||
if (size)
|
if (size)
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto size = tryGetSizeFor(UInt8()))
|
if (auto size = try_get_size_for(UInt8()))
|
||||||
return size;
|
return size;
|
||||||
if (auto size = tryGetSizeFor(UInt16()))
|
if (auto size = try_get_size_for(UInt16()))
|
||||||
return size;
|
return size;
|
||||||
if (auto size = tryGetSizeFor(UInt32()))
|
if (auto size = try_get_size_for(UInt32()))
|
||||||
return size;
|
return size;
|
||||||
if (auto size = tryGetSizeFor(UInt64()))
|
if (auto size = try_get_size_for(UInt64()))
|
||||||
return size;
|
return size;
|
||||||
|
|
||||||
throw Exception("Unexpected indexes type for ColumnLowCardinality. Expected UInt, got " + column.getName(),
|
throw Exception("Unexpected indexes type for ColumnLowCardinality. Expected UInt, got " + column.getName(),
|
||||||
@ -515,13 +515,13 @@ UInt64 ColumnLowCardinality::Index::getMaxPositionForCurrentType() const
|
|||||||
size_t ColumnLowCardinality::Index::getPositionAt(size_t row) const
|
size_t ColumnLowCardinality::Index::getPositionAt(size_t row) const
|
||||||
{
|
{
|
||||||
size_t pos;
|
size_t pos;
|
||||||
auto getPosition = [&](auto type)
|
auto get_position = [&](auto type)
|
||||||
{
|
{
|
||||||
using CurIndexType = decltype(type);
|
using CurIndexType = decltype(type);
|
||||||
pos = getPositionsData<CurIndexType>()[row];
|
pos = getPositionsData<CurIndexType>()[row];
|
||||||
};
|
};
|
||||||
|
|
||||||
callForType(std::move(getPosition), size_of_type);
|
callForType(std::move(get_position), size_of_type);
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -536,7 +536,7 @@ void ColumnLowCardinality::Index::insertPosition(UInt64 position)
|
|||||||
|
|
||||||
void ColumnLowCardinality::Index::insertPositionsRange(const IColumn & column, UInt64 offset, UInt64 limit)
|
void ColumnLowCardinality::Index::insertPositionsRange(const IColumn & column, UInt64 offset, UInt64 limit)
|
||||||
{
|
{
|
||||||
auto insertForType = [&](auto type)
|
auto insert_for_type = [&](auto type)
|
||||||
{
|
{
|
||||||
using ColumnType = decltype(type);
|
using ColumnType = decltype(type);
|
||||||
const auto * column_ptr = typeid_cast<const ColumnVector<ColumnType> *>(&column);
|
const auto * column_ptr = typeid_cast<const ColumnVector<ColumnType> *>(&column);
|
||||||
@ -570,10 +570,10 @@ void ColumnLowCardinality::Index::insertPositionsRange(const IColumn & column, U
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!insertForType(UInt8()) &&
|
if (!insert_for_type(UInt8()) &&
|
||||||
!insertForType(UInt16()) &&
|
!insert_for_type(UInt16()) &&
|
||||||
!insertForType(UInt32()) &&
|
!insert_for_type(UInt32()) &&
|
||||||
!insertForType(UInt64()))
|
!insert_for_type(UInt64()))
|
||||||
throw Exception("Invalid column for ColumnLowCardinality index. Expected UInt, got " + column.getName(),
|
throw Exception("Invalid column for ColumnLowCardinality index. Expected UInt, got " + column.getName(),
|
||||||
ErrorCodes::ILLEGAL_COLUMN);
|
ErrorCodes::ILLEGAL_COLUMN);
|
||||||
|
|
||||||
|
@ -223,24 +223,24 @@ Dwarf::Path::Path(std::string_view baseDir, std::string_view subDir, std::string
|
|||||||
size_t Dwarf::Path::size() const
|
size_t Dwarf::Path::size() const
|
||||||
{
|
{
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
bool needsSlash = false;
|
bool needs_slash = false;
|
||||||
|
|
||||||
if (!baseDir_.empty())
|
if (!baseDir_.empty())
|
||||||
{
|
{
|
||||||
size += baseDir_.size();
|
size += baseDir_.size();
|
||||||
needsSlash = baseDir_.back() != '/';
|
needs_slash = baseDir_.back() != '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!subDir_.empty())
|
if (!subDir_.empty())
|
||||||
{
|
{
|
||||||
size += needsSlash;
|
size += needs_slash;
|
||||||
size += subDir_.size();
|
size += subDir_.size();
|
||||||
needsSlash = subDir_.back() != '/';
|
needs_slash = subDir_.back() != '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_.empty())
|
if (!file_.empty())
|
||||||
{
|
{
|
||||||
size += needsSlash;
|
size += needs_slash;
|
||||||
size += file_.size();
|
size += file_.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,38 +249,38 @@ size_t Dwarf::Path::size() const
|
|||||||
|
|
||||||
size_t Dwarf::Path::toBuffer(char * buf, size_t bufSize) const
|
size_t Dwarf::Path::toBuffer(char * buf, size_t bufSize) const
|
||||||
{
|
{
|
||||||
size_t totalSize = 0;
|
size_t total_size = 0;
|
||||||
bool needsSlash = false;
|
bool needs_slash = false;
|
||||||
|
|
||||||
auto append = [&](std::string_view sp)
|
auto append = [&](std::string_view sp)
|
||||||
{
|
{
|
||||||
if (bufSize >= 2)
|
if (bufSize >= 2)
|
||||||
{
|
{
|
||||||
size_t toCopy = std::min(sp.size(), bufSize - 1);
|
size_t to_copy = std::min(sp.size(), bufSize - 1);
|
||||||
memcpy(buf, sp.data(), toCopy);
|
memcpy(buf, sp.data(), to_copy);
|
||||||
buf += toCopy;
|
buf += to_copy;
|
||||||
bufSize -= toCopy;
|
bufSize -= to_copy;
|
||||||
}
|
}
|
||||||
totalSize += sp.size();
|
total_size += sp.size();
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!baseDir_.empty())
|
if (!baseDir_.empty())
|
||||||
{
|
{
|
||||||
append(baseDir_);
|
append(baseDir_);
|
||||||
needsSlash = baseDir_.back() != '/';
|
needs_slash = baseDir_.back() != '/';
|
||||||
}
|
}
|
||||||
if (!subDir_.empty())
|
if (!subDir_.empty())
|
||||||
{
|
{
|
||||||
if (needsSlash)
|
if (needs_slash)
|
||||||
{
|
{
|
||||||
append("/");
|
append("/");
|
||||||
}
|
}
|
||||||
append(subDir_);
|
append(subDir_);
|
||||||
needsSlash = subDir_.back() != '/';
|
needs_slash = subDir_.back() != '/';
|
||||||
}
|
}
|
||||||
if (!file_.empty())
|
if (!file_.empty())
|
||||||
{
|
{
|
||||||
if (needsSlash)
|
if (needs_slash)
|
||||||
{
|
{
|
||||||
append("/");
|
append("/");
|
||||||
}
|
}
|
||||||
@ -291,14 +291,14 @@ size_t Dwarf::Path::toBuffer(char * buf, size_t bufSize) const
|
|||||||
*buf = '\0';
|
*buf = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
SAFE_CHECK(totalSize == size(), "Size mismatch");
|
SAFE_CHECK(total_size == size(), "Size mismatch");
|
||||||
return totalSize;
|
return total_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dwarf::Path::toString(std::string & dest) const
|
void Dwarf::Path::toString(std::string & dest) const
|
||||||
{
|
{
|
||||||
size_t initialSize = dest.size();
|
size_t initial_size = dest.size();
|
||||||
dest.reserve(initialSize + size());
|
dest.reserve(initial_size + size());
|
||||||
if (!baseDir_.empty())
|
if (!baseDir_.empty())
|
||||||
{
|
{
|
||||||
dest.append(baseDir_.begin(), baseDir_.end());
|
dest.append(baseDir_.begin(), baseDir_.end());
|
||||||
@ -319,7 +319,7 @@ void Dwarf::Path::toString(std::string & dest) const
|
|||||||
}
|
}
|
||||||
dest.append(file_.begin(), file_.end());
|
dest.append(file_.begin(), file_.end());
|
||||||
}
|
}
|
||||||
SAFE_CHECK(dest.size() == initialSize + size(), "Size mismatch");
|
SAFE_CHECK(dest.size() == initial_size + size(), "Size mismatch");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next chunk in section
|
// Next chunk in section
|
||||||
@ -332,9 +332,9 @@ bool Dwarf::Section::next(std::string_view & chunk)
|
|||||||
// Initial length is a uint32_t value for a 32-bit section, and
|
// Initial length is a uint32_t value for a 32-bit section, and
|
||||||
// a 96-bit value (0xffffffff followed by the 64-bit length) for a 64-bit
|
// a 96-bit value (0xffffffff followed by the 64-bit length) for a 64-bit
|
||||||
// section.
|
// section.
|
||||||
auto initialLength = read<uint32_t>(chunk);
|
auto initial_length = read<uint32_t>(chunk);
|
||||||
is64Bit_ = (initialLength == uint32_t(-1));
|
is64Bit_ = (initial_length == uint32_t(-1));
|
||||||
auto length = is64Bit_ ? read<uint64_t>(chunk) : initialLength;
|
auto length = is64Bit_ ? read<uint64_t>(chunk) : initial_length;
|
||||||
SAFE_CHECK(length <= chunk.size(), "invalid DWARF section");
|
SAFE_CHECK(length <= chunk.size(), "invalid DWARF section");
|
||||||
chunk = std::string_view(chunk.data(), length);
|
chunk = std::string_view(chunk.data(), length);
|
||||||
data_ = std::string_view(chunk.end(), data_.end() - chunk.end());
|
data_ = std::string_view(chunk.end(), data_.end() - chunk.end());
|
||||||
@ -387,7 +387,7 @@ bool Dwarf::readAbbreviation(std::string_view & section, DIEAbbreviation & abbr)
|
|||||||
abbr.hasChildren = (read<uint8_t>(section) != DW_CHILDREN_no);
|
abbr.hasChildren = (read<uint8_t>(section) != DW_CHILDREN_no);
|
||||||
|
|
||||||
// attributes
|
// attributes
|
||||||
const char * attributeBegin = section.data();
|
const char * attribute_begin = section.data();
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
SAFE_CHECK(!section.empty(), "invalid attribute section");
|
SAFE_CHECK(!section.empty(), "invalid attribute section");
|
||||||
@ -396,7 +396,7 @@ bool Dwarf::readAbbreviation(std::string_view & section, DIEAbbreviation & abbr)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
abbr.attributes = std::string_view(attributeBegin, section.data() - attributeBegin);
|
abbr.attributes = std::string_view(attribute_begin, section.data() - attribute_begin);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -483,18 +483,18 @@ std::string_view Dwarf::getStringFromStringSection(uint64_t offset) const
|
|||||||
*/
|
*/
|
||||||
bool Dwarf::findDebugInfoOffset(uintptr_t address, std::string_view aranges, uint64_t & offset)
|
bool Dwarf::findDebugInfoOffset(uintptr_t address, std::string_view aranges, uint64_t & offset)
|
||||||
{
|
{
|
||||||
Section arangesSection(aranges);
|
Section aranges_section(aranges);
|
||||||
std::string_view chunk;
|
std::string_view chunk;
|
||||||
while (arangesSection.next(chunk))
|
while (aranges_section.next(chunk))
|
||||||
{
|
{
|
||||||
auto version = read<uint16_t>(chunk);
|
auto version = read<uint16_t>(chunk);
|
||||||
SAFE_CHECK(version == 2, "invalid aranges version");
|
SAFE_CHECK(version == 2, "invalid aranges version");
|
||||||
|
|
||||||
offset = readOffset(chunk, arangesSection.is64Bit());
|
offset = readOffset(chunk, aranges_section.is64Bit());
|
||||||
auto addressSize = read<uint8_t>(chunk);
|
auto address_size = read<uint8_t>(chunk);
|
||||||
SAFE_CHECK(addressSize == sizeof(uintptr_t), "invalid address size");
|
SAFE_CHECK(address_size == sizeof(uintptr_t), "invalid address size");
|
||||||
auto segmentSize = read<uint8_t>(chunk);
|
auto segment_size = read<uint8_t>(chunk);
|
||||||
SAFE_CHECK(segmentSize == 0, "segmented architecture not supported");
|
SAFE_CHECK(segment_size == 0, "segmented architecture not supported");
|
||||||
|
|
||||||
// Padded to a multiple of 2 addresses.
|
// Padded to a multiple of 2 addresses.
|
||||||
// Strangely enough, this is the only place in the DWARF spec that requires
|
// Strangely enough, this is the only place in the DWARF spec that requires
|
||||||
@ -537,15 +537,15 @@ bool Dwarf::findLocation(uintptr_t address, std::string_view & infoEntry, Locati
|
|||||||
// 3. debug_abbrev_offset (4B or 8B): offset into the .debug_abbrev section
|
// 3. debug_abbrev_offset (4B or 8B): offset into the .debug_abbrev section
|
||||||
// 4. address_size (1B)
|
// 4. address_size (1B)
|
||||||
|
|
||||||
Section debugInfoSection(infoEntry);
|
Section debug_info_section(infoEntry);
|
||||||
std::string_view chunk;
|
std::string_view chunk;
|
||||||
SAFE_CHECK(debugInfoSection.next(chunk), "invalid debug info");
|
SAFE_CHECK(debug_info_section.next(chunk), "invalid debug info");
|
||||||
|
|
||||||
auto version = read<uint16_t>(chunk);
|
auto version = read<uint16_t>(chunk);
|
||||||
SAFE_CHECK(version >= 2 && version <= 4, "invalid info version");
|
SAFE_CHECK(version >= 2 && version <= 4, "invalid info version");
|
||||||
uint64_t abbrevOffset = readOffset(chunk, debugInfoSection.is64Bit());
|
uint64_t abbrev_offset = readOffset(chunk, debug_info_section.is64Bit());
|
||||||
auto addressSize = read<uint8_t>(chunk);
|
auto address_size = read<uint8_t>(chunk);
|
||||||
SAFE_CHECK(addressSize == sizeof(uintptr_t), "invalid address size");
|
SAFE_CHECK(address_size == sizeof(uintptr_t), "invalid address size");
|
||||||
|
|
||||||
// We survived so far. The first (and only) DIE should be DW_TAG_compile_unit
|
// We survived so far. The first (and only) DIE should be DW_TAG_compile_unit
|
||||||
// NOTE: - binutils <= 2.25 does not issue DW_TAG_partial_unit.
|
// NOTE: - binutils <= 2.25 does not issue DW_TAG_partial_unit.
|
||||||
@ -553,16 +553,16 @@ bool Dwarf::findLocation(uintptr_t address, std::string_view & infoEntry, Locati
|
|||||||
// TODO(tudorb): Handle DW_TAG_partial_unit?
|
// TODO(tudorb): Handle DW_TAG_partial_unit?
|
||||||
auto code = readULEB(chunk);
|
auto code = readULEB(chunk);
|
||||||
SAFE_CHECK(code != 0, "invalid code");
|
SAFE_CHECK(code != 0, "invalid code");
|
||||||
auto abbr = getAbbreviation(code, abbrevOffset);
|
auto abbr = getAbbreviation(code, abbrev_offset);
|
||||||
SAFE_CHECK(abbr.tag == DW_TAG_compile_unit, "expecting compile unit entry");
|
SAFE_CHECK(abbr.tag == DW_TAG_compile_unit, "expecting compile unit entry");
|
||||||
// Skip children entries, remove_prefix to the next compilation unit entry.
|
// Skip children entries, remove_prefix to the next compilation unit entry.
|
||||||
infoEntry.remove_prefix(chunk.end() - infoEntry.begin());
|
infoEntry.remove_prefix(chunk.end() - infoEntry.begin());
|
||||||
|
|
||||||
// Read attributes, extracting the few we care about
|
// Read attributes, extracting the few we care about
|
||||||
bool foundLineOffset = false;
|
bool found_line_offset = false;
|
||||||
uint64_t lineOffset = 0;
|
uint64_t line_offset = 0;
|
||||||
std::string_view compilationDirectory;
|
std::string_view compilation_directory;
|
||||||
std::string_view mainFileName;
|
std::string_view main_file_name;
|
||||||
|
|
||||||
DIEAbbreviation::Attribute attr;
|
DIEAbbreviation::Attribute attr;
|
||||||
std::string_view attributes = abbr.attributes;
|
std::string_view attributes = abbr.attributes;
|
||||||
@ -573,43 +573,43 @@ bool Dwarf::findLocation(uintptr_t address, std::string_view & infoEntry, Locati
|
|||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
auto val = readAttributeValue(chunk, attr.form, debugInfoSection.is64Bit());
|
auto val = readAttributeValue(chunk, attr.form, debug_info_section.is64Bit());
|
||||||
switch (attr.name)
|
switch (attr.name)
|
||||||
{
|
{
|
||||||
case DW_AT_stmt_list:
|
case DW_AT_stmt_list:
|
||||||
// Offset in .debug_line for the line number VM program for this
|
// Offset in .debug_line for the line number VM program for this
|
||||||
// compilation unit
|
// compilation unit
|
||||||
lineOffset = std::get<uint64_t>(val);
|
line_offset = std::get<uint64_t>(val);
|
||||||
foundLineOffset = true;
|
found_line_offset = true;
|
||||||
break;
|
break;
|
||||||
case DW_AT_comp_dir:
|
case DW_AT_comp_dir:
|
||||||
// Compilation directory
|
// Compilation directory
|
||||||
compilationDirectory = std::get<std::string_view>(val);
|
compilation_directory = std::get<std::string_view>(val);
|
||||||
break;
|
break;
|
||||||
case DW_AT_name:
|
case DW_AT_name:
|
||||||
// File name of main file being compiled
|
// File name of main file being compiled
|
||||||
mainFileName = std::get<std::string_view>(val);
|
main_file_name = std::get<std::string_view>(val);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mainFileName.empty())
|
if (!main_file_name.empty())
|
||||||
{
|
{
|
||||||
locationInfo.hasMainFile = true;
|
locationInfo.hasMainFile = true;
|
||||||
locationInfo.mainFile = Path(compilationDirectory, "", mainFileName);
|
locationInfo.mainFile = Path(compilation_directory, "", main_file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!foundLineOffset)
|
if (!found_line_offset)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string_view lineSection(line_);
|
std::string_view line_section(line_);
|
||||||
lineSection.remove_prefix(lineOffset);
|
line_section.remove_prefix(line_offset);
|
||||||
LineNumberVM lineVM(lineSection, compilationDirectory);
|
LineNumberVM line_vm(line_section, compilation_directory);
|
||||||
|
|
||||||
// Execute line number VM program to find file and line
|
// Execute line number VM program to find file and line
|
||||||
locationInfo.hasFileAndLine = lineVM.findAddress(address, locationInfo.file, locationInfo.line);
|
locationInfo.hasFileAndLine = line_vm.findAddress(address, locationInfo.file, locationInfo.line);
|
||||||
return locationInfo.hasFileAndLine;
|
return locationInfo.hasFileAndLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -635,9 +635,9 @@ bool Dwarf::findAddress(uintptr_t address, LocationInfo & locationInfo, Location
|
|||||||
if (findDebugInfoOffset(address, aranges_, offset))
|
if (findDebugInfoOffset(address, aranges_, offset))
|
||||||
{
|
{
|
||||||
// Read compilation unit header from .debug_info
|
// Read compilation unit header from .debug_info
|
||||||
std::string_view infoEntry(info_);
|
std::string_view info_entry(info_);
|
||||||
infoEntry.remove_prefix(offset);
|
info_entry.remove_prefix(offset);
|
||||||
findLocation(address, infoEntry, locationInfo);
|
findLocation(address, info_entry, locationInfo);
|
||||||
return locationInfo.hasFileAndLine;
|
return locationInfo.hasFileAndLine;
|
||||||
}
|
}
|
||||||
else if (mode == LocationInfoMode::FAST)
|
else if (mode == LocationInfoMode::FAST)
|
||||||
@ -657,9 +657,9 @@ bool Dwarf::findAddress(uintptr_t address, LocationInfo & locationInfo, Location
|
|||||||
|
|
||||||
// Slow path (linear scan): Iterate over all .debug_info entries
|
// Slow path (linear scan): Iterate over all .debug_info entries
|
||||||
// and look for the address in each compilation unit.
|
// and look for the address in each compilation unit.
|
||||||
std::string_view infoEntry(info_);
|
std::string_view info_entry(info_);
|
||||||
while (!infoEntry.empty() && !locationInfo.hasFileAndLine)
|
while (!info_entry.empty() && !locationInfo.hasFileAndLine)
|
||||||
findLocation(address, infoEntry, locationInfo);
|
findLocation(address, info_entry, locationInfo);
|
||||||
|
|
||||||
return locationInfo.hasFileAndLine;
|
return locationInfo.hasFileAndLine;
|
||||||
}
|
}
|
||||||
@ -693,16 +693,16 @@ void Dwarf::LineNumberVM::init()
|
|||||||
{
|
{
|
||||||
version_ = read<uint16_t>(data_);
|
version_ = read<uint16_t>(data_);
|
||||||
SAFE_CHECK(version_ >= 2 && version_ <= 4, "invalid version in line number VM");
|
SAFE_CHECK(version_ >= 2 && version_ <= 4, "invalid version in line number VM");
|
||||||
uint64_t headerLength = readOffset(data_, is64Bit_);
|
uint64_t header_length = readOffset(data_, is64Bit_);
|
||||||
SAFE_CHECK(headerLength <= data_.size(), "invalid line number VM header length");
|
SAFE_CHECK(header_length <= data_.size(), "invalid line number VM header length");
|
||||||
std::string_view header(data_.data(), headerLength);
|
std::string_view header(data_.data(), header_length);
|
||||||
data_ = std::string_view(header.end(), data_.end() - header.end());
|
data_ = std::string_view(header.end(), data_.end() - header.end());
|
||||||
|
|
||||||
minLength_ = read<uint8_t>(header);
|
minLength_ = read<uint8_t>(header);
|
||||||
if (version_ == 4)
|
if (version_ == 4)
|
||||||
{ // Version 2 and 3 records don't have this
|
{ // Version 2 and 3 records don't have this
|
||||||
uint8_t maxOpsPerInstruction = read<uint8_t>(header);
|
uint8_t max_ops_per_instruction = read<uint8_t>(header);
|
||||||
SAFE_CHECK(maxOpsPerInstruction == 1, "VLIW not supported");
|
SAFE_CHECK(max_ops_per_instruction == 1, "VLIW not supported");
|
||||||
}
|
}
|
||||||
defaultIsStmt_ = read<uint8_t>(header);
|
defaultIsStmt_ = read<uint8_t>(header);
|
||||||
lineBase_ = read<int8_t>(header); // yes, signed
|
lineBase_ = read<int8_t>(header); // yes, signed
|
||||||
@ -752,10 +752,10 @@ Dwarf::LineNumberVM::FileName Dwarf::LineNumberVM::getFileName(uint64_t index) c
|
|||||||
FileName fn;
|
FileName fn;
|
||||||
if (index <= fileNameCount_)
|
if (index <= fileNameCount_)
|
||||||
{
|
{
|
||||||
std::string_view fileNames = fileNames_;
|
std::string_view file_names = fileNames_;
|
||||||
for (; index; --index)
|
for (; index; --index)
|
||||||
{
|
{
|
||||||
if (!readFileName(fileNames, fn))
|
if (!readFileName(file_names, fn))
|
||||||
{
|
{
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
@ -783,11 +783,11 @@ std::string_view Dwarf::LineNumberVM::getIncludeDirectory(uint64_t index) const
|
|||||||
|
|
||||||
SAFE_CHECK(index <= includeDirectoryCount_, "invalid include directory");
|
SAFE_CHECK(index <= includeDirectoryCount_, "invalid include directory");
|
||||||
|
|
||||||
std::string_view includeDirectories = includeDirectories_;
|
std::string_view include_directories = includeDirectories_;
|
||||||
std::string_view dir;
|
std::string_view dir;
|
||||||
for (; index; --index)
|
for (; index; --index)
|
||||||
{
|
{
|
||||||
dir = readNullTerminated(includeDirectories);
|
dir = readNullTerminated(include_directories);
|
||||||
if (dir.empty())
|
if (dir.empty())
|
||||||
{
|
{
|
||||||
abort(); // BUG
|
abort(); // BUG
|
||||||
@ -825,8 +825,8 @@ bool Dwarf::LineNumberVM::nextDefineFile(std::string_view & program, FileName &
|
|||||||
if (opcode != 0)
|
if (opcode != 0)
|
||||||
{ // standard opcode
|
{ // standard opcode
|
||||||
// Skip, slurp the appropriate number of LEB arguments
|
// Skip, slurp the appropriate number of LEB arguments
|
||||||
uint8_t argCount = standardOpcodeLengths_[opcode - 1];
|
uint8_t arg_count = standardOpcodeLengths_[opcode - 1];
|
||||||
while (argCount--)
|
while (arg_count--)
|
||||||
{
|
{
|
||||||
readULEB(program);
|
readULEB(program);
|
||||||
}
|
}
|
||||||
@ -858,11 +858,11 @@ Dwarf::LineNumberVM::StepResult Dwarf::LineNumberVM::step(std::string_view & pro
|
|||||||
|
|
||||||
if (opcode >= opcodeBase_)
|
if (opcode >= opcodeBase_)
|
||||||
{ // special opcode
|
{ // special opcode
|
||||||
uint8_t adjustedOpcode = opcode - opcodeBase_;
|
uint8_t adjusted_opcode = opcode - opcodeBase_;
|
||||||
uint8_t opAdvance = adjustedOpcode / lineRange_;
|
uint8_t op_advance = adjusted_opcode / lineRange_;
|
||||||
|
|
||||||
address_ += minLength_ * opAdvance;
|
address_ += minLength_ * op_advance;
|
||||||
line_ += lineBase_ + adjustedOpcode % lineRange_;
|
line_ += lineBase_ + adjusted_opcode % lineRange_;
|
||||||
|
|
||||||
basicBlock_ = false;
|
basicBlock_ = false;
|
||||||
prologueEnd_ = false;
|
prologueEnd_ = false;
|
||||||
@ -932,8 +932,8 @@ Dwarf::LineNumberVM::StepResult Dwarf::LineNumberVM::step(std::string_view & pro
|
|||||||
|
|
||||||
// Unrecognized standard opcode, slurp the appropriate number of LEB
|
// Unrecognized standard opcode, slurp the appropriate number of LEB
|
||||||
// arguments.
|
// arguments.
|
||||||
uint8_t argCount = standardOpcodeLengths_[opcode - 1];
|
uint8_t arg_count = standardOpcodeLengths_[opcode - 1];
|
||||||
while (argCount--)
|
while (arg_count--)
|
||||||
{
|
{
|
||||||
readULEB(program);
|
readULEB(program);
|
||||||
}
|
}
|
||||||
@ -944,10 +944,10 @@ Dwarf::LineNumberVM::StepResult Dwarf::LineNumberVM::step(std::string_view & pro
|
|||||||
auto length = readULEB(program);
|
auto length = readULEB(program);
|
||||||
// the opcode itself should be included in the length, so length >= 1
|
// the opcode itself should be included in the length, so length >= 1
|
||||||
SAFE_CHECK(length != 0, "invalid extended opcode length");
|
SAFE_CHECK(length != 0, "invalid extended opcode length");
|
||||||
auto extendedOpcode = read<uint8_t>(program);
|
auto extended_opcode = read<uint8_t>(program);
|
||||||
--length;
|
--length;
|
||||||
|
|
||||||
switch (extendedOpcode)
|
switch (extended_opcode)
|
||||||
{
|
{
|
||||||
case DW_LNE_end_sequence:
|
case DW_LNE_end_sequence:
|
||||||
return END;
|
return END;
|
||||||
@ -987,15 +987,15 @@ bool Dwarf::LineNumberVM::findAddress(uintptr_t target, Path & file, uint64_t &
|
|||||||
State state = START;
|
State state = START;
|
||||||
reset();
|
reset();
|
||||||
|
|
||||||
uint64_t prevFile = 0;
|
uint64_t prev_file = 0;
|
||||||
uint64_t prevLine = 0;
|
uint64_t prev_line = 0;
|
||||||
while (!program.empty())
|
while (!program.empty())
|
||||||
{
|
{
|
||||||
bool seqEnd = !next(program);
|
bool seq_end = !next(program);
|
||||||
|
|
||||||
if (state == START)
|
if (state == START)
|
||||||
{
|
{
|
||||||
if (!seqEnd)
|
if (!seq_end)
|
||||||
{
|
{
|
||||||
state = address_ <= target ? LOW_SEQ : HIGH_SEQ;
|
state = address_ <= target ? LOW_SEQ : HIGH_SEQ;
|
||||||
}
|
}
|
||||||
@ -1008,20 +1008,20 @@ bool Dwarf::LineNumberVM::findAddress(uintptr_t target, Path & file, uint64_t &
|
|||||||
// Found it! Note that ">" is indeed correct (not ">="), as each
|
// Found it! Note that ">" is indeed correct (not ">="), as each
|
||||||
// sequence is guaranteed to have one entry past-the-end (emitted by
|
// sequence is guaranteed to have one entry past-the-end (emitted by
|
||||||
// DW_LNE_end_sequence)
|
// DW_LNE_end_sequence)
|
||||||
if (prevFile == 0)
|
if (prev_file == 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto fn = getFileName(prevFile);
|
auto fn = getFileName(prev_file);
|
||||||
file = Path(compilationDirectory_, getIncludeDirectory(fn.directoryIndex), fn.relativeName);
|
file = Path(compilationDirectory_, getIncludeDirectory(fn.directoryIndex), fn.relativeName);
|
||||||
line = prevLine;
|
line = prev_line;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
prevFile = file_;
|
prev_file = file_;
|
||||||
prevLine = line_;
|
prev_line = line_;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seqEnd)
|
if (seq_end)
|
||||||
{
|
{
|
||||||
state = START;
|
state = START;
|
||||||
reset();
|
reset();
|
||||||
|
@ -74,7 +74,7 @@ public:
|
|||||||
/** The `Entry` object protects the resource from being used by another thread.
|
/** The `Entry` object protects the resource from being used by another thread.
|
||||||
* The following methods are forbidden for `rvalue`, so you can not write a similar to
|
* The following methods are forbidden for `rvalue`, so you can not write a similar to
|
||||||
*
|
*
|
||||||
* auto q = pool.Get()->query("SELECT .."); // Oops, after this line Entry was destroyed
|
* auto q = pool.get()->query("SELECT .."); // Oops, after this line Entry was destroyed
|
||||||
* q.execute (); // Someone else can use this Connection
|
* q.execute (); // Someone else can use this Connection
|
||||||
*/
|
*/
|
||||||
Object * operator->() && = delete;
|
Object * operator->() && = delete;
|
||||||
|
@ -64,7 +64,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
/// A separate method which binds the lock holder to the owned lock
|
/// A separate method which binds the lock holder to the owned lock
|
||||||
/// N.B. It is very important that this method produces no allocations
|
/// N.B. It is very important that this method produces no allocations
|
||||||
bool bind_with(RWLock && parent_, GroupsContainer::iterator it_group_) noexcept
|
bool bindWith(RWLock && parent_, GroupsContainer::iterator it_group_) noexcept
|
||||||
{
|
{
|
||||||
if (bound)
|
if (bound)
|
||||||
return false;
|
return false;
|
||||||
@ -170,7 +170,7 @@ RWLockImpl::LockHolder RWLockImpl::getLock(RWLockImpl::Type type, const String &
|
|||||||
/// N.B. Type is Read here, query_id is not empty and it_query is a valid iterator
|
/// N.B. Type is Read here, query_id is not empty and it_query is a valid iterator
|
||||||
all_read_locks.add(query_id); /// SM1: may throw on insertion (nothing to roll back)
|
all_read_locks.add(query_id); /// SM1: may throw on insertion (nothing to roll back)
|
||||||
++it_query->second; /// SM2: nothrow
|
++it_query->second; /// SM2: nothrow
|
||||||
lock_holder->bind_with(shared_from_this(), current_owner_group); /// SM3: nothrow
|
lock_holder->bindWith(shared_from_this(), current_owner_group); /// SM3: nothrow
|
||||||
|
|
||||||
finalize_metrics();
|
finalize_metrics();
|
||||||
return lock_holder;
|
return lock_holder;
|
||||||
@ -244,7 +244,7 @@ RWLockImpl::LockHolder RWLockImpl::getLock(RWLockImpl::Type type, const String &
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_holder->bind_with(shared_from_this(), it_group); /// SM: nothrow
|
lock_holder->bindWith(shared_from_this(), it_group); /// SM: nothrow
|
||||||
|
|
||||||
finalize_metrics();
|
finalize_metrics();
|
||||||
return lock_holder;
|
return lock_holder;
|
||||||
|
@ -212,11 +212,11 @@ void ThreadFuzzer::setup()
|
|||||||
if (sigaction(SIGPROF, &sa, nullptr))
|
if (sigaction(SIGPROF, &sa, nullptr))
|
||||||
throwFromErrno("Failed to setup signal handler for thread fuzzer", ErrorCodes::CANNOT_SET_SIGNAL_HANDLER);
|
throwFromErrno("Failed to setup signal handler for thread fuzzer", ErrorCodes::CANNOT_SET_SIGNAL_HANDLER);
|
||||||
|
|
||||||
static constexpr UInt32 TIMER_PRECISION = 1000000;
|
static constexpr UInt32 timer_precision = 1000000;
|
||||||
|
|
||||||
struct timeval interval;
|
struct timeval interval;
|
||||||
interval.tv_sec = cpu_time_period_us / TIMER_PRECISION;
|
interval.tv_sec = cpu_time_period_us / timer_precision;
|
||||||
interval.tv_usec = cpu_time_period_us % TIMER_PRECISION;
|
interval.tv_usec = cpu_time_period_us % timer_precision;
|
||||||
|
|
||||||
struct itimerval timer = {.it_interval = interval, .it_value = interval};
|
struct itimerval timer = {.it_interval = interval, .it_value = interval};
|
||||||
|
|
||||||
|
@ -758,17 +758,17 @@ struct ZooKeeperMultiResponse final : MultiResponse, ZooKeeperResponse
|
|||||||
{
|
{
|
||||||
ZooKeeper::OpNum op_num;
|
ZooKeeper::OpNum op_num;
|
||||||
bool done;
|
bool done;
|
||||||
int32_t error_;
|
int32_t error_read;
|
||||||
|
|
||||||
Coordination::read(op_num, in);
|
Coordination::read(op_num, in);
|
||||||
Coordination::read(done, in);
|
Coordination::read(done, in);
|
||||||
Coordination::read(error_, in);
|
Coordination::read(error_read, in);
|
||||||
|
|
||||||
if (!done)
|
if (!done)
|
||||||
throw Exception("Too many results received for multi transaction", ZMARSHALLINGERROR);
|
throw Exception("Too many results received for multi transaction", ZMARSHALLINGERROR);
|
||||||
if (op_num != -1)
|
if (op_num != -1)
|
||||||
throw Exception("Unexpected op_num received at the end of results for multi transaction", ZMARSHALLINGERROR);
|
throw Exception("Unexpected op_num received at the end of results for multi transaction", ZMARSHALLINGERROR);
|
||||||
if (error_ != -1)
|
if (error_read != -1)
|
||||||
throw Exception("Unexpected error value received at the end of results for multi transaction", ZMARSHALLINGERROR);
|
throw Exception("Unexpected error value received at the end of results for multi transaction", ZMARSHALLINGERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ struct SmallLock
|
|||||||
{
|
{
|
||||||
std::atomic<int> locked {false};
|
std::atomic<int> locked {false};
|
||||||
|
|
||||||
bool try_lock()
|
bool tryLock()
|
||||||
{
|
{
|
||||||
int expected = 0;
|
int expected = 0;
|
||||||
return locked.compare_exchange_strong(expected, 1, std::memory_order_acquire);
|
return locked.compare_exchange_strong(expected, 1, std::memory_order_acquire);
|
||||||
|
@ -61,7 +61,7 @@ UInt32 getCompressedDataSize(UInt8 data_bytes_size, UInt32 uncompressed_size)
|
|||||||
return (items_count * max_item_size_bits + 8) / 8;
|
return (items_count * max_item_size_bits + 8) / 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct binary_value_info
|
struct BinaryValueInfo
|
||||||
{
|
{
|
||||||
UInt8 leading_zero_bits;
|
UInt8 leading_zero_bits;
|
||||||
UInt8 data_bits;
|
UInt8 data_bits;
|
||||||
@ -69,7 +69,7 @@ struct binary_value_info
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
binary_value_info getLeadingAndTrailingBits(const T & value)
|
BinaryValueInfo getLeadingAndTrailingBits(const T & value)
|
||||||
{
|
{
|
||||||
constexpr UInt8 bit_size = sizeof(T) * 8;
|
constexpr UInt8 bit_size = sizeof(T) * 8;
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ binary_value_info getLeadingAndTrailingBits(const T & value)
|
|||||||
const UInt8 tz = getTrailingZeroBits(value);
|
const UInt8 tz = getTrailingZeroBits(value);
|
||||||
const UInt8 data_size = value == 0 ? 0 : static_cast<UInt8>(bit_size - lz - tz);
|
const UInt8 data_size = value == 0 ? 0 : static_cast<UInt8>(bit_size - lz - tz);
|
||||||
|
|
||||||
return binary_value_info{lz, data_size, tz};
|
return BinaryValueInfo{lz, data_size, tz};
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -99,7 +99,7 @@ UInt32 compressDataForType(const char * source, UInt32 source_size, char * dest,
|
|||||||
|
|
||||||
T prev_value{};
|
T prev_value{};
|
||||||
// That would cause first XORed value to be written in-full.
|
// That would cause first XORed value to be written in-full.
|
||||||
binary_value_info prev_xored_info{0, 0, 0};
|
BinaryValueInfo prev_xored_info{0, 0, 0};
|
||||||
|
|
||||||
if (source < source_end)
|
if (source < source_end)
|
||||||
{
|
{
|
||||||
@ -118,7 +118,7 @@ UInt32 compressDataForType(const char * source, UInt32 source_size, char * dest,
|
|||||||
source += sizeof(curr_value);
|
source += sizeof(curr_value);
|
||||||
|
|
||||||
const auto xored_data = curr_value ^ prev_value;
|
const auto xored_data = curr_value ^ prev_value;
|
||||||
const binary_value_info curr_xored_info = getLeadingAndTrailingBits(xored_data);
|
const BinaryValueInfo curr_xored_info = getLeadingAndTrailingBits(xored_data);
|
||||||
|
|
||||||
if (xored_data == 0)
|
if (xored_data == 0)
|
||||||
{
|
{
|
||||||
@ -177,14 +177,14 @@ void decompressDataForType(const char * source, UInt32 source_size, char * dest)
|
|||||||
|
|
||||||
BitReader reader(source, source_size - sizeof(items_count) - sizeof(prev_value));
|
BitReader reader(source, source_size - sizeof(items_count) - sizeof(prev_value));
|
||||||
|
|
||||||
binary_value_info prev_xored_info{0, 0, 0};
|
BinaryValueInfo prev_xored_info{0, 0, 0};
|
||||||
|
|
||||||
// since data is tightly packed, up to 1 bit per value, and last byte is padded with zeroes,
|
// since data is tightly packed, up to 1 bit per value, and last byte is padded with zeroes,
|
||||||
// we have to keep track of items to avoid reading more that there is.
|
// we have to keep track of items to avoid reading more that there is.
|
||||||
for (UInt32 items_read = 1; items_read < items_count && !reader.eof(); ++items_read)
|
for (UInt32 items_read = 1; items_read < items_count && !reader.eof(); ++items_read)
|
||||||
{
|
{
|
||||||
T curr_value = prev_value;
|
T curr_value = prev_value;
|
||||||
binary_value_info curr_xored_info = prev_xored_info;
|
BinaryValueInfo curr_xored_info = prev_xored_info;
|
||||||
T xored_data{};
|
T xored_data{};
|
||||||
|
|
||||||
if (reader.readBit() == 1)
|
if (reader.readBit() == 1)
|
||||||
|
@ -171,7 +171,7 @@ public:
|
|||||||
return current_value;
|
return current_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ItemsLeft() const
|
size_t itemsLeft() const
|
||||||
{
|
{
|
||||||
return reinterpret_cast<const char *>(data_end) - reinterpret_cast<const char *>(data);
|
return reinterpret_cast<const char *>(data_end) - reinterpret_cast<const char *>(data);
|
||||||
}
|
}
|
||||||
@ -184,7 +184,7 @@ public:
|
|||||||
|
|
||||||
explicit operator bool() const
|
explicit operator bool() const
|
||||||
{
|
{
|
||||||
return ItemsLeft() > 0;
|
return itemsLeft() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -230,7 +230,7 @@ template <typename T, typename ContainerLeft, typename ContainerRight>
|
|||||||
auto l = AsSequenceOf<T>(left);
|
auto l = AsSequenceOf<T>(left);
|
||||||
auto r = AsSequenceOf<T>(right);
|
auto r = AsSequenceOf<T>(right);
|
||||||
|
|
||||||
const auto MAX_MISMATCHING_ITEMS = 5;
|
static constexpr auto MAX_MISMATCHING_ITEMS = 5;
|
||||||
int mismatching_items = 0;
|
int mismatching_items = 0;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
@ -607,7 +607,7 @@ TEST_P(CodecTestPerformance, TranscodingWithDataType)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto computeMeanAndStdDev = [](const auto & values)
|
auto compute_mean_and_stddev = [](const auto & values)
|
||||||
{
|
{
|
||||||
double mean{};
|
double mean{};
|
||||||
|
|
||||||
@ -648,7 +648,7 @@ TEST_P(CodecTestPerformance, TranscodingWithDataType)
|
|||||||
for (const auto & k : {"encoding", "decoding"})
|
for (const auto & k : {"encoding", "decoding"})
|
||||||
{
|
{
|
||||||
const auto & values = results[k];
|
const auto & values = results[k];
|
||||||
const auto & [mean, std_dev] = computeMeanAndStdDev(values);
|
const auto & [mean, std_dev] = compute_mean_and_stddev(values);
|
||||||
// Ensure that Coefficient of variation is reasonably low, otherwise these numbers are meaningless
|
// Ensure that Coefficient of variation is reasonably low, otherwise these numbers are meaningless
|
||||||
EXPECT_GT(0.05, std_dev / mean);
|
EXPECT_GT(0.05, std_dev / mean);
|
||||||
std::cerr << "\t" << std::fixed << std::setprecision(1) << mean / 1000.0;
|
std::cerr << "\t" << std::fixed << std::setprecision(1) << mean / 1000.0;
|
||||||
@ -1128,7 +1128,7 @@ template <typename ValueType>
|
|||||||
auto DDCompatibilityTestSequence()
|
auto DDCompatibilityTestSequence()
|
||||||
{
|
{
|
||||||
// Generates sequences with double delta in given range.
|
// Generates sequences with double delta in given range.
|
||||||
auto ddGenerator = [prev_delta = static_cast<Int64>(0), prev = static_cast<Int64>(0)](auto dd) mutable
|
auto dd_generator = [prev_delta = static_cast<Int64>(0), prev = static_cast<Int64>(0)](auto dd) mutable
|
||||||
{
|
{
|
||||||
const auto curr = dd + prev + prev_delta;
|
const auto curr = dd + prev + prev_delta;
|
||||||
prev = curr;
|
prev = curr;
|
||||||
@ -1150,7 +1150,7 @@ auto DDCompatibilityTestSequence()
|
|||||||
|
|
||||||
// - 4 is to allow DD value to settle before transitioning through important point,
|
// - 4 is to allow DD value to settle before transitioning through important point,
|
||||||
// since DD depends on 2 previous values of data, + 2 is arbitrary.
|
// since DD depends on 2 previous values of data, + 2 is arbitrary.
|
||||||
ret.append(generateSeq<ValueType>(G(ddGenerator), p - 4, p + 2));
|
ret.append(generateSeq<ValueType>(G(dd_generator), p - 4, p + 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -191,7 +191,7 @@ private:
|
|||||||
const ColumnConst * c0_const = checkAndGetColumnConst<ColVecA>(c0.get());
|
const ColumnConst * c0_const = checkAndGetColumnConst<ColVecA>(c0.get());
|
||||||
A a = c0_const->template getValue<A>();
|
A a = c0_const->template getValue<A>();
|
||||||
if (const ColVecB * c1_vec = checkAndGetColumn<ColVecB>(c1.get()))
|
if (const ColVecB * c1_vec = checkAndGetColumn<ColVecB>(c1.get()))
|
||||||
constant_vector<scale_left, scale_right>(a, c1_vec->getData(), vec_res, scale);
|
constantVector<scale_left, scale_right>(a, c1_vec->getData(), vec_res, scale);
|
||||||
else
|
else
|
||||||
throw Exception("Wrong column in Decimal comparison", ErrorCodes::LOGICAL_ERROR);
|
throw Exception("Wrong column in Decimal comparison", ErrorCodes::LOGICAL_ERROR);
|
||||||
}
|
}
|
||||||
@ -200,7 +200,7 @@ private:
|
|||||||
const ColumnConst * c1_const = checkAndGetColumnConst<ColVecB>(c1.get());
|
const ColumnConst * c1_const = checkAndGetColumnConst<ColVecB>(c1.get());
|
||||||
B b = c1_const->template getValue<B>();
|
B b = c1_const->template getValue<B>();
|
||||||
if (const ColVecA * c0_vec = checkAndGetColumn<ColVecA>(c0.get()))
|
if (const ColVecA * c0_vec = checkAndGetColumn<ColVecA>(c0.get()))
|
||||||
vector_constant<scale_left, scale_right>(c0_vec->getData(), b, vec_res, scale);
|
vectorConstant<scale_left, scale_right>(c0_vec->getData(), b, vec_res, scale);
|
||||||
else
|
else
|
||||||
throw Exception("Wrong column in Decimal comparison", ErrorCodes::LOGICAL_ERROR);
|
throw Exception("Wrong column in Decimal comparison", ErrorCodes::LOGICAL_ERROR);
|
||||||
}
|
}
|
||||||
@ -209,7 +209,7 @@ private:
|
|||||||
if (const ColVecA * c0_vec = checkAndGetColumn<ColVecA>(c0.get()))
|
if (const ColVecA * c0_vec = checkAndGetColumn<ColVecA>(c0.get()))
|
||||||
{
|
{
|
||||||
if (const ColVecB * c1_vec = checkAndGetColumn<ColVecB>(c1.get()))
|
if (const ColVecB * c1_vec = checkAndGetColumn<ColVecB>(c1.get()))
|
||||||
vector_vector<scale_left, scale_right>(c0_vec->getData(), c1_vec->getData(), vec_res, scale);
|
vectorVector<scale_left, scale_right>(c0_vec->getData(), c1_vec->getData(), vec_res, scale);
|
||||||
else
|
else
|
||||||
throw Exception("Wrong column in Decimal comparison", ErrorCodes::LOGICAL_ERROR);
|
throw Exception("Wrong column in Decimal comparison", ErrorCodes::LOGICAL_ERROR);
|
||||||
}
|
}
|
||||||
@ -260,7 +260,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool scale_left, bool scale_right>
|
template <bool scale_left, bool scale_right>
|
||||||
static void NO_INLINE vector_vector(const ArrayA & a, const ArrayB & b, PaddedPODArray<UInt8> & c,
|
static void NO_INLINE vectorVector(const ArrayA & a, const ArrayB & b, PaddedPODArray<UInt8> & c,
|
||||||
CompareInt scale)
|
CompareInt scale)
|
||||||
{
|
{
|
||||||
size_t size = a.size();
|
size_t size = a.size();
|
||||||
@ -279,7 +279,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool scale_left, bool scale_right>
|
template <bool scale_left, bool scale_right>
|
||||||
static void NO_INLINE vector_constant(const ArrayA & a, B b, PaddedPODArray<UInt8> & c, CompareInt scale)
|
static void NO_INLINE vectorConstant(const ArrayA & a, B b, PaddedPODArray<UInt8> & c, CompareInt scale)
|
||||||
{
|
{
|
||||||
size_t size = a.size();
|
size_t size = a.size();
|
||||||
const A * a_pos = a.data();
|
const A * a_pos = a.data();
|
||||||
@ -295,7 +295,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool scale_left, bool scale_right>
|
template <bool scale_left, bool scale_right>
|
||||||
static void NO_INLINE constant_vector(A a, const ArrayB & b, PaddedPODArray<UInt8> & c, CompareInt scale)
|
static void NO_INLINE constantVector(A a, const ArrayB & b, PaddedPODArray<UInt8> & c, CompareInt scale)
|
||||||
{
|
{
|
||||||
size_t size = b.size();
|
size_t size = b.size();
|
||||||
const B * b_pos = b.data();
|
const B * b_pos = b.data();
|
||||||
|
@ -205,15 +205,15 @@ std::conditional_t<Kind == ArgumentKind::Optional, std::optional<T>, T>
|
|||||||
getArgument(const ASTPtr & arguments, size_t argument_index, const char * argument_name, const std::string context_data_type_name)
|
getArgument(const ASTPtr & arguments, size_t argument_index, const char * argument_name, const std::string context_data_type_name)
|
||||||
{
|
{
|
||||||
using NearestResultType = NearestFieldType<T>;
|
using NearestResultType = NearestFieldType<T>;
|
||||||
const auto fieldType = Field::TypeToEnum<NearestResultType>::value;
|
const auto field_type = Field::TypeToEnum<NearestResultType>::value;
|
||||||
const ASTLiteral * argument = nullptr;
|
const ASTLiteral * argument = nullptr;
|
||||||
|
|
||||||
auto exceptionMessage = [=](const String & message)
|
auto exception_message = [=](const String & message)
|
||||||
{
|
{
|
||||||
return std::string("Parameter #") + std::to_string(argument_index) + " '"
|
return std::string("Parameter #") + std::to_string(argument_index) + " '"
|
||||||
+ argument_name + "' for " + context_data_type_name
|
+ argument_name + "' for " + context_data_type_name
|
||||||
+ message
|
+ message
|
||||||
+ ", expected: " + Field::Types::toString(fieldType) + " literal.";
|
+ ", expected: " + Field::Types::toString(field_type) + " literal.";
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!arguments || arguments->children.size() <= argument_index
|
if (!arguments || arguments->children.size() <= argument_index
|
||||||
@ -222,12 +222,12 @@ getArgument(const ASTPtr & arguments, size_t argument_index, const char * argume
|
|||||||
if constexpr (Kind == ArgumentKind::Optional)
|
if constexpr (Kind == ArgumentKind::Optional)
|
||||||
return {};
|
return {};
|
||||||
else
|
else
|
||||||
throw Exception(exceptionMessage(" is missing"),
|
throw Exception(exception_message(" is missing"),
|
||||||
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argument->value.getType() != fieldType)
|
if (argument->value.getType() != field_type)
|
||||||
throw Exception(exceptionMessage(String(" has wrong type: ") + argument->value.getTypeName()),
|
throw Exception(exception_message(String(" has wrong type: ") + argument->value.getTypeName()),
|
||||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||||
|
|
||||||
return argument->value.get<NearestResultType>();
|
return argument->value.get<NearestResultType>();
|
||||||
|
@ -604,7 +604,7 @@ void DataTypeLowCardinality::deserializeBinaryBulkWithMultipleStreams(
|
|||||||
auto * low_cardinality_state = checkAndGetLowCardinalityDeserializeState(state);
|
auto * low_cardinality_state = checkAndGetLowCardinalityDeserializeState(state);
|
||||||
KeysSerializationVersion::checkVersion(low_cardinality_state->key_version.value);
|
KeysSerializationVersion::checkVersion(low_cardinality_state->key_version.value);
|
||||||
|
|
||||||
auto readDictionary = [this, low_cardinality_state, keys_stream]()
|
auto read_dictionary = [this, low_cardinality_state, keys_stream]()
|
||||||
{
|
{
|
||||||
UInt64 num_keys;
|
UInt64 num_keys;
|
||||||
readIntBinary(num_keys, *keys_stream);
|
readIntBinary(num_keys, *keys_stream);
|
||||||
@ -617,7 +617,7 @@ void DataTypeLowCardinality::deserializeBinaryBulkWithMultipleStreams(
|
|||||||
low_cardinality_state->global_dictionary = std::move(column_unique);
|
low_cardinality_state->global_dictionary = std::move(column_unique);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto readAdditionalKeys = [this, low_cardinality_state, indexes_stream]()
|
auto read_additional_keys = [this, low_cardinality_state, indexes_stream]()
|
||||||
{
|
{
|
||||||
UInt64 num_keys;
|
UInt64 num_keys;
|
||||||
readIntBinary(num_keys, *indexes_stream);
|
readIntBinary(num_keys, *indexes_stream);
|
||||||
@ -636,7 +636,7 @@ void DataTypeLowCardinality::deserializeBinaryBulkWithMultipleStreams(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto readIndexes = [this, low_cardinality_state, indexes_stream, &low_cardinality_column](UInt64 num_rows)
|
auto read_indexes = [this, low_cardinality_state, indexes_stream, &low_cardinality_column](UInt64 num_rows)
|
||||||
{
|
{
|
||||||
auto indexes_type = low_cardinality_state->index_type.getDataType();
|
auto indexes_type = low_cardinality_state->index_type.getDataType();
|
||||||
MutableColumnPtr indexes_column = indexes_type->createColumn();
|
MutableColumnPtr indexes_column = indexes_type->createColumn();
|
||||||
@ -715,12 +715,12 @@ void DataTypeLowCardinality::deserializeBinaryBulkWithMultipleStreams(
|
|||||||
!global_dictionary || index_type.need_update_dictionary || low_cardinality_state->need_update_dictionary;
|
!global_dictionary || index_type.need_update_dictionary || low_cardinality_state->need_update_dictionary;
|
||||||
if (index_type.need_global_dictionary && need_update_dictionary)
|
if (index_type.need_global_dictionary && need_update_dictionary)
|
||||||
{
|
{
|
||||||
readDictionary();
|
read_dictionary();
|
||||||
low_cardinality_state->need_update_dictionary = false;
|
low_cardinality_state->need_update_dictionary = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (low_cardinality_state->index_type.has_additional_keys)
|
if (low_cardinality_state->index_type.has_additional_keys)
|
||||||
readAdditionalKeys();
|
read_additional_keys();
|
||||||
else
|
else
|
||||||
low_cardinality_state->additional_keys = nullptr;
|
low_cardinality_state->additional_keys = nullptr;
|
||||||
|
|
||||||
@ -728,7 +728,7 @@ void DataTypeLowCardinality::deserializeBinaryBulkWithMultipleStreams(
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t num_rows_to_read = std::min<UInt64>(limit, low_cardinality_state->num_pending_rows);
|
size_t num_rows_to_read = std::min<UInt64>(limit, low_cardinality_state->num_pending_rows);
|
||||||
readIndexes(num_rows_to_read);
|
read_indexes(num_rows_to_read);
|
||||||
limit -= num_rows_to_read;
|
limit -= num_rows_to_read;
|
||||||
low_cardinality_state->num_pending_rows -= num_rows_to_read;
|
low_cardinality_state->num_pending_rows -= num_rows_to_read;
|
||||||
}
|
}
|
||||||
|
@ -46,8 +46,7 @@ String getExceptionMessagePrefix(const DataTypes & types)
|
|||||||
|
|
||||||
DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_nothing, bool force_support_conversion)
|
DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_nothing, bool force_support_conversion)
|
||||||
{
|
{
|
||||||
|
auto get_nothing_or_throw = [throw_if_result_is_nothing, & types](const std::string & reason)
|
||||||
auto getNothingOrThrow = [throw_if_result_is_nothing, & types](const std::string & reason)
|
|
||||||
{
|
{
|
||||||
if (throw_if_result_is_nothing)
|
if (throw_if_result_is_nothing)
|
||||||
throw Exception(getExceptionMessagePrefix(types) + reason, ErrorCodes::NO_COMMON_TYPE);
|
throw Exception(getExceptionMessagePrefix(types) + reason, ErrorCodes::NO_COMMON_TYPE);
|
||||||
@ -92,7 +91,7 @@ DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_noth
|
|||||||
{
|
{
|
||||||
for (const auto & type : types)
|
for (const auto & type : types)
|
||||||
if (typeid_cast<const DataTypeNothing *>(type.get()))
|
if (typeid_cast<const DataTypeNothing *>(type.get()))
|
||||||
return getNothingOrThrow(" because some of them are Nothing");
|
return get_nothing_or_throw(" because some of them are Nothing");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// For Arrays
|
/// For Arrays
|
||||||
@ -117,7 +116,7 @@ DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_noth
|
|||||||
if (have_array)
|
if (have_array)
|
||||||
{
|
{
|
||||||
if (!all_arrays)
|
if (!all_arrays)
|
||||||
return getNothingOrThrow(" because some of them are Array and some of them are not");
|
return get_nothing_or_throw(" because some of them are Array and some of them are not");
|
||||||
|
|
||||||
return std::make_shared<DataTypeArray>(getMostSubtype(nested_types, false, force_support_conversion));
|
return std::make_shared<DataTypeArray>(getMostSubtype(nested_types, false, force_support_conversion));
|
||||||
}
|
}
|
||||||
@ -143,7 +142,7 @@ DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_noth
|
|||||||
nested_types[elem_idx].reserve(types.size());
|
nested_types[elem_idx].reserve(types.size());
|
||||||
}
|
}
|
||||||
else if (tuple_size != type_tuple->getElements().size())
|
else if (tuple_size != type_tuple->getElements().size())
|
||||||
return getNothingOrThrow(" because Tuples have different sizes");
|
return get_nothing_or_throw(" because Tuples have different sizes");
|
||||||
|
|
||||||
have_tuple = true;
|
have_tuple = true;
|
||||||
|
|
||||||
@ -157,7 +156,7 @@ DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_noth
|
|||||||
if (have_tuple)
|
if (have_tuple)
|
||||||
{
|
{
|
||||||
if (!all_tuples)
|
if (!all_tuples)
|
||||||
return getNothingOrThrow(" because some of them are Tuple and some of them are not");
|
return get_nothing_or_throw(" because some of them are Tuple and some of them are not");
|
||||||
|
|
||||||
DataTypes common_tuple_types(tuple_size);
|
DataTypes common_tuple_types(tuple_size);
|
||||||
for (size_t elem_idx = 0; elem_idx < tuple_size; ++elem_idx)
|
for (size_t elem_idx = 0; elem_idx < tuple_size; ++elem_idx)
|
||||||
@ -218,7 +217,7 @@ DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_noth
|
|||||||
if (!fixed_string_type)
|
if (!fixed_string_type)
|
||||||
fixed_string_type = type;
|
fixed_string_type = type;
|
||||||
else if (!type->equals(*fixed_string_type))
|
else if (!type->equals(*fixed_string_type))
|
||||||
return getNothingOrThrow(" because some of them are FixedStrings with different length");
|
return get_nothing_or_throw(" because some of them are FixedStrings with different length");
|
||||||
}
|
}
|
||||||
else if (isString(type))
|
else if (isString(type))
|
||||||
have_string = true;
|
have_string = true;
|
||||||
@ -229,7 +228,7 @@ DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_noth
|
|||||||
if (have_string)
|
if (have_string)
|
||||||
{
|
{
|
||||||
if (!all_strings)
|
if (!all_strings)
|
||||||
return getNothingOrThrow(" because some of them are String/FixedString and some of them are not");
|
return get_nothing_or_throw(" because some of them are String/FixedString and some of them are not");
|
||||||
|
|
||||||
return fixed_string_type ? fixed_string_type : std::make_shared<DataTypeString>();
|
return fixed_string_type ? fixed_string_type : std::make_shared<DataTypeString>();
|
||||||
}
|
}
|
||||||
@ -251,7 +250,7 @@ DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_noth
|
|||||||
if (have_date_or_datetime)
|
if (have_date_or_datetime)
|
||||||
{
|
{
|
||||||
if (!all_date_or_datetime)
|
if (!all_date_or_datetime)
|
||||||
return getNothingOrThrow(" because some of them are Date/DateTime and some of them are not");
|
return get_nothing_or_throw(" because some of them are Date/DateTime and some of them are not");
|
||||||
|
|
||||||
return std::make_shared<DataTypeDate>();
|
return std::make_shared<DataTypeDate>();
|
||||||
}
|
}
|
||||||
@ -300,7 +299,7 @@ DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_noth
|
|||||||
if (min_bits_of_signed_integer || min_bits_of_unsigned_integer || min_mantissa_bits_of_floating)
|
if (min_bits_of_signed_integer || min_bits_of_unsigned_integer || min_mantissa_bits_of_floating)
|
||||||
{
|
{
|
||||||
if (!all_numbers)
|
if (!all_numbers)
|
||||||
return getNothingOrThrow(" because some of them are numbers and some of them are not");
|
return get_nothing_or_throw(" because some of them are numbers and some of them are not");
|
||||||
|
|
||||||
/// If the result must be floating.
|
/// If the result must be floating.
|
||||||
if (!min_bits_of_signed_integer && !min_bits_of_unsigned_integer)
|
if (!min_bits_of_signed_integer && !min_bits_of_unsigned_integer)
|
||||||
@ -349,7 +348,7 @@ DataTypePtr getMostSubtype(const DataTypes & types, bool throw_if_result_is_noth
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// All other data types (UUID, AggregateFunction, Enum...) are compatible only if they are the same (checked in trivial cases).
|
/// All other data types (UUID, AggregateFunction, Enum...) are compatible only if they are the same (checked in trivial cases).
|
||||||
return getNothingOrThrow("");
|
return get_nothing_or_throw("");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -260,7 +260,7 @@ std::map<String, UInt64> DatabaseMySQL::fetchTablesWithModificationTime() const
|
|||||||
" WHERE TABLE_SCHEMA = " << quote << database_name_in_mysql;
|
" WHERE TABLE_SCHEMA = " << quote << database_name_in_mysql;
|
||||||
|
|
||||||
std::map<String, UInt64> tables_with_modification_time;
|
std::map<String, UInt64> tables_with_modification_time;
|
||||||
MySQLBlockInputStream result(mysql_pool.Get(), query.str(), tables_status_sample_block, DEFAULT_BLOCK_SIZE);
|
MySQLBlockInputStream result(mysql_pool.get(), query.str(), tables_status_sample_block, DEFAULT_BLOCK_SIZE);
|
||||||
|
|
||||||
while (Block block = result.read())
|
while (Block block = result.read())
|
||||||
{
|
{
|
||||||
@ -305,7 +305,7 @@ std::map<String, NamesAndTypesList> DatabaseMySQL::fetchTablesColumnsList(const
|
|||||||
<< " AND TABLE_NAME IN " << toQueryStringWithQuote(tables_name) << " ORDER BY ORDINAL_POSITION";
|
<< " AND TABLE_NAME IN " << toQueryStringWithQuote(tables_name) << " ORDER BY ORDINAL_POSITION";
|
||||||
|
|
||||||
const auto & external_table_functions_use_nulls = global_context.getSettings().external_table_functions_use_nulls;
|
const auto & external_table_functions_use_nulls = global_context.getSettings().external_table_functions_use_nulls;
|
||||||
MySQLBlockInputStream result(mysql_pool.Get(), query.str(), tables_columns_sample_block, DEFAULT_BLOCK_SIZE);
|
MySQLBlockInputStream result(mysql_pool.get(), query.str(), tables_columns_sample_block, DEFAULT_BLOCK_SIZE);
|
||||||
while (Block block = result.read())
|
while (Block block = result.read())
|
||||||
{
|
{
|
||||||
size_t rows = block.rows();
|
size_t rows = block.rows();
|
||||||
|
@ -198,7 +198,7 @@ void DatabaseOrdinary::startupTables(ThreadPool & thread_pool)
|
|||||||
AtomicStopwatch watch;
|
AtomicStopwatch watch;
|
||||||
std::atomic<size_t> tables_processed{0};
|
std::atomic<size_t> tables_processed{0};
|
||||||
|
|
||||||
auto startupOneTable = [&](const StoragePtr & table)
|
auto startup_one_table = [&](const StoragePtr & table)
|
||||||
{
|
{
|
||||||
table->startup();
|
table->startup();
|
||||||
logAboutProgress(log, ++tables_processed, total_tables, watch);
|
logAboutProgress(log, ++tables_processed, total_tables, watch);
|
||||||
@ -207,7 +207,7 @@ void DatabaseOrdinary::startupTables(ThreadPool & thread_pool)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
for (const auto & table : tables)
|
for (const auto & table : tables)
|
||||||
thread_pool.scheduleOrThrowOnError([&]() { startupOneTable(table.second); });
|
thread_pool.scheduleOrThrowOnError([&]() { startup_one_table(table.second); });
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
@ -209,7 +209,7 @@ std::string ClickHouseDictionarySource::doInvalidateQuery(const std::string & re
|
|||||||
|
|
||||||
void registerDictionarySourceClickHouse(DictionarySourceFactory & factory)
|
void registerDictionarySourceClickHouse(DictionarySourceFactory & factory)
|
||||||
{
|
{
|
||||||
auto createTableSource = [=](const DictionaryStructure & dict_struct,
|
auto create_table_source = [=](const DictionaryStructure & dict_struct,
|
||||||
const Poco::Util::AbstractConfiguration & config,
|
const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_prefix,
|
const std::string & config_prefix,
|
||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
@ -218,7 +218,7 @@ void registerDictionarySourceClickHouse(DictionarySourceFactory & factory)
|
|||||||
{
|
{
|
||||||
return std::make_unique<ClickHouseDictionarySource>(dict_struct, config, config_prefix + ".clickhouse", sample_block, context);
|
return std::make_unique<ClickHouseDictionarySource>(dict_struct, config, config_prefix + ".clickhouse", sample_block, context);
|
||||||
};
|
};
|
||||||
factory.registerSource("clickhouse", createTableSource);
|
factory.registerSource("clickhouse", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -58,8 +58,8 @@ DictionaryPtr DictionaryFactory::create(
|
|||||||
|
|
||||||
DictionaryPtr DictionaryFactory::create(const std::string & name, const ASTCreateQuery & ast, const Context & context) const
|
DictionaryPtr DictionaryFactory::create(const std::string & name, const ASTCreateQuery & ast, const Context & context) const
|
||||||
{
|
{
|
||||||
auto configurationFromAST = getDictionaryConfigurationFromAST(ast);
|
auto configuration = getDictionaryConfigurationFromAST(ast);
|
||||||
return DictionaryFactory::create(name, *configurationFromAST, "dictionary", context, true);
|
return DictionaryFactory::create(name, *configuration, "dictionary", context, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DictionaryFactory::isComplex(const std::string & layout_type) const
|
bool DictionaryFactory::isComplex(const std::string & layout_type) const
|
||||||
|
@ -216,7 +216,7 @@ std::string ExecutableDictionarySource::toString() const
|
|||||||
|
|
||||||
void registerDictionarySourceExecutable(DictionarySourceFactory & factory)
|
void registerDictionarySourceExecutable(DictionarySourceFactory & factory)
|
||||||
{
|
{
|
||||||
auto createTableSource = [=](const DictionaryStructure & dict_struct,
|
auto create_table_source = [=](const DictionaryStructure & dict_struct,
|
||||||
const Poco::Util::AbstractConfiguration & config,
|
const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_prefix,
|
const std::string & config_prefix,
|
||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
@ -236,7 +236,7 @@ void registerDictionarySourceExecutable(DictionarySourceFactory & factory)
|
|||||||
dict_struct, config, config_prefix + ".executable",
|
dict_struct, config, config_prefix + ".executable",
|
||||||
sample_block, context);
|
sample_block, context);
|
||||||
};
|
};
|
||||||
factory.registerSource("executable", createTableSource);
|
factory.registerSource("executable", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@ Poco::Timestamp FileDictionarySource::getLastModification() const
|
|||||||
|
|
||||||
void registerDictionarySourceFile(DictionarySourceFactory & factory)
|
void registerDictionarySourceFile(DictionarySourceFactory & factory)
|
||||||
{
|
{
|
||||||
auto createTableSource = [=](const DictionaryStructure & dict_struct,
|
auto create_table_source = [=](const DictionaryStructure & dict_struct,
|
||||||
const Poco::Util::AbstractConfiguration & config,
|
const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_prefix,
|
const std::string & config_prefix,
|
||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
@ -86,7 +86,7 @@ void registerDictionarySourceFile(DictionarySourceFactory & factory)
|
|||||||
return std::make_unique<FileDictionarySource>(filepath, format, sample_block, context, check_config);
|
return std::make_unique<FileDictionarySource>(filepath, format, sample_block, context, check_config);
|
||||||
};
|
};
|
||||||
|
|
||||||
factory.registerSource("file", createTableSource);
|
factory.registerSource("file", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -192,7 +192,7 @@ std::string HTTPDictionarySource::toString() const
|
|||||||
|
|
||||||
void registerDictionarySourceHTTP(DictionarySourceFactory & factory)
|
void registerDictionarySourceHTTP(DictionarySourceFactory & factory)
|
||||||
{
|
{
|
||||||
auto createTableSource = [=](const DictionaryStructure & dict_struct,
|
auto create_table_source = [=](const DictionaryStructure & dict_struct,
|
||||||
const Poco::Util::AbstractConfiguration & config,
|
const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_prefix,
|
const std::string & config_prefix,
|
||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
@ -206,7 +206,7 @@ void registerDictionarySourceHTTP(DictionarySourceFactory & factory)
|
|||||||
dict_struct, config, config_prefix + ".http",
|
dict_struct, config, config_prefix + ".http",
|
||||||
sample_block, context, check_config);
|
sample_block, context, check_config);
|
||||||
};
|
};
|
||||||
factory.registerSource("http", createTableSource);
|
factory.registerSource("http", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -151,9 +151,9 @@ LibraryDictionarySource::LibraryDictionarySource(
|
|||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
settings = std::make_shared<CStringsHolder>(getLibSettings(config, config_prefix + lib_config_settings));
|
settings = std::make_shared<CStringsHolder>(getLibSettings(config, config_prefix + lib_config_settings));
|
||||||
if (auto libNew = library->tryGet<decltype(lib_data) (*)(decltype(&settings->strings), decltype(&ClickHouseLibrary::log))>(
|
if (auto lib_new = library->tryGet<decltype(lib_data) (*)(decltype(&settings->strings), decltype(&ClickHouseLibrary::log))>(
|
||||||
"ClickHouseDictionary_v3_libNew"))
|
"ClickHouseDictionary_v3_libNew"))
|
||||||
lib_data = libNew(&settings->strings, ClickHouseLibrary::log);
|
lib_data = lib_new(&settings->strings, ClickHouseLibrary::log);
|
||||||
}
|
}
|
||||||
|
|
||||||
LibraryDictionarySource::LibraryDictionarySource(const LibraryDictionarySource & other)
|
LibraryDictionarySource::LibraryDictionarySource(const LibraryDictionarySource & other)
|
||||||
@ -166,18 +166,18 @@ LibraryDictionarySource::LibraryDictionarySource(const LibraryDictionarySource &
|
|||||||
, description{other.description}
|
, description{other.description}
|
||||||
, settings{other.settings}
|
, settings{other.settings}
|
||||||
{
|
{
|
||||||
if (auto libClone = library->tryGet<decltype(lib_data) (*)(decltype(other.lib_data))>("ClickHouseDictionary_v3_libClone"))
|
if (auto lib_clone = library->tryGet<decltype(lib_data) (*)(decltype(other.lib_data))>("ClickHouseDictionary_v3_libClone"))
|
||||||
lib_data = libClone(other.lib_data);
|
lib_data = lib_clone(other.lib_data);
|
||||||
else if (
|
else if (
|
||||||
auto libNew = library->tryGet<decltype(lib_data) (*)(decltype(&settings->strings), decltype(&ClickHouseLibrary::log))>(
|
auto lib_new = library->tryGet<decltype(lib_data) (*)(decltype(&settings->strings), decltype(&ClickHouseLibrary::log))>(
|
||||||
"ClickHouseDictionary_v3_libNew"))
|
"ClickHouseDictionary_v3_libNew"))
|
||||||
lib_data = libNew(&settings->strings, ClickHouseLibrary::log);
|
lib_data = lib_new(&settings->strings, ClickHouseLibrary::log);
|
||||||
}
|
}
|
||||||
|
|
||||||
LibraryDictionarySource::~LibraryDictionarySource()
|
LibraryDictionarySource::~LibraryDictionarySource()
|
||||||
{
|
{
|
||||||
if (auto libDelete = library->tryGet<void (*)(decltype(lib_data))>("ClickHouseDictionary_v3_libDelete"))
|
if (auto lib_delete = library->tryGet<void (*)(decltype(lib_data))>("ClickHouseDictionary_v3_libDelete"))
|
||||||
libDelete(lib_data);
|
lib_delete(lib_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockInputStreamPtr LibraryDictionarySource::loadAll()
|
BlockInputStreamPtr LibraryDictionarySource::loadAll()
|
||||||
@ -196,10 +196,10 @@ BlockInputStreamPtr LibraryDictionarySource::loadAll()
|
|||||||
void * data_ptr = nullptr;
|
void * data_ptr = nullptr;
|
||||||
|
|
||||||
/// Get function pointer before dataNew call because library->get may throw.
|
/// Get function pointer before dataNew call because library->get may throw.
|
||||||
auto func_loadAll
|
auto func_load_all
|
||||||
= library->get<void * (*)(decltype(data_ptr), decltype(&settings->strings), decltype(&columns))>("ClickHouseDictionary_v3_loadAll");
|
= library->get<void * (*)(decltype(data_ptr), decltype(&settings->strings), decltype(&columns))>("ClickHouseDictionary_v3_loadAll");
|
||||||
data_ptr = library->get<decltype(data_ptr) (*)(decltype(lib_data))>("ClickHouseDictionary_v3_dataNew")(lib_data);
|
data_ptr = library->get<decltype(data_ptr) (*)(decltype(lib_data))>("ClickHouseDictionary_v3_dataNew")(lib_data);
|
||||||
auto data = func_loadAll(data_ptr, &settings->strings, &columns);
|
auto data = func_load_all(data_ptr, &settings->strings, &columns);
|
||||||
auto block = dataToBlock(description.sample_block, data);
|
auto block = dataToBlock(description.sample_block, data);
|
||||||
SCOPE_EXIT(library->get<void (*)(decltype(lib_data), decltype(data_ptr))>("ClickHouseDictionary_v3_dataDelete")(lib_data, data_ptr));
|
SCOPE_EXIT(library->get<void (*)(decltype(lib_data), decltype(data_ptr))>("ClickHouseDictionary_v3_dataDelete")(lib_data, data_ptr));
|
||||||
return std::make_shared<OneBlockInputStream>(block);
|
return std::make_shared<OneBlockInputStream>(block);
|
||||||
@ -222,11 +222,11 @@ BlockInputStreamPtr LibraryDictionarySource::loadIds(const std::vector<UInt64> &
|
|||||||
void * data_ptr = nullptr;
|
void * data_ptr = nullptr;
|
||||||
|
|
||||||
/// Get function pointer before dataNew call because library->get may throw.
|
/// Get function pointer before dataNew call because library->get may throw.
|
||||||
auto func_loadIds
|
auto func_load_ids
|
||||||
= library->get<void * (*)(decltype(data_ptr), decltype(&settings->strings), decltype(&columns_pass), decltype(&ids_data))>(
|
= library->get<void * (*)(decltype(data_ptr), decltype(&settings->strings), decltype(&columns_pass), decltype(&ids_data))>(
|
||||||
"ClickHouseDictionary_v3_loadIds");
|
"ClickHouseDictionary_v3_loadIds");
|
||||||
data_ptr = library->get<decltype(data_ptr) (*)(decltype(lib_data))>("ClickHouseDictionary_v3_dataNew")(lib_data);
|
data_ptr = library->get<decltype(data_ptr) (*)(decltype(lib_data))>("ClickHouseDictionary_v3_dataNew")(lib_data);
|
||||||
auto data = func_loadIds(data_ptr, &settings->strings, &columns_pass, &ids_data);
|
auto data = func_load_ids(data_ptr, &settings->strings, &columns_pass, &ids_data);
|
||||||
auto block = dataToBlock(description.sample_block, data);
|
auto block = dataToBlock(description.sample_block, data);
|
||||||
SCOPE_EXIT(library->get<void (*)(decltype(lib_data), decltype(data_ptr))>("ClickHouseDictionary_v3_dataDelete")(lib_data, data_ptr));
|
SCOPE_EXIT(library->get<void (*)(decltype(lib_data), decltype(data_ptr))>("ClickHouseDictionary_v3_dataDelete")(lib_data, data_ptr));
|
||||||
return std::make_shared<OneBlockInputStream>(block);
|
return std::make_shared<OneBlockInputStream>(block);
|
||||||
@ -256,10 +256,10 @@ BlockInputStreamPtr LibraryDictionarySource::loadKeys(const Columns & key_column
|
|||||||
|
|
||||||
void * data_ptr = nullptr;
|
void * data_ptr = nullptr;
|
||||||
/// Get function pointer before dataNew call because library->get may throw.
|
/// Get function pointer before dataNew call because library->get may throw.
|
||||||
auto func_loadKeys = library->get<void * (*)(decltype(data_ptr), decltype(&settings->strings), decltype(&request_cols))>(
|
auto func_load_keys = library->get<void * (*)(decltype(data_ptr), decltype(&settings->strings), decltype(&request_cols))>(
|
||||||
"ClickHouseDictionary_v3_loadKeys");
|
"ClickHouseDictionary_v3_loadKeys");
|
||||||
data_ptr = library->get<decltype(data_ptr) (*)(decltype(lib_data))>("ClickHouseDictionary_v3_dataNew")(lib_data);
|
data_ptr = library->get<decltype(data_ptr) (*)(decltype(lib_data))>("ClickHouseDictionary_v3_dataNew")(lib_data);
|
||||||
auto data = func_loadKeys(data_ptr, &settings->strings, &request_cols);
|
auto data = func_load_keys(data_ptr, &settings->strings, &request_cols);
|
||||||
auto block = dataToBlock(description.sample_block, data);
|
auto block = dataToBlock(description.sample_block, data);
|
||||||
SCOPE_EXIT(library->get<void (*)(decltype(lib_data), decltype(data_ptr))>("ClickHouseDictionary_v3_dataDelete")(lib_data, data_ptr));
|
SCOPE_EXIT(library->get<void (*)(decltype(lib_data), decltype(data_ptr))>("ClickHouseDictionary_v3_dataDelete")(lib_data, data_ptr));
|
||||||
return std::make_shared<OneBlockInputStream>(block);
|
return std::make_shared<OneBlockInputStream>(block);
|
||||||
@ -267,17 +267,17 @@ BlockInputStreamPtr LibraryDictionarySource::loadKeys(const Columns & key_column
|
|||||||
|
|
||||||
bool LibraryDictionarySource::isModified() const
|
bool LibraryDictionarySource::isModified() const
|
||||||
{
|
{
|
||||||
if (auto func_isModified
|
if (auto func_is_modified
|
||||||
= library->tryGet<bool (*)(decltype(lib_data), decltype(&settings->strings))>("ClickHouseDictionary_v3_isModified"))
|
= library->tryGet<bool (*)(decltype(lib_data), decltype(&settings->strings))>("ClickHouseDictionary_v3_isModified"))
|
||||||
return func_isModified(lib_data, &settings->strings);
|
return func_is_modified(lib_data, &settings->strings);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LibraryDictionarySource::supportsSelectiveLoad() const
|
bool LibraryDictionarySource::supportsSelectiveLoad() const
|
||||||
{
|
{
|
||||||
if (auto func_supportsSelectiveLoad
|
if (auto func_supports_selective_load
|
||||||
= library->tryGet<bool (*)(decltype(lib_data), decltype(&settings->strings))>("ClickHouseDictionary_v3_supportsSelectiveLoad"))
|
= library->tryGet<bool (*)(decltype(lib_data), decltype(&settings->strings))>("ClickHouseDictionary_v3_supportsSelectiveLoad"))
|
||||||
return func_supportsSelectiveLoad(lib_data, &settings->strings);
|
return func_supports_selective_load(lib_data, &settings->strings);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,7 +293,7 @@ std::string LibraryDictionarySource::toString() const
|
|||||||
|
|
||||||
void registerDictionarySourceLibrary(DictionarySourceFactory & factory)
|
void registerDictionarySourceLibrary(DictionarySourceFactory & factory)
|
||||||
{
|
{
|
||||||
auto createTableSource = [=](const DictionaryStructure & dict_struct,
|
auto create_table_source = [=](const DictionaryStructure & dict_struct,
|
||||||
const Poco::Util::AbstractConfiguration & config,
|
const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_prefix,
|
const std::string & config_prefix,
|
||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
@ -302,7 +302,7 @@ void registerDictionarySourceLibrary(DictionarySourceFactory & factory)
|
|||||||
{
|
{
|
||||||
return std::make_unique<LibraryDictionarySource>(dict_struct, config, config_prefix + ".library", sample_block, context, check_config);
|
return std::make_unique<LibraryDictionarySource>(dict_struct, config, config_prefix + ".library", sample_block, context, check_config);
|
||||||
};
|
};
|
||||||
factory.registerSource("library", createTableSource);
|
factory.registerSource("library", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ namespace ErrorCodes
|
|||||||
|
|
||||||
void registerDictionarySourceMongoDB(DictionarySourceFactory & factory)
|
void registerDictionarySourceMongoDB(DictionarySourceFactory & factory)
|
||||||
{
|
{
|
||||||
auto createTableSource = [=](const DictionaryStructure & dict_struct,
|
auto create_table_source = [=](const DictionaryStructure & dict_struct,
|
||||||
const Poco::Util::AbstractConfiguration & config,
|
const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_prefix,
|
const std::string & config_prefix,
|
||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
@ -29,7 +29,7 @@ void registerDictionarySourceMongoDB(DictionarySourceFactory & factory)
|
|||||||
ErrorCodes::SUPPORT_IS_DISABLED};
|
ErrorCodes::SUPPORT_IS_DISABLED};
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
factory.registerSource("mongodb", createTableSource);
|
factory.registerSource("mongodb", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -319,16 +319,16 @@ BlockInputStreamPtr MongoDBDictionarySource::loadKeys(const Columns & key_column
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case AttributeUnderlyingType::utString:
|
case AttributeUnderlyingType::utString:
|
||||||
String _str(get<String>((*key_columns[attr.first])[row_idx]));
|
String loaded_str(get<String>((*key_columns[attr.first])[row_idx]));
|
||||||
/// Convert string to ObjectID
|
/// Convert string to ObjectID
|
||||||
if (attr.second.is_object_id)
|
if (attr.second.is_object_id)
|
||||||
{
|
{
|
||||||
Poco::MongoDB::ObjectId::Ptr _id(new Poco::MongoDB::ObjectId(_str));
|
Poco::MongoDB::ObjectId::Ptr loaded_id(new Poco::MongoDB::ObjectId(loaded_str));
|
||||||
key.add(attr.second.name, _id);
|
key.add(attr.second.name, loaded_id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
key.add(attr.second.name, _str);
|
key.add(attr.second.name, loaded_str);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ namespace ErrorCodes
|
|||||||
|
|
||||||
void registerDictionarySourceMysql(DictionarySourceFactory & factory)
|
void registerDictionarySourceMysql(DictionarySourceFactory & factory)
|
||||||
{
|
{
|
||||||
auto createTableSource = [=](const DictionaryStructure & dict_struct,
|
auto create_table_source = [=](const DictionaryStructure & dict_struct,
|
||||||
const Poco::Util::AbstractConfiguration & config,
|
const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_prefix,
|
const std::string & config_prefix,
|
||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
@ -31,7 +31,7 @@ void registerDictionarySourceMysql(DictionarySourceFactory & factory)
|
|||||||
ErrorCodes::SUPPORT_IS_DISABLED};
|
ErrorCodes::SUPPORT_IS_DISABLED};
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
factory.registerSource("mysql", createTableSource);
|
factory.registerSource("mysql", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -67,7 +67,7 @@ MySQLDictionarySource::MySQLDictionarySource(
|
|||||||
, update_field{config.getString(config_prefix + ".update_field", "")}
|
, update_field{config.getString(config_prefix + ".update_field", "")}
|
||||||
, dont_check_update_time{config.getBool(config_prefix + ".dont_check_update_time", false)}
|
, dont_check_update_time{config.getBool(config_prefix + ".dont_check_update_time", false)}
|
||||||
, sample_block{sample_block_}
|
, sample_block{sample_block_}
|
||||||
, pool{mysqlxx::PoolFactory::instance().Get(config, config_prefix)}
|
, pool{mysqlxx::PoolFactory::instance().get(config, config_prefix)}
|
||||||
, query_builder{dict_struct, db, table, where, IdentifierQuotingStyle::Backticks}
|
, query_builder{dict_struct, db, table, where, IdentifierQuotingStyle::Backticks}
|
||||||
, load_all_query{query_builder.composeLoadAllQuery()}
|
, load_all_query{query_builder.composeLoadAllQuery()}
|
||||||
, invalidate_query{config.getString(config_prefix + ".invalidate_query", "")}
|
, invalidate_query{config.getString(config_prefix + ".invalidate_query", "")}
|
||||||
@ -115,7 +115,7 @@ std::string MySQLDictionarySource::getUpdateFieldAndDate()
|
|||||||
|
|
||||||
BlockInputStreamPtr MySQLDictionarySource::loadAll()
|
BlockInputStreamPtr MySQLDictionarySource::loadAll()
|
||||||
{
|
{
|
||||||
auto connection = pool.Get();
|
auto connection = pool.get();
|
||||||
last_modification = getLastModification(connection, false);
|
last_modification = getLastModification(connection, false);
|
||||||
|
|
||||||
LOG_TRACE(log, load_all_query);
|
LOG_TRACE(log, load_all_query);
|
||||||
@ -124,7 +124,7 @@ BlockInputStreamPtr MySQLDictionarySource::loadAll()
|
|||||||
|
|
||||||
BlockInputStreamPtr MySQLDictionarySource::loadUpdatedAll()
|
BlockInputStreamPtr MySQLDictionarySource::loadUpdatedAll()
|
||||||
{
|
{
|
||||||
auto connection = pool.Get();
|
auto connection = pool.get();
|
||||||
last_modification = getLastModification(connection, false);
|
last_modification = getLastModification(connection, false);
|
||||||
|
|
||||||
std::string load_update_query = getUpdateFieldAndDate();
|
std::string load_update_query = getUpdateFieldAndDate();
|
||||||
@ -137,7 +137,7 @@ BlockInputStreamPtr MySQLDictionarySource::loadIds(const std::vector<UInt64> & i
|
|||||||
/// We do not log in here and do not update the modification time, as the request can be large, and often called.
|
/// We do not log in here and do not update the modification time, as the request can be large, and often called.
|
||||||
|
|
||||||
const auto query = query_builder.composeLoadIdsQuery(ids);
|
const auto query = query_builder.composeLoadIdsQuery(ids);
|
||||||
return std::make_shared<MySQLBlockInputStream>(pool.Get(), query, sample_block, max_block_size, close_connection);
|
return std::make_shared<MySQLBlockInputStream>(pool.get(), query, sample_block, max_block_size, close_connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockInputStreamPtr MySQLDictionarySource::loadKeys(const Columns & key_columns, const std::vector<size_t> & requested_rows)
|
BlockInputStreamPtr MySQLDictionarySource::loadKeys(const Columns & key_columns, const std::vector<size_t> & requested_rows)
|
||||||
@ -145,7 +145,7 @@ BlockInputStreamPtr MySQLDictionarySource::loadKeys(const Columns & key_columns,
|
|||||||
/// We do not log in here and do not update the modification time, as the request can be large, and often called.
|
/// We do not log in here and do not update the modification time, as the request can be large, and often called.
|
||||||
|
|
||||||
const auto query = query_builder.composeLoadKeysQuery(key_columns, requested_rows, ExternalQueryBuilder::AND_OR_CHAIN);
|
const auto query = query_builder.composeLoadKeysQuery(key_columns, requested_rows, ExternalQueryBuilder::AND_OR_CHAIN);
|
||||||
return std::make_shared<MySQLBlockInputStream>(pool.Get(), query, sample_block, max_block_size, close_connection);
|
return std::make_shared<MySQLBlockInputStream>(pool.get(), query, sample_block, max_block_size, close_connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MySQLDictionarySource::isModified() const
|
bool MySQLDictionarySource::isModified() const
|
||||||
@ -161,7 +161,7 @@ bool MySQLDictionarySource::isModified() const
|
|||||||
|
|
||||||
if (dont_check_update_time)
|
if (dont_check_update_time)
|
||||||
return true;
|
return true;
|
||||||
auto connection = pool.Get();
|
auto connection = pool.get();
|
||||||
return getLastModification(connection, true) > last_modification;
|
return getLastModification(connection, true) > last_modification;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,7 +221,7 @@ LocalDateTime MySQLDictionarySource::getLastModification(mysqlxx::Pool::Entry &
|
|||||||
if (auto row = result.fetch())
|
if (auto row = result.fetch())
|
||||||
{
|
{
|
||||||
++fetched_rows;
|
++fetched_rows;
|
||||||
const auto UPDATE_TIME_IDX = 12;
|
static const auto UPDATE_TIME_IDX = 12;
|
||||||
const auto & update_time_value = row[UPDATE_TIME_IDX];
|
const auto & update_time_value = row[UPDATE_TIME_IDX];
|
||||||
|
|
||||||
if (!update_time_value.isNull())
|
if (!update_time_value.isNull())
|
||||||
@ -259,7 +259,7 @@ std::string MySQLDictionarySource::doInvalidateQuery(const std::string & request
|
|||||||
Block invalidate_sample_block;
|
Block invalidate_sample_block;
|
||||||
ColumnPtr column(ColumnString::create());
|
ColumnPtr column(ColumnString::create());
|
||||||
invalidate_sample_block.insert(ColumnWithTypeAndName(column, std::make_shared<DataTypeString>(), "Sample Block"));
|
invalidate_sample_block.insert(ColumnWithTypeAndName(column, std::make_shared<DataTypeString>(), "Sample Block"));
|
||||||
MySQLBlockInputStream block_input_stream(pool.Get(), request, invalidate_sample_block, 1, close_connection);
|
MySQLBlockInputStream block_input_stream(pool.get(), request, invalidate_sample_block, 1, close_connection);
|
||||||
return readInvalidateQuery(block_input_stream);
|
return readInvalidateQuery(block_input_stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ namespace DB
|
|||||||
for (const auto i : ext::range(0, size))
|
for (const auto i : ext::range(0, size))
|
||||||
columns[i] = description.sample_block.getByPosition(i).column->cloneEmpty();
|
columns[i] = description.sample_block.getByPosition(i).column->cloneEmpty();
|
||||||
|
|
||||||
const auto insertValueByIdx = [this, &columns](size_t idx, const auto & value)
|
const auto insert_value_by_idx = [this, &columns](size_t idx, const auto & value)
|
||||||
{
|
{
|
||||||
if (description.types[idx].second)
|
if (description.types[idx].second)
|
||||||
{
|
{
|
||||||
@ -170,9 +170,9 @@ namespace DB
|
|||||||
/// null string means 'no value for requested key'
|
/// null string means 'no value for requested key'
|
||||||
if (!value.isNull())
|
if (!value.isNull())
|
||||||
{
|
{
|
||||||
insertValueByIdx(0, primary_key);
|
insert_value_by_idx(0, primary_key);
|
||||||
insertValueByIdx(1, secondary_key);
|
insert_value_by_idx(1, secondary_key);
|
||||||
insertValueByIdx(2, value);
|
insert_value_by_idx(2, value);
|
||||||
++num_rows;
|
++num_rows;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -198,8 +198,8 @@ namespace DB
|
|||||||
/// Null string means 'no value for requested key'
|
/// Null string means 'no value for requested key'
|
||||||
if (!value.isNull())
|
if (!value.isNull())
|
||||||
{
|
{
|
||||||
insertValueByIdx(0, key);
|
insert_value_by_idx(0, key);
|
||||||
insertValueByIdx(1, value);
|
insert_value_by_idx(1, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cursor += need_values;
|
cursor += need_values;
|
||||||
|
@ -12,7 +12,7 @@ namespace DB
|
|||||||
|
|
||||||
void registerDictionarySourceRedis(DictionarySourceFactory & factory)
|
void registerDictionarySourceRedis(DictionarySourceFactory & factory)
|
||||||
{
|
{
|
||||||
auto createTableSource = [=](const DictionaryStructure & dict_struct,
|
auto create_table_source = [=](const DictionaryStructure & dict_struct,
|
||||||
const Poco::Util::AbstractConfiguration & config,
|
const Poco::Util::AbstractConfiguration & config,
|
||||||
const String & config_prefix,
|
const String & config_prefix,
|
||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
@ -29,7 +29,7 @@ namespace DB
|
|||||||
ErrorCodes::SUPPORT_IS_DISABLED};
|
ErrorCodes::SUPPORT_IS_DISABLED};
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
factory.registerSource("redis", createTableSource);
|
factory.registerSource("redis", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -688,7 +688,7 @@ static void trieTraverse(const btrie_t * trie, Getter && getter)
|
|||||||
node = node->left;
|
node = node->left;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto getBit = [&high_bit](size_t size) { return size ? (high_bit >> (size - 1)) : 0; };
|
auto get_bit = [&high_bit](size_t size) { return size ? (high_bit >> (size - 1)) : 0; };
|
||||||
|
|
||||||
while (!stack.empty())
|
while (!stack.empty())
|
||||||
{
|
{
|
||||||
@ -703,13 +703,13 @@ static void trieTraverse(const btrie_t * trie, Getter && getter)
|
|||||||
if (node && node->right)
|
if (node && node->right)
|
||||||
{
|
{
|
||||||
stack.push(nullptr);
|
stack.push(nullptr);
|
||||||
key |= getBit(stack.size());
|
key |= get_bit(stack.size());
|
||||||
stack.push(node->right);
|
stack.push(node->right);
|
||||||
while (stack.top()->left)
|
while (stack.top()->left)
|
||||||
stack.push(stack.top()->left);
|
stack.push(stack.top()->left);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
key &= ~getBit(stack.size());
|
key &= ~get_bit(stack.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -740,13 +740,13 @@ BlockInputStreamPtr TrieDictionary::getBlockInputStream(const Names & column_nam
|
|||||||
{
|
{
|
||||||
using BlockInputStreamType = DictionaryBlockInputStream<TrieDictionary, UInt64>;
|
using BlockInputStreamType = DictionaryBlockInputStream<TrieDictionary, UInt64>;
|
||||||
|
|
||||||
auto getKeys = [](const Columns & columns, const std::vector<DictionaryAttribute> & dict_attributes)
|
auto get_keys = [](const Columns & columns, const std::vector<DictionaryAttribute> & dict_attributes)
|
||||||
{
|
{
|
||||||
const auto & attr = dict_attributes.front();
|
const auto & attr = dict_attributes.front();
|
||||||
return ColumnsWithTypeAndName(
|
return ColumnsWithTypeAndName(
|
||||||
{ColumnWithTypeAndName(columns.front(), std::make_shared<DataTypeFixedString>(IPV6_BINARY_LENGTH), attr.name)});
|
{ColumnWithTypeAndName(columns.front(), std::make_shared<DataTypeFixedString>(IPV6_BINARY_LENGTH), attr.name)});
|
||||||
};
|
};
|
||||||
auto getView = [](const Columns & columns, const std::vector<DictionaryAttribute> & dict_attributes)
|
auto get_view = [](const Columns & columns, const std::vector<DictionaryAttribute> & dict_attributes)
|
||||||
{
|
{
|
||||||
auto column = ColumnString::create();
|
auto column = ColumnString::create();
|
||||||
const auto & ip_column = assert_cast<const ColumnFixedString &>(*columns.front());
|
const auto & ip_column = assert_cast<const ColumnFixedString &>(*columns.front());
|
||||||
@ -765,7 +765,7 @@ BlockInputStreamPtr TrieDictionary::getBlockInputStream(const Names & column_nam
|
|||||||
ColumnWithTypeAndName(std::move(column), std::make_shared<DataTypeString>(), dict_attributes.front().name)};
|
ColumnWithTypeAndName(std::move(column), std::make_shared<DataTypeString>(), dict_attributes.front().name)};
|
||||||
};
|
};
|
||||||
return std::make_shared<BlockInputStreamType>(
|
return std::make_shared<BlockInputStreamType>(
|
||||||
shared_from_this(), max_block_size, getKeyColumns(), column_names, std::move(getKeys), std::move(getView));
|
shared_from_this(), max_block_size, getKeyColumns(), column_names, std::move(get_keys), std::move(get_view));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ void registerDictionarySourceXDBC(DictionarySourceFactory & factory)
|
|||||||
Poco::Data::ODBC::Connector::registerConnector();
|
Poco::Data::ODBC::Connector::registerConnector();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto createTableSource = [=](const DictionaryStructure & dict_struct,
|
auto create_table_source = [=](const DictionaryStructure & dict_struct,
|
||||||
const Poco::Util::AbstractConfiguration & config,
|
const Poco::Util::AbstractConfiguration & config,
|
||||||
const std::string & config_prefix,
|
const std::string & config_prefix,
|
||||||
Block & sample_block,
|
Block & sample_block,
|
||||||
@ -256,12 +256,12 @@ void registerDictionarySourceXDBC(DictionarySourceFactory & factory)
|
|||||||
ErrorCodes::SUPPORT_IS_DISABLED};
|
ErrorCodes::SUPPORT_IS_DISABLED};
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
factory.registerSource("odbc", createTableSource);
|
factory.registerSource("odbc", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerDictionarySourceJDBC(DictionarySourceFactory & factory)
|
void registerDictionarySourceJDBC(DictionarySourceFactory & factory)
|
||||||
{
|
{
|
||||||
auto createTableSource = [=](const DictionaryStructure & /* dict_struct */,
|
auto create_table_source = [=](const DictionaryStructure & /* dict_struct */,
|
||||||
const Poco::Util::AbstractConfiguration & /* config */,
|
const Poco::Util::AbstractConfiguration & /* config */,
|
||||||
const std::string & /* config_prefix */,
|
const std::string & /* config_prefix */,
|
||||||
Block & /* sample_block */,
|
Block & /* sample_block */,
|
||||||
@ -272,7 +272,7 @@ void registerDictionarySourceJDBC(DictionarySourceFactory & factory)
|
|||||||
// BridgeHelperPtr bridge = std::make_shared<XDBCBridgeHelper<JDBCBridgeMixin>>(config, context.getSettings().http_receive_timeout, config.getString(config_prefix + ".connection_string"));
|
// BridgeHelperPtr bridge = std::make_shared<XDBCBridgeHelper<JDBCBridgeMixin>>(config, context.getSettings().http_receive_timeout, config.getString(config_prefix + ".connection_string"));
|
||||||
// return std::make_unique<XDBCDictionarySource>(dict_struct, config, config_prefix + ".jdbc", sample_block, context, bridge);
|
// return std::make_unique<XDBCDictionarySource>(dict_struct, config, config_prefix + ".jdbc", sample_block, context, bridge);
|
||||||
};
|
};
|
||||||
factory.registerSource("jdbc", createTableSource);
|
factory.registerSource("jdbc", create_table_source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ void buildLayoutConfiguration(
|
|||||||
void buildRangeConfiguration(AutoPtr<Document> doc, AutoPtr<Element> root, const ASTDictionaryRange * range, const NamesToTypeNames & all_attrs)
|
void buildRangeConfiguration(AutoPtr<Document> doc, AutoPtr<Element> root, const ASTDictionaryRange * range, const NamesToTypeNames & all_attrs)
|
||||||
{
|
{
|
||||||
// appends <key><name>value</name></key> to root
|
// appends <key><name>value</name></key> to root
|
||||||
auto appendElem = [&doc, &root](const std::string & key, const std::string & name, const std::string & type)
|
auto append_element = [&doc, &root](const std::string & key, const std::string & name, const std::string & type)
|
||||||
{
|
{
|
||||||
AutoPtr<Element> element(doc->createElement(key));
|
AutoPtr<Element> element(doc->createElement(key));
|
||||||
AutoPtr<Element> name_node(doc->createElement("name"));
|
AutoPtr<Element> name_node(doc->createElement("name"));
|
||||||
@ -131,8 +131,8 @@ void buildRangeConfiguration(AutoPtr<Document> doc, AutoPtr<Element> root, const
|
|||||||
root->appendChild(element);
|
root->appendChild(element);
|
||||||
};
|
};
|
||||||
|
|
||||||
appendElem("range_min", range->min_attr_name, all_attrs.at(range->min_attr_name));
|
append_element("range_min", range->min_attr_name, all_attrs.at(range->min_attr_name));
|
||||||
appendElem("range_max", range->max_attr_name, all_attrs.at(range->max_attr_name));
|
append_element("range_max", range->max_attr_name, all_attrs.at(range->max_attr_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ namespace
|
|||||||
struct Metadata
|
struct Metadata
|
||||||
{
|
{
|
||||||
/// Metadata file version.
|
/// Metadata file version.
|
||||||
const UInt32 VERSION = 1;
|
static constexpr UInt32 VERSION = 1;
|
||||||
|
|
||||||
using PathAndSize = std::pair<String, size_t>;
|
using PathAndSize = std::pair<String, size_t>;
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ Volume::Volume(
|
|||||||
<< formatReadableSizeWithBinarySuffix(sizes[i]) << ") for containing part the size of max_data_part_size ("
|
<< formatReadableSizeWithBinarySuffix(sizes[i]) << ") for containing part the size of max_data_part_size ("
|
||||||
<< formatReadableSizeWithBinarySuffix(max_data_part_size) << ")");
|
<< formatReadableSizeWithBinarySuffix(max_data_part_size) << ")");
|
||||||
}
|
}
|
||||||
constexpr UInt64 MIN_PART_SIZE = 8u * 1024u * 1024u;
|
static constexpr UInt64 MIN_PART_SIZE = 8u * 1024u * 1024u;
|
||||||
if (max_data_part_size != 0 && max_data_part_size < MIN_PART_SIZE)
|
if (max_data_part_size != 0 && max_data_part_size < MIN_PART_SIZE)
|
||||||
LOG_WARNING(
|
LOG_WARNING(
|
||||||
logger,
|
logger,
|
||||||
|
@ -50,14 +50,10 @@ template <typename T>
|
|||||||
class DiskTest : public testing::Test
|
class DiskTest : public testing::Test
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void SetUp() override { disk_ = createDisk<T>(); }
|
void SetUp() override { disk = createDisk<T>(); }
|
||||||
|
void TearDown() override { destroyDisk<T>(disk); }
|
||||||
|
|
||||||
void TearDown() override { destroyDisk<T>(disk_); }
|
DB::DiskPtr disk;
|
||||||
|
|
||||||
const DB::DiskPtr & getDisk() { return disk_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
DB::DiskPtr disk_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -67,49 +63,43 @@ TYPED_TEST_SUITE(DiskTest, DiskImplementations);
|
|||||||
|
|
||||||
TYPED_TEST(DiskTest, createDirectories)
|
TYPED_TEST(DiskTest, createDirectories)
|
||||||
{
|
{
|
||||||
const auto & disk = this->getDisk();
|
this->disk->createDirectories("test_dir1/");
|
||||||
|
EXPECT_TRUE(this->disk->isDirectory("test_dir1/"));
|
||||||
|
|
||||||
disk->createDirectories("test_dir1/");
|
this->disk->createDirectories("test_dir2/nested_dir/");
|
||||||
EXPECT_TRUE(disk->isDirectory("test_dir1/"));
|
EXPECT_TRUE(this->disk->isDirectory("test_dir2/nested_dir/"));
|
||||||
|
|
||||||
disk->createDirectories("test_dir2/nested_dir/");
|
|
||||||
EXPECT_TRUE(disk->isDirectory("test_dir2/nested_dir/"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TYPED_TEST(DiskTest, writeFile)
|
TYPED_TEST(DiskTest, writeFile)
|
||||||
{
|
{
|
||||||
const auto & disk = this->getDisk();
|
|
||||||
|
|
||||||
{
|
{
|
||||||
std::unique_ptr<DB::WriteBuffer> out = disk->writeFile("test_file");
|
std::unique_ptr<DB::WriteBuffer> out = this->disk->writeFile("test_file");
|
||||||
writeString("test data", *out);
|
writeString("test data", *out);
|
||||||
}
|
}
|
||||||
|
|
||||||
DB::String data;
|
DB::String data;
|
||||||
{
|
{
|
||||||
std::unique_ptr<DB::ReadBuffer> in = disk->readFile("test_file");
|
std::unique_ptr<DB::ReadBuffer> in = this->disk->readFile("test_file");
|
||||||
readString(data, *in);
|
readString(data, *in);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPECT_EQ("test data", data);
|
EXPECT_EQ("test data", data);
|
||||||
EXPECT_EQ(data.size(), disk->getFileSize("test_file"));
|
EXPECT_EQ(data.size(), this->disk->getFileSize("test_file"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TYPED_TEST(DiskTest, readFile)
|
TYPED_TEST(DiskTest, readFile)
|
||||||
{
|
{
|
||||||
const auto & disk = this->getDisk();
|
|
||||||
|
|
||||||
{
|
{
|
||||||
std::unique_ptr<DB::WriteBuffer> out = disk->writeFile("test_file");
|
std::unique_ptr<DB::WriteBuffer> out = this->disk->writeFile("test_file");
|
||||||
writeString("test data", *out);
|
writeString("test data", *out);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test SEEK_SET
|
// Test SEEK_SET
|
||||||
{
|
{
|
||||||
String buf(4, '0');
|
String buf(4, '0');
|
||||||
std::unique_ptr<DB::SeekableReadBuffer> in = disk->readFile("test_file");
|
std::unique_ptr<DB::SeekableReadBuffer> in = this->disk->readFile("test_file");
|
||||||
|
|
||||||
in->seek(5, SEEK_SET);
|
in->seek(5, SEEK_SET);
|
||||||
|
|
||||||
@ -119,7 +109,7 @@ TYPED_TEST(DiskTest, readFile)
|
|||||||
|
|
||||||
// Test SEEK_CUR
|
// Test SEEK_CUR
|
||||||
{
|
{
|
||||||
std::unique_ptr<DB::SeekableReadBuffer> in = disk->readFile("test_file");
|
std::unique_ptr<DB::SeekableReadBuffer> in = this->disk->readFile("test_file");
|
||||||
String buf(4, '0');
|
String buf(4, '0');
|
||||||
|
|
||||||
in->readStrict(buf.data(), 4);
|
in->readStrict(buf.data(), 4);
|
||||||
@ -136,12 +126,10 @@ TYPED_TEST(DiskTest, readFile)
|
|||||||
|
|
||||||
TYPED_TEST(DiskTest, iterateDirectory)
|
TYPED_TEST(DiskTest, iterateDirectory)
|
||||||
{
|
{
|
||||||
const auto & disk = this->getDisk();
|
this->disk->createDirectories("test_dir/nested_dir/");
|
||||||
|
|
||||||
disk->createDirectories("test_dir/nested_dir/");
|
|
||||||
|
|
||||||
{
|
{
|
||||||
auto iter = disk->iterateDirectory("");
|
auto iter = this->disk->iterateDirectory("");
|
||||||
EXPECT_TRUE(iter->isValid());
|
EXPECT_TRUE(iter->isValid());
|
||||||
EXPECT_EQ("test_dir/", iter->path());
|
EXPECT_EQ("test_dir/", iter->path());
|
||||||
iter->next();
|
iter->next();
|
||||||
@ -149,7 +137,7 @@ TYPED_TEST(DiskTest, iterateDirectory)
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto iter = disk->iterateDirectory("test_dir/");
|
auto iter = this->disk->iterateDirectory("test_dir/");
|
||||||
EXPECT_TRUE(iter->isValid());
|
EXPECT_TRUE(iter->isValid());
|
||||||
EXPECT_EQ("test_dir/nested_dir/", iter->path());
|
EXPECT_EQ("test_dir/nested_dir/", iter->path());
|
||||||
iter->next();
|
iter->next();
|
||||||
|
@ -28,7 +28,7 @@ struct CRCImpl
|
|||||||
{
|
{
|
||||||
using ReturnType = T;
|
using ReturnType = T;
|
||||||
|
|
||||||
static T make_crc(const unsigned char *buf, size_t size)
|
static T makeCRC(const unsigned char *buf, size_t size)
|
||||||
{
|
{
|
||||||
static CRCBase<ReturnType> base(polynomial);
|
static CRCBase<ReturnType> base(polynomial);
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ struct CRC32ZLIBImpl
|
|||||||
using ReturnType = UInt32;
|
using ReturnType = UInt32;
|
||||||
static constexpr auto name = "CRC32";
|
static constexpr auto name = "CRC32";
|
||||||
|
|
||||||
static UInt32 make_crc(const unsigned char *buf, size_t size)
|
static UInt32 makeCRC(const unsigned char *buf, size_t size)
|
||||||
{
|
{
|
||||||
return crc32_z(0L, buf, size);
|
return crc32_z(0L, buf, size);
|
||||||
}
|
}
|
||||||
@ -85,20 +85,20 @@ struct CRCFunctionWrapper
|
|||||||
ColumnString::Offset prev_offset = 0;
|
ColumnString::Offset prev_offset = 0;
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
{
|
{
|
||||||
res[i] = do_crc(data, prev_offset, offsets[i] - prev_offset - 1);
|
res[i] = doCRC(data, prev_offset, offsets[i] - prev_offset - 1);
|
||||||
prev_offset = offsets[i];
|
prev_offset = offsets[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed_to_constant(const ColumnString::Chars & data, size_t n, ReturnType & res) { res = do_crc(data, 0, n); }
|
static void vectorFixedToConstant(const ColumnString::Chars & data, size_t n, ReturnType & res) { res = doCRC(data, 0, n); }
|
||||||
|
|
||||||
static void vector_fixed_to_vector(const ColumnString::Chars & data, size_t n, PaddedPODArray<ReturnType> & res)
|
static void vectorFixedToVector(const ColumnString::Chars & data, size_t n, PaddedPODArray<ReturnType> & res)
|
||||||
{
|
{
|
||||||
size_t size = data.size() / n;
|
size_t size = data.size() / n;
|
||||||
|
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
{
|
{
|
||||||
res[i] = do_crc(data, i * n, n);
|
res[i] = doCRC(data, i * n, n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,10 +108,10 @@ struct CRCFunctionWrapper
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static ReturnType do_crc(const ColumnString::Chars & buf, size_t offset, size_t size)
|
static ReturnType doCRC(const ColumnString::Chars & buf, size_t offset, size_t size)
|
||||||
{
|
{
|
||||||
const unsigned char * p = reinterpret_cast<const unsigned char *>(&buf[0]) + offset;
|
const unsigned char * p = reinterpret_cast<const unsigned char *>(&buf[0]) + offset;
|
||||||
return Impl::make_crc(p, size);
|
return Impl::makeCRC(p, size);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -32,12 +32,12 @@ struct EmptyImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Only make sense if is_fixed_to_constant.
|
/// Only make sense if is_fixed_to_constant.
|
||||||
static void vector_fixed_to_constant(const ColumnString::Chars & /*data*/, size_t /*n*/, UInt8 & /*res*/)
|
static void vectorFixedToConstant(const ColumnString::Chars & /*data*/, size_t /*n*/, UInt8 & /*res*/)
|
||||||
{
|
{
|
||||||
throw Exception("Logical error: 'vector_fixed_to_constant method' is called", ErrorCodes::LOGICAL_ERROR);
|
throw Exception("Logical error: 'vectorFixedToConstant method' is called", ErrorCodes::LOGICAL_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed_to_vector(const ColumnString::Chars & data, size_t n, PaddedPODArray<UInt8> & res)
|
static void vectorFixedToVector(const ColumnString::Chars & data, size_t n, PaddedPODArray<UInt8> & res)
|
||||||
{
|
{
|
||||||
size_t size = data.size() / n;
|
size_t size = data.size() / n;
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
|
@ -62,25 +62,25 @@ struct BinaryOperationImplBase
|
|||||||
using ResultType = ResultType_;
|
using ResultType = ResultType_;
|
||||||
static const constexpr bool allow_fixed_string = false;
|
static const constexpr bool allow_fixed_string = false;
|
||||||
|
|
||||||
static void NO_INLINE vector_vector(const A * __restrict a, const B * __restrict b, ResultType * __restrict c, size_t size)
|
static void NO_INLINE vectorVector(const A * __restrict a, const B * __restrict b, ResultType * __restrict c, size_t size)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
c[i] = Op::template apply<ResultType>(a[i], b[i]);
|
c[i] = Op::template apply<ResultType>(a[i], b[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE vector_constant(const A * __restrict a, B b, ResultType * __restrict c, size_t size)
|
static void NO_INLINE vectorConstant(const A * __restrict a, B b, ResultType * __restrict c, size_t size)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
c[i] = Op::template apply<ResultType>(a[i], b);
|
c[i] = Op::template apply<ResultType>(a[i], b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE constant_vector(A a, const B * __restrict b, ResultType * __restrict c, size_t size)
|
static void NO_INLINE constantVector(A a, const B * __restrict b, ResultType * __restrict c, size_t size)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
c[i] = Op::template apply<ResultType>(a, b[i]);
|
c[i] = Op::template apply<ResultType>(a, b[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ResultType constant_constant(A a, B b)
|
static ResultType constantConstant(A a, B b)
|
||||||
{
|
{
|
||||||
return Op::template apply<ResultType>(a, b);
|
return Op::template apply<ResultType>(a, b);
|
||||||
}
|
}
|
||||||
@ -89,7 +89,7 @@ struct BinaryOperationImplBase
|
|||||||
template <typename Op>
|
template <typename Op>
|
||||||
struct FixedStringOperationImpl
|
struct FixedStringOperationImpl
|
||||||
{
|
{
|
||||||
static void NO_INLINE vector_vector(const UInt8 * __restrict a, const UInt8 * __restrict b, UInt8 * __restrict c, size_t size)
|
static void NO_INLINE vectorVector(const UInt8 * __restrict a, const UInt8 * __restrict b, UInt8 * __restrict c, size_t size)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
c[i] = Op::template apply<UInt8>(a[i], b[i]);
|
c[i] = Op::template apply<UInt8>(a[i], b[i]);
|
||||||
@ -146,12 +146,12 @@ struct FixedStringOperationImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(const UInt8 * __restrict a, const UInt8 * __restrict b, UInt8 * __restrict c, size_t size, size_t N)
|
static void vectorConstant(const UInt8 * __restrict a, const UInt8 * __restrict b, UInt8 * __restrict c, size_t size, size_t N)
|
||||||
{
|
{
|
||||||
vector_constant_impl<false>(a, b, c, size, N);
|
vector_constant_impl<false>(a, b, c, size, N);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_vector(const UInt8 * __restrict a, const UInt8 * __restrict b, UInt8 * __restrict c, size_t size, size_t N)
|
static void constantVector(const UInt8 * __restrict a, const UInt8 * __restrict b, UInt8 * __restrict c, size_t size, size_t N)
|
||||||
{
|
{
|
||||||
vector_constant_impl<true>(b, a, c, size, N);
|
vector_constant_impl<true>(b, a, c, size, N);
|
||||||
}
|
}
|
||||||
@ -206,39 +206,39 @@ struct DecimalBinaryOperation
|
|||||||
using ArrayC = typename ColumnDecimal<ResultType>::Container;
|
using ArrayC = typename ColumnDecimal<ResultType>::Container;
|
||||||
using SelfNoOverflow = DecimalBinaryOperation<A, B, Operation, ResultType_, false>;
|
using SelfNoOverflow = DecimalBinaryOperation<A, B, Operation, ResultType_, false>;
|
||||||
|
|
||||||
static void vector_vector(const ArrayA & a, const ArrayB & b, ArrayC & c, ResultType scale_a, ResultType scale_b, bool check_overflow)
|
static void vectorVector(const ArrayA & a, const ArrayB & b, ArrayC & c, ResultType scale_a, ResultType scale_b, bool check_overflow)
|
||||||
{
|
{
|
||||||
if (check_overflow)
|
if (check_overflow)
|
||||||
vector_vector(a, b, c, scale_a, scale_b);
|
vectorVector(a, b, c, scale_a, scale_b);
|
||||||
else
|
else
|
||||||
SelfNoOverflow::vector_vector(a, b, c, scale_a, scale_b);
|
SelfNoOverflow::vectorVector(a, b, c, scale_a, scale_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(const ArrayA & a, B b, ArrayC & c, ResultType scale_a, ResultType scale_b, bool check_overflow)
|
static void vectorConstant(const ArrayA & a, B b, ArrayC & c, ResultType scale_a, ResultType scale_b, bool check_overflow)
|
||||||
{
|
{
|
||||||
if (check_overflow)
|
if (check_overflow)
|
||||||
vector_constant(a, b, c, scale_a, scale_b);
|
vectorConstant(a, b, c, scale_a, scale_b);
|
||||||
else
|
else
|
||||||
SelfNoOverflow::vector_constant(a, b, c, scale_a, scale_b);
|
SelfNoOverflow::vectorConstant(a, b, c, scale_a, scale_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_vector(A a, const ArrayB & b, ArrayC & c, ResultType scale_a, ResultType scale_b, bool check_overflow)
|
static void constantVector(A a, const ArrayB & b, ArrayC & c, ResultType scale_a, ResultType scale_b, bool check_overflow)
|
||||||
{
|
{
|
||||||
if (check_overflow)
|
if (check_overflow)
|
||||||
constant_vector(a, b, c, scale_a, scale_b);
|
constantVector(a, b, c, scale_a, scale_b);
|
||||||
else
|
else
|
||||||
SelfNoOverflow::constant_vector(a, b, c, scale_a, scale_b);
|
SelfNoOverflow::constantVector(a, b, c, scale_a, scale_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ResultType constant_constant(A a, B b, ResultType scale_a, ResultType scale_b, bool check_overflow)
|
static ResultType constantConstant(A a, B b, ResultType scale_a, ResultType scale_b, bool check_overflow)
|
||||||
{
|
{
|
||||||
if (check_overflow)
|
if (check_overflow)
|
||||||
return constant_constant(a, b, scale_a, scale_b);
|
return constantConstant(a, b, scale_a, scale_b);
|
||||||
else
|
else
|
||||||
return SelfNoOverflow::constant_constant(a, b, scale_a, scale_b);
|
return SelfNoOverflow::constantConstant(a, b, scale_a, scale_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE vector_vector(const ArrayA & a, const ArrayB & b, ArrayC & c,
|
static void NO_INLINE vectorVector(const ArrayA & a, const ArrayB & b, ArrayC & c,
|
||||||
ResultType scale_a [[maybe_unused]], ResultType scale_b [[maybe_unused]])
|
ResultType scale_a [[maybe_unused]], ResultType scale_b [[maybe_unused]])
|
||||||
{
|
{
|
||||||
size_t size = a.size();
|
size_t size = a.size();
|
||||||
@ -269,7 +269,7 @@ struct DecimalBinaryOperation
|
|||||||
c[i] = apply(a[i], b[i]);
|
c[i] = apply(a[i], b[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE vector_constant(const ArrayA & a, B b, ArrayC & c,
|
static void NO_INLINE vectorConstant(const ArrayA & a, B b, ArrayC & c,
|
||||||
ResultType scale_a [[maybe_unused]], ResultType scale_b [[maybe_unused]])
|
ResultType scale_a [[maybe_unused]], ResultType scale_b [[maybe_unused]])
|
||||||
{
|
{
|
||||||
size_t size = a.size();
|
size_t size = a.size();
|
||||||
@ -300,7 +300,7 @@ struct DecimalBinaryOperation
|
|||||||
c[i] = apply(a[i], b);
|
c[i] = apply(a[i], b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE constant_vector(A a, const ArrayB & b, ArrayC & c,
|
static void NO_INLINE constantVector(A a, const ArrayB & b, ArrayC & c,
|
||||||
ResultType scale_a [[maybe_unused]], ResultType scale_b [[maybe_unused]])
|
ResultType scale_a [[maybe_unused]], ResultType scale_b [[maybe_unused]])
|
||||||
{
|
{
|
||||||
size_t size = b.size();
|
size_t size = b.size();
|
||||||
@ -331,7 +331,7 @@ struct DecimalBinaryOperation
|
|||||||
c[i] = apply(a, b[i]);
|
c[i] = apply(a, b[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ResultType constant_constant(A a, B b, ResultType scale_a [[maybe_unused]], ResultType scale_b [[maybe_unused]])
|
static ResultType constantConstant(A a, B b, ResultType scale_a [[maybe_unused]], ResultType scale_b [[maybe_unused]])
|
||||||
{
|
{
|
||||||
if constexpr (is_plus_minus_compare)
|
if constexpr (is_plus_minus_compare)
|
||||||
{
|
{
|
||||||
@ -863,7 +863,7 @@ public:
|
|||||||
auto col_res = ColumnFixedString::create(col_left->getN());
|
auto col_res = ColumnFixedString::create(col_left->getN());
|
||||||
auto & out_chars = col_res->getChars();
|
auto & out_chars = col_res->getChars();
|
||||||
out_chars.resize(col_left->getN());
|
out_chars.resize(col_left->getN());
|
||||||
OpImpl::vector_vector(col_left->getChars().data(),
|
OpImpl::vectorVector(col_left->getChars().data(),
|
||||||
col_right->getChars().data(),
|
col_right->getChars().data(),
|
||||||
out_chars.data(),
|
out_chars.data(),
|
||||||
out_chars.size());
|
out_chars.size());
|
||||||
@ -893,7 +893,7 @@ public:
|
|||||||
|
|
||||||
if (!is_left_column_const && !is_right_column_const)
|
if (!is_left_column_const && !is_right_column_const)
|
||||||
{
|
{
|
||||||
OpImpl::vector_vector(
|
OpImpl::vectorVector(
|
||||||
col_left->getChars().data(),
|
col_left->getChars().data(),
|
||||||
col_right->getChars().data(),
|
col_right->getChars().data(),
|
||||||
out_chars.data(),
|
out_chars.data(),
|
||||||
@ -901,7 +901,7 @@ public:
|
|||||||
}
|
}
|
||||||
else if (is_left_column_const)
|
else if (is_left_column_const)
|
||||||
{
|
{
|
||||||
OpImpl::constant_vector(
|
OpImpl::constantVector(
|
||||||
col_left->getChars().data(),
|
col_left->getChars().data(),
|
||||||
col_right->getChars().data(),
|
col_right->getChars().data(),
|
||||||
out_chars.data(),
|
out_chars.data(),
|
||||||
@ -910,7 +910,7 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
OpImpl::vector_constant(
|
OpImpl::vectorConstant(
|
||||||
col_left->getChars().data(),
|
col_left->getChars().data(),
|
||||||
col_right->getChars().data(),
|
col_right->getChars().data(),
|
||||||
out_chars.data(),
|
out_chars.data(),
|
||||||
@ -965,7 +965,7 @@ public:
|
|||||||
if constexpr (IsDataTypeDecimal<RightDataType> && is_division)
|
if constexpr (IsDataTypeDecimal<RightDataType> && is_division)
|
||||||
scale_a = right.getScaleMultiplier();
|
scale_a = right.getScaleMultiplier();
|
||||||
|
|
||||||
auto res = OpImpl::constant_constant(col_left->template getValue<T0>(), col_right->template getValue<T1>(),
|
auto res = OpImpl::constantConstant(col_left->template getValue<T0>(), col_right->template getValue<T1>(),
|
||||||
scale_a, scale_b, check_decimal_overflow);
|
scale_a, scale_b, check_decimal_overflow);
|
||||||
block.getByPosition(result).column =
|
block.getByPosition(result).column =
|
||||||
ResultDataType(type.getPrecision(), type.getScale()).createColumnConst(
|
ResultDataType(type.getPrecision(), type.getScale()).createColumnConst(
|
||||||
@ -974,7 +974,7 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto res = OpImpl::constant_constant(col_left->template getValue<T0>(), col_right->template getValue<T1>());
|
auto res = OpImpl::constantConstant(col_left->template getValue<T0>(), col_right->template getValue<T1>());
|
||||||
block.getByPosition(result).column = ResultDataType().createColumnConst(col_left->size(), toField(res));
|
block.getByPosition(result).column = ResultDataType().createColumnConst(col_left->size(), toField(res));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -1006,11 +1006,11 @@ public:
|
|||||||
if constexpr (IsDataTypeDecimal<RightDataType> && is_division)
|
if constexpr (IsDataTypeDecimal<RightDataType> && is_division)
|
||||||
scale_a = right.getScaleMultiplier();
|
scale_a = right.getScaleMultiplier();
|
||||||
|
|
||||||
OpImpl::constant_vector(col_left_const->template getValue<T0>(), col_right->getData(), vec_res,
|
OpImpl::constantVector(col_left_const->template getValue<T0>(), col_right->getData(), vec_res,
|
||||||
scale_a, scale_b, check_decimal_overflow);
|
scale_a, scale_b, check_decimal_overflow);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
OpImpl::constant_vector(col_left_const->template getValue<T0>(), col_right->getData().data(), vec_res.data(), vec_res.size());
|
OpImpl::constantVector(col_left_const->template getValue<T0>(), col_right->getData().data(), vec_res.data(), vec_res.size());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
@ -1027,12 +1027,12 @@ public:
|
|||||||
scale_a = right.getScaleMultiplier();
|
scale_a = right.getScaleMultiplier();
|
||||||
if (auto col_right = checkAndGetColumn<ColVecT1>(col_right_raw))
|
if (auto col_right = checkAndGetColumn<ColVecT1>(col_right_raw))
|
||||||
{
|
{
|
||||||
OpImpl::vector_vector(col_left->getData(), col_right->getData(), vec_res, scale_a, scale_b,
|
OpImpl::vectorVector(col_left->getData(), col_right->getData(), vec_res, scale_a, scale_b,
|
||||||
check_decimal_overflow);
|
check_decimal_overflow);
|
||||||
}
|
}
|
||||||
else if (auto col_right_const = checkAndGetColumnConst<ColVecT1>(col_right_raw))
|
else if (auto col_right_const = checkAndGetColumnConst<ColVecT1>(col_right_raw))
|
||||||
{
|
{
|
||||||
OpImpl::vector_constant(col_left->getData(), col_right_const->template getValue<T1>(), vec_res,
|
OpImpl::vectorConstant(col_left->getData(), col_right_const->template getValue<T1>(), vec_res,
|
||||||
scale_a, scale_b, check_decimal_overflow);
|
scale_a, scale_b, check_decimal_overflow);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1041,9 +1041,9 @@ public:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (auto col_right = checkAndGetColumn<ColVecT1>(col_right_raw))
|
if (auto col_right = checkAndGetColumn<ColVecT1>(col_right_raw))
|
||||||
OpImpl::vector_vector(col_left->getData().data(), col_right->getData().data(), vec_res.data(), vec_res.size());
|
OpImpl::vectorVector(col_left->getData().data(), col_right->getData().data(), vec_res.data(), vec_res.size());
|
||||||
else if (auto col_right_const = checkAndGetColumnConst<ColVecT1>(col_right_raw))
|
else if (auto col_right_const = checkAndGetColumnConst<ColVecT1>(col_right_raw))
|
||||||
OpImpl::vector_constant(col_left->getData().data(), col_right_const->template getValue<T1>(), vec_res.data(), vec_res.size());
|
OpImpl::vectorConstant(col_left->getData().data(), col_right_const->template getValue<T1>(), vec_res.data(), vec_res.size());
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -249,7 +249,7 @@ struct Adder
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
template <typename FromVectorType, typename ToVectorType>
|
template <typename FromVectorType, typename ToVectorType>
|
||||||
void NO_INLINE vector_constant(const FromVectorType & vec_from, ToVectorType & vec_to, Int64 delta, const DateLUTImpl & time_zone) const
|
void NO_INLINE vectorConstant(const FromVectorType & vec_from, ToVectorType & vec_to, Int64 delta, const DateLUTImpl & time_zone) const
|
||||||
{
|
{
|
||||||
size_t size = vec_from.size();
|
size_t size = vec_from.size();
|
||||||
vec_to.resize(size);
|
vec_to.resize(size);
|
||||||
@ -259,7 +259,7 @@ struct Adder
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename FromVectorType, typename ToVectorType>
|
template <typename FromVectorType, typename ToVectorType>
|
||||||
void vector_vector(const FromVectorType & vec_from, ToVectorType & vec_to, const IColumn & delta, const DateLUTImpl & time_zone) const
|
void vectorVector(const FromVectorType & vec_from, ToVectorType & vec_to, const IColumn & delta, const DateLUTImpl & time_zone) const
|
||||||
{
|
{
|
||||||
size_t size = vec_from.size();
|
size_t size = vec_from.size();
|
||||||
vec_to.resize(size);
|
vec_to.resize(size);
|
||||||
@ -268,11 +268,11 @@ struct Adder
|
|||||||
ColumnUInt8, ColumnUInt16, ColumnUInt32, ColumnUInt64,
|
ColumnUInt8, ColumnUInt16, ColumnUInt32, ColumnUInt64,
|
||||||
ColumnInt8, ColumnInt16, ColumnInt32, ColumnInt64,
|
ColumnInt8, ColumnInt16, ColumnInt32, ColumnInt64,
|
||||||
ColumnFloat32, ColumnFloat64>(
|
ColumnFloat32, ColumnFloat64>(
|
||||||
&delta, [&](const auto & column){ vector_vector(vec_from, vec_to, column, time_zone, size); return true; });
|
&delta, [&](const auto & column){ vectorVector(vec_from, vec_to, column, time_zone, size); return true; });
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename FromType, typename ToVectorType>
|
template <typename FromType, typename ToVectorType>
|
||||||
void constant_vector(const FromType & from, ToVectorType & vec_to, const IColumn & delta, const DateLUTImpl & time_zone) const
|
void constantVector(const FromType & from, ToVectorType & vec_to, const IColumn & delta, const DateLUTImpl & time_zone) const
|
||||||
{
|
{
|
||||||
size_t size = delta.size();
|
size_t size = delta.size();
|
||||||
vec_to.resize(size);
|
vec_to.resize(size);
|
||||||
@ -281,19 +281,19 @@ struct Adder
|
|||||||
ColumnUInt8, ColumnUInt16, ColumnUInt32, ColumnUInt64,
|
ColumnUInt8, ColumnUInt16, ColumnUInt32, ColumnUInt64,
|
||||||
ColumnInt8, ColumnInt16, ColumnInt32, ColumnInt64,
|
ColumnInt8, ColumnInt16, ColumnInt32, ColumnInt64,
|
||||||
ColumnFloat32, ColumnFloat64>(
|
ColumnFloat32, ColumnFloat64>(
|
||||||
&delta, [&](const auto & column){ constant_vector(from, vec_to, column, time_zone, size); return true; });
|
&delta, [&](const auto & column){ constantVector(from, vec_to, column, time_zone, size); return true; });
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename FromVectorType, typename ToVectorType, typename DeltaColumnType>
|
template <typename FromVectorType, typename ToVectorType, typename DeltaColumnType>
|
||||||
void NO_INLINE vector_vector(const FromVectorType & vec_from, ToVectorType & vec_to, const DeltaColumnType & delta, const DateLUTImpl & time_zone, size_t size) const
|
void NO_INLINE vectorVector(const FromVectorType & vec_from, ToVectorType & vec_to, const DeltaColumnType & delta, const DateLUTImpl & time_zone, size_t size) const
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
vec_to[i] = transform.execute(vec_from[i], delta.getData()[i], time_zone);
|
vec_to[i] = transform.execute(vec_from[i], delta.getData()[i], time_zone);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename FromType, typename ToVectorType, typename DeltaColumnType>
|
template <typename FromType, typename ToVectorType, typename DeltaColumnType>
|
||||||
void NO_INLINE constant_vector(const FromType & from, ToVectorType & vec_to, const DeltaColumnType & delta, const DateLUTImpl & time_zone, size_t size) const
|
void NO_INLINE constantVector(const FromType & from, ToVectorType & vec_to, const DeltaColumnType & delta, const DateLUTImpl & time_zone, size_t size) const
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
vec_to[i] = transform.execute(from, delta.getData()[i], time_zone);
|
vec_to[i] = transform.execute(from, delta.getData()[i], time_zone);
|
||||||
@ -324,13 +324,13 @@ struct DateTimeAddIntervalImpl
|
|||||||
const IColumn & delta_column = *block.getByPosition(arguments[1]).column;
|
const IColumn & delta_column = *block.getByPosition(arguments[1]).column;
|
||||||
|
|
||||||
if (const auto * delta_const_column = typeid_cast<const ColumnConst *>(&delta_column))
|
if (const auto * delta_const_column = typeid_cast<const ColumnConst *>(&delta_column))
|
||||||
op.vector_constant(sources->getData(), col_to->getData(), delta_const_column->getField().get<Int64>(), time_zone);
|
op.vectorConstant(sources->getData(), col_to->getData(), delta_const_column->getField().get<Int64>(), time_zone);
|
||||||
else
|
else
|
||||||
op.vector_vector(sources->getData(), col_to->getData(), delta_column, time_zone);
|
op.vectorVector(sources->getData(), col_to->getData(), delta_column, time_zone);
|
||||||
}
|
}
|
||||||
else if (const auto * sources_const = checkAndGetColumnConst<FromColumnType>(source_col.get()))
|
else if (const auto * sources_const = checkAndGetColumnConst<FromColumnType>(source_col.get()))
|
||||||
{
|
{
|
||||||
op.constant_vector(sources_const->template getValue<FromValueType>(), col_to->getData(), *block.getByPosition(arguments[1]).column, time_zone);
|
op.constantVector(sources_const->template getValue<FromValueType>(), col_to->getData(), *block.getByPosition(arguments[1]).column, time_zone);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -137,13 +137,13 @@ void validateArgumentsImpl(const IFunction & func,
|
|||||||
|
|
||||||
const auto & arg = arguments[i + argument_offset];
|
const auto & arg = arguments[i + argument_offset];
|
||||||
const auto descriptor = descriptors[i];
|
const auto descriptor = descriptors[i];
|
||||||
if (int errorCode = descriptor.isValid(arg.type, arg.column); errorCode != 0)
|
if (int error_code = descriptor.isValid(arg.type, arg.column); error_code != 0)
|
||||||
throw Exception("Illegal type of argument #" + std::to_string(i)
|
throw Exception("Illegal type of argument #" + std::to_string(i)
|
||||||
+ (descriptor.argument_name ? " '" + std::string(descriptor.argument_name) + "'" : String{})
|
+ (descriptor.argument_name ? " '" + std::string(descriptor.argument_name) + "'" : String{})
|
||||||
+ " of function " + func.getName()
|
+ " of function " + func.getName()
|
||||||
+ (descriptor.expected_type_description ? String(", expected ") + descriptor.expected_type_description : String{})
|
+ (descriptor.expected_type_description ? String(", expected ") + descriptor.expected_type_description : String{})
|
||||||
+ (arg.type ? ", got " + arg.type->getName() : String{}),
|
+ (arg.type ? ", got " + arg.type->getName() : String{}),
|
||||||
errorCode);
|
error_code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ void validateFunctionArgumentTypes(const IFunction & func,
|
|||||||
{
|
{
|
||||||
if (arguments.size() < mandatory_args.size() || arguments.size() > mandatory_args.size() + optional_args.size())
|
if (arguments.size() < mandatory_args.size() || arguments.size() > mandatory_args.size() + optional_args.size())
|
||||||
{
|
{
|
||||||
auto joinArgumentTypes = [](const auto & args, const String sep = ", ")
|
auto join_argument_types = [](const auto & args, const String sep = ", ")
|
||||||
{
|
{
|
||||||
String result;
|
String result;
|
||||||
for (const auto & a : args)
|
for (const auto & a : args)
|
||||||
@ -194,11 +194,11 @@ void validateFunctionArgumentTypes(const IFunction & func,
|
|||||||
|
|
||||||
throw Exception("Incorrect number of arguments for function " + func.getName()
|
throw Exception("Incorrect number of arguments for function " + func.getName()
|
||||||
+ " provided " + std::to_string(arguments.size())
|
+ " provided " + std::to_string(arguments.size())
|
||||||
+ (!arguments.empty() ? " (" + joinArgumentTypes(arguments) + ")" : String{})
|
+ (!arguments.empty() ? " (" + join_argument_types(arguments) + ")" : String{})
|
||||||
+ ", expected " + std::to_string(mandatory_args.size())
|
+ ", expected " + std::to_string(mandatory_args.size())
|
||||||
+ (!optional_args.empty() ? " to " + std::to_string(mandatory_args.size() + optional_args.size()) : "")
|
+ (!optional_args.empty() ? " to " + std::to_string(mandatory_args.size() + optional_args.size()) : "")
|
||||||
+ " (" + joinArgumentTypes(mandatory_args)
|
+ " (" + join_argument_types(mandatory_args)
|
||||||
+ (!optional_args.empty() ? ", [" + joinArgumentTypes(optional_args) + "]" : "")
|
+ (!optional_args.empty() ? ", [" + join_argument_types(optional_args) + "]" : "")
|
||||||
+ ")",
|
+ ")",
|
||||||
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ public:
|
|||||||
if (Impl::is_fixed_to_constant)
|
if (Impl::is_fixed_to_constant)
|
||||||
{
|
{
|
||||||
ResultType res = 0;
|
ResultType res = 0;
|
||||||
Impl::vector_fixed_to_constant(col_fixed->getChars(), col_fixed->getN(), res);
|
Impl::vectorFixedToConstant(col_fixed->getChars(), col_fixed->getN(), res);
|
||||||
|
|
||||||
block.getByPosition(result).column = block.getByPosition(result).type->createColumnConst(col_fixed->size(), toField(res));
|
block.getByPosition(result).column = block.getByPosition(result).type->createColumnConst(col_fixed->size(), toField(res));
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ public:
|
|||||||
|
|
||||||
typename ColumnVector<ResultType>::Container & vec_res = col_res->getData();
|
typename ColumnVector<ResultType>::Container & vec_res = col_res->getData();
|
||||||
vec_res.resize(col_fixed->size());
|
vec_res.resize(col_fixed->size());
|
||||||
Impl::vector_fixed_to_vector(col_fixed->getChars(), col_fixed->getN(), vec_res);
|
Impl::vectorFixedToVector(col_fixed->getChars(), col_fixed->getN(), vec_res);
|
||||||
|
|
||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ public:
|
|||||||
else if (const ColumnFixedString * col_fixed = checkAndGetColumn<ColumnFixedString>(column.get()))
|
else if (const ColumnFixedString * col_fixed = checkAndGetColumn<ColumnFixedString>(column.get()))
|
||||||
{
|
{
|
||||||
auto col_res = ColumnFixedString::create(col_fixed->getN());
|
auto col_res = ColumnFixedString::create(col_fixed->getN());
|
||||||
Impl::vector_fixed(col_fixed->getChars(), col_fixed->getN(), col_res->getChars());
|
Impl::vectorFixed(col_fixed->getChars(), col_fixed->getN(), col_res->getChars());
|
||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -78,7 +78,7 @@ template <typename A, typename B, typename Op>
|
|||||||
struct NumComparisonImpl
|
struct NumComparisonImpl
|
||||||
{
|
{
|
||||||
/// If you don't specify NO_INLINE, the compiler will inline this function, but we don't need this as this function contains tight loop inside.
|
/// If you don't specify NO_INLINE, the compiler will inline this function, but we don't need this as this function contains tight loop inside.
|
||||||
static void NO_INLINE vector_vector(const PaddedPODArray<A> & a, const PaddedPODArray<B> & b, PaddedPODArray<UInt8> & c)
|
static void NO_INLINE vectorVector(const PaddedPODArray<A> & a, const PaddedPODArray<B> & b, PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
/** GCC 4.8.2 vectorizes a loop only if it is written in this form.
|
/** GCC 4.8.2 vectorizes a loop only if it is written in this form.
|
||||||
* In this case, if you loop through the array index (the code will look simpler),
|
* In this case, if you loop through the array index (the code will look simpler),
|
||||||
@ -100,7 +100,7 @@ struct NumComparisonImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE vector_constant(const PaddedPODArray<A> & a, B b, PaddedPODArray<UInt8> & c)
|
static void NO_INLINE vectorConstant(const PaddedPODArray<A> & a, B b, PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
size_t size = a.size();
|
size_t size = a.size();
|
||||||
const A * __restrict a_pos = a.data();
|
const A * __restrict a_pos = a.data();
|
||||||
@ -115,12 +115,12 @@ struct NumComparisonImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_vector(A a, const PaddedPODArray<B> & b, PaddedPODArray<UInt8> & c)
|
static void constantVector(A a, const PaddedPODArray<B> & b, PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
NumComparisonImpl<B, A, typename Op::SymmetricOp>::vector_constant(b, a, c);
|
NumComparisonImpl<B, A, typename Op::SymmetricOp>::vectorConstant(b, a, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_constant(A a, B b, UInt8 & c)
|
static void constantConstant(A a, B b, UInt8 & c)
|
||||||
{
|
{
|
||||||
c = Op::apply(a, b);
|
c = Op::apply(a, b);
|
||||||
}
|
}
|
||||||
@ -168,7 +168,7 @@ struct StringComparisonImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE string_vector_constant(
|
static void NO_INLINE string_vectorConstant(
|
||||||
const ColumnString::Chars & a_data, const ColumnString::Offsets & a_offsets,
|
const ColumnString::Chars & a_data, const ColumnString::Offsets & a_offsets,
|
||||||
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
||||||
PaddedPODArray<UInt8> & c)
|
PaddedPODArray<UInt8> & c)
|
||||||
@ -243,7 +243,7 @@ struct StringComparisonImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE fixed_string_vector_constant(
|
static void NO_INLINE fixed_string_vectorConstant(
|
||||||
const ColumnString::Chars & a_data, ColumnString::Offset a_n,
|
const ColumnString::Chars & a_data, ColumnString::Offset a_n,
|
||||||
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
||||||
PaddedPODArray<UInt8> & c)
|
PaddedPODArray<UInt8> & c)
|
||||||
@ -271,7 +271,7 @@ struct StringComparisonImpl
|
|||||||
const ColumnString::Chars & b_data, const ColumnString::Offsets & b_offsets,
|
const ColumnString::Chars & b_data, const ColumnString::Offsets & b_offsets,
|
||||||
PaddedPODArray<UInt8> & c)
|
PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
StringComparisonImpl<typename Op::SymmetricOp>::string_vector_constant(b_data, b_offsets, a_data, a_size, c);
|
StringComparisonImpl<typename Op::SymmetricOp>::string_vectorConstant(b_data, b_offsets, a_data, a_size, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_fixed_string_vector(
|
static void constant_fixed_string_vector(
|
||||||
@ -279,10 +279,10 @@ struct StringComparisonImpl
|
|||||||
const ColumnString::Chars & b_data, ColumnString::Offset b_n,
|
const ColumnString::Chars & b_data, ColumnString::Offset b_n,
|
||||||
PaddedPODArray<UInt8> & c)
|
PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
StringComparisonImpl<typename Op::SymmetricOp>::fixed_string_vector_constant(b_data, b_n, a_data, a_size, c);
|
StringComparisonImpl<typename Op::SymmetricOp>::fixed_string_vectorConstant(b_data, b_n, a_data, a_size, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_constant(
|
static void constantConstant(
|
||||||
const ColumnString::Chars & a_data, ColumnString::Offset a_size,
|
const ColumnString::Chars & a_data, ColumnString::Offset a_size,
|
||||||
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
||||||
UInt8 & c)
|
UInt8 & c)
|
||||||
@ -339,7 +339,7 @@ struct StringEqualsImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE string_vector_constant(
|
static void NO_INLINE string_vectorConstant(
|
||||||
const ColumnString::Chars & a_data, const ColumnString::Offsets & a_offsets,
|
const ColumnString::Chars & a_data, const ColumnString::Offsets & a_offsets,
|
||||||
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
||||||
PaddedPODArray<UInt8> & c)
|
PaddedPODArray<UInt8> & c)
|
||||||
@ -405,7 +405,7 @@ struct StringEqualsImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE fixed_string_vector_constant(
|
static void NO_INLINE fixed_string_vectorConstant(
|
||||||
const ColumnString::Chars & a_data, ColumnString::Offset a_n,
|
const ColumnString::Chars & a_data, ColumnString::Offset a_n,
|
||||||
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
||||||
PaddedPODArray<UInt8> & c)
|
PaddedPODArray<UInt8> & c)
|
||||||
@ -435,7 +435,7 @@ struct StringEqualsImpl
|
|||||||
const ColumnString::Chars & b_data, const ColumnString::Offsets & b_offsets,
|
const ColumnString::Chars & b_data, const ColumnString::Offsets & b_offsets,
|
||||||
PaddedPODArray<UInt8> & c)
|
PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
string_vector_constant(b_data, b_offsets, a_data, a_size, c);
|
string_vectorConstant(b_data, b_offsets, a_data, a_size, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_fixed_string_vector(
|
static void constant_fixed_string_vector(
|
||||||
@ -443,10 +443,10 @@ struct StringEqualsImpl
|
|||||||
const ColumnString::Chars & b_data, ColumnString::Offset b_n,
|
const ColumnString::Chars & b_data, ColumnString::Offset b_n,
|
||||||
PaddedPODArray<UInt8> & c)
|
PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
fixed_string_vector_constant(b_data, b_n, a_data, a_size, c);
|
fixed_string_vectorConstant(b_data, b_n, a_data, a_size, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_constant(
|
static void constantConstant(
|
||||||
const ColumnString::Chars & a_data, ColumnString::Offset a_size,
|
const ColumnString::Chars & a_data, ColumnString::Offset a_size,
|
||||||
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
const ColumnString::Chars & b_data, ColumnString::Offset b_size,
|
||||||
UInt8 & c)
|
UInt8 & c)
|
||||||
@ -467,25 +467,25 @@ struct StringComparisonImpl<NotEqualsOp<A, B>> : StringEqualsImpl<false> {};
|
|||||||
template <typename Op>
|
template <typename Op>
|
||||||
struct GenericComparisonImpl
|
struct GenericComparisonImpl
|
||||||
{
|
{
|
||||||
static void NO_INLINE vector_vector(const IColumn & a, const IColumn & b, PaddedPODArray<UInt8> & c)
|
static void NO_INLINE vectorVector(const IColumn & a, const IColumn & b, PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
for (size_t i = 0, size = a.size(); i < size; ++i)
|
for (size_t i = 0, size = a.size(); i < size; ++i)
|
||||||
c[i] = Op::apply(a.compareAt(i, i, b, 1), 0);
|
c[i] = Op::apply(a.compareAt(i, i, b, 1), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NO_INLINE vector_constant(const IColumn & a, const IColumn & b, PaddedPODArray<UInt8> & c)
|
static void NO_INLINE vectorConstant(const IColumn & a, const IColumn & b, PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
auto b_materialized = b.cloneResized(1)->convertToFullColumnIfConst();
|
auto b_materialized = b.cloneResized(1)->convertToFullColumnIfConst();
|
||||||
for (size_t i = 0, size = a.size(); i < size; ++i)
|
for (size_t i = 0, size = a.size(); i < size; ++i)
|
||||||
c[i] = Op::apply(a.compareAt(i, 0, *b_materialized, 1), 0);
|
c[i] = Op::apply(a.compareAt(i, 0, *b_materialized, 1), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_vector(const IColumn & a, const IColumn & b, PaddedPODArray<UInt8> & c)
|
static void constantVector(const IColumn & a, const IColumn & b, PaddedPODArray<UInt8> & c)
|
||||||
{
|
{
|
||||||
GenericComparisonImpl<typename Op::SymmetricOp>::vector_constant(b, a, c);
|
GenericComparisonImpl<typename Op::SymmetricOp>::vectorConstant(b, a, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_constant(const IColumn & a, const IColumn & b, UInt8 & c)
|
static void constantConstant(const IColumn & a, const IColumn & b, UInt8 & c)
|
||||||
{
|
{
|
||||||
c = Op::apply(a.compareAt(0, 0, b, 1), 0);
|
c = Op::apply(a.compareAt(0, 0, b, 1), 0);
|
||||||
}
|
}
|
||||||
@ -582,7 +582,7 @@ private:
|
|||||||
|
|
||||||
ColumnUInt8::Container & vec_res = col_res->getData();
|
ColumnUInt8::Container & vec_res = col_res->getData();
|
||||||
vec_res.resize(col_left->getData().size());
|
vec_res.resize(col_left->getData().size());
|
||||||
NumComparisonImpl<T0, T1, Op<T0, T1>>::vector_vector(col_left->getData(), col_right->getData(), vec_res);
|
NumComparisonImpl<T0, T1, Op<T0, T1>>::vectorVector(col_left->getData(), col_right->getData(), vec_res);
|
||||||
|
|
||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
return true;
|
return true;
|
||||||
@ -593,7 +593,7 @@ private:
|
|||||||
|
|
||||||
ColumnUInt8::Container & vec_res = col_res->getData();
|
ColumnUInt8::Container & vec_res = col_res->getData();
|
||||||
vec_res.resize(col_left->size());
|
vec_res.resize(col_left->size());
|
||||||
NumComparisonImpl<T0, T1, Op<T0, T1>>::vector_constant(col_left->getData(), col_right_const->template getValue<T1>(), vec_res);
|
NumComparisonImpl<T0, T1, Op<T0, T1>>::vectorConstant(col_left->getData(), col_right_const->template getValue<T1>(), vec_res);
|
||||||
|
|
||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
return true;
|
return true;
|
||||||
@ -611,7 +611,7 @@ private:
|
|||||||
|
|
||||||
ColumnUInt8::Container & vec_res = col_res->getData();
|
ColumnUInt8::Container & vec_res = col_res->getData();
|
||||||
vec_res.resize(col_left->size());
|
vec_res.resize(col_left->size());
|
||||||
NumComparisonImpl<T0, T1, Op<T0, T1>>::constant_vector(col_left->template getValue<T0>(), col_right->getData(), vec_res);
|
NumComparisonImpl<T0, T1, Op<T0, T1>>::constantVector(col_left->template getValue<T0>(), col_right->getData(), vec_res);
|
||||||
|
|
||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
return true;
|
return true;
|
||||||
@ -619,7 +619,7 @@ private:
|
|||||||
else if (auto col_right_const = checkAndGetColumnConst<ColumnVector<T1>>(col_right_untyped))
|
else if (auto col_right_const = checkAndGetColumnConst<ColumnVector<T1>>(col_right_untyped))
|
||||||
{
|
{
|
||||||
UInt8 res = 0;
|
UInt8 res = 0;
|
||||||
NumComparisonImpl<T0, T1, Op<T0, T1>>::constant_constant(col_left->template getValue<T0>(), col_right_const->template getValue<T1>(), res);
|
NumComparisonImpl<T0, T1, Op<T0, T1>>::constantConstant(col_left->template getValue<T0>(), col_right_const->template getValue<T1>(), res);
|
||||||
|
|
||||||
block.getByPosition(result).column = DataTypeUInt8().createColumnConst(col_left->size(), toField(res));
|
block.getByPosition(result).column = DataTypeUInt8().createColumnConst(col_left->size(), toField(res));
|
||||||
return true;
|
return true;
|
||||||
@ -759,7 +759,7 @@ private:
|
|||||||
if (c0_const && c1_const)
|
if (c0_const && c1_const)
|
||||||
{
|
{
|
||||||
UInt8 res = 0;
|
UInt8 res = 0;
|
||||||
StringImpl::constant_constant(*c0_const_chars, c0_const_size, *c1_const_chars, c1_const_size, res);
|
StringImpl::constantConstant(*c0_const_chars, c0_const_size, *c1_const_chars, c1_const_size, res);
|
||||||
block.getByPosition(result).column = block.getByPosition(result).type->createColumnConst(c0_const->size(), toField(res));
|
block.getByPosition(result).column = block.getByPosition(result).type->createColumnConst(c0_const->size(), toField(res));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -780,7 +780,7 @@ private:
|
|||||||
c1_fixed_string->getChars(), c1_fixed_string->getN(),
|
c1_fixed_string->getChars(), c1_fixed_string->getN(),
|
||||||
c_res->getData());
|
c_res->getData());
|
||||||
else if (c0_string && c1_const)
|
else if (c0_string && c1_const)
|
||||||
StringImpl::string_vector_constant(
|
StringImpl::string_vectorConstant(
|
||||||
c0_string->getChars(), c0_string->getOffsets(),
|
c0_string->getChars(), c0_string->getOffsets(),
|
||||||
*c1_const_chars, c1_const_size,
|
*c1_const_chars, c1_const_size,
|
||||||
c_res->getData());
|
c_res->getData());
|
||||||
@ -795,7 +795,7 @@ private:
|
|||||||
c1_fixed_string->getChars(), c1_fixed_string->getN(),
|
c1_fixed_string->getChars(), c1_fixed_string->getN(),
|
||||||
c_res->getData());
|
c_res->getData());
|
||||||
else if (c0_fixed_string && c1_const)
|
else if (c0_fixed_string && c1_const)
|
||||||
StringImpl::fixed_string_vector_constant(
|
StringImpl::fixed_string_vectorConstant(
|
||||||
c0_fixed_string->getChars(), c0_fixed_string->getN(),
|
c0_fixed_string->getChars(), c0_fixed_string->getN(),
|
||||||
*c1_const_chars, c1_const_size,
|
*c1_const_chars, c1_const_size,
|
||||||
c_res->getData());
|
c_res->getData());
|
||||||
@ -1081,7 +1081,7 @@ private:
|
|||||||
if (c0_const && c1_const)
|
if (c0_const && c1_const)
|
||||||
{
|
{
|
||||||
UInt8 res = 0;
|
UInt8 res = 0;
|
||||||
GenericComparisonImpl<Op<int, int>>::constant_constant(*c0, *c1, res);
|
GenericComparisonImpl<Op<int, int>>::constantConstant(*c0, *c1, res);
|
||||||
block.getByPosition(result).column = DataTypeUInt8().createColumnConst(c0->size(), toField(res));
|
block.getByPosition(result).column = DataTypeUInt8().createColumnConst(c0->size(), toField(res));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1091,11 +1091,11 @@ private:
|
|||||||
vec_res.resize(c0->size());
|
vec_res.resize(c0->size());
|
||||||
|
|
||||||
if (c0_const)
|
if (c0_const)
|
||||||
GenericComparisonImpl<Op<int, int>>::constant_vector(*c0, *c1, vec_res);
|
GenericComparisonImpl<Op<int, int>>::constantVector(*c0, *c1, vec_res);
|
||||||
else if (c1_const)
|
else if (c1_const)
|
||||||
GenericComparisonImpl<Op<int, int>>::vector_constant(*c0, *c1, vec_res);
|
GenericComparisonImpl<Op<int, int>>::vectorConstant(*c0, *c1, vec_res);
|
||||||
else
|
else
|
||||||
GenericComparisonImpl<Op<int, int>>::vector_vector(*c0, *c1, vec_res);
|
GenericComparisonImpl<Op<int, int>>::vectorVector(*c0, *c1, vec_res);
|
||||||
|
|
||||||
block.getByPosition(result).column = std::move(c_res);
|
block.getByPosition(result).column = std::move(c_res);
|
||||||
}
|
}
|
||||||
|
@ -301,13 +301,13 @@ struct OperationApplier
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const OperationApplierImpl<Op, N> operationApplierImpl(in);
|
const OperationApplierImpl<Op, N> operation_applier_impl(in);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (auto & res : result_data)
|
for (auto & res : result_data)
|
||||||
if constexpr (CarryResult)
|
if constexpr (CarryResult)
|
||||||
res = Op::apply(res, operationApplierImpl.apply(i++));
|
res = Op::apply(res, operation_applier_impl.apply(i++));
|
||||||
else
|
else
|
||||||
res = operationApplierImpl.apply(i++);
|
res = operation_applier_impl.apply(i++);
|
||||||
|
|
||||||
in.erase(in.end() - N, in.end());
|
in.erase(in.end() - N, in.end());
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,7 @@ struct MatchImpl
|
|||||||
|
|
||||||
using ResultType = UInt8;
|
using ResultType = UInt8;
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & pattern, PaddedPODArray<UInt8> & res)
|
const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & pattern, PaddedPODArray<UInt8> & res)
|
||||||
{
|
{
|
||||||
if (offsets.empty())
|
if (offsets.empty())
|
||||||
@ -246,14 +246,14 @@ struct MatchImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
static void vector_vector(Args &&...)
|
static void vectorVector(Args &&...)
|
||||||
{
|
{
|
||||||
throw Exception("Functions 'like' and 'match' don't support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Functions 'like' and 'match' don't support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Search different needles in single haystack.
|
/// Search different needles in single haystack.
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
static void constant_vector(Args &&...)
|
static void constantVector(Args &&...)
|
||||||
{
|
{
|
||||||
throw Exception("Functions 'like' and 'match' don't support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Functions 'like' and 'match' don't support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
@ -269,22 +269,22 @@ struct MultiMatchAnyImpl
|
|||||||
/// Variable for understanding, if we used offsets for the output, most
|
/// Variable for understanding, if we used offsets for the output, most
|
||||||
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
||||||
static constexpr bool is_column_array = false;
|
static constexpr bool is_column_array = false;
|
||||||
static auto ReturnType()
|
static auto getReturnType()
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeNumber<ResultType>>();
|
return std::make_shared<DataTypeNumber<ResultType>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const std::vector<StringRef> & needles,
|
const std::vector<StringRef> & needles,
|
||||||
PaddedPODArray<Type> & res,
|
PaddedPODArray<Type> & res,
|
||||||
PaddedPODArray<UInt64> & offsets)
|
PaddedPODArray<UInt64> & offsets)
|
||||||
{
|
{
|
||||||
vector_constant(haystack_data, haystack_offsets, needles, res, offsets, std::nullopt);
|
vectorConstant(haystack_data, haystack_offsets, needles, res, offsets, std::nullopt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const std::vector<StringRef> & needles,
|
const std::vector<StringRef> & needles,
|
||||||
@ -351,7 +351,7 @@ struct MultiMatchAnyImpl
|
|||||||
memset(accum.data(), 0, accum.size());
|
memset(accum.data(), 0, accum.size());
|
||||||
for (size_t j = 0; j < needles.size(); ++j)
|
for (size_t j = 0; j < needles.size(); ++j)
|
||||||
{
|
{
|
||||||
MatchImpl<false, false>::vector_constant(haystack_data, haystack_offsets, needles[j].toString(), accum);
|
MatchImpl<false, false>::vectorConstant(haystack_data, haystack_offsets, needles[j].toString(), accum);
|
||||||
for (size_t i = 0; i < res.size(); ++i)
|
for (size_t i = 0; i < res.size(); ++i)
|
||||||
{
|
{
|
||||||
if constexpr (FindAny)
|
if constexpr (FindAny)
|
||||||
@ -372,22 +372,22 @@ struct MultiMatchAllIndicesImpl
|
|||||||
/// Variable for understanding, if we used offsets for the output, most
|
/// Variable for understanding, if we used offsets for the output, most
|
||||||
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
||||||
static constexpr bool is_column_array = true;
|
static constexpr bool is_column_array = true;
|
||||||
static auto ReturnType()
|
static auto getReturnType()
|
||||||
{
|
{
|
||||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeUInt64>());
|
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeUInt64>());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const std::vector<StringRef> & needles,
|
const std::vector<StringRef> & needles,
|
||||||
PaddedPODArray<Type> & res,
|
PaddedPODArray<Type> & res,
|
||||||
PaddedPODArray<UInt64> & offsets)
|
PaddedPODArray<UInt64> & offsets)
|
||||||
{
|
{
|
||||||
vector_constant(haystack_data, haystack_offsets, needles, res, offsets, std::nullopt);
|
vectorConstant(haystack_data, haystack_offsets, needles, res, offsets, std::nullopt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const std::vector<StringRef> & needles,
|
const std::vector<StringRef> & needles,
|
||||||
@ -652,7 +652,7 @@ struct ReplaceRegexpImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed(
|
static void vectorFixed(
|
||||||
const ColumnString::Chars & data,
|
const ColumnString::Chars & data,
|
||||||
size_t n,
|
size_t n,
|
||||||
const std::string & needle,
|
const std::string & needle,
|
||||||
@ -763,7 +763,7 @@ struct ReplaceStringImpl
|
|||||||
|
|
||||||
/// Note: this function converts fixed-length strings to variable-length strings
|
/// Note: this function converts fixed-length strings to variable-length strings
|
||||||
/// and each variable-length string should ends with zero byte.
|
/// and each variable-length string should ends with zero byte.
|
||||||
static void vector_fixed(
|
static void vectorFixed(
|
||||||
const ColumnString::Chars & data,
|
const ColumnString::Chars & data,
|
||||||
size_t n,
|
size_t n,
|
||||||
const std::string & needle,
|
const std::string & needle,
|
||||||
@ -910,7 +910,7 @@ public:
|
|||||||
else if (const ColumnFixedString * col_fixed = checkAndGetColumn<ColumnFixedString>(column_src.get()))
|
else if (const ColumnFixedString * col_fixed = checkAndGetColumn<ColumnFixedString>(column_src.get()))
|
||||||
{
|
{
|
||||||
auto col_res = ColumnString::create();
|
auto col_res = ColumnString::create();
|
||||||
Impl::vector_fixed(col_fixed->getChars(), col_fixed->getN(), needle, replacement, col_res->getChars(), col_res->getOffsets());
|
Impl::vectorFixed(col_fixed->getChars(), col_fixed->getN(), needle, replacement, col_res->getChars(), col_res->getOffsets());
|
||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -63,7 +63,7 @@ public:
|
|||||||
if (!array_type || !checkAndGetDataType<DataTypeString>(array_type->getNestedType().get()))
|
if (!array_type || !checkAndGetDataType<DataTypeString>(array_type->getNestedType().get()))
|
||||||
throw Exception(
|
throw Exception(
|
||||||
"Illegal type " + arguments[2]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
"Illegal type " + arguments[2]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||||
return Impl::ReturnType();
|
return Impl::getReturnType();
|
||||||
}
|
}
|
||||||
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override
|
||||||
@ -121,7 +121,7 @@ public:
|
|||||||
|
|
||||||
/// The blame for resizing output is for the callee.
|
/// The blame for resizing output is for the callee.
|
||||||
if (col_haystack_vector)
|
if (col_haystack_vector)
|
||||||
Impl::vector_constant(
|
Impl::vectorConstant(
|
||||||
col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res, offsets_res, edit_distance);
|
col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res, offsets_res, edit_distance);
|
||||||
else
|
else
|
||||||
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN);
|
||||||
|
@ -155,7 +155,7 @@ struct PositionImpl
|
|||||||
using ResultType = UInt64;
|
using ResultType = UInt64;
|
||||||
|
|
||||||
/// Find one substring in many strings.
|
/// Find one substring in many strings.
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & needle, PaddedPODArray<UInt64> & res)
|
const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & needle, PaddedPODArray<UInt64> & res)
|
||||||
{
|
{
|
||||||
const UInt8 * begin = data.data();
|
const UInt8 * begin = data.data();
|
||||||
@ -192,7 +192,7 @@ struct PositionImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Search for substring in string.
|
/// Search for substring in string.
|
||||||
static void constant_constant(std::string data, std::string needle, UInt64 & res)
|
static void constantConstant(std::string data, std::string needle, UInt64 & res)
|
||||||
{
|
{
|
||||||
Impl::toLowerIfNeed(data);
|
Impl::toLowerIfNeed(data);
|
||||||
Impl::toLowerIfNeed(needle);
|
Impl::toLowerIfNeed(needle);
|
||||||
@ -205,7 +205,7 @@ struct PositionImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Search each time for a different single substring inside each time different string.
|
/// Search each time for a different single substring inside each time different string.
|
||||||
static void vector_vector(
|
static void vectorVector(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const ColumnString::Chars & needle_data,
|
const ColumnString::Chars & needle_data,
|
||||||
@ -255,7 +255,7 @@ struct PositionImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Find many substrings in single string.
|
/// Find many substrings in single string.
|
||||||
static void constant_vector(
|
static void constantVector(
|
||||||
const String & haystack,
|
const String & haystack,
|
||||||
const ColumnString::Chars & needle_data,
|
const ColumnString::Chars & needle_data,
|
||||||
const ColumnString::Offsets & needle_offsets,
|
const ColumnString::Offsets & needle_offsets,
|
||||||
@ -303,7 +303,7 @@ struct MultiSearchAllPositionsImpl
|
|||||||
{
|
{
|
||||||
using ResultType = UInt64;
|
using ResultType = UInt64;
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const std::vector<StringRef> & needles,
|
const std::vector<StringRef> & needles,
|
||||||
@ -344,9 +344,9 @@ struct MultiSearchImpl
|
|||||||
/// Variable for understanding, if we used offsets for the output, most
|
/// Variable for understanding, if we used offsets for the output, most
|
||||||
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
||||||
static constexpr bool is_column_array = false;
|
static constexpr bool is_column_array = false;
|
||||||
static auto ReturnType() { return std::make_shared<DataTypeNumber<ResultType>>(); }
|
static auto getReturnType() { return std::make_shared<DataTypeNumber<ResultType>>(); }
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const std::vector<StringRef> & needles,
|
const std::vector<StringRef> & needles,
|
||||||
@ -381,9 +381,9 @@ struct MultiSearchFirstPositionImpl
|
|||||||
/// Variable for understanding, if we used offsets for the output, most
|
/// Variable for understanding, if we used offsets for the output, most
|
||||||
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
||||||
static constexpr bool is_column_array = false;
|
static constexpr bool is_column_array = false;
|
||||||
static auto ReturnType() { return std::make_shared<DataTypeNumber<ResultType>>(); }
|
static auto getReturnType() { return std::make_shared<DataTypeNumber<ResultType>>(); }
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const std::vector<StringRef> & needles,
|
const std::vector<StringRef> & needles,
|
||||||
@ -428,9 +428,9 @@ struct MultiSearchFirstIndexImpl
|
|||||||
/// Variable for understanding, if we used offsets for the output, most
|
/// Variable for understanding, if we used offsets for the output, most
|
||||||
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
/// likely to determine whether the function returns ColumnVector of ColumnArray.
|
||||||
static constexpr bool is_column_array = false;
|
static constexpr bool is_column_array = false;
|
||||||
static auto ReturnType() { return std::make_shared<DataTypeNumber<ResultType>>(); }
|
static auto getReturnType() { return std::make_shared<DataTypeNumber<ResultType>>(); }
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const std::vector<StringRef> & needles,
|
const std::vector<StringRef> & needles,
|
||||||
@ -467,7 +467,7 @@ struct HasTokenImpl
|
|||||||
|
|
||||||
static constexpr bool use_default_implementation_for_constants = true;
|
static constexpr bool use_default_implementation_for_constants = true;
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & pattern, PaddedPODArray<UInt8> & res)
|
const ColumnString::Chars & data, const ColumnString::Offsets & offsets, const std::string & pattern, PaddedPODArray<UInt8> & res)
|
||||||
{
|
{
|
||||||
if (offsets.empty())
|
if (offsets.empty())
|
||||||
@ -508,14 +508,14 @@ struct HasTokenImpl
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
static void vector_vector(Args &&...)
|
static void vectorVector(Args &&...)
|
||||||
{
|
{
|
||||||
throw Exception("Function 'hasToken' does not support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Function 'hasToken' does not support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Search different needles in single haystack.
|
/// Search different needles in single haystack.
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
static void constant_vector(Args &&...)
|
static void constantVector(Args &&...)
|
||||||
{
|
{
|
||||||
throw Exception("Function 'hasToken' does not support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Function 'hasToken' does not support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ public:
|
|||||||
if (col_haystack_const && col_needle_const)
|
if (col_haystack_const && col_needle_const)
|
||||||
{
|
{
|
||||||
ResultType res{};
|
ResultType res{};
|
||||||
Impl::constant_constant(col_haystack_const->getValue<String>(), col_needle_const->getValue<String>(), res);
|
Impl::constantConstant(col_haystack_const->getValue<String>(), col_needle_const->getValue<String>(), res);
|
||||||
block.getByPosition(result).column
|
block.getByPosition(result).column
|
||||||
= block.getByPosition(result).type->createColumnConst(col_haystack_const->size(), toField(res));
|
= block.getByPosition(result).type->createColumnConst(col_haystack_const->size(), toField(res));
|
||||||
return;
|
return;
|
||||||
@ -135,17 +135,17 @@ public:
|
|||||||
const ColumnString * col_needle_vector = checkAndGetColumn<ColumnString>(&*column_needle);
|
const ColumnString * col_needle_vector = checkAndGetColumn<ColumnString>(&*column_needle);
|
||||||
|
|
||||||
if (col_haystack_vector && col_needle_vector)
|
if (col_haystack_vector && col_needle_vector)
|
||||||
Impl::vector_vector(
|
Impl::vectorVector(
|
||||||
col_haystack_vector->getChars(),
|
col_haystack_vector->getChars(),
|
||||||
col_haystack_vector->getOffsets(),
|
col_haystack_vector->getOffsets(),
|
||||||
col_needle_vector->getChars(),
|
col_needle_vector->getChars(),
|
||||||
col_needle_vector->getOffsets(),
|
col_needle_vector->getOffsets(),
|
||||||
vec_res);
|
vec_res);
|
||||||
else if (col_haystack_vector && col_needle_const)
|
else if (col_haystack_vector && col_needle_const)
|
||||||
Impl::vector_constant(
|
Impl::vectorConstant(
|
||||||
col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), col_needle_const->getValue<String>(), vec_res);
|
col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), col_needle_const->getValue<String>(), vec_res);
|
||||||
else if (col_haystack_const && col_needle_vector)
|
else if (col_haystack_const && col_needle_vector)
|
||||||
Impl::constant_vector(
|
Impl::constantVector(
|
||||||
col_haystack_const->getValue<String>(), col_needle_vector->getChars(), col_needle_vector->getOffsets(), vec_res);
|
col_haystack_const->getValue<String>(), col_needle_vector->getChars(), col_needle_vector->getOffsets(), vec_res);
|
||||||
else
|
else
|
||||||
throw Exception(
|
throw Exception(
|
||||||
@ -277,7 +277,7 @@ public:
|
|||||||
vec_res.resize(column_haystack_size * refs.size());
|
vec_res.resize(column_haystack_size * refs.size());
|
||||||
|
|
||||||
if (col_haystack_vector)
|
if (col_haystack_vector)
|
||||||
Impl::vector_constant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res);
|
Impl::vectorConstant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res);
|
||||||
else
|
else
|
||||||
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN);
|
||||||
|
|
||||||
@ -325,7 +325,7 @@ public:
|
|||||||
if (!array_type || !checkAndGetDataType<DataTypeString>(array_type->getNestedType().get()))
|
if (!array_type || !checkAndGetDataType<DataTypeString>(array_type->getNestedType().get()))
|
||||||
throw Exception(
|
throw Exception(
|
||||||
"Illegal type " + arguments[1]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
"Illegal type " + arguments[1]->getName() + " of argument of function " + getName(), ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||||
return Impl::ReturnType();
|
return Impl::getReturnType();
|
||||||
}
|
}
|
||||||
|
|
||||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override
|
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t /*input_rows_count*/) override
|
||||||
@ -366,7 +366,7 @@ public:
|
|||||||
|
|
||||||
/// The blame for resizing output is for the callee.
|
/// The blame for resizing output is for the callee.
|
||||||
if (col_haystack_vector)
|
if (col_haystack_vector)
|
||||||
Impl::vector_constant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res, offsets_res);
|
Impl::vectorConstant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), refs, vec_res, offsets_res);
|
||||||
else
|
else
|
||||||
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Illegal column " + block.getByPosition(arguments[0]).column->getName(), ErrorCodes::ILLEGAL_COLUMN);
|
||||||
|
|
||||||
|
@ -54,12 +54,12 @@ struct NgramDistanceImpl
|
|||||||
*/
|
*/
|
||||||
using NgramStats = UInt16[map_size];
|
using NgramStats = UInt16[map_size];
|
||||||
|
|
||||||
static ALWAYS_INLINE UInt16 ASCIIHash(const CodePoint * code_points)
|
static ALWAYS_INLINE UInt16 calculateASCIIHash(const CodePoint * code_points)
|
||||||
{
|
{
|
||||||
return intHashCRC32(unalignedLoad<UInt32>(code_points)) & 0xFFFFu;
|
return intHashCRC32(unalignedLoad<UInt32>(code_points)) & 0xFFFFu;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ALWAYS_INLINE UInt16 UTF8Hash(const CodePoint * code_points)
|
static ALWAYS_INLINE UInt16 calculateUTF8Hash(const CodePoint * code_points)
|
||||||
{
|
{
|
||||||
UInt64 combined = (static_cast<UInt64>(code_points[0]) << 32) | code_points[1];
|
UInt64 combined = (static_cast<UInt64>(code_points[0]) << 32) | code_points[1];
|
||||||
#ifdef __SSE4_2__
|
#ifdef __SSE4_2__
|
||||||
@ -249,12 +249,12 @@ struct NgramDistanceImpl
|
|||||||
static inline auto dispatchSearcher(Callback callback, Args &&... args)
|
static inline auto dispatchSearcher(Callback callback, Args &&... args)
|
||||||
{
|
{
|
||||||
if constexpr (!UTF8)
|
if constexpr (!UTF8)
|
||||||
return callback(std::forward<Args>(args)..., readASCIICodePoints, ASCIIHash);
|
return callback(std::forward<Args>(args)..., readASCIICodePoints, calculateASCIIHash);
|
||||||
else
|
else
|
||||||
return callback(std::forward<Args>(args)..., readUTF8CodePoints, UTF8Hash);
|
return callback(std::forward<Args>(args)..., readUTF8CodePoints, calculateUTF8Hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_constant(std::string data, std::string needle, Float32 & res)
|
static void constantConstant(std::string data, std::string needle, Float32 & res)
|
||||||
{
|
{
|
||||||
NgramStats common_stats = {};
|
NgramStats common_stats = {};
|
||||||
|
|
||||||
@ -284,7 +284,7 @@ struct NgramDistanceImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_vector(
|
static void vectorVector(
|
||||||
const ColumnString::Chars & haystack_data,
|
const ColumnString::Chars & haystack_data,
|
||||||
const ColumnString::Offsets & haystack_offsets,
|
const ColumnString::Offsets & haystack_offsets,
|
||||||
const ColumnString::Chars & needle_data,
|
const ColumnString::Chars & needle_data,
|
||||||
@ -358,7 +358,7 @@ struct NgramDistanceImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_vector(
|
static void constantVector(
|
||||||
std::string haystack,
|
std::string haystack,
|
||||||
const ColumnString::Chars & needle_data,
|
const ColumnString::Chars & needle_data,
|
||||||
const ColumnString::Offsets & needle_offsets,
|
const ColumnString::Offsets & needle_offsets,
|
||||||
@ -367,7 +367,7 @@ struct NgramDistanceImpl
|
|||||||
/// For symmetric version it is better to use vector_constant
|
/// For symmetric version it is better to use vector_constant
|
||||||
if constexpr (symmetric)
|
if constexpr (symmetric)
|
||||||
{
|
{
|
||||||
vector_constant(needle_data, needle_offsets, std::move(haystack), res);
|
vectorConstant(needle_data, needle_offsets, std::move(haystack), res);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -423,7 +423,7 @@ struct NgramDistanceImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const ColumnString::Chars & data,
|
const ColumnString::Chars & data,
|
||||||
const ColumnString::Offsets & offsets,
|
const ColumnString::Offsets & offsets,
|
||||||
std::string needle,
|
std::string needle,
|
||||||
|
@ -72,7 +72,7 @@ public:
|
|||||||
+ std::to_string(Impl::max_string_size),
|
+ std::to_string(Impl::max_string_size),
|
||||||
ErrorCodes::TOO_LARGE_STRING_SIZE);
|
ErrorCodes::TOO_LARGE_STRING_SIZE);
|
||||||
}
|
}
|
||||||
Impl::constant_constant(col_haystack_const->getValue<String>(), needle, res);
|
Impl::constantConstant(col_haystack_const->getValue<String>(), needle, res);
|
||||||
block.getByPosition(result).column
|
block.getByPosition(result).column
|
||||||
= block.getByPosition(result).type->createColumnConst(col_haystack_const->size(), toField(res));
|
= block.getByPosition(result).type->createColumnConst(col_haystack_const->size(), toField(res));
|
||||||
return;
|
return;
|
||||||
@ -96,11 +96,11 @@ public:
|
|||||||
+ std::to_string(Impl::max_string_size),
|
+ std::to_string(Impl::max_string_size),
|
||||||
ErrorCodes::TOO_LARGE_STRING_SIZE);
|
ErrorCodes::TOO_LARGE_STRING_SIZE);
|
||||||
}
|
}
|
||||||
Impl::vector_constant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), needle, vec_res);
|
Impl::vectorConstant(col_haystack_vector->getChars(), col_haystack_vector->getOffsets(), needle, vec_res);
|
||||||
}
|
}
|
||||||
else if (col_haystack_vector && col_needle_vector)
|
else if (col_haystack_vector && col_needle_vector)
|
||||||
{
|
{
|
||||||
Impl::vector_vector(
|
Impl::vectorVector(
|
||||||
col_haystack_vector->getChars(),
|
col_haystack_vector->getChars(),
|
||||||
col_haystack_vector->getOffsets(),
|
col_haystack_vector->getOffsets(),
|
||||||
col_needle_vector->getChars(),
|
col_needle_vector->getChars(),
|
||||||
@ -117,7 +117,7 @@ public:
|
|||||||
+ std::to_string(Impl::max_string_size),
|
+ std::to_string(Impl::max_string_size),
|
||||||
ErrorCodes::TOO_LARGE_STRING_SIZE);
|
ErrorCodes::TOO_LARGE_STRING_SIZE);
|
||||||
}
|
}
|
||||||
Impl::constant_vector(haystack, col_needle_vector->getChars(), col_needle_vector->getOffsets(), vec_res);
|
Impl::constantVector(haystack, col_needle_vector->getChars(), col_needle_vector->getOffsets(), vec_res);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -81,7 +81,7 @@ struct ExtractParamImpl
|
|||||||
static constexpr bool use_default_implementation_for_constants = true;
|
static constexpr bool use_default_implementation_for_constants = true;
|
||||||
|
|
||||||
/// It is assumed that `res` is the correct size and initialized with zeros.
|
/// It is assumed that `res` is the correct size and initialized with zeros.
|
||||||
static void vector_constant(const ColumnString::Chars & data, const ColumnString::Offsets & offsets,
|
static void vectorConstant(const ColumnString::Chars & data, const ColumnString::Offsets & offsets,
|
||||||
std::string needle,
|
std::string needle,
|
||||||
PaddedPODArray<ResultType> & res)
|
PaddedPODArray<ResultType> & res)
|
||||||
{
|
{
|
||||||
@ -121,12 +121,12 @@ struct ExtractParamImpl
|
|||||||
memset(&res[i], 0, (res.size() - i) * sizeof(res[0]));
|
memset(&res[i], 0, (res.size() - i) * sizeof(res[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename... Args> static void vector_vector(Args &&...)
|
template <typename... Args> static void vectorVector(Args &&...)
|
||||||
{
|
{
|
||||||
throw Exception("Functions 'visitParamHas' and 'visitParamExtract*' doesn't support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Functions 'visitParamHas' and 'visitParamExtract*' doesn't support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename... Args> static void constant_vector(Args &&...)
|
template <typename... Args> static void constantVector(Args &&...)
|
||||||
{
|
{
|
||||||
throw Exception("Functions 'visitParamHas' and 'visitParamExtract*' doesn't support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Functions 'visitParamHas' and 'visitParamExtract*' doesn't support non-constant needle argument", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ struct LowerUpperImpl
|
|||||||
array(data.data(), data.data() + data.size(), res_data.data());
|
array(data.data(), data.data() + data.size(), res_data.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed(const ColumnString::Chars & data, size_t /*n*/, ColumnString::Chars & res_data)
|
static void vectorFixed(const ColumnString::Chars & data, size_t /*n*/, ColumnString::Chars & res_data)
|
||||||
{
|
{
|
||||||
res_data.resize(data.size());
|
res_data.resize(data.size());
|
||||||
array(data.data(), data.data() + data.size(), res_data.data());
|
array(data.data(), data.data() + data.size(), res_data.data());
|
||||||
|
@ -96,7 +96,7 @@ struct LowerUpperUTF8Impl
|
|||||||
array(data.data(), data.data() + data.size(), res_data.data());
|
array(data.data(), data.data() + data.size(), res_data.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
{
|
{
|
||||||
throw Exception("Functions lowerUTF8 and upperUTF8 cannot work with FixedString argument", ErrorCodes::BAD_ARGUMENTS);
|
throw Exception("Functions lowerUTF8 and upperUTF8 cannot work with FixedString argument", ErrorCodes::BAD_ARGUMENTS);
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ struct ExtractSubstringImpl
|
|||||||
res_data.assign(start, length);
|
res_data.assign(start, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
{
|
{
|
||||||
throw Exception("Column of type FixedString is not supported by URL functions", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Column of type FixedString is not supported by URL functions", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
@ -153,7 +153,7 @@ struct CutSubstringImpl
|
|||||||
res_data.append(start + length, data.data() + data.size());
|
res_data.append(start + length, data.data() + data.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
{
|
{
|
||||||
throw Exception("Column of type FixedString is not supported by URL functions", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Column of type FixedString is not supported by URL functions", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
@ -93,7 +93,7 @@ struct DecodeURLComponentImpl
|
|||||||
res_data.resize(res_offset);
|
res_data.resize(res_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[noreturn]] static void vector_fixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
[[noreturn]] static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
{
|
{
|
||||||
throw Exception("Column of type FixedString is not supported by URL functions", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Column of type FixedString is not supported by URL functions", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,7 @@ struct ExtractFirstSignificantSubdomain
|
|||||||
end_of_level_domain = end;
|
end_of_level_domain = end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tldLookup::is_valid(last_3_periods[1] + 1, end_of_level_domain - last_3_periods[1] - 1) != nullptr)
|
if (tldLookup::isValid(last_3_periods[1] + 1, end_of_level_domain - last_3_periods[1] - 1) != nullptr)
|
||||||
{
|
{
|
||||||
res_data += last_3_periods[2] + 1 - begin;
|
res_data += last_3_periods[2] + 1 - begin;
|
||||||
res_size = last_3_periods[1] - last_3_periods[2] - 1;
|
res_size = last_3_periods[1] - last_3_periods[2] - 1;
|
||||||
|
@ -33,16 +33,16 @@
|
|||||||
#define MAX_HASH_VALUE 95690
|
#define MAX_HASH_VALUE 95690
|
||||||
/* maximum key range = 95616, duplicates = 0 */
|
/* maximum key range = 95616, duplicates = 0 */
|
||||||
|
|
||||||
class tldLookupHash
|
class TopLevelDomainLookupHash
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
static inline unsigned int hash(const char * str, size_t len);
|
static inline unsigned int hash(const char * str, size_t len);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const char * is_valid(const char * str, size_t len);
|
static const char * isValid(const char * str, size_t len);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline unsigned int tldLookupHash::hash(const char * str, size_t len)
|
inline unsigned int TopLevelDomainLookupHash::hash(const char * str, size_t len)
|
||||||
{
|
{
|
||||||
static const unsigned int asso_values[] = {
|
static const unsigned int asso_values[] = {
|
||||||
95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691,
|
95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691, 95691,
|
||||||
@ -105,7 +105,7 @@ inline unsigned int tldLookupHash::hash(const char * str, size_t len)
|
|||||||
return hval + asso_values[static_cast<unsigned char>(str[len - 1])];
|
return hval + asso_values[static_cast<unsigned char>(str[len - 1])];
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * tldLookupHash::is_valid(const char * str, size_t len)
|
const char * TopLevelDomainLookupHash::isValid(const char * str, size_t len)
|
||||||
{
|
{
|
||||||
static const char * const wordlist[]
|
static const char * const wordlist[]
|
||||||
= {"",
|
= {"",
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// Definition of the class generated by gperf, present on gperf/tldLookup.gperf
|
// Definition of the class generated by gperf, present on gperf/tldLookup.gperf
|
||||||
class tldLookupHash
|
class TopLevelDomainLookupHash
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
static inline unsigned int hash (const char *str, size_t len);
|
static inline unsigned int hash(const char *str, size_t len);
|
||||||
public:
|
public:
|
||||||
static const char *is_valid (const char *str, size_t len);
|
static const char * isValid(const char *str, size_t len);
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
using tldLookup = tldLookupHash;
|
using tldLookup = TopLevelDomainLookupHash;
|
||||||
}
|
}
|
||||||
|
@ -349,7 +349,7 @@ struct ArrayIndexStringImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_vector(
|
static void vectorVector(
|
||||||
const ColumnString::Chars & data, const ColumnArray::Offsets & offsets, const ColumnString::Offsets & string_offsets,
|
const ColumnString::Chars & data, const ColumnArray::Offsets & offsets, const ColumnString::Offsets & string_offsets,
|
||||||
const ColumnString::Chars & item_values, const ColumnString::Offsets & item_offsets,
|
const ColumnString::Chars & item_values, const ColumnString::Offsets & item_offsets,
|
||||||
PaddedPODArray<typename IndexConv::ResultType> & result,
|
PaddedPODArray<typename IndexConv::ResultType> & result,
|
||||||
@ -731,7 +731,7 @@ private:
|
|||||||
}
|
}
|
||||||
else if (const auto item_arg_vector = checkAndGetColumn<ColumnString>(item_arg))
|
else if (const auto item_arg_vector = checkAndGetColumn<ColumnString>(item_arg))
|
||||||
{
|
{
|
||||||
ArrayIndexStringImpl<IndexConv>::vector_vector(col_nested->getChars(), col_array->getOffsets(),
|
ArrayIndexStringImpl<IndexConv>::vectorVector(col_nested->getChars(), col_array->getOffsets(),
|
||||||
col_nested->getOffsets(), item_arg_vector->getChars(), item_arg_vector->getOffsets(),
|
col_nested->getOffsets(), item_arg_vector->getChars(), item_arg_vector->getOffsets(),
|
||||||
col_res->getData(), null_map_data, null_map_item);
|
col_res->getData(), null_map_data, null_map_item);
|
||||||
}
|
}
|
||||||
|
@ -20,12 +20,12 @@ struct LengthImpl
|
|||||||
res[i] = offsets[i] - 1 - offsets[i - 1];
|
res[i] = offsets[i] - 1 - offsets[i - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed_to_constant(const ColumnString::Chars & /*data*/, size_t n, UInt64 & res)
|
static void vectorFixedToConstant(const ColumnString::Chars & /*data*/, size_t n, UInt64 & res)
|
||||||
{
|
{
|
||||||
res = n;
|
res = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed_to_vector(const ColumnString::Chars & /*data*/, size_t /*n*/, PaddedPODArray<UInt64> & /*res*/)
|
static void vectorFixedToVector(const ColumnString::Chars & /*data*/, size_t /*n*/, PaddedPODArray<UInt64> & /*res*/)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ private:
|
|||||||
auto c_res = ColumnString::create();
|
auto c_res = ColumnString::create();
|
||||||
std::vector<const ColumnString::Chars *> data(arguments.size());
|
std::vector<const ColumnString::Chars *> data(arguments.size());
|
||||||
std::vector<const ColumnString::Offsets *> offsets(arguments.size());
|
std::vector<const ColumnString::Offsets *> offsets(arguments.size());
|
||||||
std::vector<size_t> fixed_string_N(arguments.size());
|
std::vector<size_t> fixed_string_sizes(arguments.size());
|
||||||
std::vector<String> constant_strings(arguments.size());
|
std::vector<String> constant_strings(arguments.size());
|
||||||
bool has_column_string = false;
|
bool has_column_string = false;
|
||||||
bool has_column_fixed_string = false;
|
bool has_column_fixed_string = false;
|
||||||
@ -136,7 +136,7 @@ private:
|
|||||||
{
|
{
|
||||||
has_column_fixed_string = true;
|
has_column_fixed_string = true;
|
||||||
data[i] = &fixed_col->getChars();
|
data[i] = &fixed_col->getChars();
|
||||||
fixed_string_N[i] = fixed_col->getN();
|
fixed_string_sizes[i] = fixed_col->getN();
|
||||||
}
|
}
|
||||||
else if (const ColumnConst * const_col = checkAndGetColumnConstStringOrFixedString(column.get()))
|
else if (const ColumnConst * const_col = checkAndGetColumnConstStringOrFixedString(column.get()))
|
||||||
{
|
{
|
||||||
@ -159,7 +159,7 @@ private:
|
|||||||
std::move(pattern),
|
std::move(pattern),
|
||||||
data,
|
data,
|
||||||
offsets,
|
offsets,
|
||||||
fixed_string_N,
|
fixed_string_sizes,
|
||||||
constant_strings,
|
constant_strings,
|
||||||
c_res->getChars(),
|
c_res->getChars(),
|
||||||
c_res->getOffsets(),
|
c_res->getOffsets(),
|
||||||
|
@ -145,13 +145,13 @@ private:
|
|||||||
ColumnInt64::Container & result)
|
ColumnInt64::Container & result)
|
||||||
{
|
{
|
||||||
if (auto * y_vec_16 = checkAndGetColumn<ColumnUInt16>(&y))
|
if (auto * y_vec_16 = checkAndGetColumn<ColumnUInt16>(&y))
|
||||||
vector_vector<Transform>(x, *y_vec_16, timezone_x, timezone_y, result);
|
vectorVector<Transform>(x, *y_vec_16, timezone_x, timezone_y, result);
|
||||||
else if (auto * y_vec_32 = checkAndGetColumn<ColumnUInt32>(&y))
|
else if (auto * y_vec_32 = checkAndGetColumn<ColumnUInt32>(&y))
|
||||||
vector_vector<Transform>(x, *y_vec_32, timezone_x, timezone_y, result);
|
vectorVector<Transform>(x, *y_vec_32, timezone_x, timezone_y, result);
|
||||||
else if (auto * y_const_16 = checkAndGetColumnConst<ColumnUInt16>(&y))
|
else if (auto * y_const_16 = checkAndGetColumnConst<ColumnUInt16>(&y))
|
||||||
vector_constant<Transform>(x, y_const_16->getValue<UInt16>(), timezone_x, timezone_y, result);
|
vectorConstant<Transform>(x, y_const_16->getValue<UInt16>(), timezone_x, timezone_y, result);
|
||||||
else if (auto * y_const_32 = checkAndGetColumnConst<ColumnUInt32>(&y))
|
else if (auto * y_const_32 = checkAndGetColumnConst<ColumnUInt32>(&y))
|
||||||
vector_constant<Transform>(x, y_const_32->getValue<UInt32>(), timezone_x, timezone_y, result);
|
vectorConstant<Transform>(x, y_const_32->getValue<UInt32>(), timezone_x, timezone_y, result);
|
||||||
else
|
else
|
||||||
throw Exception("Illegal column for second argument of function " + getName() + ", must be Date or DateTime", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Illegal column for second argument of function " + getName() + ", must be Date or DateTime", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
@ -163,15 +163,15 @@ private:
|
|||||||
ColumnInt64::Container & result)
|
ColumnInt64::Container & result)
|
||||||
{
|
{
|
||||||
if (auto * y_vec_16 = checkAndGetColumn<ColumnUInt16>(&y))
|
if (auto * y_vec_16 = checkAndGetColumn<ColumnUInt16>(&y))
|
||||||
constant_vector<Transform>(x, *y_vec_16, timezone_x, timezone_y, result);
|
constantVector<Transform>(x, *y_vec_16, timezone_x, timezone_y, result);
|
||||||
else if (auto * y_vec_32 = checkAndGetColumn<ColumnUInt32>(&y))
|
else if (auto * y_vec_32 = checkAndGetColumn<ColumnUInt32>(&y))
|
||||||
constant_vector<Transform>(x, *y_vec_32, timezone_x, timezone_y, result);
|
constantVector<Transform>(x, *y_vec_32, timezone_x, timezone_y, result);
|
||||||
else
|
else
|
||||||
throw Exception("Illegal column for second argument of function " + getName() + ", must be Date or DateTime", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Illegal column for second argument of function " + getName() + ", must be Date or DateTime", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Transform, typename T1, typename T2>
|
template <typename Transform, typename T1, typename T2>
|
||||||
void vector_vector(
|
void vectorVector(
|
||||||
const ColumnVector<T1> & x, const ColumnVector<T2> & y,
|
const ColumnVector<T1> & x, const ColumnVector<T2> & y,
|
||||||
const DateLUTImpl & timezone_x, const DateLUTImpl & timezone_y,
|
const DateLUTImpl & timezone_x, const DateLUTImpl & timezone_y,
|
||||||
ColumnInt64::Container & result)
|
ColumnInt64::Container & result)
|
||||||
@ -183,7 +183,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Transform, typename T1, typename T2>
|
template <typename Transform, typename T1, typename T2>
|
||||||
void vector_constant(
|
void vectorConstant(
|
||||||
const ColumnVector<T1> & x, T2 y,
|
const ColumnVector<T1> & x, T2 y,
|
||||||
const DateLUTImpl & timezone_x, const DateLUTImpl & timezone_y,
|
const DateLUTImpl & timezone_x, const DateLUTImpl & timezone_y,
|
||||||
ColumnInt64::Container & result)
|
ColumnInt64::Container & result)
|
||||||
@ -194,7 +194,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Transform, typename T1, typename T2>
|
template <typename Transform, typename T1, typename T2>
|
||||||
void constant_vector(
|
void constantVector(
|
||||||
T1 x, const ColumnVector<T2> & y,
|
T1 x, const ColumnVector<T2> & y,
|
||||||
const DateLUTImpl & timezone_x, const DateLUTImpl & timezone_y,
|
const DateLUTImpl & timezone_x, const DateLUTImpl & timezone_y,
|
||||||
ColumnInt64::Container & result)
|
ColumnInt64::Container & result)
|
||||||
|
@ -155,7 +155,7 @@ private:
|
|||||||
writeNumber2(target, day);
|
writeNumber2(target, day);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ISO8601Date(char * target, Time source, const DateLUTImpl & timezone)
|
static void ISO8601Date(char * target, Time source, const DateLUTImpl & timezone) // NOLINT
|
||||||
{
|
{
|
||||||
writeNumber4(target, ToYearImpl::execute(source, timezone));
|
writeNumber4(target, ToYearImpl::execute(source, timezone));
|
||||||
writeNumber2(target + 5, ToMonthImpl::execute(source, timezone));
|
writeNumber2(target + 5, ToMonthImpl::execute(source, timezone));
|
||||||
@ -183,7 +183,7 @@ private:
|
|||||||
*target += (day == 7 ? 0 : day);
|
*target += (day == 7 ? 0 : day);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ISO8601Week(char * target, Time source, const DateLUTImpl & timezone)
|
static void ISO8601Week(char * target, Time source, const DateLUTImpl & timezone) // NOLINT
|
||||||
{
|
{
|
||||||
writeNumber2(target, ToISOWeekImpl::execute(source, timezone));
|
writeNumber2(target, ToISOWeekImpl::execute(source, timezone));
|
||||||
}
|
}
|
||||||
@ -214,7 +214,7 @@ private:
|
|||||||
writeNumber2(target, ToMinuteImpl::execute(source, timezone));
|
writeNumber2(target, ToMinuteImpl::execute(source, timezone));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AMPM(char * target, Time source, const DateLUTImpl & timezone)
|
static void AMPM(char * target, Time source, const DateLUTImpl & timezone) // NOLINT
|
||||||
{
|
{
|
||||||
auto hour = ToHourImpl::execute(source, timezone);
|
auto hour = ToHourImpl::execute(source, timezone);
|
||||||
if (hour >= 12)
|
if (hour >= 12)
|
||||||
@ -232,7 +232,7 @@ private:
|
|||||||
writeNumber2(target, ToSecondImpl::execute(source, timezone));
|
writeNumber2(target, ToSecondImpl::execute(source, timezone));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ISO8601Time(char * target, Time source, const DateLUTImpl & timezone)
|
static void ISO8601Time(char * target, Time source, const DateLUTImpl & timezone) // NOLINT
|
||||||
{
|
{
|
||||||
writeNumber2(target, ToHourImpl::execute(source, timezone));
|
writeNumber2(target, ToHourImpl::execute(source, timezone));
|
||||||
writeNumber2(target + 3, ToMinuteImpl::execute(source, timezone));
|
writeNumber2(target + 3, ToMinuteImpl::execute(source, timezone));
|
||||||
@ -394,7 +394,7 @@ public:
|
|||||||
const char * end = pos + pattern.size();
|
const char * end = pos + pattern.size();
|
||||||
|
|
||||||
/// Add shift to previous action; or if there were none, add noop action with shift.
|
/// Add shift to previous action; or if there were none, add noop action with shift.
|
||||||
auto addShift = [&](size_t amount)
|
auto add_shift = [&](size_t amount)
|
||||||
{
|
{
|
||||||
if (instructions.empty())
|
if (instructions.empty())
|
||||||
instructions.emplace_back(&Action<T>::noop);
|
instructions.emplace_back(&Action<T>::noop);
|
||||||
@ -402,12 +402,12 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// If the argument was DateTime, add instruction for printing. If it was date, just shift (the buffer is pre-filled with default values).
|
/// If the argument was DateTime, add instruction for printing. If it was date, just shift (the buffer is pre-filled with default values).
|
||||||
auto addInstructionOrShift = [&](typename Action<T>::Func func [[maybe_unused]], size_t shift)
|
auto add_instruction_or_shift = [&](typename Action<T>::Func func [[maybe_unused]], size_t shift)
|
||||||
{
|
{
|
||||||
if constexpr (std::is_same_v<T, UInt32>)
|
if constexpr (std::is_same_v<T, UInt32>)
|
||||||
instructions.emplace_back(func, shift);
|
instructions.emplace_back(func, shift);
|
||||||
else
|
else
|
||||||
addShift(shift);
|
add_shift(shift);
|
||||||
};
|
};
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
@ -419,7 +419,7 @@ public:
|
|||||||
if (pos < percent_pos)
|
if (pos < percent_pos)
|
||||||
{
|
{
|
||||||
result.append(pos, percent_pos);
|
result.append(pos, percent_pos);
|
||||||
addShift(percent_pos - pos);
|
add_shift(percent_pos - pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = percent_pos + 1;
|
pos = percent_pos + 1;
|
||||||
@ -505,58 +505,58 @@ public:
|
|||||||
|
|
||||||
// Minute (00-59)
|
// Minute (00-59)
|
||||||
case 'M':
|
case 'M':
|
||||||
addInstructionOrShift(&Action<T>::minute, 2);
|
add_instruction_or_shift(&Action<T>::minute, 2);
|
||||||
result.append("00");
|
result.append("00");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// AM or PM
|
// AM or PM
|
||||||
case 'p':
|
case 'p':
|
||||||
addInstructionOrShift(&Action<T>::AMPM, 2);
|
add_instruction_or_shift(&Action<T>::AMPM, 2);
|
||||||
result.append("AM");
|
result.append("AM");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 24-hour HH:MM time, equivalent to %H:%M 14:55
|
// 24-hour HH:MM time, equivalent to %H:%M 14:55
|
||||||
case 'R':
|
case 'R':
|
||||||
addInstructionOrShift(&Action<T>::hhmm24, 5);
|
add_instruction_or_shift(&Action<T>::hhmm24, 5);
|
||||||
result.append("00:00");
|
result.append("00:00");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Seconds
|
// Seconds
|
||||||
case 'S':
|
case 'S':
|
||||||
addInstructionOrShift(&Action<T>::second, 2);
|
add_instruction_or_shift(&Action<T>::second, 2);
|
||||||
result.append("00");
|
result.append("00");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S 14:55:02
|
// ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S 14:55:02
|
||||||
case 'T':
|
case 'T':
|
||||||
addInstructionOrShift(&Action<T>::ISO8601Time, 8);
|
add_instruction_or_shift(&Action<T>::ISO8601Time, 8);
|
||||||
result.append("00:00:00");
|
result.append("00:00:00");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Hour in 24h format (00-23)
|
// Hour in 24h format (00-23)
|
||||||
case 'H':
|
case 'H':
|
||||||
addInstructionOrShift(&Action<T>::hour24, 2);
|
add_instruction_or_shift(&Action<T>::hour24, 2);
|
||||||
result.append("00");
|
result.append("00");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Hour in 12h format (01-12)
|
// Hour in 12h format (01-12)
|
||||||
case 'I':
|
case 'I':
|
||||||
addInstructionOrShift(&Action<T>::hour12, 2);
|
add_instruction_or_shift(&Action<T>::hour12, 2);
|
||||||
result.append("12");
|
result.append("12");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/// Escaped literal characters.
|
/// Escaped literal characters.
|
||||||
case '%':
|
case '%':
|
||||||
result += '%';
|
result += '%';
|
||||||
addShift(1);
|
add_shift(1);
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
result += '\t';
|
result += '\t';
|
||||||
addShift(1);
|
add_shift(1);
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
result += '\n';
|
result += '\n';
|
||||||
addShift(1);
|
add_shift(1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Unimplemented
|
// Unimplemented
|
||||||
@ -575,7 +575,7 @@ public:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
result.append(pos, end);
|
result.append(pos, end);
|
||||||
addShift(end + 1 - pos); /// including zero terminator
|
add_shift(end + 1 - pos); /// including zero terminator
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ public:
|
|||||||
|
|
||||||
std::vector<const ColumnString::Chars *> data(arguments.size() - 1);
|
std::vector<const ColumnString::Chars *> data(arguments.size() - 1);
|
||||||
std::vector<const ColumnString::Offsets *> offsets(arguments.size() - 1);
|
std::vector<const ColumnString::Offsets *> offsets(arguments.size() - 1);
|
||||||
std::vector<size_t> fixed_string_N(arguments.size() - 1);
|
std::vector<size_t> fixed_string_sizes(arguments.size() - 1);
|
||||||
std::vector<String> constant_strings(arguments.size() - 1);
|
std::vector<String> constant_strings(arguments.size() - 1);
|
||||||
|
|
||||||
bool has_column_string = false;
|
bool has_column_string = false;
|
||||||
@ -96,7 +96,7 @@ public:
|
|||||||
{
|
{
|
||||||
has_column_fixed_string = true;
|
has_column_fixed_string = true;
|
||||||
data[i - 1] = &fixed_col->getChars();
|
data[i - 1] = &fixed_col->getChars();
|
||||||
fixed_string_N[i - 1] = fixed_col->getN();
|
fixed_string_sizes[i - 1] = fixed_col->getN();
|
||||||
}
|
}
|
||||||
else if (const ColumnConst * const_col = checkAndGetColumnConstStringOrFixedString(column.get()))
|
else if (const ColumnConst * const_col = checkAndGetColumnConstStringOrFixedString(column.get()))
|
||||||
{
|
{
|
||||||
@ -113,7 +113,7 @@ public:
|
|||||||
std::move(pattern),
|
std::move(pattern),
|
||||||
data,
|
data,
|
||||||
offsets,
|
offsets,
|
||||||
fixed_string_N,
|
fixed_string_sizes,
|
||||||
constant_strings,
|
constant_strings,
|
||||||
col_res->getChars(),
|
col_res->getChars(),
|
||||||
col_res->getOffsets(),
|
col_res->getOffsets(),
|
||||||
|
@ -53,7 +53,7 @@ struct NumIfImpl
|
|||||||
using ArrayB = PaddedPODArray<B>;
|
using ArrayB = PaddedPODArray<B>;
|
||||||
using ColVecResult = ColumnVector<ResultType>;
|
using ColVecResult = ColumnVector<ResultType>;
|
||||||
|
|
||||||
static void vector_vector(const ArrayCond & cond, const ArrayA & a, const ArrayB & b, Block & block, size_t result, UInt32)
|
static void vectorVector(const ArrayCond & cond, const ArrayA & a, const ArrayB & b, Block & block, size_t result, UInt32)
|
||||||
{
|
{
|
||||||
size_t size = cond.size();
|
size_t size = cond.size();
|
||||||
auto col_res = ColVecResult::create(size);
|
auto col_res = ColVecResult::create(size);
|
||||||
@ -64,7 +64,7 @@ struct NumIfImpl
|
|||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(const ArrayCond & cond, const ArrayA & a, B b, Block & block, size_t result, UInt32)
|
static void vectorConstant(const ArrayCond & cond, const ArrayA & a, B b, Block & block, size_t result, UInt32)
|
||||||
{
|
{
|
||||||
size_t size = cond.size();
|
size_t size = cond.size();
|
||||||
auto col_res = ColVecResult::create(size);
|
auto col_res = ColVecResult::create(size);
|
||||||
@ -75,7 +75,7 @@ struct NumIfImpl
|
|||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_vector(const ArrayCond & cond, A a, const ArrayB & b, Block & block, size_t result, UInt32)
|
static void constantVector(const ArrayCond & cond, A a, const ArrayB & b, Block & block, size_t result, UInt32)
|
||||||
{
|
{
|
||||||
size_t size = cond.size();
|
size_t size = cond.size();
|
||||||
auto col_res = ColVecResult::create(size);
|
auto col_res = ColVecResult::create(size);
|
||||||
@ -86,7 +86,7 @@ struct NumIfImpl
|
|||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_constant(const ArrayCond & cond, A a, B b, Block & block, size_t result, UInt32)
|
static void constantConstant(const ArrayCond & cond, A a, B b, Block & block, size_t result, UInt32)
|
||||||
{
|
{
|
||||||
size_t size = cond.size();
|
size_t size = cond.size();
|
||||||
auto col_res = ColVecResult::create(size);
|
auto col_res = ColVecResult::create(size);
|
||||||
@ -107,7 +107,7 @@ struct NumIfImpl<Decimal<A>, Decimal<B>, Decimal<R>>
|
|||||||
using ArrayB = DecimalPaddedPODArray<Decimal<B>>;
|
using ArrayB = DecimalPaddedPODArray<Decimal<B>>;
|
||||||
using ColVecResult = ColumnDecimal<ResultType>;
|
using ColVecResult = ColumnDecimal<ResultType>;
|
||||||
|
|
||||||
static void vector_vector(const ArrayCond & cond, const ArrayA & a, const ArrayB & b, Block & block, size_t result, UInt32 scale)
|
static void vectorVector(const ArrayCond & cond, const ArrayA & a, const ArrayB & b, Block & block, size_t result, UInt32 scale)
|
||||||
{
|
{
|
||||||
size_t size = cond.size();
|
size_t size = cond.size();
|
||||||
auto col_res = ColVecResult::create(size, scale);
|
auto col_res = ColVecResult::create(size, scale);
|
||||||
@ -118,7 +118,7 @@ struct NumIfImpl<Decimal<A>, Decimal<B>, Decimal<R>>
|
|||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(const ArrayCond & cond, const ArrayA & a, B b, Block & block, size_t result, UInt32 scale)
|
static void vectorConstant(const ArrayCond & cond, const ArrayA & a, B b, Block & block, size_t result, UInt32 scale)
|
||||||
{
|
{
|
||||||
size_t size = cond.size();
|
size_t size = cond.size();
|
||||||
auto col_res = ColVecResult::create(size, scale);
|
auto col_res = ColVecResult::create(size, scale);
|
||||||
@ -129,7 +129,7 @@ struct NumIfImpl<Decimal<A>, Decimal<B>, Decimal<R>>
|
|||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_vector(const ArrayCond & cond, A a, const ArrayB & b, Block & block, size_t result, UInt32 scale)
|
static void constantVector(const ArrayCond & cond, A a, const ArrayB & b, Block & block, size_t result, UInt32 scale)
|
||||||
{
|
{
|
||||||
size_t size = cond.size();
|
size_t size = cond.size();
|
||||||
auto col_res = ColVecResult::create(size, scale);
|
auto col_res = ColVecResult::create(size, scale);
|
||||||
@ -140,7 +140,7 @@ struct NumIfImpl<Decimal<A>, Decimal<B>, Decimal<R>>
|
|||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_constant(const ArrayCond & cond, A a, B b, Block & block, size_t result, UInt32 scale)
|
static void constantConstant(const ArrayCond & cond, A a, B b, Block & block, size_t result, UInt32 scale)
|
||||||
{
|
{
|
||||||
size_t size = cond.size();
|
size_t size = cond.size();
|
||||||
auto col_res = ColVecResult::create(size, scale);
|
auto col_res = ColVecResult::create(size, scale);
|
||||||
@ -156,15 +156,15 @@ template <typename A, typename B>
|
|||||||
struct NumIfImpl<A, B, NumberTraits::Error>
|
struct NumIfImpl<A, B, NumberTraits::Error>
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
[[noreturn]] static void throw_error()
|
[[noreturn]] static void throwError()
|
||||||
{
|
{
|
||||||
throw Exception("Internal logic error: invalid types of arguments 2 and 3 of if", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
throw Exception("Internal logic error: invalid types of arguments 2 and 3 of if", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
template <typename... Args> static void vector_vector(Args &&...) { throw_error(); }
|
template <typename... Args> static void vectorVector(Args &&...) { throwError(); }
|
||||||
template <typename... Args> static void vector_constant(Args &&...) { throw_error(); }
|
template <typename... Args> static void vectorConstant(Args &&...) { throwError(); }
|
||||||
template <typename... Args> static void constant_vector(Args &&...) { throw_error(); }
|
template <typename... Args> static void constantVector(Args &&...) { throwError(); }
|
||||||
template <typename... Args> static void constant_constant(Args &&...) { throw_error(); }
|
template <typename... Args> static void constantConstant(Args &&...) { throwError(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -209,13 +209,13 @@ private:
|
|||||||
|
|
||||||
if (auto col_right_vec = checkAndGetColumn<ColVecT1>(col_right_untyped))
|
if (auto col_right_vec = checkAndGetColumn<ColVecT1>(col_right_untyped))
|
||||||
{
|
{
|
||||||
NumIfImpl<T0, T1, ResultType>::vector_vector(
|
NumIfImpl<T0, T1, ResultType>::vectorVector(
|
||||||
cond_col->getData(), col_left->getData(), col_right_vec->getData(), block, result, scale);
|
cond_col->getData(), col_left->getData(), col_right_vec->getData(), block, result, scale);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (auto col_right_const = checkAndGetColumnConst<ColVecT1>(col_right_untyped))
|
else if (auto col_right_const = checkAndGetColumnConst<ColVecT1>(col_right_untyped))
|
||||||
{
|
{
|
||||||
NumIfImpl<T0, T1, ResultType>::vector_constant(
|
NumIfImpl<T0, T1, ResultType>::vectorConstant(
|
||||||
cond_col->getData(), col_left->getData(), col_right_const->template getValue<T1>(), block, result, scale);
|
cond_col->getData(), col_left->getData(), col_right_const->template getValue<T1>(), block, result, scale);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -238,13 +238,13 @@ private:
|
|||||||
|
|
||||||
if (auto col_right_vec = checkAndGetColumn<ColVecT1>(col_right_untyped))
|
if (auto col_right_vec = checkAndGetColumn<ColVecT1>(col_right_untyped))
|
||||||
{
|
{
|
||||||
NumIfImpl<T0, T1, ResultType>::constant_vector(
|
NumIfImpl<T0, T1, ResultType>::constantVector(
|
||||||
cond_col->getData(), col_left->template getValue<T0>(), col_right_vec->getData(), block, result, scale);
|
cond_col->getData(), col_left->template getValue<T0>(), col_right_vec->getData(), block, result, scale);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (auto col_right_const = checkAndGetColumnConst<ColVecT1>(col_right_untyped))
|
else if (auto col_right_const = checkAndGetColumnConst<ColVecT1>(col_right_untyped))
|
||||||
{
|
{
|
||||||
NumIfImpl<T0, T1, ResultType>::constant_constant(
|
NumIfImpl<T0, T1, ResultType>::constantConstant(
|
||||||
cond_col->getData(), col_left->template getValue<T0>(), col_right_const->template getValue<T1>(), block, result, scale);
|
cond_col->getData(), col_left->template getValue<T0>(), col_right_const->template getValue<T1>(), block, result, scale);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ struct DivideIntegralByConstantImpl
|
|||||||
using ResultType = typename DivideIntegralImpl<A, B>::ResultType;
|
using ResultType = typename DivideIntegralImpl<A, B>::ResultType;
|
||||||
static const constexpr bool allow_fixed_string = false;
|
static const constexpr bool allow_fixed_string = false;
|
||||||
|
|
||||||
static NO_INLINE void vector_constant(const A * __restrict a_pos, B b, ResultType * __restrict c_pos, size_t size)
|
static NO_INLINE void vectorConstant(const A * __restrict a_pos, B b, ResultType * __restrict c_pos, size_t size)
|
||||||
{
|
{
|
||||||
if (unlikely(b == 0))
|
if (unlikely(b == 0))
|
||||||
throw Exception("Division by zero", ErrorCodes::ILLEGAL_DIVISION);
|
throw Exception("Division by zero", ErrorCodes::ILLEGAL_DIVISION);
|
||||||
|
@ -304,9 +304,9 @@ SOFTWARE.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed_to_constant(const ColumnString::Chars & /*data*/, size_t /*n*/, UInt8 & /*res*/) {}
|
static void vectorFixedToConstant(const ColumnString::Chars & /*data*/, size_t /*n*/, UInt8 & /*res*/) {}
|
||||||
|
|
||||||
static void vector_fixed_to_vector(const ColumnString::Chars & data, size_t n, PaddedPODArray<UInt8> & res)
|
static void vectorFixedToVector(const ColumnString::Chars & data, size_t n, PaddedPODArray<UInt8> & res)
|
||||||
{
|
{
|
||||||
size_t size = data.size() / n;
|
size_t size = data.size() / n;
|
||||||
for (size_t i = 0; i < size; ++i)
|
for (size_t i = 0; i < size; ++i)
|
||||||
|
@ -34,11 +34,11 @@ struct LengthUTF8Impl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed_to_constant(const ColumnString::Chars & /*data*/, size_t /*n*/, UInt64 & /*res*/)
|
static void vectorFixedToConstant(const ColumnString::Chars & /*data*/, size_t /*n*/, UInt64 & /*res*/)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed_to_vector(const ColumnString::Chars & data, size_t n, PaddedPODArray<UInt64> & res)
|
static void vectorFixedToVector(const ColumnString::Chars & data, size_t n, PaddedPODArray<UInt64> & res)
|
||||||
{
|
{
|
||||||
size_t size = data.size() / n;
|
size_t size = data.size() / n;
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ struct ModuloByConstantImpl
|
|||||||
using ResultType = typename ModuloImpl<A, B>::ResultType;
|
using ResultType = typename ModuloImpl<A, B>::ResultType;
|
||||||
static const constexpr bool allow_fixed_string = false;
|
static const constexpr bool allow_fixed_string = false;
|
||||||
|
|
||||||
static NO_INLINE void vector_constant(const A * __restrict src, B b, ResultType * __restrict dst, size_t size)
|
static NO_INLINE void vectorConstant(const A * __restrict src, B b, ResultType * __restrict dst, size_t size)
|
||||||
{
|
{
|
||||||
if (unlikely(b == 0))
|
if (unlikely(b == 0))
|
||||||
throw Exception("Division by zero", ErrorCodes::ILLEGAL_DIVISION);
|
throw Exception("Division by zero", ErrorCodes::ILLEGAL_DIVISION);
|
||||||
|
@ -121,28 +121,28 @@ public:
|
|||||||
throw Exception("Too few arguments", ErrorCodes::TOO_FEW_ARGUMENTS_FOR_FUNCTION);
|
throw Exception("Too few arguments", ErrorCodes::TOO_FEW_ARGUMENTS_FOR_FUNCTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto getMsgPrefix = [this](size_t i) { return "Argument " + toString(i + 1) + " for function " + getName(); };
|
auto get_message_prefix = [this](size_t i) { return "Argument " + toString(i + 1) + " for function " + getName(); };
|
||||||
|
|
||||||
for (size_t i = 1; i < arguments.size(); ++i)
|
for (size_t i = 1; i < arguments.size(); ++i)
|
||||||
{
|
{
|
||||||
auto * array = checkAndGetDataType<DataTypeArray>(arguments[i].get());
|
auto * array = checkAndGetDataType<DataTypeArray>(arguments[i].get());
|
||||||
if (array == nullptr && i != 1)
|
if (array == nullptr && i != 1)
|
||||||
throw Exception(getMsgPrefix(i) + " must be array of tuples.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
throw Exception(get_message_prefix(i) + " must be array of tuples.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||||
|
|
||||||
auto * tuple = checkAndGetDataType<DataTypeTuple>(array ? array->getNestedType().get() : arguments[i].get());
|
auto * tuple = checkAndGetDataType<DataTypeTuple>(array ? array->getNestedType().get() : arguments[i].get());
|
||||||
if (tuple == nullptr)
|
if (tuple == nullptr)
|
||||||
throw Exception(getMsgPrefix(i) + " must contains tuple.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
throw Exception(get_message_prefix(i) + " must contains tuple.", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||||
|
|
||||||
const DataTypes & elements = tuple->getElements();
|
const DataTypes & elements = tuple->getElements();
|
||||||
|
|
||||||
if (elements.size() != 2)
|
if (elements.size() != 2)
|
||||||
throw Exception(getMsgPrefix(i) + " must have exactly two elements.", ErrorCodes::BAD_ARGUMENTS);
|
throw Exception(get_message_prefix(i) + " must have exactly two elements.", ErrorCodes::BAD_ARGUMENTS);
|
||||||
|
|
||||||
for (auto j : ext::range(0, elements.size()))
|
for (auto j : ext::range(0, elements.size()))
|
||||||
{
|
{
|
||||||
if (!isNativeNumber(elements[j]))
|
if (!isNativeNumber(elements[j]))
|
||||||
{
|
{
|
||||||
throw Exception(getMsgPrefix(i) + " must contains numeric tuple at position " + toString(j + 1),
|
throw Exception(get_message_prefix(i) + " must contains numeric tuple at position " + toString(j + 1),
|
||||||
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -207,7 +207,7 @@ private:
|
|||||||
{
|
{
|
||||||
Polygon<Type> polygon;
|
Polygon<Type> polygon;
|
||||||
|
|
||||||
auto getMsgPrefix = [this](size_t i) { return "Argument " + toString(i + 1) + " for function " + getName(); };
|
auto get_message_prefix = [this](size_t i) { return "Argument " + toString(i + 1) + " for function " + getName(); };
|
||||||
|
|
||||||
for (size_t i = 1; i < arguments.size(); ++i)
|
for (size_t i = 1; i < arguments.size(); ++i)
|
||||||
{
|
{
|
||||||
@ -216,7 +216,7 @@ private:
|
|||||||
auto tuple_col = array_col ? checkAndGetColumn<ColumnTuple>(&array_col->getData()) : nullptr;
|
auto tuple_col = array_col ? checkAndGetColumn<ColumnTuple>(&array_col->getData()) : nullptr;
|
||||||
|
|
||||||
if (!tuple_col)
|
if (!tuple_col)
|
||||||
throw Exception(getMsgPrefix(i) + " must be constant array of tuples.", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception(get_message_prefix(i) + " must be constant array of tuples.", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
|
|
||||||
const auto & tuple_columns = tuple_col->getColumns();
|
const auto & tuple_columns = tuple_col->getColumns();
|
||||||
const auto & column_x = tuple_columns[0];
|
const auto & column_x = tuple_columns[0];
|
||||||
@ -230,7 +230,7 @@ private:
|
|||||||
auto size = column_x->size();
|
auto size = column_x->size();
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
throw Exception(getMsgPrefix(i) + " shouldn't be empty.", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception(get_message_prefix(i) + " shouldn't be empty.", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
|
|
||||||
for (auto j : ext::range(0, size))
|
for (auto j : ext::range(0, size))
|
||||||
{
|
{
|
||||||
@ -244,13 +244,12 @@ private:
|
|||||||
container.push_back(container.front());
|
container.push_back(container.front());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto callImpl = use_object_pool
|
auto call_impl = use_object_pool
|
||||||
? FunctionPointInPolygonDetail::callPointInPolygonImplWithPool<Polygon<Type>, PointInPolygonImpl<Type>>
|
? FunctionPointInPolygonDetail::callPointInPolygonImplWithPool<Polygon<Type>, PointInPolygonImpl<Type>>
|
||||||
: FunctionPointInPolygonDetail::callPointInPolygonImpl<Polygon<Type>, PointInPolygonImpl<Type>>;
|
: FunctionPointInPolygonDetail::callPointInPolygonImpl<Polygon<Type>, PointInPolygonImpl<Type>>;
|
||||||
|
|
||||||
return callImpl(x, y, polygon);
|
return call_impl(x, y, polygon);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ struct ReverseImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed(const ColumnString::Chars & data, size_t n, ColumnString::Chars & res_data)
|
static void vectorFixed(const ColumnString::Chars & data, size_t n, ColumnString::Chars & res_data)
|
||||||
{
|
{
|
||||||
res_data.resize(data.size());
|
res_data.resize(data.size());
|
||||||
size_t size = data.size() / n;
|
size_t size = data.size() / n;
|
||||||
@ -100,7 +100,7 @@ public:
|
|||||||
else if (const ColumnFixedString * col_fixed = checkAndGetColumn<ColumnFixedString>(column.get()))
|
else if (const ColumnFixedString * col_fixed = checkAndGetColumn<ColumnFixedString>(column.get()))
|
||||||
{
|
{
|
||||||
auto col_res = ColumnFixedString::create(col_fixed->getN());
|
auto col_res = ColumnFixedString::create(col_fixed->getN());
|
||||||
ReverseImpl::vector_fixed(col_fixed->getChars(), col_fixed->getN(), col_res->getChars());
|
ReverseImpl::vectorFixed(col_fixed->getChars(), col_fixed->getN(), col_res->getChars());
|
||||||
block.getByPosition(result).column = std::move(col_res);
|
block.getByPosition(result).column = std::move(col_res);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -61,7 +61,7 @@ struct ReverseUTF8Impl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[[noreturn]] static void vector_fixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
[[noreturn]] static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
{
|
{
|
||||||
throw Exception("Cannot apply function reverseUTF8 to fixed string.", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Cannot apply function reverseUTF8 to fixed string.", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ namespace ErrorCodes
|
|||||||
template <typename DurationType>
|
template <typename DurationType>
|
||||||
struct TimeSlotsImpl
|
struct TimeSlotsImpl
|
||||||
{
|
{
|
||||||
static void vector_vector(
|
static void vectorVector(
|
||||||
const PaddedPODArray<UInt32> & starts, const PaddedPODArray<DurationType> & durations, UInt32 time_slot_size,
|
const PaddedPODArray<UInt32> & starts, const PaddedPODArray<DurationType> & durations, UInt32 time_slot_size,
|
||||||
PaddedPODArray<UInt32> & result_values, ColumnArray::Offsets & result_offsets)
|
PaddedPODArray<UInt32> & result_values, ColumnArray::Offsets & result_offsets)
|
||||||
{
|
{
|
||||||
@ -56,7 +56,7 @@ struct TimeSlotsImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_constant(
|
static void vectorConstant(
|
||||||
const PaddedPODArray<UInt32> & starts, DurationType duration, UInt32 time_slot_size,
|
const PaddedPODArray<UInt32> & starts, DurationType duration, UInt32 time_slot_size,
|
||||||
PaddedPODArray<UInt32> & result_values, ColumnArray::Offsets & result_offsets)
|
PaddedPODArray<UInt32> & result_values, ColumnArray::Offsets & result_offsets)
|
||||||
{
|
{
|
||||||
@ -78,7 +78,7 @@ struct TimeSlotsImpl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void constant_vector(
|
static void constantVector(
|
||||||
UInt32 start, const PaddedPODArray<DurationType> & durations, UInt32 time_slot_size,
|
UInt32 start, const PaddedPODArray<DurationType> & durations, UInt32 time_slot_size,
|
||||||
PaddedPODArray<UInt32> & result_values, ColumnArray::Offsets & result_offsets)
|
PaddedPODArray<UInt32> & result_values, ColumnArray::Offsets & result_offsets)
|
||||||
{
|
{
|
||||||
@ -168,17 +168,17 @@ public:
|
|||||||
|
|
||||||
if (starts && durations)
|
if (starts && durations)
|
||||||
{
|
{
|
||||||
TimeSlotsImpl<UInt32>::vector_vector(starts->getData(), durations->getData(), time_slot_size, res_values, res->getOffsets());
|
TimeSlotsImpl<UInt32>::vectorVector(starts->getData(), durations->getData(), time_slot_size, res_values, res->getOffsets());
|
||||||
block.getByPosition(result).column = std::move(res);
|
block.getByPosition(result).column = std::move(res);
|
||||||
}
|
}
|
||||||
else if (starts && const_durations)
|
else if (starts && const_durations)
|
||||||
{
|
{
|
||||||
TimeSlotsImpl<UInt32>::vector_constant(starts->getData(), const_durations->getValue<UInt32>(), time_slot_size, res_values, res->getOffsets());
|
TimeSlotsImpl<UInt32>::vectorConstant(starts->getData(), const_durations->getValue<UInt32>(), time_slot_size, res_values, res->getOffsets());
|
||||||
block.getByPosition(result).column = std::move(res);
|
block.getByPosition(result).column = std::move(res);
|
||||||
}
|
}
|
||||||
else if (const_starts && durations)
|
else if (const_starts && durations)
|
||||||
{
|
{
|
||||||
TimeSlotsImpl<UInt32>::constant_vector(const_starts->getValue<UInt32>(), durations->getData(), time_slot_size, res_values, res->getOffsets());
|
TimeSlotsImpl<UInt32>::constantVector(const_starts->getValue<UInt32>(), durations->getData(), time_slot_size, res_values, res->getOffsets());
|
||||||
block.getByPosition(result).column = std::move(res);
|
block.getByPosition(result).column = std::move(res);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -124,7 +124,7 @@ struct ToValidUTF8Impl
|
|||||||
write_buffer.finalize();
|
write_buffer.finalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
[[noreturn]] static void vector_fixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
[[noreturn]] static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
{
|
{
|
||||||
throw Exception("Column of type FixedString is not supported by toValidUTF8 function", ErrorCodes::ILLEGAL_COLUMN);
|
throw Exception("Column of type FixedString is not supported by toValidUTF8 function", ErrorCodes::ILLEGAL_COLUMN);
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ struct TrimModeBoth
|
|||||||
static constexpr bool trim_right = true;
|
static constexpr bool trim_right = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename mode>
|
template <typename Mode>
|
||||||
class FunctionTrimImpl
|
class FunctionTrimImpl
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -67,7 +67,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vector_fixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
static void vectorFixed(const ColumnString::Chars &, size_t, ColumnString::Chars &)
|
||||||
{
|
{
|
||||||
throw Exception("Functions trimLeft, trimRight and trimBoth cannot work with FixedString argument", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
throw Exception("Functions trimLeft, trimRight and trimBoth cannot work with FixedString argument", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||||
}
|
}
|
||||||
@ -78,14 +78,14 @@ private:
|
|||||||
const char * char_data = reinterpret_cast<const char *>(data);
|
const char * char_data = reinterpret_cast<const char *>(data);
|
||||||
const char * char_end = char_data + size;
|
const char * char_end = char_data + size;
|
||||||
|
|
||||||
if constexpr (mode::trim_left)
|
if constexpr (Mode::trim_left)
|
||||||
{ // NOLINT
|
{ // NOLINT
|
||||||
const char * found = find_first_not_symbols<' '>(char_data, char_end);
|
const char * found = find_first_not_symbols<' '>(char_data, char_end);
|
||||||
size_t num_chars = found - char_data;
|
size_t num_chars = found - char_data;
|
||||||
char_data += num_chars;
|
char_data += num_chars;
|
||||||
}
|
}
|
||||||
|
|
||||||
if constexpr (mode::trim_right)
|
if constexpr (Mode::trim_right)
|
||||||
{ // NOLINT
|
{ // NOLINT
|
||||||
const char * found = find_last_not_symbols_or_null<' '>(char_data, char_end);
|
const char * found = find_last_not_symbols_or_null<' '>(char_data, char_end);
|
||||||
if (found)
|
if (found)
|
||||||
|
@ -164,10 +164,10 @@ namespace
|
|||||||
|
|
||||||
/// We store exception messages in session data.
|
/// We store exception messages in session data.
|
||||||
/// Poco HTTPSession also stores exception, but it can be removed at any time.
|
/// Poco HTTPSession also stores exception, but it can be removed at any time.
|
||||||
const auto & sessionData = session->sessionData();
|
const auto & session_data = session->sessionData();
|
||||||
if (!sessionData.empty())
|
if (!session_data.empty())
|
||||||
{
|
{
|
||||||
auto msg = Poco::AnyCast<std::string>(sessionData);
|
auto msg = Poco::AnyCast<std::string>(session_data);
|
||||||
if (!msg.empty())
|
if (!msg.empty())
|
||||||
{
|
{
|
||||||
LOG_TRACE((&Logger::get("HTTPCommon")), "Failed communicating with " << host << " with error '" << msg << "' will try to reconnect session");
|
LOG_TRACE((&Logger::get("HTTPCommon")), "Failed communicating with " << host << " with error '" << msg << "' will try to reconnect session");
|
||||||
|
@ -786,14 +786,14 @@ ReturnType readDateTimeTextFallback(time_t & datetime, ReadBuffer & buf, const D
|
|||||||
{
|
{
|
||||||
static constexpr bool throw_exception = std::is_same_v<ReturnType, void>;
|
static constexpr bool throw_exception = std::is_same_v<ReturnType, void>;
|
||||||
|
|
||||||
static constexpr auto DATE_TIME_BROKEN_DOWN_LENGTH = 19;
|
static constexpr auto date_time_broken_down_length = 19;
|
||||||
static constexpr auto UNIX_TIMESTAMP_MAX_LENGTH = 10;
|
static constexpr auto unix_timestamp_max_length = 10;
|
||||||
|
|
||||||
char s[DATE_TIME_BROKEN_DOWN_LENGTH];
|
char s[date_time_broken_down_length];
|
||||||
char * s_pos = s;
|
char * s_pos = s;
|
||||||
|
|
||||||
/// A piece similar to unix timestamp.
|
/// A piece similar to unix timestamp.
|
||||||
while (s_pos < s + UNIX_TIMESTAMP_MAX_LENGTH && !buf.eof() && isNumericASCII(*buf.position()))
|
while (s_pos < s + unix_timestamp_max_length && !buf.eof() && isNumericASCII(*buf.position()))
|
||||||
{
|
{
|
||||||
*s_pos = *buf.position();
|
*s_pos = *buf.position();
|
||||||
++s_pos;
|
++s_pos;
|
||||||
@ -803,7 +803,7 @@ ReturnType readDateTimeTextFallback(time_t & datetime, ReadBuffer & buf, const D
|
|||||||
/// 2015-01-01 01:02:03
|
/// 2015-01-01 01:02:03
|
||||||
if (s_pos == s + 4 && !buf.eof() && (*buf.position() < '0' || *buf.position() > '9'))
|
if (s_pos == s + 4 && !buf.eof() && (*buf.position() < '0' || *buf.position() > '9'))
|
||||||
{
|
{
|
||||||
const size_t remaining_size = DATE_TIME_BROKEN_DOWN_LENGTH - (s_pos - s);
|
const size_t remaining_size = date_time_broken_down_length - (s_pos - s);
|
||||||
size_t size = buf.read(s_pos, remaining_size);
|
size_t size = buf.read(s_pos, remaining_size);
|
||||||
if (remaining_size != size)
|
if (remaining_size != size)
|
||||||
{
|
{
|
||||||
|
@ -106,7 +106,7 @@ namespace S3
|
|||||||
|
|
||||||
URI::URI(const Poco::URI & uri_)
|
URI::URI(const Poco::URI & uri_)
|
||||||
{
|
{
|
||||||
static const std::regex BUCKET_KEY_PATTERN("([^/]+)/(.*)");
|
static const std::regex bucket_key_pattern("([^/]+)/(.*)"); /// TODO std::regex is discouraged
|
||||||
|
|
||||||
uri = uri_;
|
uri = uri_;
|
||||||
|
|
||||||
@ -133,7 +133,7 @@ namespace S3
|
|||||||
|
|
||||||
// Parse bucket and key from path.
|
// Parse bucket and key from path.
|
||||||
std::smatch match;
|
std::smatch match;
|
||||||
std::regex_search(uri.getPath(), match, BUCKET_KEY_PATTERN);
|
std::regex_search(uri.getPath(), match, bucket_key_pattern);
|
||||||
if (!match.empty())
|
if (!match.empty())
|
||||||
{
|
{
|
||||||
bucket = match.str(1);
|
bucket = match.str(1);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user