提交 cbf3c34c 编写于 作者: C chertus

minor improvement in ExpressionAnalyzer + array join

上级 b7ce79c4
......@@ -143,15 +143,17 @@ void ExpressionAnalyzer::analyzeAggregation()
ExpressionActionsPtr temp_actions = std::make_shared<ExpressionActions>(source_columns, context);
if (select_query && select_query->array_join_expression_list())
{
getRootActions(select_query->array_join_expression_list(), true, temp_actions);
addMultipleArrayJoinAction(temp_actions);
array_join_columns = temp_actions->getSampleBlock().getNamesAndTypesList();
}
if (select_query)
{
bool is_array_join_left;
ASTPtr array_join_expression_list = select_query->array_join_expression_list(is_array_join_left);
if (array_join_expression_list)
{
getRootActions(array_join_expression_list, true, temp_actions);
addMultipleArrayJoinAction(temp_actions, is_array_join_left);
array_join_columns = temp_actions->getSampleBlock().getNamesAndTypesList();
}
const ASTTablesInSelectQueryElement * join = select_query->join();
if (join)
{
......@@ -512,7 +514,7 @@ void ExpressionAnalyzer::initChain(ExpressionActionsChain & chain, const NamesAn
}
/// "Big" ARRAY JOIN.
void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actions) const
void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actions, bool array_join_is_left) const
{
NameSet result_columns;
for (const auto & result_source : syntax->array_join_result_to_source)
......@@ -525,22 +527,24 @@ void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actio
result_columns.insert(result_source.first);
}
actions->add(ExpressionAction::arrayJoin(result_columns, select_query->array_join_is_left(), context));
actions->add(ExpressionAction::arrayJoin(result_columns, array_join_is_left, context));
}
bool ExpressionAnalyzer::appendArrayJoin(ExpressionActionsChain & chain, bool only_types)
{
assertSelect();
if (!select_query->array_join_expression_list())
bool is_array_join_left;
ASTPtr array_join_expression_list = select_query->array_join_expression_list(is_array_join_left);
if (!array_join_expression_list)
return false;
initChain(chain, source_columns);
ExpressionActionsChain::Step & step = chain.steps.back();
getRootActions(select_query->array_join_expression_list(), only_types, step.actions);
getRootActions(array_join_expression_list, only_types, step.actions);
addMultipleArrayJoinAction(step.actions);
addMultipleArrayJoinAction(step.actions, is_array_join_left);
return true;
}
......
......@@ -240,7 +240,7 @@ private:
/// Find global subqueries in the GLOBAL IN/JOIN sections. Fills in external_tables.
void initGlobalSubqueriesAndExternalTables();
void addMultipleArrayJoinAction(ExpressionActionsPtr & actions) const;
void addMultipleArrayJoinAction(ExpressionActionsPtr & actions, bool is_left) const;
void addJoinAction(ExpressionActionsPtr & actions, bool only_types) const;
......
......@@ -676,9 +676,13 @@ void optimizeUsing(const ASTSelectQuery * select_query)
void getArrayJoinedColumns(ASTPtr & query, SyntaxAnalyzerResult & result, const ASTSelectQuery * select_query,
const Names & source_columns, const NameSet & source_columns_set)
{
if (select_query && select_query->array_join_expression_list())
if (!select_query)
return;
ASTPtr array_join_expression_list = select_query->array_join_expression_list();
if (array_join_expression_list)
{
ASTs & array_join_asts = select_query->array_join_expression_list()->children;
ASTs & array_join_asts = array_join_expression_list->children;
for (const auto & ast : array_join_asts)
{
const String nested_table_name = ast->getColumnName();
......
......@@ -283,23 +283,21 @@ bool ASTSelectQuery::final() const
}
ASTPtr ASTSelectQuery::array_join_expression_list() const
ASTPtr ASTSelectQuery::array_join_expression_list(bool & is_left) const
{
const ASTArrayJoin * array_join = getFirstArrayJoin(*this);
if (!array_join)
return {};
is_left = (array_join->kind == ASTArrayJoin::Kind::Left);
return array_join->expression_list;
}
bool ASTSelectQuery::array_join_is_left() const
ASTPtr ASTSelectQuery::array_join_expression_list() const
{
const ASTArrayJoin * array_join = getFirstArrayJoin(*this);
if (!array_join)
return {};
return array_join->kind == ASTArrayJoin::Kind::Left;
bool is_left;
return array_join_expression_list(is_left);
}
......
......@@ -41,9 +41,9 @@ public:
/// Compatibility with old parser of tables list. TODO remove
ASTPtr sample_size() const;
ASTPtr sample_offset() const;
ASTPtr array_join_expression_list(bool & is_left) const;
ASTPtr array_join_expression_list() const;
const ASTTablesInSelectQueryElement * join() const;
bool array_join_is_left() const;
bool final() const;
void replaceDatabaseAndTable(const String & database_name, const String & table_name);
void addTableFunction(ASTPtr & table_function_ptr);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册