dbms: fixed error with multiple GLOBAL subqueries [#METR-17622].

This commit is contained in:
Alexey Milovidov 2015-08-15 00:07:17 +03:00
parent 4724de39bd
commit 3fbb61cbad
3 changed files with 13 additions and 7 deletions

View File

@ -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);
/** Заменяем подзапрос на имя временной таблицы. /** Заменяем подзапрос на имя временной таблицы.
* Именно в таком виде, запрос отправится на удалённый сервер. * Именно в таком виде, запрос отправится на удалённый сервер.
* На удалённый сервер отправится эта временная таблица, и на его стороне, * На удалённый сервер отправится эта временная таблица, и на его стороне,

View File

@ -0,0 +1 @@
1 1

View File

@ -0,0 +1 @@
SELECT 1 GLOBAL IN (SELECT 1), 2 GLOBAL IN (SELECT 2) FROM remote('127.0.0.2', system.one);