#pragma once #include #include #include #include namespace DB { struct AsteriskSemanticImpl { using RevertedAliases = std::unordered_map>; using RevertedAliasesPtr = std::shared_ptr; RevertedAliasesPtr aliases; /// map of aliases that should be set in phase of * expanding. }; struct AsteriskSemantic { using RevertedAliases = AsteriskSemanticImpl::RevertedAliases; using RevertedAliasesPtr = AsteriskSemanticImpl::RevertedAliasesPtr; static void setAliases(ASTAsterisk & node, const RevertedAliasesPtr & aliases) { node.semantic = makeSemantic(aliases); } static void setAliases(ASTQualifiedAsterisk & node, const RevertedAliasesPtr & aliases) { node.semantic = makeSemantic(aliases); } static void setAliases(ASTColumnsMatcher & node, const RevertedAliasesPtr & aliases) { node.semantic = makeSemantic(aliases); } static RevertedAliasesPtr getAliases(const ASTAsterisk & node) { return node.semantic ? node.semantic->aliases : nullptr; } static RevertedAliasesPtr getAliases(const ASTQualifiedAsterisk & node) { return node.semantic ? node.semantic->aliases : nullptr; } static RevertedAliasesPtr getAliases(const ASTColumnsMatcher & node) { return node.semantic ? node.semantic->aliases : nullptr; } private: static std::shared_ptr makeSemantic(const RevertedAliasesPtr & aliases) { return std::make_shared(AsteriskSemanticImpl{aliases}); } }; }