fixed 'unknown column' issue with ARRAY JOIN section [#CONV-7967]

This commit is contained in:
Vyacheslav Alipov 2013-07-23 16:15:40 +00:00
parent 9dfce3c015
commit 3ab02bffef
4 changed files with 9 additions and 19 deletions

View File

@ -63,7 +63,6 @@ public:
/// После агрегации:
bool appendHaving(ExpressionActionsChain & chain);
void appendSelect(ExpressionActionsChain & chain);
bool appendArrayJoin(ExpressionActionsChain & chain);
bool appendOrderBy(ExpressionActionsChain & chain);
/// Удаляет все столбцы кроме выбираемых SELECT, упорядочивает оставшиеся столбцы и переименовывает их в алиасы.
void appendProjectResult(ExpressionActionsChain & chain);

View File

@ -18,6 +18,7 @@ public:
Database,
Table,
Format,
ArrayJoin,
};
/// имя

View File

@ -338,7 +338,7 @@ void ExpressionAnalyzer::normalizeTreeImpl(ASTPtr & ast, MapOfASTs & finished_as
}
else if (ASTIdentifier * node = dynamic_cast<ASTIdentifier *>(&*ast))
{
if (node->kind == ASTIdentifier::Column)
if (node->kind == ASTIdentifier::Column || node->kind == ASTIdentifier::ArrayJoin)
{
/// Если это алиас, но не родительский алиас (чтобы работали конструкции вроде "SELECT column+1 AS column").
Aliases::const_iterator jt = aliases.find(node->name);
@ -723,6 +723,11 @@ void ExpressionAnalyzer::getActionsImpl(ASTPtr ast, bool no_subqueries, bool onl
additional_requirements);
}
}
else if (ASTIdentifier * node = dynamic_cast<ASTIdentifier *>(&*ast))
{
if (node->kind == ASTIdentifier::ArrayJoin && !only_consts)
actions_stack.addAction(ExpressionActions::Action::arrayJoin(node->name, ""));
}
else if (ASTLiteral * node = dynamic_cast<ASTLiteral *>(&*ast))
{
DataTypePtr type = apply_visitor(FieldToDataType(), node->value);
@ -906,8 +911,6 @@ void ExpressionAnalyzer::appendSelect(ExpressionActionsChain & chain)
getRootActionsImpl(select_query->select_expression_list, false, false, *step.actions);
appendArrayJoin(chain);
ASTs asts = select_query->select_expression_list->children;
for (size_t i = 0; i < asts.size(); ++i)
{
@ -915,21 +918,6 @@ void ExpressionAnalyzer::appendSelect(ExpressionActionsChain & chain)
}
}
bool ExpressionAnalyzer::appendArrayJoin(ExpressionActionsChain & chain)
{
assertSelect();
if (!select_query->array_join_identifier)
return false;
initChain(chain, aggregated_columns);
ExpressionActionsChain::Step & step = chain.steps.back();
step.actions->add(ExpressionActions::Action::arrayJoin(select_query->array_join_identifier->getColumnName(), ""));
return true;
}
bool ExpressionAnalyzer::appendOrderBy(ExpressionActionsChain & chain)
{
assertSelect();

View File

@ -120,6 +120,8 @@ bool ParserSelectQuery::parseImpl(Pos & pos, Pos end, ASTPtr & node, String & ex
if (!ident.parse(pos, end, select_query->array_join_identifier, expected))
return false;
dynamic_cast<ASTIdentifier &>(*select_query->array_join_identifier).kind = ASTIdentifier::ArrayJoin;
ws.ignore(pos, end);
}