ExpressionAnalyzer.cpp 61.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
#include <DB/DataTypes/FieldToDataType.h>

#include <DB/Parsers/ASTFunction.h>
#include <DB/Parsers/ASTIdentifier.h>
#include <DB/Parsers/ASTLiteral.h>
#include <DB/Parsers/ASTAsterisk.h>
#include <DB/Parsers/ASTExpressionList.h>
#include <DB/Parsers/ASTSelectQuery.h>
#include <DB/Parsers/ASTSubquery.h>
#include <DB/Parsers/ASTSet.h>
11
#include <DB/Parsers/ASTOrderByElement.h>
12
#include <DB/Parsers/ParserSelectQuery.h>
13 14 15 16

#include <DB/DataTypes/DataTypeSet.h>
#include <DB/DataTypes/DataTypeTuple.h>
#include <DB/DataTypes/DataTypeExpression.h>
17
#include <DB/DataTypes/DataTypeNested.h>
18 19 20 21 22 23 24 25
#include <DB/Columns/ColumnSet.h>
#include <DB/Columns/ColumnExpression.h>

#include <DB/Interpreters/InterpreterSelectQuery.h>
#include <DB/Interpreters/ExpressionAnalyzer.h>

#include <DB/Storages/StorageMergeTree.h>
#include <DB/Storages/StorageDistributed.h>
26
#include <DB/Storages/StorageMemory.h>
27
#include <DB/Storages/StorageReplicatedMergeTree.h>
28 29 30 31

#include <DB/DataStreams/copyData.h>

#include <DB/Parsers/formatAST.h>
32 33 34 35 36 37


namespace DB
{


A
Alexey Milovidov 已提交
38
static std::string * getAlias(ASTPtr & ast)
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
{
	if (ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast))
	{
		return &node->alias;
	}
	else if (ASTIdentifier * node = dynamic_cast<ASTIdentifier *>(&*ast))
	{
		return &node->alias;
	}
	else if (ASTLiteral * node = dynamic_cast<ASTLiteral *>(&*ast))
	{
		return &node->alias;
	}
	else
	{
A
Alexey Milovidov 已提交
54
		return nullptr;
55 56 57
	}
}

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
static void setAlias(ASTPtr & ast, const std::string & alias)
{
	if (ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast))
	{
		node->alias = alias;
	}
	else if (ASTIdentifier * node = dynamic_cast<ASTIdentifier *>(&*ast))
	{
		node->alias = alias;
	}
	else if (ASTLiteral * node = dynamic_cast<ASTLiteral *>(&*ast))
	{
		node->alias = alias;
	}
	else
	{
		throw Exception("Can't set alias of " + ast->getColumnName(), ErrorCodes::UNKNOWN_TYPE_OF_AST_NODE);
	}
}

78 79 80 81

void ExpressionAnalyzer::init()
{
	select_query = dynamic_cast<ASTSelectQuery *>(&*ast);
82

83 84
	createAliasesDict(ast); /// Если есть агрегатные функции, присвоит has_aggregation=true.
	normalizeTree();
85

86 87
	findExternalTables(ast);

88
	getArrayJoinedColumns();
89

90 91
	removeUnusedColumns();

92
	/// Найдем агрегатные функции.
93 94
	if (select_query && (select_query->group_expression_list || select_query->having_expression))
		has_aggregation = true;
95

96
	ExpressionActions temp_actions(columns, settings);
97 98 99

	if (select_query && select_query->array_join_expression_list)
	{
100
		getRootActionsImpl(select_query->array_join_expression_list, true, false, temp_actions);
101
		addMultipleArrayJoinAction(temp_actions);
102
	}
103

104 105 106
	if (select_query && select_query->join)
	{
		getRootActionsImpl(dynamic_cast<ASTJoin &>(*select_query->join).using_expr_list, true, false, temp_actions);
107
		addJoinAction(temp_actions, true);
108 109
	}

110
	getAggregatesImpl(ast, temp_actions);
111

112 113
	if (has_aggregation)
	{
114
		assertSelect();
115

116 117 118
		/// Найдем ключи агрегации.
		if (select_query->group_expression_list)
		{
119
			NameSet unique_keys;
120 121 122
			const ASTs & group_asts = select_query->group_expression_list->children;
			for (size_t i = 0; i < group_asts.size(); ++i)
			{
123
				getRootActionsImpl(group_asts[i], true, false, temp_actions);
124 125
				NameAndTypePair key;
				key.first = group_asts[i]->getColumnName();
126
				key.second = temp_actions.getSampleBlock().getByName(key.first).type;
127
				aggregation_keys.push_back(key);
128

129 130 131 132 133
				if (!unique_keys.count(key.first))
				{
					aggregated_columns.push_back(key);
					unique_keys.insert(key.first);
				}
134 135
			}
		}
136

137 138 139 140 141 142 143 144
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
		{
			AggregateDescription & desc = aggregate_descriptions[i];
			aggregated_columns.push_back(NameAndTypePair(desc.column_name, desc.function->getReturnType()));
		}
	}
	else
	{
145
		aggregated_columns = temp_actions.getSampleBlock().getColumnsList();
146 147 148 149
	}
}


A
Alexey Milovidov 已提交
150
NamesAndTypesList::iterator ExpressionAnalyzer::findColumn(const String & name, NamesAndTypesList & cols)
151
{
A
Alexey Milovidov 已提交
152 153
	return std::find_if(cols.begin(), cols.end(),
		[&](const NamesAndTypesList::value_type & val) { return val.first == name; });
154 155 156
}


157 158
/// ignore_levels - алиасы в скольки верхних уровнях поддерева нужно игнорировать.
/// Например, при ignore_levels=1 ast не может быть занесен в словарь, но его дети могут.
159
void ExpressionAnalyzer::createAliasesDict(ASTPtr & ast, int ignore_levels)
160
{
161
	ASTSelectQuery * select = dynamic_cast<ASTSelectQuery *>(&*ast);
162

163 164
	/// Обход снизу-вверх. Не опускаемся в подзапросы.
	for (ASTs::iterator it = ast->children.begin(); it != ast->children.end(); ++it)
165 166
	{
		int new_ignore_levels = std::max(0, ignore_levels - 1);
A
Alexey Milovidov 已提交
167

168 169
		/// Алиасы верхнего уровня в секции ARRAY JOIN имеют особый смысл, их добавлять не будем
		///  (пропустим сам expression list и его детей).
170 171
		if (select && *it == select->array_join_expression_list)
			new_ignore_levels = 2;
A
Alexey Milovidov 已提交
172

173
		if (!dynamic_cast<ASTSelectQuery *>(&**it))
174 175 176 177 178 179
			createAliasesDict(*it, new_ignore_levels);
	}

	if (ignore_levels > 0)
		return;

A
Alexey Milovidov 已提交
180
	std::string * alias = getAlias(ast);
181 182 183 184
	if (alias && !alias->empty())
	{
		if (aliases.count(*alias) && ast->getTreeID() != aliases[*alias]->getTreeID())
			throw Exception("Different expressions with the same alias " + *alias, ErrorCodes::MULTIPLE_EXPRESSIONS_FOR_ALIAS);
A
Alexey Milovidov 已提交
185 186

		aliases[*alias] = ast;
187 188 189 190 191 192 193 194
	}
}


StoragePtr ExpressionAnalyzer::getTable()
{
	if (const ASTSelectQuery * select = dynamic_cast<const ASTSelectQuery *>(&*ast))
	{
195
		if (select->table && !dynamic_cast<const ASTSelectQuery *>(&*select->table) && !dynamic_cast<const ASTFunction *>(&*select->table))
196
		{
A
Alexey Milovidov 已提交
197 198 199
			String database = select->database
				? dynamic_cast<const ASTIdentifier &>(*select->database).name
				: "";
200 201 202 203
			const String & table = dynamic_cast<const ASTIdentifier &>(*select->table).name;
			return context.tryGetTable(database, table);
		}
	}
A
Alexey Milovidov 已提交
204

205 206 207 208 209 210 211 212
	return StoragePtr();
}


void ExpressionAnalyzer::normalizeTree()
{
	SetOfASTs tmp_set;
	MapOfASTs tmp_map;
213
	normalizeTreeImpl(ast, tmp_map, tmp_set, "");
214 215 216 217 218
}


/// finished_asts - уже обработанные вершины (и на что они заменены)
/// current_asts - вершины в текущем стеке вызовов этого метода
219
/// current_alias - алиас, повешенный на предка ast (самого глубокого из предков с алиасами)
220
void ExpressionAnalyzer::normalizeTreeImpl(ASTPtr & ast, MapOfASTs & finished_asts, SetOfASTs & current_asts, std::string current_alias)
221 222 223 224 225 226
{
	if (finished_asts.count(ast))
	{
		ast = finished_asts[ast];
		return;
	}
227

228 229
	ASTPtr initial_ast = ast;
	current_asts.insert(initial_ast);
230

M
Merge  
Michael Kolupaev 已提交
231 232
	std::string * my_alias = getAlias(ast);
	if (my_alias && !my_alias->empty())
233
		current_alias = *my_alias;
234

235
	/// rewrite правила, которые действуют при обходе сверху-вниз.
236 237
	bool replaced = false;

238 239 240
	if (ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast))
	{
		/** Нет ли в таблице столбца, название которого полностью совпадает с записью функции?
A
Alexey Milovidov 已提交
241 242
		  * Например, в таблице есть столбец "domain(URL)", и мы запросили domain(URL).
		  */
243 244 245 246 247 248 249
		String function_string = node->getColumnName();
		NamesAndTypesList::const_iterator it = findColumn(function_string);
		if (columns.end() != it)
		{
			ASTIdentifier * ast_id = new ASTIdentifier(node->range, std::string(node->range.first, node->range.second));
			ast = ast_id;
			current_asts.insert(ast);
250
			replaced = true;
251
		}
252
		/// может быть указано in t, где t - таблица, что равносильно select * from t.
253
		if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
254 255
			if (ASTIdentifier * right = dynamic_cast<ASTIdentifier *>(&*node->arguments->children[1]))
				right->kind = ASTIdentifier::Table;
256 257
	}
	else if (ASTIdentifier * node = dynamic_cast<ASTIdentifier *>(&*ast))
