#pragma once #include #include #include #include #include #include namespace DB { /// If node is ASTIdentifier try to extract external_storage. class ExternalTablesMatcher { public: struct Data { const Context & context; Tables & external_tables; }; static void visit(ASTPtr & ast, Data & data) { if (auto * t = typeid_cast(ast.get())) visit(*t, ast, data); } static bool needChildVisit(ASTPtr &, const ASTPtr &) { return true; } private: static void visit(const ASTIdentifier & node, ASTPtr &, Data & data) { if (auto opt_name = IdentifierSemantic::getTableName(node)) if (StoragePtr external_storage = data.context.tryGetExternalTable(*opt_name)) data.external_tables[*opt_name] = external_storage; } }; /// Finds in the query the usage of external tables. Fills in external_tables. using ExternalTablesVisitor = InDepthNodeVisitor; }