2015-08-06 21:32:51 +00:00
|
|
|
#include <DB/Parsers/ASTWithAlias.h>
|
2016-11-20 12:43:20 +00:00
|
|
|
#include <DB/IO/WriteBufferFromOStream.h>
|
|
|
|
#include <DB/IO/WriteHelpers.h>
|
|
|
|
|
2015-08-06 21:32:51 +00:00
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
void ASTWithAlias::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
if (!alias.empty())
|
|
|
|
{
|
|
|
|
/// Если мы уже ранее вывели этот узел в другом месте запроса, то теперь достаточно вывести лишь алиас.
|
|
|
|
if (!state.printed_asts_with_alias.emplace(frame.current_select, alias).second)
|
|
|
|
{
|
|
|
|
WriteBufferFromOStream wb(settings.ostr, 32);
|
|
|
|
writeProbablyBackQuotedString(alias, wb);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2015-08-06 21:32:51 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
/// Если есть алиас, то требуются скобки вокруг всего выражения, включая алиас. Потому что запись вида 0 AS x + 0 синтаксически некорректна.
|
|
|
|
if (frame.need_parens && !alias.empty())
|
|
|
|
settings.ostr <<'(';
|
2015-08-06 21:32:51 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
formatImplWithoutAlias(settings, state, frame);
|
2015-08-06 21:32:51 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
if (!alias.empty())
|
|
|
|
{
|
|
|
|
writeAlias(alias, settings.ostr, settings.hilite);
|
|
|
|
if (frame.need_parens)
|
|
|
|
settings.ostr <<')';
|
|
|
|
}
|
2015-08-06 21:32:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|