258
	{
259
		if (node->kind == ASTIdentifier::Column)
260
		{
M
Merge  
Michael Kolupaev 已提交
261
			/// Если это алиас, но не родительский алиас (чтобы работали конструкции вроде "SELECT column+1 AS column").
262
			Aliases::const_iterator jt = aliases.find(node->name);
M
Merge  
Michael Kolupaev 已提交
263
			if (jt != aliases.end() && current_alias != node->name)
264
			{
265
				/// Заменим его на соответствующий узел дерева.
266 267
				if (current_asts.count(jt->second))
					throw Exception("Cyclic aliases", ErrorCodes::CYCLIC_ALIASES);
268 269 270 271 272 273 274 275 276 277 278 279
				if (my_alias && !my_alias->empty() && *my_alias != jt->second->getAlias())
				{
					/// В конструкции вроде "a AS b", где a - алиас, нужно перевесить алиас b на результат подстановки алиаса a.
					ast = jt->second->clone();
					setAlias(ast, *my_alias);
				}
				else
				{
					ast = jt->second;
				}

				replaced = true;
280 281 282 283 284 285 286 287 288 289 290 291
			}
		}
	}
	else if (ASTExpressionList * node = dynamic_cast<ASTExpressionList *>(&*ast))
	{
		/// Заменим * на список столбцов.
		ASTs & asts = node->children;
		for (int i = static_cast<int>(asts.size()) - 1; i >= 0; --i)
		{
			if (ASTAsterisk * asterisk = dynamic_cast<ASTAsterisk *>(&*asts[i]))
			{
				ASTs all_columns;
A
Alexey Milovidov 已提交
292 293 294
				for (const auto & column_name_type : columns)
					all_columns.push_back(new ASTIdentifier(asterisk->range, column_name_type.first));

295 296 297 298 299
				asts.erase(asts.begin() + i);
				asts.insert(asts.begin() + i, all_columns.begin(), all_columns.end());
			}
		}
	}
300

301 302 303
	/// Если заменили корень поддерева вызовемся для нового корня снова - на случай, если алиас заменился на алиас.
	if (replaced)
	{
304
		normalizeTreeImpl(ast, finished_asts, current_asts, current_alias);
305 306 307 308 309 310
		current_asts.erase(initial_ast);
		current_asts.erase(ast);
		finished_asts[initial_ast] = ast;
		return;
	}

311
	/// Рекурсивные вызовы. Не опускаемся в подзапросы.
312

313 314
	for (ASTs::iterator it = ast->children.begin(); it != ast->children.end(); ++it)
		if (!dynamic_cast<ASTSelectQuery *>(&**it))
315
			normalizeTreeImpl(*it, finished_asts, current_asts, current_alias);
316

317 318 319
	/// Если секция WHERE или HAVING состоит из одного алиаса, ссылку нужно заменить не только в children, но и в where_expression и having_expression.
	if (ASTSelectQuery * select = dynamic_cast<ASTSelectQuery *>(&*ast))
	{
320
		if (select->prewhere_expression)
321
			normalizeTreeImpl(select->prewhere_expression, finished_asts, current_asts, current_alias);
322
		if (select->where_expression)
323
			normalizeTreeImpl(select->where_expression, finished_asts, current_asts, current_alias);
324
		if (select->having_expression)
325
			normalizeTreeImpl(select->having_expression, finished_asts, current_asts, current_alias);
326
	}
327

M
Merge  
Michael Kolupaev 已提交
328 329
	/// Действия, выполняемые снизу вверх.

330
	if (ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast))
331
	{
332 333 334 335
		if (node->kind == ASTFunction::TABLE_FUNCTION)
		{
		}
		else if (node->name == "lambda")
336
		{
337
			node->kind = ASTFunction::LAMBDA_EXPRESSION;
338 339 340
		}
		else if (context.getAggregateFunctionFactory().isAggregateFunctionName(node->name))
		{
341
			node->kind = ASTFunction::AGGREGATE_FUNCTION;
342
		}
343 344 345 346 347 348 349 350
		else if (node->name == "arrayJoin")
		{
			node->kind = ASTFunction::ARRAY_JOIN;
		}
		else
		{
			node->kind = ASTFunction::FUNCTION;
		}
351 352 353

		if (do_global && (node->name == "globalIn" || node->name == "globalNotIn"))
			addExternalStorage(node);
354
	}
355

356 357 358 359 360
	current_asts.erase(initial_ast);
	current_asts.erase(ast);
	finished_asts[initial_ast] = ast;
}

A
Alexey Milovidov 已提交
361

362
void ExpressionAnalyzer::makeSetsForIndex()
P
Pavel Kartavyy 已提交
363
{
364
	if (storage && ast && storage->supportsIndexForIn())
A
Alexey Milovidov 已提交
365
		makeSetsForIndexImpl(ast, storage->getSampleBlock());
P
Pavel Kartavyy 已提交
366 367
}

A
Alexey Milovidov 已提交
368
void ExpressionAnalyzer::makeSetsForIndexImpl(ASTPtr & node, const Block & sample_block)
P
Pavel Kartavyy 已提交
369 370
{
	for (auto & child : node->children)
A
Alexey Milovidov 已提交
371
		makeSetsForIndexImpl(child, sample_block);
P
Pavel Kartavyy 已提交
372 373 374 375 376 377 378

	ASTFunction * func = dynamic_cast<ASTFunction *>(node.get());
	if (func && func->kind == ASTFunction::FUNCTION && (func->name == "in" || func->name == "notIn"))
	{
		IAST & args = *func->arguments;
		ASTPtr & arg = args.children[1];

379
		if (!dynamic_cast<ASTSet *>(&*arg) && !dynamic_cast<ASTSubquery *>(&*arg) && !dynamic_cast<ASTIdentifier *>(&*arg))
380 381 382
		{
			try
			{
383
				makeExplicitSet(func, sample_block, true);
384 385 386 387 388 389 390 391
			}
			catch (const DB::Exception & e)
			{
				/// в sample_block нет колонок, которые добаляет getActions
				if (e.code() != ErrorCodes::NOT_FOUND_COLUMN_IN_BLOCK)
					throw;
			}
		}
P
Pavel Kartavyy 已提交
392 393
	}
}
394

395

396 397 398 399 400 401 402 403 404 405
void ExpressionAnalyzer::findExternalTables(ASTPtr & ast)
{
	/// Рекурсивные вызовы. Намеренно опускаемся в подзапросы.
	for (ASTs::iterator it = ast->children.begin(); it != ast->children.end(); ++it)
		findExternalTables(*it);

	/// Если идентификатор типа таблица
	StoragePtr external_storage;
	if (ASTIdentifier * node = dynamic_cast<ASTIdentifier *>(&*ast))
		if (node->kind == ASTIdentifier::Kind::Table)
406
			if ((external_storage = context.tryGetExternalTable(node->name)))
407 408 409 410 411 412 413 414 415 416
				external_tables[node->name] = external_storage;

	if (ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast))
	{
		if (node->name == "globalIn" || node->name == "globalNotIn" || node->name == "In" || node->name == "NotIn")
		{
			IAST & args = *node->arguments;
			ASTPtr & arg = args.children[1];
			/// Если имя таблицы для селекта
			if (ASTIdentifier * id = dynamic_cast<ASTIdentifier *>(&*arg))
417
				if ((external_storage = context.tryGetExternalTable(id->name)))
418 419 420 421 422 423
					external_tables[id->name] = external_storage;
		}
	}
}


