fix unnecessarily preparations for join at initial server

This commit is contained in:
CurtizJ 2018-10-10 20:07:21 +03:00
parent 4e6fd3e3fe
commit 815380b8b2
3 changed files with 28 additions and 1 deletions

View File

@ -574,14 +574,20 @@ void ExpressionAnalyzer::initGlobalSubqueries(ASTPtr & ast)
{
/// For GLOBAL IN.
if (do_global && (func->name == "globalIn" || func->name == "globalNotIn"))
{
addExternalStorage(func->arguments->children.at(1));
has_global_subqueries = true;
}
}
else if (ASTTablesInSelectQueryElement * table_elem = typeid_cast<ASTTablesInSelectQueryElement *>(ast.get()))
{
/// For GLOBAL JOIN.
if (do_global && table_elem->table_join
&& static_cast<const ASTTableJoin &>(*table_elem->table_join).locality == ASTTableJoin::Locality::Global)
{
addExternalStorage(table_elem->table_expression);
has_global_subqueries = true;
}
}
}

View File

@ -186,6 +186,8 @@ public:
bool isRewriteSubqueriesPredicate() { return rewrite_subqueries; }
bool hasGlobalSubqueries() { return has_global_subqueries; }
private:
ASTPtr query;
ASTSelectQuery * select_query;
@ -216,6 +218,7 @@ private:
/// Do I need to prepare for execution global subqueries when analyzing the query.
bool do_global;
bool has_global_subqueries = false;
SubqueriesForSets subqueries_for_sets;

View File

@ -549,6 +549,10 @@ void InterpreterSelectQuery::executeImpl(Pipeline & pipeline, const BlockInputSt
if (query.limit_length)
executePreLimit(pipeline);
}
// If there is no global subqueries, we can run subqueries only when recieve them on server.
if (!query_analyzer->hasGlobalSubqueries() && !expressions.subqueries_for_sets.empty())
executeSubqueriesInSetsAndJoins(pipeline, expressions.subqueries_for_sets);
}
if (expressions.second_stage)
@ -654,7 +658,21 @@ void InterpreterSelectQuery::executeImpl(Pipeline & pipeline, const BlockInputSt
}
}
if (!expressions.subqueries_for_sets.empty())
LOG_DEBUG(log, "is first_stage: " << expressions.first_stage);
LOG_DEBUG(log, "is second_stage: " << expressions.second_stage);
LOG_DEBUG(log, "has_join: " << expressions.has_join);
LOG_DEBUG(log, "subqueries size: " << expressions.subqueries_for_sets.size());
LOG_DEBUG(log, "has global subqueries: " << query_analyzer->hasGlobalSubqueries());
for (auto s : expressions.subqueries_for_sets)
{
LOG_DEBUG(log, "set: " << !!s.second.set);
LOG_DEBUG(log, "join: " << !!s.second.join);
LOG_DEBUG(log, "table: " << !!s.second.table);
for (auto name : s.second.joined_block_aliases)
LOG_DEBUG(log, "name with alias: " << name.first << "; " << name.second);
}
if (query_analyzer->hasGlobalSubqueries() && !expressions.subqueries_for_sets.empty())
executeSubqueriesInSetsAndJoins(pipeline, expressions.subqueries_for_sets);
}