ExpressionAnalyzer.cpp 61.2 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
}

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

	if (!select_query->join)
		return false;

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

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

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

		/** Для подзапроса в секции 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,
1279
			required_joined_columns,
1280 1281 1282 1283 1284 1285 1286 1287 1288
			QueryProcessingStage::Complete, subquery_depth + 1);

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

		joins.push_back(join);
	}

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

	return true;
}

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

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

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

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

1306 1307 1308
	return true;
}

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

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

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

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

1326 1327 1328
	return true;
}

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

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

1336 1337 1338 1339 1340 1341 1342
	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]);
		}
	}
1343

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

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

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

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

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

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

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

1366
	return true;
1367 1368
}

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

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

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

1378 1379 1380 1381 1382
	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());
	}
1383
}
1384

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

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

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

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

1397 1398 1399 1400 1401 1402 1403 1404 1405
	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());
	}
1406

1407 1408 1409
	return true;
}

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

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

1417
	NamesWithAliases result_columns;
1418

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

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


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

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

1443

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

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

1451 1452 1453 1454
	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()));
1455
		getRootActionsImpl(asts[i], true, false, temp_actions);
1456
	}
1457

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

1460 1461 1462
	return temp_actions.getSampleBlock();
}

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

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


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

1491
	ASTs asts;
1492

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

1498
	for (size_t i = 0; i < asts.size(); ++i)
1499
	{
1500 1501 1502 1503 1504 1505 1506 1507 1508
		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);
1509
	}
1510

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

1522
	actions->finalize(result_names);
1523

1524 1525 1526 1527 1528 1529
	return actions;
}


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

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

1534 1535 1536 1537 1538 1539 1540 1541 1542 1543
	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;
}

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

	NameSet required;
	NameSet ignored;
1553

1554 1555 1556 1557 1558 1559
	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.
1560
			/// Их потом добавим отдельно.
1561
			if (dynamic_cast<ASTIdentifier *>(&*expressions[i]))
1562
			{
1563
				ignored.insert(expressions[i]->getColumnName());
1564 1565 1566 1567
			}
			else
			{
				/// Для выражений в ARRAY JOIN ничего игнорировать не нужно.
A
Alexey Milovidov 已提交
1568
				NameSet empty;
1569
				getRequiredColumnsImpl(expressions[i], required, empty, empty, empty);
1570
			}
1571 1572

			ignored.insert(expressions[i]->getAlias());
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++);
	}

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

A
Alexey Milovidov 已提交
1597
	/// Вставляем в список требуемых столбцов столбцы, нужные для вычисления ARRAY JOIN.
1598
	NameSet array_join_sources;
A
Alexey Milovidov 已提交
1599 1600 1601 1602 1603 1604
	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);
1605

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

1610
	unknown_required_columns = required;
1611

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

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

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

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

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

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

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

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

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

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

	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;
1675 1676
}

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

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

1686 1687 1688
	return res;
}

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

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

1714 1715
		return;
	}
1716

1717 1718 1719 1720 1721 1722
	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);
1723

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

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

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

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

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

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

1752 1753 1754
			return;
		}
	}
1755

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

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

1770
}