424
void ExpressionAnalyzer::addExternalStorage(ASTFunction * node)
425
{
A
Alexey Milovidov 已提交
426
	/// Сгенерируем имя для внешней таблицы.
427 428 429 430
	String external_table_name = "_data";
	while (context.tryGetExternalTable(external_table_name + toString(external_table_id)))
		++external_table_id;

431
	IAST & args = *node->arguments;		/// TODO Для JOIN.
432
	ASTPtr & arg = args.children[1];
433
	StoragePtr external_storage;
434 435

	/// Если подзапрос или имя таблицы для селекта
436
	if (dynamic_cast<const ASTSubquery *>(&*arg) || dynamic_cast<const ASTIdentifier *>(&*arg))
437 438 439 440 441 442 443 444 445 446 447 448 449 450
	{
		/** Для подзапроса в секции IN не действуют ограничения на максимальный размер результата.
			* Так как результат этого поздапроса - ещё не результат всего запроса.
			* Вместо этого работают ограничения max_rows_in_set, max_bytes_in_set, set_overflow_mode.
			*/
		Context subquery_context = context;
		Settings subquery_settings = context.getSettings();
		subquery_settings.limits.max_result_rows = 0;
		subquery_settings.limits.max_result_bytes = 0;
		/// Вычисление extremes не имеет смысла и не нужно (если его делать, то в результате всего запроса могут взяться extremes подзапроса).
		subquery_settings.extremes = 0;
		subquery_context.setSettings(subquery_settings);

		ASTPtr subquery;
451
		if (const ASTIdentifier * table = dynamic_cast<const ASTIdentifier *>(&*arg))
452 453 454
		{
			ParserSelectQuery parser;

455 456
			StoragePtr existing_storage;

457
			/// Если это уже внешняя таблица, ничего заполять не нужно. Просто запоминаем ее наличие.
458
			if ((existing_storage = context.tryGetExternalTable(table->name)))
459 460
			{
				external_tables[table->name] = existing_storage;
461
				return;
462
			}
463 464 465 466 467

			String query = "SELECT * FROM " + table->name;
			const char * begin = query.data();
			const char * end = begin + query.size();
			const char * pos = begin;
468
			Expected expected = "";
469 470 471

			bool parse_res = parser.parse(pos, end, subquery, expected);
			if (!parse_res)
472
				throw Exception("Error in parsing SELECT query while creating set for table " + table->name + ".",
A
Alexey Milovidov 已提交
473
					ErrorCodes::LOGICAL_ERROR);
474 475 476 477 478 479 480 481 482
		}
		else
			subquery = arg->children[0];

		InterpreterSelectQuery interpreter(subquery, subquery_context, QueryProcessingStage::Complete, subquery_depth + 1);

		Block sample = interpreter.getSampleBlock();
		NamesAndTypesListPtr columns = new NamesAndTypesList(sample.getColumnsList());

483
		String external_table_name = "_data" + toString(external_table_id++);
484 485
		external_storage = StorageMemory::create(external_table_name, columns);

486
		ASTIdentifier * ast_ident = new ASTIdentifier;
487 488 489
		ast_ident->kind = ASTIdentifier::Table;
		ast_ident->name = external_storage->getTableName();
		arg = ast_ident;
490
		external_tables[external_table_name] = external_storage;
491
		external_data[external_table_name] = interpreter.execute();
492 493 494 495 496 497

		/// Добавляем множество, при обработке которого будет заполнена внешняя таблица.
		ASTSet * ast_set = new ASTSet("external_" + arg->getColumnName());
		ast_set->set = new Set(settings.limits);
		ast_set->set->setSource(external_data[external_table_name]);
		ast_set->set->setExternalOutput(external_tables[external_table_name]);
498
		ast_set->set->setOnlyExternal(true);
499
		sets_with_subqueries[ast_set->getColumnName()] = ast_set->set;
500 501
	}
	else
502
		throw Exception("GLOBAL [NOT] IN supports only SELECT data.", ErrorCodes::BAD_ARGUMENTS);
503 504 505
}


506
void ExpressionAnalyzer::makeSet(ASTFunction * node, const Block & sample_block)
507
{
508
	/** Нужно преобразовать правый аргумент в множество.
509
	  * Это может быть имя таблицы, значение, перечисление значений или подзапрос.
510 511 512 513
	  * Перечисление значений парсится как функция tuple.
	  */
	IAST & args = *node->arguments;
	ASTPtr & arg = args.children[1];
514

515 516
	if (dynamic_cast<ASTSet *>(&*arg))
		return;
517

518 519
	/// Если подзапрос или имя таблицы для селекта
	if (dynamic_cast<ASTSubquery *>(&*arg) || dynamic_cast<ASTIdentifier *>(&*arg))
520
	{
521
		/// Получаем поток блоков для подзапроса, отдаем его множеству, и кладём это множество на место подзапроса.
522
		ASTSet * ast_set = new ASTSet(arg->getColumnName());
523
		ASTPtr ast_set_ptr = ast_set;
524

A
Alexey Milovidov 已提交
525 526
		String set_id = ast_set->getColumnName();

527 528
		/// Удаляем множество, которое могло быть создано, чтобы заполнить внешнюю таблицу
		/// Вместо него будет добавлено множество, так же заполняющее себя и помогающее отвечать на зарос.
A
Alexey Milovidov 已提交
529
		sets_with_subqueries.erase("external_" + set_id);
530

A
Alexey Milovidov 已提交
531
		if (sets_with_subqueries.count(set_id))
532
		{
A
Alexey Milovidov 已提交
533
			ast_set->set = sets_with_subqueries[set_id];
534 535 536
		}
		else
		{
537 538
			ast_set->set = new Set(settings.limits);

539
			ASTPtr subquery;
540
			bool external = false;
A
Alexey Milovidov 已提交
541 542 543 544

			/** В правой части IN-а может стоять подзапрос или имя таблицы.
			  * Во втором случае, это эквивалентно подзапросу (SELECT * FROM t).
			  */
545 546
			if (ASTIdentifier * table = dynamic_cast<ASTIdentifier *>(&*arg))
			{
547 548 549 550 551 552 553 554 555 556 557 558 559 560
				if (external_data.count(table->name))
				{
					external = true;
					ast_set->set->setExternalOutput(external_tables[table->name]);
					ast_set->set->setSource(external_data[table->name]);
				}
				else
				{
					ParserSelectQuery parser;

					String query = "SELECT * FROM " + table->name;
					const char * begin = query.data();
					const char * end = begin + query.size();
					const char * pos = begin;
561
					Expected expected = "";
562 563 564 565 566 567

					bool parse_res = parser.parse(pos, end, subquery, expected);
					if (!parse_res)
						throw Exception("Error in parsing select query while creating set for table " + table->name + ".",
										ErrorCodes::LOGICAL_ERROR);
				}
568 569 570 571
			}
			else
				subquery = arg->children[0];

572 573 574
			/// Если чтение из внешней таблицы, то источник данных уже вычислен.
			if (!external)
			{
575 576 577 578 579 580 581 582 583 584 585 586
				/** Для подзапроса в секции IN не действуют ограничения на максимальный размер результата.
				  * Так как результат этого поздапроса - ещё не результат всего запроса.
				  * Вместо этого работают ограничения max_rows_in_set, max_bytes_in_set, set_overflow_mode.
				  */
				Context subquery_context = context;
				Settings subquery_settings = context.getSettings();
				subquery_settings.limits.max_result_rows = 0;
				subquery_settings.limits.max_result_bytes = 0;
				/// Вычисление extremes не имеет смысла и не нужно (если его делать, то в результате всего запроса могут взяться extremes подзапроса).
				subquery_settings.extremes = 0;
				subquery_context.setSettings(subquery_settings);

587 588 589
				InterpreterSelectQuery interpreter(subquery, subquery_context, QueryProcessingStage::Complete, subquery_depth + 1);
				ast_set->set->setSource(interpreter.execute());
			}
590

A
Alexey Milovidov 已提交
591
			sets_with_subqueries[set_id] = ast_set->set;
592
		}
A
Alexey Milovidov 已提交
593

594
		arg = ast_set_ptr;
595
	}
596
	else
597
	{
A
Alexey Milovidov 已提交
598
		/// Явное перечисление значений в скобках.
P
Pavel Kartavyy 已提交
599
		makeExplicitSet(node, sample_block, false);
P
Pavel Kartavyy 已提交
600 601 602 603
	}
}

