Merge branch 'ClickHouse:master' into master

This commit is contained in:
andrc1901 2021-10-24 19:57:15 +03:00 committed by GitHub
commit eb88a77b5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 50 additions and 35 deletions

View File

@ -86,7 +86,6 @@ void Client::processError(const String & query) const
{
if (server_exception)
{
bool print_stack_trace = config().getBool("stacktrace", false);
fmt::print(stderr, "Received exception from server (version {}):\n{}\n",
server_version,
getExceptionMessage(*server_exception, print_stack_trace, true));
@ -225,7 +224,7 @@ bool Client::executeMultiQuery(const String & all_queries_text)
{
// Surprisingly, this is a client error. A server error would
// have been reported w/o throwing (see onReceiveSeverException()).
client_exception = std::make_unique<Exception>(getCurrentExceptionMessage(true), getCurrentExceptionCode());
client_exception = std::make_unique<Exception>(getCurrentExceptionMessage(print_stack_trace), getCurrentExceptionCode());
have_error = true;
}
// Check whether the error (or its absence) matches the test hints
@ -813,7 +812,7 @@ bool Client::processWithFuzzing(const String & full_query)
// uniformity.
// Surprisingly, this is a client exception, because we get the
// server exception w/o throwing (see onReceiveException()).
client_exception = std::make_unique<Exception>(getCurrentExceptionMessage(true), getCurrentExceptionCode());
client_exception = std::make_unique<Exception>(getCurrentExceptionMessage(print_stack_trace), getCurrentExceptionCode());
have_error = true;
}
@ -1179,6 +1178,7 @@ void Client::processConfig()
if (!query_id.empty())
global_context->setCurrentQueryId(query_id);
}
print_stack_trace = config().getBool("stacktrace", false);
if (config().has("multiquery"))
is_multiquery = true;

View File

@ -62,7 +62,6 @@ void LocalServer::processError(const String &) const
String message;
if (server_exception)
{
bool print_stack_trace = config().getBool("stacktrace", false);
message = getExceptionMessage(*server_exception, print_stack_trace, true);
}
else if (client_exception)
@ -131,9 +130,12 @@ bool LocalServer::executeMultiQuery(const String & all_queries_text)
}
catch (...)
{
if (!is_interactive && !ignore_error)
throw;
// Surprisingly, this is a client error. A server error would
// have been reported w/o throwing (see onReceiveSeverException()).
client_exception = std::make_unique<Exception>(getCurrentExceptionMessage(true), getCurrentExceptionCode());
client_exception = std::make_unique<Exception>(getCurrentExceptionMessage(print_stack_trace), getCurrentExceptionCode());
have_error = true;
}
@ -287,23 +289,30 @@ void LocalServer::tryInitPath()
void LocalServer::cleanup()
{
connection.reset();
if (global_context)
try
{
global_context->shutdown();
global_context.reset();
connection.reset();
if (global_context)
{
global_context->shutdown();
global_context.reset();
}
status.reset();
// Delete the temporary directory if needed.
if (temporary_directory_to_delete)
{
const auto dir = *temporary_directory_to_delete;
temporary_directory_to_delete.reset();
LOG_DEBUG(&logger(), "Removing temporary directory: {}", dir.string());
remove_all(dir);
}
}
status.reset();
// Delete the temporary directory if needed.
if (temporary_directory_to_delete)
catch (...)
{
const auto dir = *temporary_directory_to_delete;
temporary_directory_to_delete.reset();
LOG_DEBUG(&logger(), "Removing temporary directory: {}", dir.string());
remove_all(dir);
tryLogCurrentException(__PRETTY_FUNCTION__);
}
}
@ -446,23 +455,20 @@ try
cleanup();
return Application::EXIT_OK;
}
catch (const DB::Exception & e)
{
cleanup();
bool print_stack_trace = config().getBool("stacktrace", false);
std::cerr << getExceptionMessage(e, print_stack_trace, true) << std::endl;
return e.code() ? e.code() : -1;
}
catch (...)
{
try
{
cleanup();
}
catch (...)
{
tryLogCurrentException(__PRETTY_FUNCTION__);
}
cleanup();
if (!ignore_error)
std::cerr << getCurrentExceptionMessage(config().hasOption("stacktrace")) << '\n';
auto code = getCurrentExceptionCode();
/// If exception code isn't zero, we should return non-zero return code anyway.
return code ? code : -1;
std::cerr << getCurrentExceptionMessage(false) << std::endl;
return getCurrentExceptionCode();
}
@ -485,6 +491,7 @@ void LocalServer::processConfig()
ignore_error = config().getBool("ignore-error", false);
is_multiquery = true;
}
print_stack_trace = config().getBool("stacktrace", false);
shared_context = Context::createShared();
global_context = Context::createGlobal(shared_context.get());

View File

@ -1364,9 +1364,7 @@ void ClientBase::runInteractive()
catch (const Exception & e)
{
/// We don't need to handle the test hints in the interactive mode.
bool print_stack_trace = config().getBool("stacktrace", false);
std::cerr << "Exception on client:" << std::endl << getExceptionMessage(e, print_stack_trace, true) << std::endl << std::endl;
client_exception = std::make_unique<Exception>(e);
}

View File

@ -202,6 +202,7 @@ protected:
bool written_first_block = false;
size_t processed_rows = 0; /// How many rows have been read or written.
bool print_stack_trace = false;
/// The last exception that was received from the server. Is used for the
/// return code in batch mode.
std::unique_ptr<Exception> server_exception;

View File

@ -0,0 +1,8 @@
#!/usr/bin/env bash
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# shellcheck source=../shell_config.sh
. "$CURDIR"/../shell_config.sh
touch test_exception
$CLICKHOUSE_LOCAL --query="SELECT 1 INTO OUTFILE 'test_exception' FORMAT Native" 2>&1 | grep -q "Code: 76. DB::ErrnoException:" && echo 'OK' || echo 'FAIL' ||: