mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-05 23:31:24 +00:00
55 lines
1.1 KiB
C++
55 lines
1.1 KiB
C++
|
#pragma once
|
||
|
|
||
|
#include <DB/Parsers/IAST.h>
|
||
|
#include <unordered_map>
|
||
|
|
||
|
|
||
|
namespace DB
|
||
|
{
|
||
|
|
||
|
class WriteBuffer;
|
||
|
|
||
|
|
||
|
/** Build a map: alias -> AST node.
|
||
|
*
|
||
|
* Also fill information about what kind each alias has:
|
||
|
* - expression alias;
|
||
|
* - table alias;
|
||
|
* - ARRAY JOIN alias.
|
||
|
*
|
||
|
* As extension to standard SQL, aliases could be specified and used in any part of query.
|
||
|
* Example: SELECT a, (1 AS a) + 1 AS b FROM t GROUP BY a, b
|
||
|
* Alias could be used in query before it is defined.
|
||
|
*
|
||
|
* Aliases could not be redefined. Example: 1 AS a, a + 1 AS a - is prohibited.
|
||
|
*
|
||
|
* Don't descend into subqueries (as aliases are local inside them).
|
||
|
*/
|
||
|
struct CollectAliases
|
||
|
{
|
||
|
void process(const ASTPtr & ast);
|
||
|
|
||
|
enum class Kind
|
||
|
{
|
||
|
Expression, /// Example: SELECT a AS b, f(x) AS y
|
||
|
Table, /// Example: SELECT t.* FROM (SELECT 1) AS t
|
||
|
ArrayJoin /// Example: SELECT t.x.a FROM t ARRAY JOIN arr AS x
|
||
|
};
|
||
|
|
||
|
struct AliasInfo
|
||
|
{
|
||
|
ASTPtr node;
|
||
|
Kind kind;
|
||
|
|
||
|
AliasInfo(ASTPtr node, Kind kind) : node(node), kind(kind) {}
|
||
|
};
|
||
|
|
||
|
using Aliases = std::unordered_map<String, AliasInfo>;
|
||
|
Aliases aliases;
|
||
|
|
||
|
/// Debug output
|
||
|
void dump(WriteBuffer & out) const;
|
||
|
};
|
||
|
|
||
|
}
|