/// Случай явного перечисления значений.
P
Pavel Kartavyy 已提交
604
void ExpressionAnalyzer::makeExplicitSet(ASTFunction * node, const Block & sample_block, bool create_ordered_set)
P
Pavel Kartavyy 已提交
605 606 607
{
		IAST & args = *node->arguments;
		ASTPtr & arg = args.children[1];
608

609 610 611 612 613 614 615 616 617 618
		DataTypes set_element_types;
		ASTPtr & left_arg = args.children[0];

		ASTFunction * left_arg_tuple = dynamic_cast<ASTFunction *>(&*left_arg);

		if (left_arg_tuple && left_arg_tuple->name == "tuple")
		{
			for (ASTs::const_iterator it = left_arg_tuple->arguments->children.begin();
				it != left_arg_tuple->arguments->children.end();
				++it)
619
				set_element_types.push_back(sample_block.getByName((*it)->getColumnName()).type);
620 621 622
		}
		else
		{
623
			DataTypePtr left_type = sample_block.getByName(left_arg->getColumnName()).type;
624 625 626 627 628
			if (DataTypeArray * array_type = dynamic_cast<DataTypeArray *>(&*left_type))
				set_element_types.push_back(array_type->getNestedType());
			else
				set_element_types.push_back(left_type);
		}
629

630 631 632
		/// Отличим случай x in (1, 2) от случая x in 1 (он же x in (1)).
		bool single_value = false;
		ASTPtr elements_ast = arg;
633

634 635 636 637 638
		if (ASTFunction * set_func = dynamic_cast<ASTFunction *>(&*arg))
		{
			if (set_func->name != "tuple")
				throw Exception("Incorrect type of 2nd argument for function " + node->name + ". Must be subquery or set of values.",
								ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
639

640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
			/// Отличм случай (x, y) in ((1, 2), (3, 4)) от случая (x, y) in (1, 2).
			ASTFunction * any_element = dynamic_cast<ASTFunction *>(&*set_func->arguments->children[0]);
			if (set_element_types.size() >= 2 && (!any_element || any_element->name != "tuple"))
				single_value = true;
			else
				elements_ast = set_func->arguments;
		}
		else if (dynamic_cast<ASTLiteral *>(&*arg))
		{
			single_value = true;
		}
		else
		{
			throw Exception("Incorrect type of 2nd argument for function " + node->name + ". Must be subquery or set of values.",
							ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
		}
656

657 658 659 660 661 662
		if (single_value)
		{
			ASTPtr exp_list = new ASTExpressionList;
			exp_list->children.push_back(elements_ast);
			elements_ast = exp_list;
		}
663

664
		ASTSet * ast_set = new ASTSet(arg->getColumnName());
665
		ASTPtr ast_set_ptr = ast_set;
666
		ast_set->set = new Set(settings.limits);
P
Pavel Kartavyy 已提交
667
		ast_set->set->createFromAST(set_element_types, elements_ast, create_ordered_set);
668
		arg = ast_set_ptr;
669 670 671 672 673 674
}


static std::string getUniqueName(const Block & block, const std::string & prefix)
{
	int i = 1;
675
	while (block.has(prefix + toString(i)))
676
		++i;
677
	return prefix + toString(i);
678 679 680
}


A
Alexey Milovidov 已提交
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
/** Для getActionsImpl.
  * Стек из ExpressionActions, соответствующих вложенным лямбда-выражениям.
  * Новое действие нужно добавлять на самый высокий возможный уровень.
  * Например, в выражении "select arrayMap(x -> x + column1 * column2, array1)"
  *  вычисление произведения нужно делать вне лямбда-выражения (оно не зависит от x), а вычисление суммы - внутри (зависит от x).
  */
struct ExpressionAnalyzer::ScopeStack
{
	struct Level
	{
		ExpressionActionsPtr actions;
		NameSet new_columns;
	};

	typedef std::vector<Level> Levels;

	Levels stack;
	Settings settings;

	ScopeStack(const ExpressionActions & actions, const Settings & settings_)
		: settings(settings_)
	{
		stack.push_back(Level());
		stack.back().actions = new ExpressionActions(actions);
		const NamesAndTypesList & input_columns = actions.getSampleBlock().getColumnsList();
		for (NamesAndTypesList::const_iterator it = input_columns.begin(); it != input_columns.end(); ++it)
			stack.back().new_columns.insert(it->first);
	}

	void pushLevel(const NamesAndTypesList & input_columns)
	{
		stack.push_back(Level());
		Level & prev = stack[stack.size() - 2];

		ColumnsWithNameAndType prev_columns = prev.actions->getSampleBlock().getColumns();

		ColumnsWithNameAndType all_columns;
		NameSet new_names;

		for (NamesAndTypesList::const_iterator it = input_columns.begin(); it != input_columns.end(); ++it)
		{
			all_columns.push_back(ColumnWithNameAndType(nullptr, it->second, it->first));
			new_names.insert(it->first);
			stack.back().new_columns.insert(it->first);
		}

		for (ColumnsWithNameAndType::const_iterator it = prev_columns.begin(); it != prev_columns.end(); ++it)
		{
			if (!new_names.count(it->name))
				all_columns.push_back(*it);
		}

		stack.back().actions = new ExpressionActions(all_columns, settings);
	}

	size_t getColumnLevel(const std::string & name)
	{
		for (int i = static_cast<int>(stack.size()) - 1; i >= 0; --i)
			if (stack[i].new_columns.count(name))
				return i;

		throw Exception("Unknown identifier: " + name, ErrorCodes::UNKNOWN_IDENTIFIER);
	}

	void addAction(const ExpressionAction & action, const Names & additional_required_columns = Names())
	{
		size_t level = 0;
		for (size_t i = 0; i < additional_required_columns.size(); ++i)
			level = std::max(level, getColumnLevel(additional_required_columns[i]));
		Names required = action.getNeededColumns();
		for (size_t i = 0; i < required.size(); ++i)
			level = std::max(level, getColumnLevel(required[i]));

		Names added;
		stack[level].actions->add(action, added);

		stack[level].new_columns.insert(added.begin(), added.end());

		for (size_t i = 0; i < added.size(); ++i)
		{
			const ColumnWithNameAndType & col = stack[level].actions->getSampleBlock().getByName(added[i]);
			for (size_t j = level + 1; j < stack.size(); ++j)
				stack[j].actions->addInput(col);
		}
	}

	ExpressionActionsPtr popLevel()
	{
		ExpressionActionsPtr res = stack.back().actions;
		stack.pop_back();
		return res;
	}

	const Block & getSampleBlock()
	{
		return stack.back().actions->getSampleBlock();
	}
};


781 782 783
void ExpressionAnalyzer::getRootActionsImpl(ASTPtr ast, bool no_subqueries, bool only_consts, ExpressionActions & actions)
{
	ScopeStack scopes(actions, settings);
784
	getActionsImpl(ast, no_subqueries, only_consts, scopes);
785 786 787 788
	actions = *scopes.popLevel();
}


789 790
void ExpressionAnalyzer::getArrayJoinedColumns()
{
791 792
	if (select_query && select_query->array_join_expression_list)
	{
793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815
		ASTs & array_join_asts = select_query->array_join_expression_list->children;
		for (size_t i = 0; i < array_join_asts .size(); ++i)
		{
			ASTPtr ast = array_join_asts [i];

			String nested_table_name = ast->getColumnName();
			String nested_table_alias = ast->getAlias();
			if (nested_table_alias == nested_table_name && !dynamic_cast<ASTIdentifier *>(&*ast))
				throw Exception("No alias for non-trivial value in ARRAY JOIN: " + nested_table_name, ErrorCodes::ALIAS_REQUIRED);

			if (array_join_alias_to_name.count(nested_table_alias) || aliases.count(nested_table_alias))
				throw Exception("Duplicate alias " + nested_table_alias, ErrorCodes::MULTIPLE_EXPRESSIONS_FOR_ALIAS);
			array_join_alias_to_name[nested_table_alias] = nested_table_name;
		}

		ASTs & query_asts = select_query->children;
		for (size_t i = 0; i < query_asts.size(); ++i)
		{
			ASTPtr ast = query_asts[i];
			if (select_query && ast == select_query->array_join_expression_list)
				continue;
			getArrayJoinedColumnsImpl(ast);
		}
816 817 818

		/// Если результат ARRAY JOIN не используется, придется все равно по-ARRAY-JOIN-ить какой-нибудь столбец,
		/// чтобы получить правильное количество строк.
819
		if (array_join_result_to_source.empty())
820 821 822 823
		{
			ASTPtr expr = select_query->array_join_expression_list->children[0];
			String source_name = expr->getColumnName();
			String result_name = expr->getAlias();
A
Alexey Milovidov 已提交
824

825 826 827
			/// Это массив.
			if (!dynamic_cast<ASTIdentifier *>(&*expr) || findColumn(source_name, columns) != columns.end())
			{
828
				array_join_result_to_source[result_name] = source_name;
829 830 831 832
			}
			else /// Это вложенная таблица.
			{
				bool found = false;
A
Alexey Milovidov 已提交
833
				for (const auto & column_name_type : columns)
834
				{
A
Alexey Milovidov 已提交
835 836
					String table_name = DataTypeNested::extractNestedTableName(column_name_type.first);
					String column_name = DataTypeNested::extractNestedColumnName(column_name_type.first);
837 838
					if (table_name == source_name)
					{
A
Alexey Milovidov 已提交
839
						array_join_result_to_source[DataTypeNested::concatenateNestedName(result_name, column_name)] = column_name_type.first;
840 841 842 843
						found = true;
						break;
					}
				}
844 845
				if (!found)
					throw Exception("No columns in nested table " + source_name, ErrorCodes::EMPTY_NESTED_TABLE);
846 847
			}
		}
848
	}
849 850 851 852
}


void ExpressionAnalyzer::getArrayJoinedColumnsImpl(ASTPtr ast)
853 854 855
{
	if (ASTIdentifier * node = dynamic_cast<ASTIdentifier *>(&*ast))
	{
856 857 858 859 860 861 862 863 864 865 866 867
		if (node->kind == ASTIdentifier::Column)
		{
			String table_name = DataTypeNested::extractNestedTableName(node->name);
			if (array_join_alias_to_name.count(node->name))
				array_join_result_to_source[node->name] = array_join_alias_to_name[node->name];
			else if (array_join_alias_to_name.count(table_name))
			{
				String nested_column = DataTypeNested::extractNestedColumnName(node->name);
				array_join_result_to_source[node->name]
					= DataTypeNested::concatenateNestedName(array_join_alias_to_name[table_name], nested_column);
			}
		}
868 869 870 871
	}
	else
	{
		for (ASTs::iterator it = ast->children.begin(); it != ast->children.end(); ++it)
872
			if (!dynamic_cast<ASTSelectQuery *>(&**it))
873
				getArrayJoinedColumnsImpl(*it);
874 875 876 877 878
	}
}


void ExpressionAnalyzer::getActionsImpl(ASTPtr ast, bool no_subqueries, bool only_consts, ScopeStack & actions_stack)
879 880
{
	/// Если результат вычисления уже есть в блоке.
881
	if ((dynamic_cast<ASTFunction *>(&*ast) || dynamic_cast<ASTLiteral *>(&*ast))
882
		&& actions_stack.getSampleBlock().has(ast->getColumnName()))
883
		return;
884

885 886 887 888 889 890
	if (ASTIdentifier * node = dynamic_cast<ASTIdentifier *>(&*ast))
	{
		std::string name = node->getColumnName();
		if (!only_consts && !actions_stack.getSampleBlock().has(name))
		{
			/// Запрошенного столбца нет в блоке.
891
			/// Если такой столбец есть в таблице, значит пользователь наверно забыл окружить его агрегатной функцией или добавить в GROUP BY.
892 893

			bool found = false;
A
Alexey Milovidov 已提交
894 895
			for (const auto & column_name_type : columns)
				if (column_name_type.first == name)
896 897 898 899
					found = true;

			if (found)
				throw Exception("Column " + name + " is not under aggregate function and not in GROUP BY.",
900
					ErrorCodes::NOT_AN_AGGREGATE);
901 902 903
		}
	}
	else if (ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast))
904
	{
905
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
906
			throw Exception("Unexpected expression", ErrorCodes::UNEXPECTED_EXPRESSION);
907

908 909 910 911 912
		if (node->kind == ASTFunction::ARRAY_JOIN)
		{
			if (node->arguments->children.size() != 1)
				throw Exception("arrayJoin requires exactly 1 argument", ErrorCodes::TYPE_MISMATCH);
			ASTPtr arg = node->arguments->children[0];
913
			getActionsImpl(arg, no_subqueries, only_consts, actions_stack);
914
			if (!only_consts)
915
			{
916
				String result_name = node->getColumnName();
917
				actions_stack.addAction(ExpressionAction::copyColumn(arg->getColumnName(), result_name));
918 919
				NameSet joined_columns;
				joined_columns.insert(result_name);
920
				actions_stack.addAction(ExpressionAction::arrayJoin(joined_columns));
921
			}
922

923 924
			return;
		}
925

926
		if (node->kind == ASTFunction::FUNCTION)
927
		{
928
			if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
929 930 931
			{
				if (!no_subqueries)
				{
932
					/// Найдем тип первого аргумента (потом getActionsImpl вызовется для него снова и ни на что не повлияет).
933
					getActionsImpl(node->arguments->children[0], no_subqueries, only_consts, actions_stack);
934
					/// Превратим tuple или подзапрос в множество.
935
					makeSet(node, actions_stack.getSampleBlock());
936 937 938
				}
				else
				{
939 940 941 942 943 944 945 946
					if (!only_consts)
					{
						/// Мы в той части дерева, которую не собираемся вычислять. Нужно только определить типы.
						/// Не будем выполнять подзапросы и составлять множества. Вставим произвольный столбец правильного типа.
						ColumnWithNameAndType fake_column;
						fake_column.name = node->getColumnName();
						fake_column.type = new DataTypeUInt8;
						fake_column.column = new ColumnConstUInt8(1, 0);
947
						actions_stack.addAction(ExpressionAction::addColumn(fake_column));
948 949
						getActionsImpl(node->arguments->children[0], no_subqueries, only_consts, actions_stack);
					}
950 951 952
					return;
				}
			}
953

954
			FunctionPtr function = context.getFunctionFactory().get(node->name, context);
955

956 957
			Names argument_names;
			DataTypes argument_types;
M
Merge  
Michael Kolupaev 已提交
958
			bool arguments_present = true;
959

960 961
			/// Если у функции есть аргумент-лямбда-выражение, нужно определить его тип до рекурсивного вызова.
			bool has_lambda_arguments = false;
962

963 964 965
			for (size_t i = 0; i < node->arguments->children.size(); ++i)
			{
				ASTPtr child = node->arguments->children[i];
966

967
				ASTFunction * lambda = dynamic_cast<ASTFunction *>(&*child);
968
				ASTSet * set = dynamic_cast<ASTSet *>(&*child);
969 970
				if (lambda && lambda->name == "lambda")
				{
M
Merge  
Michael Kolupaev 已提交
971
					/// Если аргумент - лямбда-выражение, только запомним его примерный тип.
972 973
					if (lambda->arguments->children.size() != 2)
						throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
974

975
					ASTFunction * lambda_args_tuple = dynamic_cast<ASTFunction *>(&*lambda->arguments->children[0]);
976

977 978
					if (!lambda_args_tuple || lambda_args_tuple->name != "tuple")
						throw Exception("First argument of lambda must be a tuple", ErrorCodes::TYPE_MISMATCH);
979

980 981
					has_lambda_arguments = true;
					argument_types.push_back(new DataTypeExpression(DataTypes(lambda_args_tuple->arguments->children.size())));
982 983
					/// Выберем название в следующем цикле.
					argument_names.push_back("");
984
				}
985 986 987 988
				else if (set)
				{
					ColumnWithNameAndType column;
					column.type = new DataTypeSet;
989

990 991 992 993 994 995 996 997 998 999 1000
					/// Если аргумент - множество, заданное перечислением значений, дадим ему уникальное имя,
					///  чтобы множества с одинаковой записью не склеивались (у них может быть разный тип).
					if (!set->set->getSource())
						column.name = getUniqueName(actions_stack.getSampleBlock(), "__set");
					else
						column.name = set->getColumnName();

					if (!actions_stack.getSampleBlock().has(column.name))
					{
						column.column = new ColumnSet(1, set->set);

1001
						actions_stack.addAction(ExpressionAction::addColumn(column));
1002
					}
1003

1004 1005 1006
					argument_types.push_back(column.type);
					argument_names.push_back(column.name);
				}
1007 1008
				else
				{
M
Merge  
Michael Kolupaev 已提交
1009
					/// Если аргумент не лямбда-выражение, вызовемся рекурсивно и узнаем его тип.
1010
					getActionsImpl(child, no_subqueries, only_consts, actions_stack);
1011
					std::string name = child->getColumnName();
1012
					if (actions_stack.getSampleBlock().has(name))
M
Merge  
Michael Kolupaev 已提交
1013
					{
1014
						argument_types.push_back(actions_stack.getSampleBlock().getByName(name).type);
M
Merge  
Michael Kolupaev 已提交
1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
						argument_names.push_back(name);
					}
					else
					{
						if (only_consts)
						{
							arguments_present = false;
						}
						else
						{
							throw Exception("Unknown identifier: " + name, ErrorCodes::UNKNOWN_IDENTIFIER);
						}
					}
1028 1029
				}
			}
1030

M
Merge  
Michael Kolupaev 已提交
1031 1032
			if (only_consts && !arguments_present)
				return;
1033

1034
			Names additional_requirements;
1035

1036 1037 1038
			if (has_lambda_arguments && !only_consts)
			{
				function->getLambdaArgumentTypes(argument_types);
1039

1040 1041 1042 1043
				/// Вызовемся рекурсивно для лямбда-выражений.
				for (size_t i = 0; i < node->arguments->children.size(); ++i)
				{
					ASTPtr child = node->arguments->children[i];
1044

1045 1046 1047 1048 1049 1050
					ASTFunction * lambda = dynamic_cast<ASTFunction *>(&*child);
					if (lambda && lambda->name == "lambda")
					{
						DataTypeExpression * lambda_type = dynamic_cast<DataTypeExpression *>(&*argument_types[i]);
						ASTFunction * lambda_args_tuple = dynamic_cast<ASTFunction *>(&*lambda->arguments->children[0]);
						ASTs lambda_arg_asts = lambda_args_tuple->arguments->children;
1051
						NamesAndTypesList lambda_arguments;
1052

1053 1054 1055 1056 1057
						for (size_t j = 0; j < lambda_arg_asts.size(); ++j)
						{
							ASTIdentifier * identifier = dynamic_cast<ASTIdentifier *>(&*lambda_arg_asts[j]);
							if (!identifier)
								throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1058

1059 1060
							String arg_name = identifier->name;
							NameAndTypePair arg(arg_name, lambda_type->getArgumentTypes()[j]);
1061

1062
							lambda_arguments.push_back(arg);
1063
						}
1064

1065
						actions_stack.pushLevel(lambda_arguments);
1066
						getActionsImpl(lambda->arguments->children[1], no_subqueries, only_consts, actions_stack);
1067
						ExpressionActionsPtr lambda_actions = actions_stack.popLevel();
1068

1069
						String result_name = lambda->arguments->children[1]->getColumnName();
1070
						lambda_actions->finalize(Names(1, result_name));
1071
						DataTypePtr result_type = lambda_actions->getSampleBlock().getByName(result_name).type;
1072
						argument_types[i] = new DataTypeExpression(lambda_type->getArgumentTypes(), result_type);
1073

1074 1075 1076 1077
						Names captured = lambda_actions->getRequiredColumns();
						for (size_t j = 0; j < captured.size(); ++j)
							if (findColumn(captured[j], lambda_arguments) == lambda_arguments.end())
								additional_requirements.push_back(captured[j]);
1078

1079 1080
						/// Не можем дать название getColumnName(),
						///  потому что оно не однозначно определяет выражение (типы аргументов могут быть разными).
1081
						argument_names[i] = getUniqueName(actions_stack.getSampleBlock(), "__lambda");
1082

1083
						ColumnWithNameAndType lambda_column;
1084
						lambda_column.column = new ColumnExpression(1, lambda_actions, lambda_arguments, result_type, result_name);
1085 1086
						lambda_column.type = argument_types[i];
						lambda_column.name = argument_names[i];
1087
						actions_stack.addAction(ExpressionAction::addColumn(lambda_column));
1088 1089 1090
					}
				}
			}
1091

1092 1093 1094 1095
			if (only_consts)
			{
				for (size_t i = 0; i < argument_names.size(); ++i)
				{
1096
					if (!actions_stack.getSampleBlock().has(argument_names[i]))
1097
					{
M
Merge  
Michael Kolupaev 已提交
1098
						arguments_present = false;
1099 1100 1101 1102
						break;
					}
				}
			}
1103

M
Merge  
Michael Kolupaev 已提交
1104
			if (arguments_present)
1105
				actions_stack.addAction(ExpressionAction::applyFunction(function, argument_names, node->getColumnName()),
1106
										additional_requirements);
1107 1108 1109 1110 1111 1112 1113 1114 1115
		}
	}
	else if (ASTLiteral * node = dynamic_cast<ASTLiteral *>(&*ast))
	{
		DataTypePtr type = apply_visitor(FieldToDataType(), node->value);
		ColumnWithNameAndType column;
		column.column = type->createConstColumn(1, node->value);
		column.type = type;
		column.name = node->getColumnName();
1116

1117
		actions_stack.addAction(ExpressionAction::addColumn(column));
1118 1119 1120 1121
	}
	else
	{
		for (ASTs::iterator it = ast->children.begin(); it != ast->children.end(); ++it)
1122
			getActionsImpl(*it, no_subqueries, only_consts, actions_stack);
1123 1124 1125 1126 1127 1128 1129
	}
}


void ExpressionAnalyzer::getAggregatesImpl(ASTPtr ast, ExpressionActions & actions)
{
	ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast);
1130
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
1131
	{
1132
		has_aggregation = true;
1133 1134
		AggregateDescription aggregate;
		aggregate.column_name = node->getColumnName();
1135

1136 1137 1138
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
			if (aggregate_descriptions[i].column_name == aggregate.column_name)
				return;
1139

1140 1141 1142
		ASTs & arguments = node->arguments->children;
		aggregate.argument_names.resize(arguments.size());
		DataTypes types(arguments.size());
1143

1144 1145
		for (size_t i = 0; i < arguments.size(); ++i)
		{
1146
			getRootActionsImpl(arguments[i], true, false, actions);
1147 1148 1149 1150
			const std::string & name = arguments[i]->getColumnName();
			types[i] = actions.getSampleBlock().getByName(name).type;
			aggregate.argument_names[i] = name;
		}
1151

1152
		aggregate.function = context.getAggregateFunctionFactory().get(node->name, types);
1153

1154 1155 1156
		if (node->parameters)
		{
			ASTs & parameters = dynamic_cast<ASTExpressionList &>(*node->parameters).children;
1157
			Array params_row(parameters.size());
1158

1159 1160 1161 1162 1163
			for (size_t i = 0; i < parameters.size(); ++i)
			{
				ASTLiteral * lit = dynamic_cast<ASTLiteral *>(&*parameters[i]);
				if (!lit)
					throw Exception("Parameters to aggregate functions must be literals", ErrorCodes::PARAMETERS_TO_AGGREGATE_FUNCTIONS_MUST_BE_LITERALS);
1164

1165 1166
				params_row[i] = lit->value;
			}
1167

1168
			aggregate.parameters = params_row;
1169 1170
			aggregate.function->setParameters(params_row);
		}
1171

1172
		aggregate.function->setArguments(types);
1173

1174 1175 1176 1177 1178 1179
		aggregate_descriptions.push_back(aggregate);
	}
	else
	{
		for (size_t i = 0; i < ast->children.size(); ++i)
		{
1180 1181 1182
			ASTPtr child = ast->children[i];
			if (!dynamic_cast<ASTSubquery *>(&*child) && !dynamic_cast<ASTSelectQuery *>(&*child))
				getAggregatesImpl(child, actions);
1183 1184 1185 1186
		}
	}
}

