#pragma once #include #include #include #include #include namespace DB { class ASTIdentifier; class ASTQualifiedAsterisk; class ASTSelectQuery; struct ASTTableJoin; class NamesAndTypesList; /// It visits nodes, find identifiers and translate their names to needed form. class TranslateQualifiedNamesVisitor { public: TranslateQualifiedNamesVisitor(const NamesAndTypesList & source_columns_, const std::vector & tables_, std::ostream * ostr_ = nullptr) : source_columns(source_columns_), tables(tables_), visit_depth(0), ostr(ostr_) {} void visit(ASTPtr & ast) const { DumpASTNode dump(*ast, ostr, visit_depth, "translateQualifiedNames"); if (!tryVisit(ast, dump) && !tryVisit(ast, dump) && !tryVisit(ast, dump) && !tryVisit(ast, dump)) visitChildren(ast); /// default: do nothing, visit children } private: const NamesAndTypesList & source_columns; const std::vector & tables; mutable size_t visit_depth; std::ostream * ostr; void visit(ASTIdentifier * node, ASTPtr & ast, const DumpASTNode & dump) const; void visit(ASTQualifiedAsterisk * node, ASTPtr & ast, const DumpASTNode & dump) const; void visit(ASTTableJoin * node, ASTPtr & ast, const DumpASTNode & dump) const; void visit(ASTSelectQuery * ast, ASTPtr &, const DumpASTNode & dump) const; void visitChildren(ASTPtr &) const; template bool tryVisit(ASTPtr & ast, const DumpASTNode & dump) const { if (T * t = typeid_cast(ast.get())) { visit(t, ast, dump); return true; } return false; } }; }