mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
dbms: handle ALIAS columns differently, support them in ARRAY JOIN. [#METR-18221]
This commit is contained in:
parent
1d4691af54
commit
37ba429c1e
@ -208,6 +208,9 @@ private:
|
||||
*/
|
||||
void collectJoinedColumns(NameSet & joined_columns, NamesAndTypesList & joined_columns_name_type);
|
||||
|
||||
/** Добавляет ALIAS столбцы из storage в aliases, если запрос не является SELECT с ARRAY JOIN. При наличии
|
||||
* ARRAY JOIN их добавлять нельзя, иначе ломается логика его выполнения.
|
||||
*/
|
||||
void addStorageAliases();
|
||||
|
||||
/** Создать словарь алиасов.
|
||||
@ -229,6 +232,9 @@ private:
|
||||
/// Превратить перечисление значений или подзапрос в ASTSet. node - функция in или notIn.
|
||||
void makeSet(ASTFunction * node, const Block & sample_block);
|
||||
|
||||
/// Добавляет список ALIAS столбцов из таблицы
|
||||
void addAliasColumns();
|
||||
|
||||
/// Замена скалярных подзапросов на значения-константы.
|
||||
void executeScalarSubqueries();
|
||||
void executeScalarSubqueriesImpl(ASTPtr & ast);
|
||||
|
@ -117,15 +117,18 @@ void ExpressionAnalyzer::init()
|
||||
/// Оптимизирует логические выражения.
|
||||
LogicalExpressionsOptimizer(select_query, settings).perform();
|
||||
|
||||
/// Добавляет в множество известных алиасов те, которые объявлены в структуре таблицы (ALIAS-столбцы).
|
||||
addStorageAliases();
|
||||
|
||||
/// Создаёт словарь aliases: alias -> ASTPtr
|
||||
addASTAliases(ast);
|
||||
|
||||
/// Добавляет ALIAS столбцы из стаблицы в aliases, если применимо.
|
||||
addStorageAliases();
|
||||
|
||||
/// Common subexpression elimination. Rewrite rules.
|
||||
normalizeTree();
|
||||
|
||||
/// ALIAS столбцы не должны подставляться вместо ASTAsterisk, добавим их теперь, после normalizeTree.
|
||||
addAliasColumns();
|
||||
|
||||
/// Выполнение скалярных подзапросов - замена их на значения-константы.
|
||||
executeScalarSubqueries();
|
||||
|
||||
@ -317,12 +320,17 @@ NamesAndTypesList::iterator ExpressionAnalyzer::findColumn(const String & name,
|
||||
|
||||
void ExpressionAnalyzer::addStorageAliases()
|
||||
{
|
||||
if (select_query && select_query->array_join_expression_list)
|
||||
return;
|
||||
|
||||
if (!storage)
|
||||
return;
|
||||
|
||||
/// @todo: consider storing default expressions with alias set to avoid cloning
|
||||
/// Добавляем ALIAS из таблицы, только если такого ALIAS еще не объявлено в запросе.
|
||||
for (const auto & alias : storage->alias_columns)
|
||||
(aliases[alias.name] = storage->column_defaults[alias.name].expression->clone())->setAlias(alias.name);
|
||||
if (!aliases.count(alias.name))
|
||||
aliases[alias.name] = setAlias(storage->column_defaults[alias.name].expression->clone(), alias.name);
|
||||
}
|
||||
|
||||
|
||||
@ -566,6 +574,18 @@ void ExpressionAnalyzer::normalizeTreeImpl(
|
||||
}
|
||||
|
||||
|
||||
void ExpressionAnalyzer::addAliasColumns()
|
||||
{
|
||||
if (!(select_query && select_query->array_join_expression_list))
|
||||
return;
|
||||
|
||||
if (!storage)
|
||||
return;
|
||||
|
||||
columns.insert(std::end(columns), std::begin(storage->alias_columns), std::end(storage->alias_columns));
|
||||
}
|
||||
|
||||
|
||||
void ExpressionAnalyzer::executeScalarSubqueries()
|
||||
{
|
||||
if (!select_query)
|
||||
@ -2256,19 +2276,6 @@ void ExpressionAnalyzer::collectUsedColumns()
|
||||
++it;
|
||||
}
|
||||
|
||||
for (NamesAndTypesList::iterator it = columns.begin(); it != columns.end();)
|
||||
{
|
||||
unknown_required_columns.erase(it->name);
|
||||
|
||||
if (!required.count(it->name))
|
||||
{
|
||||
required.erase(it->name);
|
||||
columns.erase(it++);
|
||||
}
|
||||
else
|
||||
++it;
|
||||
}
|
||||
|
||||
/// Возможно, среди неизвестных столбцов есть виртуальные. Удаляем их из списка неизвестных и добавляем
|
||||
/// в columns list, чтобы при дальнейшей обработке запроса они воспринимались как настоящие.
|
||||
if (storage)
|
||||
|
@ -34,6 +34,7 @@
|
||||
|
||||
#include <DB/Core/Field.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
@ -650,6 +651,37 @@ QueryProcessingStage::Enum InterpreterSelectQuery::executeFetchColumns()
|
||||
|
||||
/// Список столбцов, которых нужно прочитать, чтобы выполнить запрос.
|
||||
Names required_columns = query_analyzer->getRequiredColumns();
|
||||
/// Действия для вычисления ALIAS, если потребуется.
|
||||
ExpressionActionsPtr alias_actions;
|
||||
/// Требуются ли ALIAS столбцы для выполнения запроса?
|
||||
auto alias_columns_required = false;
|
||||
|
||||
if (storage && !storage->alias_columns.empty())
|
||||
{
|
||||
for (const auto & column : required_columns)
|
||||
{
|
||||
const auto default_it = storage->column_defaults.find(column);
|
||||
if (default_it != std::end(storage->column_defaults) && default_it->second.type == ColumnDefaultType::Alias)
|
||||
{
|
||||
alias_columns_required = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (alias_columns_required)
|
||||
{
|
||||
/// Составим выражение для возврата всех запрошенных столбцов, с вычислением требуемых ALIAS столбцов.
|
||||
ASTPtr required_columns_expr_list{new ASTExpressionList};
|
||||
|
||||
for (const auto & column : required_columns)
|
||||
required_columns_expr_list->children.emplace_back(new ASTIdentifier{{}, column});
|
||||
|
||||
alias_actions = ExpressionAnalyzer{required_columns_expr_list, context, storage, table_column_names}.getActions(true);
|
||||
|
||||
/// Множество требуемых столбцов могло быть дополнено в результате добавления действия для вычисления ALIAS.
|
||||
required_columns = alias_actions->getRequiredColumns();
|
||||
}
|
||||
}
|
||||
|
||||
if (query.table && typeid_cast<ASTSelectQuery *>(query.table.get()))
|
||||
{
|
||||
@ -761,6 +793,13 @@ QueryProcessingStage::Enum InterpreterSelectQuery::executeFetchColumns()
|
||||
context, settings_for_storage, from_stage,
|
||||
settings.max_block_size, max_streams);
|
||||
|
||||
if (alias_actions)
|
||||
/// Обернем каждый поток, возвращенный из таблицы, с целью вычисления и добавления ALIAS столбцов
|
||||
transformStreams([&] (auto & stream)
|
||||
{
|
||||
stream = new ExpressionBlockInputStream{stream, alias_actions};
|
||||
});
|
||||
|
||||
transformStreams([&](auto & stream)
|
||||
{
|
||||
stream->addTableLock(table_lock);
|
||||
|
@ -0,0 +1,189 @@
|
||||
-- Ensure ALIAS columns are not selected by asterisk
|
||||
0000-00-00 0 ['zero','one','two'] ['zero','one','two'] ['zero','one','two']
|
||||
-- select DEFAULT and ALIAS arrays
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
-- select DEFAULT and ALIAS nested columns
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
zero zero
|
||||
one one
|
||||
two two
|
||||
zero ['zero','one','two']
|
||||
one ['zero','one','two']
|
||||
two ['zero','one','two']
|
||||
['zero','one','two'] zero
|
||||
['zero','one','two'] one
|
||||
['zero','one','two'] two
|
||||
-- array join, but request the original columns
|
||||
['zero','one','two'] ['zero','one','two']
|
||||
['zero','one','two'] ['zero','one','two']
|
||||
['zero','one','two'] ['zero','one','two']
|
||||
-- array join, do not use the result
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
-- select DEFAULT and ALIAS arrays, array joining one at a time
|
||||
['zero','one','two'] zero ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] one ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] two ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] zero ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] one ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] two ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] zero ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] one ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] two ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] zero ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] one ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] two ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 0 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 1 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 2 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 0 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 1 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 2 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 2
|
||||
-- select DEFAULT and ALIAS arrays, array joining one at a time and aliasing result with original name
|
||||
['zero','one','two'] zero ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] one ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] two ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] zero ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] one ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] two ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] zero ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] one ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] two ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] zero ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] one ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] two ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 0 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 1 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 2 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 0 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 1 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 2 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 2
|
||||
-- select DEFAULT and ALIAS arrays and array join result, aliased as `joined`
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] zero
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] one
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] two
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] zero
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] one
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] two
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] zero
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] one
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] two
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] zero
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] one
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] two
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 2
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 2
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 2
|
||||
-- select DEFAULT and ALIAS nested columns, array joining one at a time
|
||||
['zero','one','two'] zero ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] one ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] two ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] zero ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] one ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] two ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] zero ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] one ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] two ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] zero ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] one ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] two ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 0 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 1 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 2 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 0 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 1 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 2 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 2
|
||||
-- select DEFAULT and ALIAS nested columns, array joining one at a time and aliasing result with original name
|
||||
['zero','one','two'] zero ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] one ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] two ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] zero ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] one ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] two ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] zero ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] one ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] two ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] zero ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] one ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] two ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 0 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 1 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] 2 ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 0 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 1 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] 2 ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] 2
|
||||
-- select DEFAULT and ALIAS nested columns and array join result, aliased as `joined`
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] zero
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] one
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] two
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] zero
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] one
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] two
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] zero
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] one
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] two
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] zero
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] one
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] two
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 2
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 2
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] 2
|
||||
-- array join whole nested table
|
||||
['zero','one','two'] zero zero zero zero 0 0 0
|
||||
['zero','one','two'] one one one one 1 1 1
|
||||
['zero','one','two'] two two two two 2 2 2
|
||||
-- array join whole nested table not using the result
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
-- array join whole nested table, aliasing with original name
|
||||
['zero','one','two'] zero zero zero zero 0 0 0
|
||||
['zero','one','two'] one one one one 1 1 1
|
||||
['zero','one','two'] two two two two 2 2 2
|
||||
-- array join whole nested table, aliasing with original name not using the result
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
-- array join whole nested table, aliasing as `class`
|
||||
['zero','one','two'] zero zero zero zero 0 0 0
|
||||
['zero','one','two'] one one one one 1 1 1
|
||||
['zero','one','two'] two two two two 2 2 2
|
||||
-- array join whole nested table, aliasing as `class` and not using the result
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
['zero','one','two']
|
||||
-- array join whole nested table, aliasing as `class` but requesting the original columns
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2']
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] zero zero zero zero 0 0 0
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] one one one one 1 1 1
|
||||
['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['zero','one','two'] ['0','1','2'] ['0','1','2'] ['0','1','2'] two two two two 2 2 2
|
@ -0,0 +1,114 @@
|
||||
drop table if exists aliases_test;
|
||||
|
||||
create table aliases_test (
|
||||
date Date, id UInt64,
|
||||
array default ['zero','one','two'],
|
||||
d1 default array,
|
||||
a1 alias array, a2 alias a1, a3 alias a2,
|
||||
a4 alias arrayMap(x -> toString(x), range(3)), a5 alias a4, a6 alias a5,
|
||||
`struct.d1` default array,
|
||||
`struct.a1` alias array, `struct.a2` alias struct.a1, `struct.a3` alias struct.a2,
|
||||
`struct.a4` alias arrayMap(x -> toString(x), range(3)), `struct.a5` alias struct.a4, `struct.a6` alias struct.a5
|
||||
) engine=MergeTree(date, id, 1);
|
||||
|
||||
insert into aliases_test (id) values (0);
|
||||
|
||||
select '-- Ensure ALIAS columns are not selected by asterisk';
|
||||
select * from aliases_test;
|
||||
|
||||
select '-- select DEFAULT and ALIAS arrays';
|
||||
select d1, a1, a2, a3, a4, a5, a6 from aliases_test;
|
||||
select '-- select DEFAULT and ALIAS nested columns';
|
||||
select struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test;
|
||||
|
||||
select d1, a1 from aliases_test array join d1, a1;
|
||||
select d1, a1 from aliases_test array join d1, a1 as a2;
|
||||
select d1, a1 from aliases_test array join d1 as d2, a1;
|
||||
select '-- array join, but request the original columns';
|
||||
select d1, a1 from aliases_test array join d1 as d2, a1 as a2;
|
||||
|
||||
select '-- array join, do not use the result';
|
||||
select array from aliases_test array join d1, a1;
|
||||
select array from aliases_test array join d1 as d2, a1 as a1;
|
||||
|
||||
select '-- select DEFAULT and ALIAS arrays, array joining one at a time';
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join d1;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a1;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a2;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a3;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a4;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a5;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a6;
|
||||
|
||||
select '-- select DEFAULT and ALIAS arrays, array joining one at a time and aliasing result with original name';
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join d1 as d1;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a1 as a1;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a2 as a2;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a3 as a3;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a4 as a4;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a5 as a5;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6 from aliases_test array join a6 as a6;
|
||||
|
||||
select '-- select DEFAULT and ALIAS arrays and array join result, aliased as `joined`';
|
||||
select array, d1, a1, a2, a3, a4, a5, a6, joined from aliases_test array join d1 as joined;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6, joined from aliases_test array join a1 as joined;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6, joined from aliases_test array join a2 as joined;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6, joined from aliases_test array join a3 as joined;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6, joined from aliases_test array join a4 as joined;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6, joined from aliases_test array join a5 as joined;
|
||||
select array, d1, a1, a2, a3, a4, a5, a6, joined from aliases_test array join a6 as joined;
|
||||
|
||||
select '-- select DEFAULT and ALIAS nested columns, array joining one at a time';
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.d1;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a1;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a2;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a3;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a4;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a5;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a6;
|
||||
|
||||
select '-- select DEFAULT and ALIAS nested columns, array joining one at a time and aliasing result with original name';
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.d1 as `struct.d1`;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a1 as `struct.a1`;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a2 as `struct.a2`;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a3 as `struct.a3`;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a4 as `struct.a4`;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a5 as `struct.a5`;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct.a6 as `struct.a6`;
|
||||
|
||||
select '-- select DEFAULT and ALIAS nested columns and array join result, aliased as `joined`';
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6, joined from aliases_test array join struct.d1 as joined;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6, joined from aliases_test array join struct.a1 as joined;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6, joined from aliases_test array join struct.a2 as joined;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6, joined from aliases_test array join struct.a3 as joined;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6, joined from aliases_test array join struct.a4 as joined;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6, joined from aliases_test array join struct.a5 as joined;
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6, joined from aliases_test array join struct.a6 as joined;
|
||||
|
||||
select '-- array join whole nested table';
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct;
|
||||
|
||||
select '-- array join whole nested table not using the result';
|
||||
select array from aliases_test array join struct;
|
||||
|
||||
select '-- array join whole nested table, aliasing with original name';
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct as struct;
|
||||
|
||||
select '-- array join whole nested table, aliasing with original name not using the result';
|
||||
select array from aliases_test array join struct as struct;
|
||||
|
||||
select '-- array join whole nested table, aliasing as `class`';
|
||||
select array, class.d1, class.a1, class.a2, class.a3, class.a4, class.a5, class.a6 from aliases_test array join struct as class;
|
||||
|
||||
select '-- array join whole nested table, aliasing as `class` and not using the result';
|
||||
select array from aliases_test array join struct as class;
|
||||
|
||||
select '-- array join whole nested table, aliasing as `class` but requesting the original columns';
|
||||
select array, struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6 from aliases_test array join struct as class;
|
||||
|
||||
select array,
|
||||
struct.d1, struct.a1, struct.a2, struct.a3, struct.a4, struct.a5, struct.a6,
|
||||
class.d1, class.a1, class.a2, class.a3, class.a4, class.a5, class.a6
|
||||
from aliases_test array join struct as class;
|
||||
|
||||
drop table aliases_test;
|
14
dbms/tests/queries/0_stateless/00262_alter_alias.reference
Normal file
14
dbms/tests/queries/0_stateless/00262_alter_alias.reference
Normal file
@ -0,0 +1,14 @@
|
||||
[0,1,2]
|
||||
[0,1,2]
|
||||
[0,1,2]
|
||||
[0,1,2] [0,1,2]
|
||||
[0,1,2] [0,1,2]
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
||||
0 0
|
||||
1 1
|
||||
2 2
|
24
dbms/tests/queries/0_stateless/00262_alter_alias.sql
Normal file
24
dbms/tests/queries/0_stateless/00262_alter_alias.sql
Normal file
@ -0,0 +1,24 @@
|
||||
drop table if exists aliases_test;
|
||||
|
||||
create table aliases_test (date default today(), id default rand(), array default [0, 1, 2]) engine=MergeTree(date, id, 1);
|
||||
|
||||
insert into aliases_test (id) values (0);
|
||||
select array from aliases_test;
|
||||
|
||||
alter table aliases_test modify column array alias [0, 1, 2];
|
||||
select array from aliases_test;
|
||||
|
||||
alter table aliases_test modify column array default [0, 1, 2];
|
||||
select array from aliases_test;
|
||||
|
||||
alter table aliases_test add column struct.key default [0, 1, 2], add column struct.value default array;
|
||||
select struct.key, struct.value from aliases_test;
|
||||
|
||||
alter table aliases_test modify column struct.value alias array;
|
||||
select struct.key, struct.value from aliases_test;
|
||||
|
||||
select struct.key, struct.value from aliases_test array join struct;
|
||||
select struct.key, struct.value from aliases_test array join struct as struct;
|
||||
select class.key, class.value from aliases_test array join struct as class;
|
||||
|
||||
drop table aliases_test;
|
Loading…
Reference in New Issue
Block a user