1187 1188 1189 1190 1191
void ExpressionAnalyzer::assertSelect()
{
	if (!select_query)
		throw Exception("Not a select query", ErrorCodes::LOGICAL_ERROR);
}
1192

1193
void ExpressionAnalyzer::assertAggregation()
1194 1195 1196
{
	if (!has_aggregation)
		throw Exception("No aggregation", ErrorCodes::LOGICAL_ERROR);
1197
}
1198

1199 1200 1201 1202 1203 1204 1205 1206
void ExpressionAnalyzer::initChain(ExpressionActionsChain & chain, NamesAndTypesList & columns)
{
	if (chain.steps.empty())
	{
		chain.settings = settings;
		chain.steps.push_back(ExpressionActionsChain::Step(new ExpressionActions(columns, settings)));
	}
}
1207

1208 1209
void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActions & actions)
{
1210 1211
	NameSet result_columns;
	for (NameToNameMap::iterator it = array_join_result_to_source.begin(); it != array_join_result_to_source.end(); ++it)
1212
	{
1213
		if (it->first != it->second)
1214
			actions.add(ExpressionAction::copyColumn(it->second, it->first));
1215
		result_columns.insert(it->first);
1216 1217
	}

1218
	actions.add(ExpressionAction::arrayJoin(result_columns));
1219 1220
}

1221
bool ExpressionAnalyzer::appendArrayJoin(ExpressionActionsChain & chain, bool only_types)
1222 1223
{
	assertSelect();
1224 1225

	if (!select_query->array_join_expression_list)
1226
		return false;
1227

1228 1229
	initChain(chain, columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1230

1231
	getRootActionsImpl(select_query->array_join_expression_list, only_types, false, *step.actions);
1232 1233

	addMultipleArrayJoinAction(*step.actions);
1234

1235 1236 1237
	return true;
}

1238
void ExpressionAnalyzer::addJoinAction(ExpressionActions & actions, bool only_types)
1239
{
1240
	actions.add(ExpressionAction::ordinaryJoin(only_types ? nullptr : joins[0], columns_added_by_join));
1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254
}

bool ExpressionAnalyzer::appendJoin(ExpressionActionsChain & chain, bool only_types)
{
	assertSelect();

	if (!select_query->join)
		return false;

	initChain(chain, columns);
	ExpressionActionsChain::Step & step = chain.steps.back();

	getRootActionsImpl(dynamic_cast<ASTJoin &>(*select_query->join).using_expr_list, only_types, false, *step.actions);

1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277
	{
		Names join_key_names(join_key_names_set.begin(), join_key_names_set.end());
		JoinPtr join = new Join(join_key_names, settings.limits);

		/** Для подзапроса в секции JOIN не действуют ограничения на максимальный размер результата.
		* Так как результат этого поздапроса - ещё не результат всего запроса.
		* Вместо этого работают ограничения max_rows_in_set, max_bytes_in_set, set_overflow_mode.
		* TODO: отдельные ограничения для JOIN.
		*/
		Context subquery_context = context;
		Settings subquery_settings = context.getSettings();
		subquery_settings.limits.max_result_rows = 0;
		subquery_settings.limits.max_result_bytes = 0;
		/// Вычисление extremes не имеет смысла и не нужно (если его делать, то в результате всего запроса могут взяться extremes подзапроса).
		subquery_settings.extremes = 0;
		subquery_context.setSettings(subquery_settings);

		Names required_joined_columns(join_key_names.begin(), join_key_names.end());
		for (const auto & name_type : columns_added_by_join)
			required_joined_columns.push_back(name_type.first);

		InterpreterSelectQuery interpreter(
			dynamic_cast<ASTJoin &>(*select_query->join).subquery->children[0], subquery_context,
1278
			required_joined_columns,
1279 1280 1281 1282 1283 1284 1285 1286 1287
			QueryProcessingStage::Complete, subquery_depth + 1);

		Block right_table_sample = interpreter.getSampleBlock();
		join->setSource(interpreter.execute());

		joins.push_back(join);
	}

	addJoinAction(*step.actions, false);
1288 1289 1290 1291

	return true;
}

1292
bool ExpressionAnalyzer::appendWhere(ExpressionActionsChain & chain, bool only_types)
1293 1294
{
	assertSelect();
1295

1296 1297
	if (!select_query->where_expression)
		return false;
1298

1299
	initChain(chain, columns);
1300
	ExpressionActionsChain::Step & step = chain.steps.back();
1301

1302
	step.required_output.push_back(select_query->where_expression->getColumnName());
1303
	getRootActionsImpl(select_query->where_expression, only_types, false, *step.actions);
1304

1305 1306 1307
	return true;
}

1308
bool ExpressionAnalyzer::appendGroupBy(ExpressionActionsChain & chain, bool only_types)
1309 1310
{
	assertAggregation();
1311

1312 1313
	if (!select_query->group_expression_list)
		return false;
1314

1315
	initChain(chain, columns);
1316
	ExpressionActionsChain::Step & step = chain.steps.back();
1317

1318
	ASTs asts = select_query->group_expression_list->children;
1319 1320
	for (size_t i = 0; i < asts.size(); ++i)
	{
1321
		step.required_output.push_back(asts[i]->getColumnName());
1322
		getRootActionsImpl(asts[i], only_types, false, *step.actions);
1323
	}
1324

1325 1326 1327
	return true;
}

1328
void ExpressionAnalyzer::appendAggregateFunctionsArguments(ExpressionActionsChain & chain, bool only_types)
1329 1330
{
	assertAggregation();
1331

1332
	initChain(chain, columns);
1333
	ExpressionActionsChain::Step & step = chain.steps.back();
1334

1335 1336 1337 1338 1339 1340 1341
	for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
	{
		for (size_t j = 0; j < aggregate_descriptions[i].argument_names.size(); ++j)
		{
			step.required_output.push_back(aggregate_descriptions[i].argument_names[j]);
		}
	}
1342

1343
	getActionsBeforeAggregationImpl(select_query->select_expression_list, *step.actions, only_types);
1344

1345
	if (select_query->having_expression)
1346
		getActionsBeforeAggregationImpl(select_query->having_expression, *step.actions, only_types);
1347

1348
	if (select_query->order_expression_list)
1349
		getActionsBeforeAggregationImpl(select_query->order_expression_list, *step.actions, only_types);
1350 1351
}

1352
bool ExpressionAnalyzer::appendHaving(ExpressionActionsChain & chain, bool only_types)
1353 1354
{
	assertAggregation();
1355

1356 1357
	if (!select_query->having_expression)
		return false;
1358

1359 1360
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1361

1362
	step.required_output.push_back(select_query->having_expression->getColumnName());
1363
	getRootActionsImpl(select_query->having_expression, only_types, false, *step.actions);
1364

1365
	return true;
1366 1367
}

1368
void ExpressionAnalyzer::appendSelect(ExpressionActionsChain & chain, bool only_types)
1369 1370
{
	assertSelect();
1371

1372 1373
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1374

1375
	getRootActionsImpl(select_query->select_expression_list, only_types, false, *step.actions);
1376

1377 1378 1379 1380 1381
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
		step.required_output.push_back(asts[i]->getColumnName());
	}
1382
}
1383

