Miscellaneous #3145

This commit is contained in:
Alexey Milovidov 2018-10-10 23:35:21 +03:00
parent 5e50e6bfef
commit 2c0ea27377
3 changed files with 19 additions and 22 deletions

View File

@ -860,7 +860,7 @@ void ExpressionAnalyzer::normalizeTree()
if (all_columns_name.empty())
throw Exception("An asterisk cannot be replaced with empty columns.", ErrorCodes::LOGICAL_ERROR);
TableNamesAndColumnsName table_names_and_columns_name;
TableNamesAndColumnNames table_names_and_column_names;
if (select_query && select_query->tables && !select_query->tables->children.empty())
{
std::vector<ASTTableExpression> tables_expression = getTableExpressions(query);
@ -881,11 +881,11 @@ void ExpressionAnalyzer::normalizeTree()
first = false;
table_names_and_columns_name.emplace_back(std::pair(table_name, names_and_types.getNames()));
table_names_and_column_names.emplace_back(std::pair(table_name, names_and_types.getNames()));
}
}
QueryNormalizer(query, aliases, settings, all_columns_name, table_names_and_columns_name).perform();
QueryNormalizer(query, aliases, settings, all_columns_name, table_names_and_column_names).perform();
}

View File

@ -32,10 +32,10 @@ bool functionIsInOrGlobalInOperator(const String & name)
}
QueryNormalizer::QueryNormalizer(ASTPtr & query, const QueryNormalizer::Aliases & aliases,
const Settings & settings, const Names & all_columns_name,
const TableNamesAndColumnsName & table_names_and_columns_name)
: query(query), aliases(aliases), settings(settings), all_columns_name(all_columns_name),
table_names_and_columns_name(table_names_and_columns_name)
const Settings & settings, const Names & all_column_names,
const TableNamesAndColumnNames & table_names_and_column_names)
: query(query), aliases(aliases), settings(settings), all_column_names(all_column_names),
table_names_and_column_names(table_names_and_column_names)
{
}
@ -151,24 +151,21 @@ void QueryNormalizer::performImpl(ASTPtr & ast, MapOfASTs & finished_asts, SetOf
ASTs & asts = expr_list->children;
for (int i = static_cast<int>(asts.size()) - 1; i >= 0; --i)
{
if (typeid_cast<ASTAsterisk *>(asts[i].get()) && !all_columns_name.empty())
if (typeid_cast<const ASTAsterisk *>(asts[i].get()) && !all_column_names.empty())
{
asts.erase(asts.begin() + i);
for (size_t idx = 0; idx < all_columns_name.size(); idx++)
asts.insert(asts.begin() + idx + i, std::make_shared<ASTIdentifier>(all_columns_name[idx]));
for (size_t idx = 0; idx < all_column_names.size(); idx++)
asts.insert(asts.begin() + idx + i, std::make_shared<ASTIdentifier>(all_column_names[idx]));
}
else if (typeid_cast<ASTQualifiedAsterisk *>(asts[i].get()) && !table_names_and_columns_name.empty())
else if (typeid_cast<const ASTQualifiedAsterisk *>(asts[i].get()) && !table_names_and_column_names.empty())
{
ASTQualifiedAsterisk * qualified_asterisk = static_cast<ASTQualifiedAsterisk *>(asts[i].get());
ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(qualified_asterisk->children[0].get());
size_t num_components = identifier->children.size();
for (const auto & table_name_and_columns_name : table_names_and_columns_name)
for (const auto & [table_name, table_all_column_names] : table_names_and_column_names)
{
const auto & table_name = table_name_and_columns_name.first;
const auto & table_all_columns_name = table_name_and_columns_name.second;
if ((num_components == 2
&& !table_name.database.empty()
&& static_cast<const ASTIdentifier &>(*identifier->children[0]).name == table_name.database
@ -178,8 +175,8 @@ void QueryNormalizer::performImpl(ASTPtr & ast, MapOfASTs & finished_asts, SetOf
|| (!table_name.alias.empty() && identifier->name == table_name.alias))))
{
asts.erase(asts.begin() + i);
for (size_t idx = 0; idx < table_all_columns_name.size(); idx++)
asts.insert(asts.begin() + idx + i, std::make_shared<ASTIdentifier>(table_all_columns_name[idx]));
for (size_t idx = 0; idx < table_all_column_names.size(); idx++)
asts.insert(asts.begin() + idx + i, std::make_shared<ASTIdentifier>(table_all_column_names[idx]));
}
}
}

View File

@ -7,8 +7,8 @@
namespace DB
{
using TableNameAndColumnsName = std::pair<DatabaseAndTableWithAlias, Names>;
using TableNamesAndColumnsName = std::vector<TableNameAndColumnsName>;
using TableNameAndColumnNames = std::pair<DatabaseAndTableWithAlias, Names>;
using TableNamesAndColumnNames = std::vector<TableNameAndColumnNames>;
class QueryNormalizer
{
@ -16,7 +16,7 @@ public:
using Aliases = std::unordered_map<String, ASTPtr>;
QueryNormalizer(ASTPtr & query, const Aliases & aliases, const Settings & settings, const Names & all_columns_name,
const TableNamesAndColumnsName & table_names_and_columns_name);
const TableNamesAndColumnNames & table_names_and_column_names);
void perform();
@ -27,8 +27,8 @@ private:
ASTPtr & query;
const Aliases & aliases;
const Settings & settings;
const Names & all_columns_name;
const std::vector<std::pair<DatabaseAndTableWithAlias, Names>> & table_names_and_columns_name;
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);
};