ExpressionAnalyzer.cpp 61.9 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

#include <DB/DataStreams/copyData.h>

31 32
#include <DB/Common/typeid_cast.h>

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


namespace DB
{


40
static std::string * tryGetAlias(ASTPtr & ast)
41
{
42
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
43
		return &node->alias;
44
	else if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
45
		return &node->alias;
46
	else if (ASTLiteral * node = typeid_cast<ASTLiteral *>(&*ast))
47 48
		return &node->alias;
	else
A
Alexey Milovidov 已提交
49
		return nullptr;
50 51
}

52 53
static void setAlias(ASTPtr & ast, const std::string & alias)
{
54
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
55 56 57
	{
		node->alias = alias;
	}
58
	else if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
59 60 61
	{
		node->alias = alias;
	}
62
	else if (ASTLiteral * node = typeid_cast<ASTLiteral *>(&*ast))
63 64 65 66 67 68 69 70 71
	{
		node->alias = alias;
	}
	else
	{
		throw Exception("Can't set alias of " + ast->getColumnName(), ErrorCodes::UNKNOWN_TYPE_OF_AST_NODE);
	}
}

72 73 74

void ExpressionAnalyzer::init()
{
75
	select_query = typeid_cast<ASTSelectQuery *>(&*ast);
76

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

80 81
	findExternalTables(ast);

82
	getArrayJoinedColumns();
83

84 85
	removeUnusedColumns();

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

90
	ExpressionActionsPtr temp_actions = new ExpressionActions(columns, settings);
91 92 93

	if (select_query && select_query->array_join_expression_list)
	{
94
		getRootActionsImpl(select_query->array_join_expression_list, true, false, temp_actions);
95
		addMultipleArrayJoinAction(temp_actions);
96
	}
97

98 99
	if (select_query && select_query->join)
	{
100
		getRootActionsImpl(typeid_cast<ASTJoin &>(*select_query->join).using_expr_list, true, false, temp_actions);
101
		addJoinAction(temp_actions, true);
102 103
	}

104
	getAggregatesImpl(ast, temp_actions);
105

106 107
	if (has_aggregation)
	{
108
		assertSelect();
109

110 111 112
		/// Найдем ключи агрегации.
		if (select_query->group_expression_list)
		{
113
			NameSet unique_keys;
114 115 116
			const ASTs & group_asts = select_query->group_expression_list->children;
			for (size_t i = 0; i < group_asts.size(); ++i)
			{
117
				getRootActionsImpl(group_asts[i], true, false, temp_actions);
118

119 120
				NameAndTypePair key;
				key.first = group_asts[i]->getColumnName();
121 122 123 124
				key.second = temp_actions->getSampleBlock().has(key.first)
					? temp_actions->getSampleBlock().getByName(key.first).type
					: throw Exception("Unknown identifier (in GROUP BY): " + key.first, ErrorCodes::UNKNOWN_IDENTIFIER);

125
				aggregation_keys.push_back(key);
126

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

135 136 137 138 139 140 141 142
		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
	{
143
		aggregated_columns = temp_actions->getSampleBlock().getColumnsList();
144 145 146 147
	}
}


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


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

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

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

171
		if (!typeid_cast<ASTSelectQuery *>(&**it))
172 173 174 175 176 177
			createAliasesDict(*it, new_ignore_levels);
	}

	if (ignore_levels > 0)
		return;

178
	std::string * alias = tryGetAlias(ast);
179 180 181 182
	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 已提交
183 184

		aliases[*alias] = ast;
185 186 187 188 189 190
	}
}


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

203 204 205 206 207 208 209 210
	return StoragePtr();
}


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


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

226 227
	ASTPtr initial_ast = ast;
	current_asts.insert(initial_ast);
228

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

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

236
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
237 238
	{
		/** Нет ли в таблице столбца, название которого полностью совпадает с записью функции?
A
Alexey Milovidov 已提交
239 240
		  * Например, в таблице есть столбец "domain(URL)", и мы запросили domain(URL).
		  */
241 242 243 244 245 246 247
		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);
248
			replaced = true;
249
		}
250
		/// может быть указано in t, где t - таблица, что равносильно select * from t.
251
		if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
252
			if (ASTIdentifier * right = typeid_cast<ASTIdentifier *>(&*node->arguments->children[1]))
253
				right->kind = ASTIdentifier::Table;
254
	}
255
	else if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
