Refactoring, fix test, fix local interactive

This commit is contained in:
kssenii 2021-07-29 12:45:09 +03:00
parent 62d1e18b7f
commit 22e3bde548
6 changed files with 52 additions and 42 deletions

View File

@ -113,7 +113,7 @@ void Client::processSingleQuery(const String & full_query)
else
query_to_execute = full_query;
processSingleQueryImpl(full_query, [&]() { executeSingleQuery(query_to_execute, parsed_query); });
processSingleQueryImpl(full_query, query_to_execute, parsed_query);
if (have_error)
reportQueryError(full_query);
@ -147,7 +147,7 @@ bool Client::processMultiQuery(const String & all_queries_text)
echo_query = test_hint.echoQueries().value_or(echo_query);
try
{
processSingleQueryImpl(full_query, [&](){ executeSingleQuery(query_to_execute, parsed_query); }, echo_query, false);
processSingleQueryImpl(full_query, query_to_execute, parsed_query, echo_query, false);
}
catch (...)
{
@ -708,7 +708,7 @@ bool Client::processWithFuzzing(const String & full_query)
parsed_query = ast_to_process;
query_to_execute = parsed_query->formatForErrorMessage();
processSingleQueryImpl(full_query, [&]() { executeSingleQuery(query_to_execute, parsed_query); });
processSingleQueryImpl(full_query, query_to_execute, parsed_query);
}
catch (...)
{
@ -807,8 +807,7 @@ bool Client::processWithFuzzing(const String & full_query)
{
const auto * tmp_pos = query_to_execute.c_str();
ast_2 = parseQuery(tmp_pos, tmp_pos + query_to_execute.size(),
false /* allow_multi_statements */);
ast_2 = parseQuery(tmp_pos, tmp_pos + query_to_execute.size(), false /* allow_multi_statements */);
}
catch (Exception & e)
{

View File

@ -24,6 +24,8 @@ protected:
void reportQueryError(const String & query) const override;
void executeSingleQuery(const String & query_to_execute, ASTPtr parsed_query) override;
void loadSuggestionData() override;
@ -98,7 +100,6 @@ private:
void onProfileInfo(const BlockStreamProfileInfo & profile_info);
void onEndOfStream();
void executeSingleQuery(const String & query_to_execute, ASTPtr parsed_query);
std::vector<String> loadWarningMessages();
void reconnectIfNeeded() override

View File

@ -218,7 +218,7 @@ std::string LocalServer::getInitialCreateTableQuery()
}
void LocalServer::executeSingleQuery(const String & query_to_execute)
void LocalServer::executeSingleQuery(const String & query_to_execute, ASTPtr /* parsed_query */)
{
ReadBufferFromString read_buf(query_to_execute);
WriteBufferFromFileDescriptor write_buf(STDOUT_FILENO);
@ -335,7 +335,7 @@ int LocalServer::mainImpl()
/// Use the same query_id (and thread group) for all queries
CurrentThread::QueryScope query_scope_holder(query_context);
if (need_render_progress)
if (need_render_progress && !is_interactive)
{
/// Set progress callback, which can be run from multiple threads.
query_context->setProgressCallback([&](const Progress & value)
@ -402,7 +402,7 @@ void LocalServer::processConfig()
is_multiquery = true;
need_render_progress = config().getBool("progress", false);
echo_queries = config().getBool("echo", false);
echo_queries = config().hasOption("echo") || config().hasOption("verbose");
ignore_error = config().getBool("ignore-error", false);
}
@ -483,8 +483,6 @@ void LocalServer::processConfig()
attachSystemTables(global_context);
}
echo_queries = config().hasOption("echo") || config().hasOption("verbose");
server_display_name = config().getString("display_name", getFQDNOrHostName());
prompt_by_server_display_name = config().getRawString("prompt_by_server_display_name.default", "{display_name} :) ");
std::map<String, String> prompt_substitutions{{"display_name", server_display_name}};
@ -568,7 +566,7 @@ void LocalServer::applyCmdSettings(ContextMutablePtr context)
void LocalServer::applyCmdOptions(ContextMutablePtr context)
{
context->setDefaultFormat(config().getString("output-format", config().getString("format", "TSV")));
context->setDefaultFormat(config().getString("output-format", config().getString("format", is_interactive ? "PrettyCompact" : "TSV")));
applyCmdSettings(context);
}

View File

@ -12,6 +12,7 @@
#include <loggers/Loggers.h>
#include <Client/ClientBase.h>
#include <Poco/Util/Application.h>
#include <IO/WriteBufferFromOStream.h>
namespace DB
@ -49,14 +50,22 @@ protected:
bool processMultiQuery(const String & all_queries_text) override
{
auto process_single_query = [&](const String & query, const String &, ASTPtr) { executeSingleQuery(query); };
auto process_single_query = [&](const String & query_to_execute, const String &, ASTPtr)
{
processSingleQueryImpl(all_queries_text, query_to_execute, nullptr, echo_queries, false);
};
return processMultiQueryImpl(all_queries_text, process_single_query);
}
void processSingleQuery(const String & full_query) override
{
auto process_single_query = [&]() { executeSingleQuery(full_query); };
processSingleQueryImpl(full_query, process_single_query);
ASTPtr parsed_query;
if (is_interactive)
{
auto this_query_begin = full_query.data();
parsed_query = parseQuery(this_query_begin, full_query.data() + full_query.size(), false);
}
processSingleQueryImpl(full_query, full_query, parsed_query, echo_queries);
}
@ -65,13 +74,13 @@ protected:
return getInitialCreateTableQuery();
}
void executeSingleQuery(const String & query_to_execute, ASTPtr parsed_query) override;
void reportQueryError(const String &) const override {}
void printHelpMessage(const OptionsDescription & options_description) override;
private:
void executeSingleQuery(const String & query_to_execute);
/** Composes CREATE subquery based on passed arguments (--structure --file --table and --input-format)
* This query will be executed first, before queries passed through --query argument
* Returns empty string if it cannot compose that query.

View File

@ -167,7 +167,7 @@ void ClientBase::resetOutput()
}
void ClientBase::processSingleQueryImpl(const String & full_query, std::function<void()> execute_single_query, std::optional<bool> echo_query_, bool report_error)
void ClientBase::processSingleQueryImpl(const String & full_query, const String & query_to_execute, ASTPtr parsed_query, std::optional<bool> echo_query_, bool report_error)
{
resetOutput();
have_error = false;
@ -196,7 +196,7 @@ void ClientBase::processSingleQueryImpl(const String & full_query, std::function
written_first_block = false;
progress_indication.resetProgress();
execute_single_query();
executeSingleQuery(query_to_execute, parsed_query);
if (is_interactive)
{

View File

@ -44,29 +44,6 @@ protected:
void runNonInteractive();
/*
* full_query - current query as it was given to the client.
* parsed_query - parsed query (used to determine some settings e.g. format, output file).
* query_to_execute - current query as it will be executed by server.
* (It may differ from the full query for INSERT queries, for which the
* data that follows the query is stripped and sent separately.)
**/
/*
* Process multiquery - several queries separated by ';'.
* Also in case of clickhouse-server:
* - INSERT data is ended by the end of line, not ';'.
* - An exception is VALUES format where we also support semicolon in addition to end of line.
**/
bool processMultiQueryImpl(const String & all_queries_text,
std::function<void(const String & full_query, const String & query_to_execute, ASTPtr parsed_query)> execute_single_query,
std::function<void(const String &, Exception &)> process_parse_query_error = {});
/// Process parsed single query.
void processSingleQueryImpl(const String & query,
std::function<void()> execute_single_query,
std::optional<bool> echo_query_ = {}, bool report_error = false);
/*
* Method to implement multi-query processing.
@ -86,6 +63,32 @@ protected:
}
/*
* Process multiquery - several queries separated by ';'. Depends on executeSingleQuery().
* Also in case of clickhouse-server:
* - INSERT data is ended by the end of line, not ';'.
* - An exception is VALUES format where we also support semicolon in addition to end of line.
**/
bool processMultiQueryImpl(const String & all_queries_text,
std::function<void(const String & full_query, const String & query_to_execute, ASTPtr parsed_query)> execute_single_query,
std::function<void(const String &, Exception &)> process_parse_query_error = {});
/*
* Process parsed single query. Depends on executeSingleQuery().
**/
void processSingleQueryImpl(const String & query, const String & query_to_execute, ASTPtr parsed_query,
std::optional<bool> echo_query_ = {}, bool report_error = false);
/*
* Just execute a single query.
* full_query - current query as it was given to the client.
* parsed_query - parsed query (used to determine some settings e.g. format, output file).
* query_to_execute - current query as it will be executed by server.
* (It may differ from the full query for INSERT queries, for which the
* data that follows the query is stripped and sent separately.)
**/
virtual void executeSingleQuery(const String & query_to_execute, ASTPtr parsed_query) = 0;
virtual void reportQueryError(const String & query) const = 0;
/// For non-interactive multi-query mode get queries text prefix.