#pragma once #include #include #include namespace DB { /** RENAME query */ class ASTRenameQuery : public ASTQueryWithOutput, public ASTQueryWithOnCluster { public: struct Table { String database; String table; }; struct Element { Table from; Table to; }; using Elements = std::vector; Elements elements; /** Get the text that identifies this element. */ String getID() const override { return "Rename"; } ASTPtr clone() const override { auto res = std::make_shared(*this); cloneOutputOptions(*res); return res; } ASTPtr getRewrittenASTWithoutOnCluster(const std::string & new_database) const override { auto query_ptr = clone(); auto & query = static_cast(*query_ptr); query.cluster.clear(); for (Element & elem : query.elements) { if (elem.from.database.empty()) elem.from.database = new_database; if (elem.to.database.empty()) elem.to.database = new_database; } return query_ptr; } protected: void formatQueryImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override { settings.ostr << (settings.hilite ? hilite_keyword : "") << "RENAME TABLE " << (settings.hilite ? hilite_none : ""); for (auto it = elements.cbegin(); it != elements.cend(); ++it) { if (it != elements.cbegin()) settings.ostr << ", "; settings.ostr << (!it->from.database.empty() ? backQuoteIfNeed(it->from.database) + "." : "") << backQuoteIfNeed(it->from.table) << (settings.hilite ? hilite_keyword : "") << " TO " << (settings.hilite ? hilite_none : "") << (!it->to.database.empty() ? backQuoteIfNeed(it->to.database) + "." : "") << backQuoteIfNeed(it->to.table); } formatOnCluster(settings); } }; }