1 | #pragma once |
---|---|
2 | |
3 | #include <ostream> |
4 | #include <optional> |
5 | |
6 | #include <Common/typeid_cast.h> |
7 | #include <Core/Names.h> |
8 | #include <Parsers/ASTIdentifier.h> |
9 | #include <Parsers/ASTTablesInSelectQuery.h> |
10 | |
11 | namespace DB |
12 | { |
13 | |
14 | /// Information about table and column names extracted from ASTSelectQuery block. Do not include info from subselects. |
15 | struct ColumnNamesContext |
16 | { |
17 | struct JoinedTable |
18 | { |
19 | const ASTTableExpression * expr = nullptr; |
20 | const ASTTableJoin * join = nullptr; |
21 | |
22 | std::optional<String> alias() const |
23 | { |
24 | String alias; |
25 | if (expr) |
26 | { |
27 | if (expr->database_and_table_name) |
28 | alias = expr->database_and_table_name->tryGetAlias(); |
29 | else if (expr->table_function) |
30 | alias = expr->table_function->tryGetAlias(); |
31 | else if (expr->subquery) |
32 | alias = expr->subquery->tryGetAlias(); |
33 | } |
34 | if (!alias.empty()) |
35 | return alias; |
36 | return {}; |
37 | } |
38 | |
39 | std::optional<String> name() const |
40 | { |
41 | if (expr) |
42 | return tryGetIdentifierName(expr->database_and_table_name); |
43 | return {}; |
44 | } |
45 | |
46 | std::optional<ASTTableJoin::Kind> joinKind() const |
47 | { |
48 | if (join) |
49 | return join->kind; |
50 | return {}; |
51 | } |
52 | }; |
53 | |
54 | struct NameInfo |
55 | { |
56 | std::set<String> aliases; |
57 | size_t appears = 0; |
58 | |
59 | void addInclusion(const String & alias) |
60 | { |
61 | if (!alias.empty()) |
62 | aliases.insert(alias); |
63 | ++appears; |
64 | } |
65 | }; |
66 | |
67 | std::unordered_map<String, NameInfo> required_names; |
68 | NameSet table_aliases; |
69 | NameSet private_aliases; |
70 | NameSet complex_aliases; |
71 | NameSet masked_columns; |
72 | NameSet array_join_columns; |
73 | std::vector<JoinedTable> tables; /// ordered list of visited tables in FROM section with joins |
74 | bool has_table_join = false; |
75 | bool has_array_join = false; |
76 | |
77 | bool addTableAliasIfAny(const IAST & ast); |
78 | bool addColumnAliasIfAny(const IAST & ast); |
79 | void addColumnIdentifier(const ASTIdentifier & node); |
80 | bool addArrayJoinAliasIfAny(const IAST & ast); |
81 | void addArrayJoinIdentifier(const ASTIdentifier & node); |
82 | |
83 | NameSet requiredColumns() const; |
84 | size_t nameInclusion(const String & name) const; |
85 | }; |
86 | |
87 | std::ostream & operator << (std::ostream & os, const ColumnNamesContext & cols); |
88 | |
89 | } |
90 |