256
	{
257
		if (node->kind == ASTIdentifier::Column)
258
		{
M
Merge  
Michael Kolupaev 已提交
259
			/// Если это алиас, но не родительский алиас (чтобы работали конструкции вроде "SELECT column+1 AS column").
260
			Aliases::const_iterator jt = aliases.find(node->name);
M
Merge  
Michael Kolupaev 已提交
261
			if (jt != aliases.end() && current_alias != node->name)
262
			{
263
				/// Заменим его на соответствующий узел дерева.
264 265
				if (current_asts.count(jt->second))
					throw Exception("Cyclic aliases", ErrorCodes::CYCLIC_ALIASES);
266 267 268 269 270 271 272 273 274 275 276 277
				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;
278 279 280
			}
		}
	}
281
	else if (ASTExpressionList * node = typeid_cast<ASTExpressionList *>(&*ast))
282 283 284 285 286
	{
		/// Заменим * на список столбцов.
		ASTs & asts = node->children;
		for (int i = static_cast<int>(asts.size()) - 1; i >= 0; --i)
		{
287
			if (ASTAsterisk * asterisk = typeid_cast<ASTAsterisk *>(&*asts[i]))
288 289
			{
				ASTs all_columns;
A
Alexey Milovidov 已提交
290 291 292
				for (const auto & column_name_type : columns)
					all_columns.push_back(new ASTIdentifier(asterisk->range, column_name_type.first));

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

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

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

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

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

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

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

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

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

A
Alexey Milovidov 已提交
359

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

A
Alexey Milovidov 已提交
366
void ExpressionAnalyzer::makeSetsForIndexImpl(ASTPtr & node, const Block & sample_block)
P
Pavel Kartavyy 已提交
367 368
{
	for (auto & child : node->children)
A
Alexey Milovidov 已提交
369
		makeSetsForIndexImpl(child, sample_block);
P
Pavel Kartavyy 已提交
370

371
	ASTFunction * func = typeid_cast<ASTFunction *>(node.get());
P
Pavel Kartavyy 已提交
372 373 374 375 376
	if (func && func->kind == ASTFunction::FUNCTION && (func->name == "in" || func->name == "notIn"))
	{
		IAST & args = *func->arguments;
		ASTPtr & arg = args.children[1];

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

393

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

	/// Если идентификатор типа таблица
	StoragePtr external_storage;
402
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
403
		if (node->kind == ASTIdentifier::Kind::Table)
404
			if ((external_storage = context.tryGetExternalTable(node->name)))
405 406
				external_tables[node->name] = external_storage;

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


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

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

	/// Если подзапрос или имя таблицы для селекта
434
	if (typeid_cast<const ASTSubquery *>(&*arg) || typeid_cast<const ASTIdentifier *>(&*arg))
435 436 437 438 439 440 441 442 443 444 445 446 447 448
	{
		/** Для подзапроса в секции 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;
449
		if (const ASTIdentifier * table = typeid_cast<const ASTIdentifier *>(&*arg))
450 451 452
		{
			ParserSelectQuery parser;

453 454
			StoragePtr existing_storage;

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

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

			bool parse_res = parser.parse(pos, end, subquery, expected);
			if (!parse_res)
470
				throw Exception("Error in parsing SELECT query while creating set for table " + table->name + ".",
A
Alexey Milovidov 已提交
471
					ErrorCodes::LOGICAL_ERROR);
472 473 474 475 476 477 478 479 480
		}
		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());

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

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

		/// Добавляем множество, при обработке которого будет заполнена внешняя таблица.
		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]);
496
		ast_set->set->setOnlyExternal(true);
497
		sets_with_subqueries[ast_set->getColumnName()] = ast_set->set;
498 499
	}
	else
500
		throw Exception("GLOBAL [NOT] IN supports only SELECT data.", ErrorCodes::BAD_ARGUMENTS);
501 502 503
}


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

513
	if (typeid_cast<ASTSet *>(&*arg))
514
		return;
515

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

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

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

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

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

			/** В правой части IN-а может стоять подзапрос или имя таблицы.
			  * Во втором случае, это эквивалентно подзапросу (SELECT * FROM t).
			  */
543
			if (ASTIdentifier * table = typeid_cast<ASTIdentifier *>(&*arg))
544
			{
545 546 547 548 549 550 551 552 553 554 555 556 557 558
				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;
559
					Expected expected = "";
560 561 562 563 564 565

					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);
				}
566 567 568 569
			}
			else
				subquery = arg->children[0];

570 571 572
			/// Если чтение из внешней таблицы, то источник данных уже вычислен.
			if (!external)
			{
573 574 575 576 577 578 579 580 581 582 583 584
				/** Для подзапроса в секции 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);

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

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

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

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

607 608 609
		DataTypes set_element_types;
		ASTPtr & left_arg = args.children[0];

610
		ASTFunction * left_arg_tuple = typeid_cast<ASTFunction *>(&*left_arg);
611 612 613 614 615 616

		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)
617
				set_element_types.push_back(sample_block.getByName((*it)->getColumnName()).type);
618 619 620
		}
		else
		{
621
			DataTypePtr left_type = sample_block.getByName(left_arg->getColumnName()).type;
622
			if (DataTypeArray * array_type = typeid_cast<DataTypeArray *>(&*left_type))
623 624 625 626
				set_element_types.push_back(array_type->getNestedType());
			else
				set_element_types.push_back(left_type);
		}
627

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

632
		if (ASTFunction * set_func = typeid_cast<ASTFunction *>(&*arg))
633 634 635 636
		{
			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);
637

638
			/// Отличм случай (x, y) in ((1, 2), (3, 4)) от случая (x, y) in (1, 2).
639
			ASTFunction * any_element = typeid_cast<ASTFunction *>(&*set_func->arguments->children[0]);
640 641 642 643 644
			if (set_element_types.size() >= 2 && (!any_element || any_element->name != "tuple"))
				single_value = true;
			else
				elements_ast = set_func->arguments;
		}
645
		else if (typeid_cast<ASTLiteral *>(&*arg))
646 647 648 649 650 651 652 653
		{
			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);
		}
654

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

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


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


A
Alexey Milovidov 已提交
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697
/** Для 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;

698
	ScopeStack(const ExpressionActionsPtr & actions, const Settings & settings_)
A
Alexey Milovidov 已提交
699 700 701
		: settings(settings_)
	{
		stack.push_back(Level());
702
		stack.back().actions = actions;
703 704 705 706

		const Block & sample_block = actions->getSampleBlock();
		for (size_t i = 0, size = sample_block.columns(); i < size; ++i)
			stack.back().new_columns.insert(sample_block.unsafeGetByPosition(i).name);
A
Alexey Milovidov 已提交
707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723
	}

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

		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);
		}

724 725
		const Block & prev_sample_block = prev.actions->getSampleBlock();
		for (size_t i = 0, size = prev_sample_block.columns(); i < size; ++i)
A
Alexey Milovidov 已提交
726
		{
727 728 729
			const ColumnWithNameAndType & col = prev_sample_block.unsafeGetByPosition(i);
			if (!new_names.count(col.name))
				all_columns.push_back(col);
A
Alexey Milovidov 已提交
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
		}

		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();
	}
};


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


788 789
void ExpressionAnalyzer::getArrayJoinedColumns()
{
790 791
	if (select_query && select_query->array_join_expression_list)
	{
792 793 794 795 796 797 798
		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();
799
			if (nested_table_alias == nested_table_name && !typeid_cast<ASTIdentifier *>(&*ast))
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
				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);
		}
815 816 817

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

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


void ExpressionAnalyzer::getArrayJoinedColumnsImpl(ASTPtr ast)
852
{
853
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
854
	{
855 856 857 858 859 860 861 862 863 864 865 866
		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);
			}
		}
867 868 869 870
	}
	else
	{
		for (ASTs::iterator it = ast->children.begin(); it != ast->children.end(); ++it)
871
			if (!typeid_cast<ASTSelectQuery *>(&**it))
872
				getArrayJoinedColumnsImpl(*it);
873 874 875 876 877
	}
}


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

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

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

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

907 908 909 910 911
		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];
912
			getActionsImpl(arg, no_subqueries, only_consts, actions_stack);
913
			if (!only_consts)
914
			{
915
				String result_name = node->getColumnName();
916
				actions_stack.addAction(ExpressionAction::copyColumn(arg->getColumnName(), result_name));
917 918
				NameSet joined_columns;
				joined_columns.insert(result_name);
919
				actions_stack.addAction(ExpressionAction::arrayJoin(joined_columns));
920
			}
921

922 923
			return;
		}
924

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

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

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

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

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

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

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

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

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

989 990 991 992 993 994 995 996 997 998 999
					/// Если аргумент - множество, заданное перечислением значений, дадим ему уникальное имя,
					///  чтобы множества с одинаковой записью не склеивались (у них может быть разный тип).
					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);

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

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

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

1033
			Names additional_requirements;
1034

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

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

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

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

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

1061
							lambda_arguments.push_back(arg);
1062
						}
1063

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

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

1073 1074 1075 1076
						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]);
1077

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

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

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

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

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


1126
void ExpressionAnalyzer::getAggregatesImpl(ASTPtr ast, ExpressionActionsPtr & actions)
1127
{
1128
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1129
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
1130
	{
1131
		has_aggregation = true;
1132 1133
		AggregateDescription aggregate;
		aggregate.column_name = node->getColumnName();
1134

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1217
	actions->add(ExpressionAction::arrayJoin(result_columns));
1218 1219
}

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

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

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

1230
	getRootActionsImpl(select_query->array_join_expression_list, only_types, false, step.actions);
1231

1232
	addMultipleArrayJoinAction(step.actions);
1233

1234 1235 1236
	return true;
}

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

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

	if (!select_query->join)
		return false;

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

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

1255
	{
1256 1257 1258
		Names join_key_names_left(join_key_names_left_set.begin(), join_key_names_left_set.end());
		Names join_key_names_right(join_key_names_right_set.begin(), join_key_names_right_set.end());
		JoinPtr join = new Join(join_key_names_left, join_key_names_right, settings.limits, ast_join.kind, ast_join.strictness);
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272

		/** Для подзапроса в секции 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);

1273 1274 1275 1276
		for (const auto & name_type : columns_added_by_join)
			std::cerr << "! Column added by JOIN: " << name_type.first << std::endl;

		Names required_joined_columns(join_key_names_right.begin(), join_key_names_right.end());
1277 1278 1279 1280
		for (const auto & name_type : columns_added_by_join)
			required_joined_columns.push_back(name_type.first);

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

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

		joins.push_back(join);
	}

1291
	addJoinAction(step.actions, false);
1292 1293 1294 1295

	return true;
}

1296
bool ExpressionAnalyzer::appendWhere(ExpressionActionsChain & chain, bool only_types)
1297 1298
{
	assertSelect();
1299

1300 1301
	if (!select_query->where_expression)
		return false;
1302

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

1306
	step.required_output.push_back(select_query->where_expression->getColumnName());
1307
	getRootActionsImpl(select_query->where_expression, only_types, false, step.actions);
1308

1309 1310 1311
	return true;
}

1312
bool ExpressionAnalyzer::appendGroupBy(ExpressionActionsChain & chain, bool only_types)
1313 1314
{
	assertAggregation();
1315

1316 1317
	if (!select_query->group_expression_list)
		return false;
1318

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

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

1329 1330 1331
	return true;
}

1332
void ExpressionAnalyzer::appendAggregateFunctionsArguments(ExpressionActionsChain & chain, bool only_types)
1333 1334
{
	assertAggregation();
1335

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

1339 1340 1341 1342 1343 1344 1345
	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]);
		}
	}
1346

1347
	getActionsBeforeAggregationImpl(select_query->select_expression_list, step.actions, only_types);
1348

1349
	if (select_query->having_expression)
1350
		getActionsBeforeAggregationImpl(select_query->having_expression, step.actions, only_types);
1351

1352
	if (select_query->order_expression_list)
1353
		getActionsBeforeAggregationImpl(select_query->order_expression_list, step.actions, only_types);
1354 1355
}

1356
bool ExpressionAnalyzer::appendHaving(ExpressionActionsChain & chain, bool only_types)
1357 1358
{
	assertAggregation();
1359

1360 1361
	if (!select_query->having_expression)
		return false;
1362

1363 1364
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1365

1366
	step.required_output.push_back(select_query->having_expression->getColumnName());
1367
	getRootActionsImpl(select_query->having_expression, only_types, false, step.actions);
1368

1369
	return true;
1370 1371
}

1372
void ExpressionAnalyzer::appendSelect(ExpressionActionsChain & chain, bool only_types)
1373 1374
{
	assertSelect();
1375

1376 1377
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1378

1379
	getRootActionsImpl(select_query->select_expression_list, only_types, false, step.actions);
1380

1381 1382 1383 1384 1385
	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());
	}
1386
}
1387

1388
bool ExpressionAnalyzer::appendOrderBy(ExpressionActionsChain & chain, bool only_types)
1389
{
1390
	assertSelect();
1391

1392 1393
	if (!select_query->order_expression_list)
		return false;
1394

1395 1396
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1397

1398
	getRootActionsImpl(select_query->order_expression_list, only_types, false, step.actions);
1399

1400 1401 1402
	ASTs asts = select_query->order_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
1403
		ASTOrderByElement * ast = typeid_cast<ASTOrderByElement *>(&*asts[i]);
1404 1405 1406 1407 1408
		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());
	}
1409

1410 1411 1412
	return true;
}

1413
void ExpressionAnalyzer::appendProjectResult(DB::ExpressionActionsChain & chain, bool only_types)
1414 1415
{
	assertSelect();
1416

1417 1418
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1419

1420
	NamesWithAliases result_columns;
1421

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

1429
	step.actions->add(ExpressionAction::project(result_columns));
1430 1431 1432
}


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

1441 1442
Joins ExpressionAnalyzer::getJoinsWithSubqueries()
{
1443
	return joins;
1444 1445
}

1446

1447 1448 1449
Block ExpressionAnalyzer::getSelectSampleBlock()
{
	assertSelect();
1450

1451
	ExpressionActionsPtr temp_actions = new ExpressionActions(aggregated_columns, settings);
1452
	NamesWithAliases result_columns;
1453

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

1461
	temp_actions->add(ExpressionAction::project(result_columns));
1462

1463
	return temp_actions->getSampleBlock();
1464 1465
}

1466
void ExpressionAnalyzer::getActionsBeforeAggregationImpl(ASTPtr ast, ExpressionActionsPtr & actions, bool no_subqueries)
1467
{
1468
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1469
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
1470 1471
	{
		ASTs & arguments = node->arguments->children;
1472

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


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

1494
	ASTs asts;
1495

1496
	if (ASTExpressionList * node = typeid_cast<ASTExpressionList *>(&*ast))
1497
		asts = node->children;
1498
	else
1499
		asts = ASTs(1, ast);
1500

1501
	for (size_t i = 0; i < asts.size(); ++i)
1502
	{
1503 1504 1505 1506 1507 1508 1509 1510
		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);
1511
		getRootActionsImpl(asts[i], false, false, actions);
1512
	}
1513

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

1525
	actions->finalize(result_names);
1526

1527 1528 1529 1530 1531 1532
	return actions;
}


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

1535
	getRootActionsImpl(ast, true, true, actions);
1536

1537 1538 1539 1540 1541 1542 1543 1544 1545 1546
	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;
}

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

	NameSet required;
	NameSet ignored;
1556

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

			ignored.insert(expressions[i]->getAlias());
1576 1577
		}
	}
1578

1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
	/** Также нужно не учитывать идентификаторы столбцов, получающихся путём 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++);
	}

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

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

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

1613
	unknown_required_columns = required;
1614

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

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

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

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

1647
	std::cerr << "collectJoinedColumns" << std::endl;
1648

1649 1650
	auto & node = typeid_cast<ASTJoin &>(*select_query->join);
	auto & keys = typeid_cast<ASTExpressionList &>(*node.using_expr_list);
1651
	auto & select = node.subquery->children[0];
1652

1653
	size_t num_join_keys = keys.children.size();
1654 1655

	for (size_t i = 0; i < num_join_keys; ++i)
1656 1657
	{
		if (!join_key_names_left_set.insert(keys.children[i]->getColumnName()).second)
1658 1659
			throw Exception("Duplicate column in USING list", ErrorCodes::DUPLICATE_COLUMN);

1660 1661 1662 1663
		if (!join_key_names_right_set.insert(keys.children[i]->getAlias()).second)
			throw Exception("Duplicate column in USING list", ErrorCodes::DUPLICATE_COLUMN);
	}

1664
	Block nested_result_sample = ExpressionAnalyzer(select, context, subquery_depth + 1).getSelectSampleBlock();
1665

1666 1667
	size_t nested_result_columns = nested_result_sample.columns();
	for (size_t i = 0; i < nested_result_columns; ++i)
1668
	{
1669
		auto col = nested_result_sample.getByPosition(i);
1670
		if (!join_key_names_right_set.count(col.name))
1671
		{
1672 1673
			joined_columns.insert(col.name);
			joined_columns_name_type.emplace_back(col.name, col.type);
1674
		}
1675
	}
1676

1677 1678 1679 1680
	for (const auto & name : join_key_names_left_set)
		std::cerr << "JOIN key (left): " << name << std::endl;
	for (const auto & name : join_key_names_right_set)
		std::cerr << "JOIN key (right): " << name << std::endl;
1681 1682 1683 1684
	std::cerr << std::endl;
	for (const auto & name : joined_columns)
		std::cerr << "JOINed column: " << name << std::endl;
	std::cerr << std::endl;
1685 1686
}

1687 1688
Names ExpressionAnalyzer::getRequiredColumns()
{
M
Merge  
Michael Kolupaev 已提交
1689 1690
	if (!unknown_required_columns.empty())
		throw Exception("Unknown identifier: " + *unknown_required_columns.begin(), ErrorCodes::UNKNOWN_IDENTIFIER);
1691

1692
	Names res;
1693 1694
	for (const auto & column_name_type : columns)
		res.push_back(column_name_type.first);
A
Alexey Milovidov 已提交
1695

1696 1697 1698
	return res;
}

1699 1700 1701
void ExpressionAnalyzer::getRequiredColumnsImpl(ASTPtr ast,
	NameSet & required_columns, NameSet & ignored_names,
	const NameSet & available_joined_columns, NameSet & required_joined_columns)
1702
{
1703 1704 1705 1706 1707
	/** Найдём все идентификаторы в запросе.
	  * Будем искать их рекурсивно, обходя в глубину AST.
	  * При этом:
	  * - для лямбда функций не будем брать формальные параметры;
	  * - не опускаемся в подзапросы (там свои идентификаторы);
1708 1709
	  * - некоторое исключение для секции ARRAY JOIN (в ней идентификаторы немного другие);
	  * - идентификаторы, доступные из JOIN-а, кладём в required_joined_columns.
1710 1711
	  */

1712
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
1713
	{
1714 1715 1716
		if (node->kind == ASTIdentifier::Column
			&& !ignored_names.count(node->name)
			&& !ignored_names.count(DataTypeNested::extractNestedTableName(node->name)))
1717
		{
1718 1719 1720 1721
			if (!available_joined_columns.count(node->name))
				required_columns.insert(node->name);
			else
				required_joined_columns.insert(node->name);
1722
		}
A
Alexey Milovidov 已提交
1723

1724 1725
		return;
	}
1726

1727
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
1728 1729 1730 1731 1732
	{
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
		{
			if (node->arguments->children.size() != 2)
				throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
1733

1734
			ASTFunction * lambda_args_tuple = typeid_cast<ASTFunction *>(&*node->arguments->children[0]);
1735

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

1739
			/// Не нужно добавлять формальные параметры лямбда-выражения в required_columns.
1740
			Names added_ignored;
1741
			for (size_t i = 0 ; i < lambda_args_tuple->arguments->children.size(); ++i)
1742
			{
1743
				ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*lambda_args_tuple->arguments->children[i]);
1744 1745
				if (!identifier)
					throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1746 1747

				String & name = identifier->name;
1748 1749 1750 1751 1752 1753
				if (!ignored_names.count(name))
				{
					ignored_names.insert(name);
					added_ignored.push_back(name);
				}
			}
1754

1755 1756 1757
			getRequiredColumnsImpl(node->arguments->children[1],
				required_columns, ignored_names,
				available_joined_columns, required_joined_columns);
1758

1759 1760
			for (size_t i = 0; i < added_ignored.size(); ++i)
				ignored_names.erase(added_ignored[i]);
1761

1762 1763 1764
			return;
		}
	}
1765

1766
	ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast);
1767

1768 1769
	/// Рекурсивный обход выражения.
	for (auto & child : ast->children)
1770
	{
1771 1772 1773
		/** Не пойдем в секцию ARRAY JOIN, потому что там нужно смотреть на имена не-ARRAY-JOIN-енных столбцов.
		  * Туда removeUnusedColumns отправит нас отдельно.
		  */
1774
		if (!typeid_cast<ASTSubquery *>(&*child) && !typeid_cast<ASTSelectQuery *>(&*child) &&
1775
			!(select && child == select->array_join_expression_list))
1776
			getRequiredColumnsImpl(child, required_columns, ignored_names, available_joined_columns, required_joined_columns);
1777
    }
1778 1779
}

1780
}