ClickHouse/dbms/src/Interpreters/TranslateQualifiedNamesVisitor.h

81 lines
2.6 KiB
C++
Raw Normal View History

2018-09-28 15:01:13 +00:00
#pragma once
#include <vector>
2019-01-16 17:26:14 +00:00
#include <Core/Names.h>
#include <Interpreters/DatabaseAndTableWithAlias.h>
#include <Interpreters/InDepthNodeVisitor.h>
namespace DB
{
class ASTIdentifier;
class ASTQualifiedAsterisk;
struct ASTTableJoin;
class ASTSelectQuery;
class ASTExpressionList;
class ASTFunction;
/// Visit one node for names qualification. @sa InDepthNodeVisitor.
class TranslateQualifiedNamesMatcher
{
public:
2019-02-22 13:33:56 +00:00
using Visitor = InDepthNodeVisitor<TranslateQualifiedNamesMatcher, true>;
struct Data
{
const NameSet source_columns;
const std::vector<TableWithColumnNames> tables;
std::unordered_set<String> join_using_columns;
bool has_columns;
Data(const NameSet & source_columns_, std::vector<TableWithColumnNames> && tables_, bool has_columns_ = true)
: source_columns(source_columns_)
, tables(tables_)
, has_columns(has_columns_)
{}
static std::vector<TableWithColumnNames> tablesOnly(const std::vector<DatabaseAndTableWithAlias> & tables)
{
std::vector<TableWithColumnNames> tables_with_columns;
tables_with_columns.reserve(tables.size());
for (const auto & table : tables)
tables_with_columns.emplace_back(TableWithColumnNames{table, {}});
return tables_with_columns;
}
bool processAsterisks() const { return !tables.empty() && has_columns; }
};
2019-02-22 13:33:56 +00:00
static void visit(ASTPtr & ast, Data & data);
static bool needChildVisit(ASTPtr & node, const ASTPtr & child);
private:
2019-02-22 13:33:56 +00:00
static void visit(ASTIdentifier & node, ASTPtr & ast, Data &);
static void visit(const ASTQualifiedAsterisk & node, const ASTPtr & ast, Data &);
static void visit(ASTTableJoin & node, const ASTPtr & ast, Data &);
static void visit(ASTSelectQuery & node, const ASTPtr & ast, Data &);
static void visit(ASTExpressionList &, const ASTPtr &, Data &);
static void visit(ASTFunction &, const ASTPtr &, Data &);
static void extractJoinUsingColumns(const ASTPtr ast, Data & data);
};
/// Visits AST for names qualification.
/// It finds columns and translate their names to the normal form. Expand asterisks and qualified asterisks with column names.
2019-02-22 13:33:56 +00:00
using TranslateQualifiedNamesVisitor = TranslateQualifiedNamesMatcher::Visitor;
/// Restore ASTIdentifiers to long form
struct RestoreQualifiedNamesData
{
using TypeToVisit = ASTIdentifier;
void visit(ASTIdentifier & identifier, ASTPtr & ast);
};
using RestoreQualifiedNamesMatcher = OneTypeMatcher<RestoreQualifiedNamesData>;
using RestoreQualifiedNamesVisitor = InDepthNodeVisitor<RestoreQualifiedNamesMatcher, true>;
}