mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-18 04:12:19 +00:00
dbms: fixed error with multiple GLOBAL subqueries [#METR-17622].
This commit is contained in:
parent
4724de39bd
commit
3fbb61cbad
@ -239,9 +239,10 @@ void ExpressionAnalyzer::analyzeAggregation()
|
|||||||
|
|
||||||
void ExpressionAnalyzer::initGlobalSubqueriesAndExternalTables()
|
void ExpressionAnalyzer::initGlobalSubqueriesAndExternalTables()
|
||||||
{
|
{
|
||||||
|
/// Преобразует GLOBAL-подзапросы во внешние таблицы; кладёт их в словарь external_tables: name -> StoragePtr.
|
||||||
initGlobalSubqueries(ast);
|
initGlobalSubqueries(ast);
|
||||||
|
|
||||||
/// Создаёт словарь external_tables: name -> StoragePtr.
|
/// Добавляет уже существующие внешние таблицы (не подзапросы) в словарь external_tables.
|
||||||
findExternalTables(ast);
|
findExternalTables(ast);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -896,10 +897,6 @@ static SharedPtr<InterpreterSelectQuery> interpretSubquery(
|
|||||||
|
|
||||||
void ExpressionAnalyzer::addExternalStorage(ASTPtr & subquery_or_table_name)
|
void ExpressionAnalyzer::addExternalStorage(ASTPtr & subquery_or_table_name)
|
||||||
{
|
{
|
||||||
/// Сгенерируем имя для внешней таблицы.
|
|
||||||
while (context.tryGetExternalTable("_data" + toString(external_table_id)))
|
|
||||||
++external_table_id;
|
|
||||||
|
|
||||||
if (const ASTIdentifier * table = typeid_cast<const ASTIdentifier *>(&*subquery_or_table_name))
|
if (const ASTIdentifier * table = typeid_cast<const ASTIdentifier *>(&*subquery_or_table_name))
|
||||||
{
|
{
|
||||||
/// Если это уже внешняя таблица, ничего заполять не нужно. Просто запоминаем ее наличие.
|
/// Если это уже внешняя таблица, ничего заполять не нужно. Просто запоминаем ее наличие.
|
||||||
@ -910,13 +907,20 @@ void ExpressionAnalyzer::addExternalStorage(ASTPtr & subquery_or_table_name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Сгенерируем имя для внешней таблицы.
|
||||||
|
String external_table_name = "_data" + toString(external_table_id);
|
||||||
|
while (context.tryGetExternalTable(external_table_name)
|
||||||
|
|| external_tables.count(external_table_name))
|
||||||
|
{
|
||||||
|
++external_table_id;
|
||||||
|
external_table_name = "_data" + toString(external_table_id);
|
||||||
|
}
|
||||||
|
|
||||||
SharedPtr<InterpreterSelectQuery> interpreter = interpretSubquery(subquery_or_table_name, context, subquery_depth + 1);
|
SharedPtr<InterpreterSelectQuery> interpreter = interpretSubquery(subquery_or_table_name, context, subquery_depth + 1);
|
||||||
|
|
||||||
Block sample = interpreter->getSampleBlock();
|
Block sample = interpreter->getSampleBlock();
|
||||||
NamesAndTypesListPtr columns = new NamesAndTypesList(sample.getColumnsList());
|
NamesAndTypesListPtr columns = new NamesAndTypesList(sample.getColumnsList());
|
||||||
|
|
||||||
String external_table_name = "_data" + toString(external_table_id);
|
|
||||||
|
|
||||||
/** Заменяем подзапрос на имя временной таблицы.
|
/** Заменяем подзапрос на имя временной таблицы.
|
||||||
* Именно в таком виде, запрос отправится на удалённый сервер.
|
* Именно в таком виде, запрос отправится на удалённый сервер.
|
||||||
* На удалённый сервер отправится эта временная таблица, и на его стороне,
|
* На удалённый сервер отправится эта временная таблица, и на его стороне,
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
1 1
|
@ -0,0 +1 @@
|
|||||||
|
SELECT 1 GLOBAL IN (SELECT 1), 2 GLOBAL IN (SELECT 2) FROM remote('127.0.0.2', system.one);
|
Loading…
Reference in New Issue
Block a user