void CollectAliases::dump(WriteBuffer & out) const { /// For need of tests, we need to dump result in some fixed order. std::vector<Aliases::const_iterator> vec; vec.reserve(aliases.size()); for (auto it = aliases.begin(); it != aliases.end(); ++it) vec.emplace_back(it); std::sort(vec.begin(), vec.end(), [](const auto & a, const auto & b) { return a->first < b->first; }); for (const auto & it : vec) { writeProbablyBackQuotedString(it->first, out); writeCString(" -> ", out); switch (it->second.kind) { case Kind::Expression: writeCString("(expression) ", out); break; case Kind::Table: writeCString("(table) ", out); break; case Kind::ArrayJoin: writeCString("(array join) ", out); break; } std::stringstream formatted_ast; formatAST(*it->second.node, formatted_ast, 0, false, true); writeString(formatted_ast.str(), out); writeChar('\n', out); } }
void IAST::FormatSettings::writeIdentifier(const String & name) const { WriteBufferFromOStream out(ostr, 32); switch (identifier_quoting_style) { case IdentifierQuotingStyle::None: { if (always_quote_identifiers) throw Exception("Incompatible arguments: always_quote_identifiers = true && identifier_quoting_style == IdentifierQuotingStyle::None", ErrorCodes::BAD_ARGUMENTS); writeString(name, out); break; } case IdentifierQuotingStyle::Backticks: { if (always_quote_identifiers) writeBackQuotedString(name, out); else writeProbablyBackQuotedString(name, out); break; } case IdentifierQuotingStyle::DoubleQuotes: { if (always_quote_identifiers) writeDoubleQuotedString(name, out); else writeProbablyDoubleQuotedString(name, out); break; } } out.next(); }
void ASTIdentifier::formatImplWithoutAlias(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const { auto format_element = [&](const String & name) { settings.ostr << (settings.hilite ? hilite_identifier : ""); WriteBufferFromOStream wb(settings.ostr, 32); writeProbablyBackQuotedString(name, wb); wb.next(); settings.ostr << (settings.hilite ? hilite_none : ""); }; /// A simple or compound identifier? if (children.size() > 1) { for (size_t i = 0, size = children.size(); i < size; ++i) { if (i != 0) settings.ostr << '.'; format_element(static_cast<const ASTIdentifier &>(*children[i].get()).name); } } else { format_element(name); } }
/// Quote the identifier with backquotes, if required. String backQuoteIfNeed(const String & x) { String res(x.size(), '\0'); { WriteBufferFromString wb(res); writeProbablyBackQuotedString(x, wb); } return res; }
void IAST::writeAlias(const String & name, std::ostream & s, bool hilite) const { s << (hilite ? hilite_keyword : "") << " AS " << (hilite ? hilite_alias : ""); WriteBufferFromOStream wb(s, 32); writeProbablyBackQuotedString(name, wb); wb.next(); s << (hilite ? hilite_none : ""); }
void AnalyzeColumns::dump(WriteBuffer & out) const { /// For need of tests, we need to dump result in some fixed order. std::vector<Columns::const_iterator> vec; vec.reserve(columns.size()); for (auto it = columns.begin(); it != columns.end(); ++it) vec.emplace_back(it); std::sort(vec.begin(), vec.end(), [](const auto & a, const auto & b) { return a->first < b->first; }); for (const auto & it : vec) { writeString(it->first, out); writeCString(" -> ", out); writeProbablyBackQuotedString(it->second.name_in_table, out); writeCString(" ", out); writeProbablyBackQuotedString(it->second.data_type->getName(), out); const auto & table = it->second.table; writeCString(". Database name: ", out); if (table.database_name.empty()) writeCString("(none)", out); else writeProbablyBackQuotedString(table.database_name, out); writeCString(". Table name: ", out); if (table.table_name.empty()) writeCString("(none)", out); else writeProbablyBackQuotedString(table.table_name, out); writeCString(". Alias: ", out); if (table.alias.empty()) writeCString("(none)", out); else writeProbablyBackQuotedString(table.alias, out); writeCString(". Storage: ", out); if (!table.storage) writeCString("(none)", out); else writeProbablyBackQuotedString(table.storage->getName(), out); writeCString(". AST: ", out); if (it->second.node) { std::stringstream formatted_ast; formatAST(*it->second.node, formatted_ast, false, true); writeString(formatted_ast.str(), out); } else writeCString("(none)", out); writeChar('\n', out); } }