1384
bool ExpressionAnalyzer::appendOrderBy(ExpressionActionsChain & chain, bool only_types)
1385
{
1386
	assertSelect();
1387

1388 1389
	if (!select_query->order_expression_list)
		return false;
1390

1391 1392
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1393

1394
	getRootActionsImpl(select_query->order_expression_list, only_types, false, *step.actions);
1395

1396 1397 1398 1399 1400 1401 1402 1403 1404
	ASTs asts = select_query->order_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
		ASTOrderByElement * ast = dynamic_cast<ASTOrderByElement *>(&*asts[i]);
		if (!ast || ast->children.size() != 1)
			throw Exception("Bad order expression AST", ErrorCodes::UNKNOWN_TYPE_OF_AST_NODE);
		ASTPtr order_expression = ast->children[0];
		step.required_output.push_back(order_expression->getColumnName());
	}
1405

1406 1407 1408
	return true;
}

1409
void ExpressionAnalyzer::appendProjectResult(DB::ExpressionActionsChain & chain, bool only_types)
1410 1411
{
	assertSelect();
1412

1413 1414
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1415

1416
	NamesWithAliases result_columns;
1417

1418 1419
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
1420
	{
1421 1422
		result_columns.push_back(NameWithAlias(asts[i]->getColumnName(), asts[i]->getAlias()));
		step.required_output.push_back(result_columns.back().second);
1423
	}
1424

1425
	step.actions->add(ExpressionAction::project(result_columns));
1426 1427 1428
}


1429 1430 1431 1432 1433 1434 1435 1436
Sets ExpressionAnalyzer::getSetsWithSubqueries()
{
	Sets res;
	for (auto & s : sets_with_subqueries)
		res.push_back(s.second);
	return res;
}

1437 1438
Joins ExpressionAnalyzer::getJoinsWithSubqueries()
{
1439
	return joins;
1440 1441
}

1442

1443 1444 1445
Block ExpressionAnalyzer::getSelectSampleBlock()
{
	assertSelect();
1446

1447
	ExpressionActions temp_actions(aggregated_columns, settings);
1448
	NamesWithAliases result_columns;
1449

1450 1451 1452 1453
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
		result_columns.push_back(NameWithAlias(asts[i]->getColumnName(), asts[i]->getAlias()));
1454
		getRootActionsImpl(asts[i], true, false, temp_actions);
1455
	}
1456

1457
	temp_actions.add(ExpressionAction::project(result_columns));
1458

1459 1460 1461
	return temp_actions.getSampleBlock();
}

1462
void ExpressionAnalyzer::getActionsBeforeAggregationImpl(ASTPtr ast, ExpressionActions & actions, bool no_subqueries)
1463 1464
{
	ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast);
1465
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
1466 1467
	{
		ASTs & arguments = node->arguments->children;
1468

1469 1470
		for (size_t i = 0; i < arguments.size(); ++i)
		{
1471
			getRootActionsImpl(arguments[i], no_subqueries, false, actions);
1472 1473 1474 1475 1476 1477
		}
	}
	else
	{
		for (size_t i = 0; i < ast->children.size(); ++i)
		{
1478
			getActionsBeforeAggregationImpl(ast->children[i], actions, no_subqueries);
1479 1480
		}
	}
1481 1482 1483
}


M
Merge  
Michael Kolupaev 已提交
1484
ExpressionActionsPtr ExpressionAnalyzer::getActions(bool project_result)
1485
{
1486
	ExpressionActionsPtr actions = new ExpressionActions(columns, settings);
1487
	NamesWithAliases result_columns;
1488
	Names result_names;
1489

1490
	ASTs asts;
1491

1492
	if (ASTExpressionList * node = dynamic_cast<ASTExpressionList *>(&*ast))
1493
		asts = node->children;
1494
	else
1495
		asts = ASTs(1, ast);
1496

1497
	for (size_t i = 0; i < asts.size(); ++i)
1498
	{
1499 1500 1501 1502 1503 1504 1505 1506 1507
		std::string name = asts[i]->getColumnName();
		std::string alias;
		if (project_result)
			alias = asts[i]->getAlias();
		else
			alias = name;
		result_columns.push_back(NameWithAlias(name, alias));
		result_names.push_back(alias);
		getRootActionsImpl(asts[i], false, false, *actions);
1508
	}
1509

M
Merge  
Michael Kolupaev 已提交
1510 1511
	if (project_result)
	{
1512
		actions->add(ExpressionAction::project(result_columns));
M
Merge  
Michael Kolupaev 已提交
1513
	}
M
Merge  
Michael Kolupaev 已提交
1514 1515 1516
	else
	{
		/// Не будем удалять исходные столбцы.
A
Alexey Milovidov 已提交
1517 1518
		for (const auto & column_name_type : columns)
			result_names.push_back(column_name_type.first);
M
Merge  
Michael Kolupaev 已提交
1519
	}
1520

1521
	actions->finalize(result_names);
1522

1523 1524 1525 1526 1527 1528
	return actions;
}


ExpressionActionsPtr ExpressionAnalyzer::getConstActions()
{
M
Merge  
Michael Kolupaev 已提交
1529
	ExpressionActionsPtr actions = new ExpressionActions(NamesAndTypesList(), settings);
1530

1531
	getRootActionsImpl(ast, true, true, *actions);
1532

1533 1534 1535 1536 1537 1538 1539 1540 1541 1542
	return actions;
}

void ExpressionAnalyzer::getAggregateInfo(Names & key_names, AggregateDescriptions & aggregates)
{
	for (NamesAndTypesList::iterator it = aggregation_keys.begin(); it != aggregation_keys.end(); ++it)
		key_names.push_back(it->first);
	aggregates = aggregate_descriptions;
}

