#pragma once #include #include #include #include namespace DB { inline bool functionIsInOperator(const String & name) { return name == "in" || name == "notIn"; } inline bool functionIsInOrGlobalInOperator(const String & name) { return functionIsInOperator(name) || name == "globalIn" || name == "globalNotIn"; } using TableNameAndColumnNames = std::pair; using TableNamesAndColumnNames = std::vector; class QueryNormalizer { public: using Aliases = std::unordered_map; QueryNormalizer(ASTPtr & query, const Aliases & aliases, const Settings & settings, const Names & all_columns_name, const TableNamesAndColumnNames & table_names_and_column_names); void perform(); private: using SetOfASTs = std::set; using MapOfASTs = std::map; ASTPtr & query; const Aliases & aliases; const Settings & settings; const Names & all_column_names; const TableNamesAndColumnNames & table_names_and_column_names; void performImpl(ASTPtr & ast, MapOfASTs & finished_asts, SetOfASTs & current_asts, std::string current_alias, size_t level); }; }