mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-30 03:22:14 +00:00
Apply settings for EXPLAIN earlier (in the same way we do for SELECT).
This commit is contained in:
parent
6a086ab926
commit
f6ac225f98
@ -1,6 +1,11 @@
|
|||||||
#include <Interpreters/Context.h>
|
#include <Interpreters/Context.h>
|
||||||
#include <Interpreters/InterpreterSetQuery.h>
|
#include <Interpreters/InterpreterSetQuery.h>
|
||||||
#include <Parsers/ASTSetQuery.h>
|
#include <Parsers/ASTSetQuery.h>
|
||||||
|
#include <Parsers/ASTCreateQuery.h>
|
||||||
|
#include <Parsers/ASTExplainQuery.h>
|
||||||
|
#include <Parsers/ASTInsertQuery.h>
|
||||||
|
#include <Parsers/ASTQueryWithOutput.h>
|
||||||
|
#include <Parsers/ASTSelectWithUnionQuery.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
@ -26,4 +31,56 @@ void InterpreterSetQuery::executeForCurrentContext()
|
|||||||
getContext()->resetSettingsToDefaultValue(ast.default_settings);
|
getContext()->resetSettingsToDefaultValue(ast.default_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void applySettingsFromSelectWithUnion(const ASTSelectWithUnionQuery & select_with_union, ContextMutablePtr context)
|
||||||
|
{
|
||||||
|
const ASTs & children = select_with_union.list_of_selects->children;
|
||||||
|
if (children.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// We might have an arbitrarily complex UNION tree, so just give
|
||||||
|
// up if the last first-order child is not a plain SELECT.
|
||||||
|
// It is flattened later, when we process UNION ALL/DISTINCT.
|
||||||
|
const auto * last_select = children.back()->as<ASTSelectQuery>();
|
||||||
|
if (last_select && last_select->settings())
|
||||||
|
{
|
||||||
|
InterpreterSetQuery(last_select->settings(), context).executeForCurrentContext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InterpreterSetQuery::applySettingsFromQuery(const ASTPtr & ast, ContextMutablePtr context_)
|
||||||
|
{
|
||||||
|
if (const auto * select_query = ast->as<ASTSelectQuery>())
|
||||||
|
{
|
||||||
|
if (auto new_settings = select_query->settings())
|
||||||
|
InterpreterSetQuery(new_settings, context_).executeForCurrentContext();
|
||||||
|
}
|
||||||
|
else if (const auto * select_with_union_query = ast->as<ASTSelectWithUnionQuery>())
|
||||||
|
{
|
||||||
|
applySettingsFromSelectWithUnion(*select_with_union_query, context_);
|
||||||
|
}
|
||||||
|
else if (const auto * explain_query = ast->as<ASTExplainQuery>())
|
||||||
|
{
|
||||||
|
applySettingsFromQuery(explain_query->getExplainedQuery(), context_);
|
||||||
|
}
|
||||||
|
else if (const auto * query_with_output = dynamic_cast<const ASTQueryWithOutput *>(ast.get()))
|
||||||
|
{
|
||||||
|
if (query_with_output->settings_ast)
|
||||||
|
InterpreterSetQuery(query_with_output->settings_ast, context_).executeForCurrentContext();
|
||||||
|
|
||||||
|
if (const auto * create_query = ast->as<ASTCreateQuery>())
|
||||||
|
{
|
||||||
|
if (create_query->select)
|
||||||
|
{
|
||||||
|
applySettingsFromSelectWithUnion(create_query->select->as<ASTSelectWithUnionQuery &>(), context_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (auto * insert_query = ast->as<ASTInsertQuery>())
|
||||||
|
{
|
||||||
|
context_->setInsertFormat(insert_query->format);
|
||||||
|
if (insert_query->settings_ast)
|
||||||
|
InterpreterSetQuery(insert_query->settings_ast, context_).executeForCurrentContext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,9 @@ public:
|
|||||||
|
|
||||||
bool supportsTransactions() const override { return true; }
|
bool supportsTransactions() const override { return true; }
|
||||||
|
|
||||||
|
/// To apply SETTINGS clauses from query as early as possible
|
||||||
|
static void applySettingsFromQuery(const ASTPtr & ast, ContextMutablePtr context_);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ASTPtr query_ptr;
|
ASTPtr query_ptr;
|
||||||
};
|
};
|
||||||
|
@ -303,22 +303,6 @@ static void setQuerySpecificSettings(ASTPtr & ast, ContextMutablePtr context)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void applySettingsFromSelectWithUnion(const ASTSelectWithUnionQuery & select_with_union, ContextMutablePtr context)
|
|
||||||
{
|
|
||||||
const ASTs & children = select_with_union.list_of_selects->children;
|
|
||||||
if (children.empty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// We might have an arbitrarily complex UNION tree, so just give
|
|
||||||
// up if the last first-order child is not a plain SELECT.
|
|
||||||
// It is flattened later, when we process UNION ALL/DISTINCT.
|
|
||||||
const auto * last_select = children.back()->as<ASTSelectQuery>();
|
|
||||||
if (last_select && last_select->settings())
|
|
||||||
{
|
|
||||||
InterpreterSetQuery(last_select->settings(), context).executeForCurrentContext();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::tuple<ASTPtr, BlockIO> executeQueryImpl(
|
static std::tuple<ASTPtr, BlockIO> executeQueryImpl(
|
||||||
const char * begin,
|
const char * begin,
|
||||||
const char * end,
|
const char * end,
|
||||||
@ -466,35 +450,10 @@ static std::tuple<ASTPtr, BlockIO> executeQueryImpl(
|
|||||||
|
|
||||||
/// Interpret SETTINGS clauses as early as possible (before invoking the corresponding interpreter),
|
/// Interpret SETTINGS clauses as early as possible (before invoking the corresponding interpreter),
|
||||||
/// to allow settings to take effect.
|
/// to allow settings to take effect.
|
||||||
if (const auto * select_query = ast->as<ASTSelectQuery>())
|
InterpreterSetQuery::applySettingsFromQuery(ast, context);
|
||||||
{
|
|
||||||
if (auto new_settings = select_query->settings())
|
|
||||||
InterpreterSetQuery(new_settings, context).executeForCurrentContext();
|
|
||||||
}
|
|
||||||
else if (const auto * select_with_union_query = ast->as<ASTSelectWithUnionQuery>())
|
|
||||||
{
|
|
||||||
applySettingsFromSelectWithUnion(*select_with_union_query, context);
|
|
||||||
}
|
|
||||||
else if (const auto * query_with_output = dynamic_cast<const ASTQueryWithOutput *>(ast.get()))
|
|
||||||
{
|
|
||||||
if (query_with_output->settings_ast)
|
|
||||||
InterpreterSetQuery(query_with_output->settings_ast, context).executeForCurrentContext();
|
|
||||||
|
|
||||||
if (const auto * create_query = ast->as<ASTCreateQuery>())
|
if (auto * insert_query = ast->as<ASTInsertQuery>())
|
||||||
{
|
|
||||||
if (create_query->select)
|
|
||||||
{
|
|
||||||
applySettingsFromSelectWithUnion(create_query->select->as<ASTSelectWithUnionQuery &>(), context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (auto * insert_query = ast->as<ASTInsertQuery>())
|
|
||||||
{
|
|
||||||
context->setInsertFormat(insert_query->format);
|
|
||||||
if (insert_query->settings_ast)
|
|
||||||
InterpreterSetQuery(insert_query->settings_ast, context).executeForCurrentContext();
|
|
||||||
insert_query->tail = istr;
|
insert_query->tail = istr;
|
||||||
}
|
|
||||||
|
|
||||||
setQuerySpecificSettings(ast, context);
|
setQuerySpecificSettings(ast, context);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user