#pragma once #include #include #include #include #include #include namespace DB { /// Information about table and column names extracted from ASTSelectQuery block. Do not include info from subselects. struct ColumnNamesContext { struct JoinedTable { const ASTTableExpression * expr = nullptr; const ASTTableJoin * join = nullptr; std::optional alias() const { String alias; if (expr) { if (expr->database_and_table_name) alias = expr->database_and_table_name->tryGetAlias(); else if (expr->table_function) alias = expr->table_function->tryGetAlias(); else if (expr->subquery) alias = expr->subquery->tryGetAlias(); } if (!alias.empty()) return alias; return {}; } std::optional name() const { if (expr) return tryGetIdentifierName(expr->database_and_table_name); return {}; } std::optional joinKind() const { if (join) return join->kind; return {}; } }; struct NameInfo { std::set aliases; size_t appears = 0; void addInclusion(const String & alias) { if (!alias.empty()) aliases.insert(alias); ++appears; } }; std::unordered_map required_names; NameSet table_aliases; NameSet private_aliases; NameSet complex_aliases; NameSet masked_columns; NameSet array_join_columns; std::vector tables; /// ordered list of visited tables in FROM section with joins bool has_table_join = false; bool has_array_join = false; bool addTableAliasIfAny(const IAST & ast); bool addColumnAliasIfAny(const IAST & ast); void addColumnIdentifier(const ASTIdentifier & node); bool addArrayJoinAliasIfAny(const IAST & ast); void addArrayJoinIdentifier(const ASTIdentifier & node); NameSet requiredColumns() const; size_t nameInclusion(const String & name) const; }; std::ostream & operator << (std::ostream & os, const ColumnNamesContext & cols); }