1543
void ExpressionAnalyzer::removeUnusedColumns()
1544
{
A
Alexey Milovidov 已提交
1545 1546 1547 1548 1549 1550 1551
	/** Вычислим, какие столбцы требуются для выполнения выражения.
	  * Затем, удалим все остальные столбцы из списка доступных столбцов.
	  * После выполнения, columns будет содержать только список столбцов, нужных для чтения из таблицы.
	  */

	NameSet required;
	NameSet ignored;
1552

1553 1554 1555 1556 1557 1558
	if (select_query && select_query->array_join_expression_list)
	{
		ASTs & expressions = select_query->array_join_expression_list->children;
		for (size_t i = 0; i < expressions.size(); ++i)
		{
			/// Игнорируем идентификаторы верхнего уровня из секции ARRAY JOIN.
1559
			/// Их потом добавим отдельно.
1560
			if (dynamic_cast<ASTIdentifier *>(&*expressions[i]))
1561
			{
1562
				ignored.insert(expressions[i]->getColumnName());
1563 1564 1565 1566
			}
			else
			{
				/// Для выражений в ARRAY JOIN ничего игнорировать не нужно.
A
Alexey Milovidov 已提交
1567
				NameSet empty;
1568
				getRequiredColumnsImpl(expressions[i], required, empty, empty, empty);
1569
			}
1570 1571

			ignored.insert(expressions[i]->getAlias());
1572 1573
		}
	}
1574

1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592
	/** Также нужно не учитывать идентификаторы столбцов, получающихся путём JOIN-а.
	  * (Не считать, что они требуются для чтения из "левой" таблицы).
	  */
	NameSet available_joined_columns;
	collectJoinedColumns(available_joined_columns, columns_added_by_join);

	NameSet required_joined_columns;
	getRequiredColumnsImpl(ast, required, ignored, available_joined_columns, required_joined_columns);

	for (NamesAndTypesList::iterator it = columns_added_by_join.begin(); it != columns_added_by_join.end();)
	{
		if (required_joined_columns.count(it->first))
			++it;
		else
			columns_added_by_join.erase(it++);
	}

	for (const auto & name_type : columns_added_by_join)
1593
		std::cerr << "JOINed column (required, not key): " << name_type.first << std::endl;
1594
	std::cerr << std::endl;
1595

A
Alexey Milovidov 已提交
1596
	/// Вставляем в список требуемых столбцов столбцы, нужные для вычисления ARRAY JOIN.
1597
	NameSet array_join_sources;
A
Alexey Milovidov 已提交
1598 1599 1600 1601 1602 1603
	for (const auto & result_source : array_join_result_to_source)
		array_join_sources.insert(result_source.second);

	for (const auto & column_name_type : columns)
		if (array_join_sources.count(column_name_type.first))
			required.insert(column_name_type.first);
1604

1605 1606 1607
	/// Нужно прочитать хоть один столбец, чтобы узнать количество строк.
	if (required.empty())
		required.insert(ExpressionActions::getSmallestColumn(columns));
1608

1609
	unknown_required_columns = required;
1610

1611 1612
	for (NamesAndTypesList::iterator it = columns.begin(); it != columns.end();)
	{
A
Alexey Milovidov 已提交
1613
		unknown_required_columns.erase(it->first);
1614

A
Alexey Milovidov 已提交
1615
		if (!required.count(it->first))
1616
		{
A
Alexey Milovidov 已提交
1617 1618
			required.erase(it->first);
			columns.erase(it++);
1619
		}
A
Alexey Milovidov 已提交
1620 1621
		else
			++it;
1622
	}
S
Merge  
Sergey Fedorov 已提交
1623 1624 1625 1626 1627

	/// Возможно, среди неизвестных столбцов есть виртуальные. Удаляем их из списка неизвестных и добавляем
	/// в columns list, чтобы при дальнейшей обработке запроса они воспринимались как настоящие.
	for (NameSet::iterator it = unknown_required_columns.begin(); it != unknown_required_columns.end();)
	{
S
Merge  
Sergey Fedorov 已提交
1628
		if (storage && storage->hasColumn(*it))
S
Merge  
Sergey Fedorov 已提交
1629
		{
S
Merge  
Sergey Fedorov 已提交
1630 1631
			columns.push_back(storage->getColumn(*it));
			unknown_required_columns.erase(it++);
A
Alexey Milovidov 已提交
1632 1633
		}
		else
S
Merge  
Sergey Fedorov 已提交
1634
			++it;
S
Merge  
Sergey Fedorov 已提交
1635
	}
1636 1637
}

1638
void ExpressionAnalyzer::collectJoinedColumns(NameSet & joined_columns, NamesAndTypesList & joined_columns_name_type)
1639 1640 1641 1642
{
	if (!select_query || !select_query->join)
		return;

1643
	std::cerr << "collectJoinedColumns" << std::endl;
1644 1645

	auto & node = dynamic_cast<ASTJoin &>(*select_query->join);
1646 1647
	auto & keys = dynamic_cast<ASTExpressionList &>(*node.using_expr_list);
	auto & select = node.subquery->children[0];
1648

1649
	size_t num_join_keys = keys.children.size();
1650 1651

	for (size_t i = 0; i < num_join_keys; ++i)
1652
		if (!join_key_names_set.insert(keys.children[i]->getColumnName()).second)
1653 1654
			throw Exception("Duplicate column in USING list", ErrorCodes::DUPLICATE_COLUMN);

1655
	Block nested_result_sample = ExpressionAnalyzer(select, context, subquery_depth + 1).getSelectSampleBlock();
1656

1657 1658
	size_t nested_result_columns = nested_result_sample.columns();
	for (size_t i = 0; i < nested_result_columns; ++i)
1659
	{
1660 1661
		auto col = nested_result_sample.getByPosition(i);
		if (!join_key_names_set.count(col.name))
1662
		{
1663 1664
			joined_columns.insert(col.name);
			joined_columns_name_type.emplace_back(col.name, col.type);
1665
		}
1666
	}
1667 1668 1669 1670 1671 1672 1673

	for (const auto & name : join_key_names_set)
		std::cerr << "JOIN key: " << name << std::endl;
	std::cerr << std::endl;
	for (const auto & name : joined_columns)
		std::cerr << "JOINed column: " << name << std::endl;
	std::cerr << std::endl;
1674 1675
}

1676 1677
Names ExpressionAnalyzer::getRequiredColumns()
{
M
Merge  
Michael Kolupaev 已提交
1678 1679
	if (!unknown_required_columns.empty())
		throw Exception("Unknown identifier: " + *unknown_required_columns.begin(), ErrorCodes::UNKNOWN_IDENTIFIER);
1680

1681
	Names res;
1682 1683
	for (const auto & column_name_type : columns)
		res.push_back(column_name_type.first);
A
Alexey Milovidov 已提交
1684

1685 1686 1687
	return res;
}

1688 1689 1690
void ExpressionAnalyzer::getRequiredColumnsImpl(ASTPtr ast,
	NameSet & required_columns, NameSet & ignored_names,
	const NameSet & available_joined_columns, NameSet & required_joined_columns)
1691
{
1692 1693 1694 1695 1696
	/** Найдём все идентификаторы в запросе.
	  * Будем искать их рекурсивно, обходя в глубину AST.
	  * При этом:
	  * - для лямбда функций не будем брать формальные параметры;
	  * - не опускаемся в подзапросы (там свои идентификаторы);
1697 1698
	  * - некоторое исключение для секции ARRAY JOIN (в ней идентификаторы немного другие);
	  * - идентификаторы, доступные из JOIN-а, кладём в required_joined_columns.
1699 1700
	  */

1701 1702
	if (ASTIdentifier * node = dynamic_cast<ASTIdentifier *>(&*ast))
	{
1703 1704 1705
		if (node->kind == ASTIdentifier::Column
			&& !ignored_names.count(node->name)
			&& !ignored_names.count(DataTypeNested::extractNestedTableName(node->name)))
1706
		{
1707 1708 1709 1710
			if (!available_joined_columns.count(node->name))
				required_columns.insert(node->name);
			else
				required_joined_columns.insert(node->name);
1711
		}
A
Alexey Milovidov 已提交
1712

1713 1714
		return;
	}
1715

1716 1717 1718 1719 1720 1721
	if (ASTFunction * node = dynamic_cast<ASTFunction *>(&*ast))
	{
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
		{
			if (node->arguments->children.size() != 2)
				throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
1722

1723
			ASTFunction * lambda_args_tuple = dynamic_cast<ASTFunction *>(&*node->arguments->children[0]);
1724

1725 1726
			if (!lambda_args_tuple || lambda_args_tuple->name != "tuple")
				throw Exception("First argument of lambda must be a tuple", ErrorCodes::TYPE_MISMATCH);
1727

1728
			/// Не нужно добавлять формальные параметры лямбда-выражения в required_columns.
1729
			Names added_ignored;
1730
			for (size_t i = 0 ; i < lambda_args_tuple->arguments->children.size(); ++i)
1731
			{
1732
				ASTIdentifier * identifier = dynamic_cast<ASTIdentifier *>(&*lambda_args_tuple->arguments->children[i]);
1733 1734
				if (!identifier)
					throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1735 1736

				String & name = identifier->name;
1737 1738 1739 1740 1741 1742
				if (!ignored_names.count(name))
				{
					ignored_names.insert(name);
					added_ignored.push_back(name);
				}
			}
1743

1744 1745 1746
			getRequiredColumnsImpl(node->arguments->children[1],
				required_columns, ignored_names,
				available_joined_columns, required_joined_columns);
1747

1748 1749
			for (size_t i = 0; i < added_ignored.size(); ++i)
				ignored_names.erase(added_ignored[i]);
1750

1751 1752 1753
			return;
		}
	}
1754

1755 1756
	ASTSelectQuery * select = dynamic_cast<ASTSelectQuery *>(&*ast);

1757 1758
	/// Рекурсивный обход выражения.
	for (auto & child : ast->children)
1759
	{
1760 1761 1762
		/** Не пойдем в секцию ARRAY JOIN, потому что там нужно смотреть на имена не-ARRAY-JOIN-енных столбцов.
		  * Туда removeUnusedColumns отправит нас отдельно.
		  */
1763 1764
		if (!dynamic_cast<ASTSubquery *>(&*child) && !dynamic_cast<ASTSelectQuery *>(&*child) &&
			!(select && child == select->array_join_expression_list))
1765
			getRequiredColumnsImpl(child, required_columns, ignored_names, available_joined_columns, required_joined_columns);
1766
    }
1767 1768
}

1769
}