ExpressionAnalyzer.cpp 62.6 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 40 41


namespace DB
{


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

44 45 46
	/// Создаёт словарь aliases: alias -> ASTPtr
	createAliasesDict(ast);

47
	/// Common subexpression elimination. Rewrite rules.
48
	normalizeTree();
49

50
	/// array_join_alias_to_name, array_join_result_to_source.
51
	getArrayJoinedColumns();
52

53 54 55 56 57
	/// Удалить ненужное из списка columns. Создать unknown_required_columns. Сформировать columns_added_by_join.
	collectUsedColumns();

	/// has_aggregation, aggregation_keys, aggregate_descriptions, aggregated_columns.
	analyzeAggregation();
58 59 60 61

	/// external_tables, external_data.
	/// Заменяет глобальные подзапросы на сгенерированные имена временных таблиц, которые будут отправлены на удалённые серверы.
	initGlobalSubqueriesAndExternalTables();
62 63 64 65 66 67 68 69 70 71 72
}


void ExpressionAnalyzer::analyzeAggregation()
{
	/** Найдем ключи агрегации (aggregation_keys), информацию об агрегатных функциях (aggregate_descriptions),
	 *  а также набор столбцов, получаемых после агрегации, если она есть,
	 *  или после всех действий, которые обычно выполняются до агрегации (aggregated_columns).
	 *
	 * Всё, что ниже (составление временных ExpressionActions) - только в целях анализа запроса (вывода типов).
	 */
73

74 75
	if (select_query && (select_query->group_expression_list || select_query->having_expression))
		has_aggregation = true;
76

77
	ExpressionActionsPtr temp_actions = new ExpressionActions(columns, settings);
78 79 80

	if (select_query && select_query->array_join_expression_list)
	{
81
		getRootActions(select_query->array_join_expression_list, true, false, temp_actions);
82
		addMultipleArrayJoinAction(temp_actions);
83
	}
84

85 86
	if (select_query && select_query->join)
	{
87
		getRootActions(typeid_cast<ASTJoin &>(*select_query->join).using_expr_list, true, false, temp_actions);
88
		addJoinAction(temp_actions, true);
89 90
	}

91
	getAggregates(ast, temp_actions);
92

93 94
	if (has_aggregation)
	{
95
		assertSelect();
96

97 98 99
		/// Найдем ключи агрегации.
		if (select_query->group_expression_list)
		{
100
			NameSet unique_keys;
101 102 103
			const ASTs & group_asts = select_query->group_expression_list->children;
			for (size_t i = 0; i < group_asts.size(); ++i)
			{
104
				getRootActions(group_asts[i], true, false, temp_actions);
105

106 107
				NameAndTypePair key;
				key.first = group_asts[i]->getColumnName();
108 109 110 111
				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);

112
				aggregation_keys.push_back(key);
113

114 115 116 117 118
				if (!unique_keys.count(key.first))
				{
					aggregated_columns.push_back(key);
					unique_keys.insert(key.first);
				}
119 120
			}
		}
121

122 123 124
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
		{
			AggregateDescription & desc = aggregate_descriptions[i];
125
			aggregated_columns.emplace_back(desc.column_name, desc.function->getReturnType());
126 127 128 129
		}
	}
	else
	{
130
		aggregated_columns = temp_actions->getSampleBlock().getColumnsList();
131 132 133 134
	}
}


135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
void ExpressionAnalyzer::initGlobalSubqueriesAndExternalTables()
{
	initGlobalSubqueries(ast);

	/// Создаёт словарь external_tables: name -> StoragePtr.
	findExternalTables(ast);
}


void ExpressionAnalyzer::initGlobalSubqueries(ASTPtr & ast)
{
	/// Рекурсивные вызовы. Не опускаемся в подзапросы.

	for (auto & child : ast->children)
		if (!typeid_cast<ASTSelectQuery *>(&*child))
			initGlobalSubqueries(child);

	/// Действия, выполняемые снизу вверх.

	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
	{
		/// Для GLOBAL IN.
		if (do_global && (node->name == "globalIn" || node->name == "globalNotIn"))
			addExternalStorage(node->arguments->children.at(1));
	}
	else if (ASTJoin * node = typeid_cast<ASTJoin *>(&*ast))
	{
		/// Для GLOBAL JOIN.
		if (do_global && node->locality == ASTJoin::Global)
			addExternalStorage(node->table);
	}
}


void ExpressionAnalyzer::findExternalTables(ASTPtr & ast)
{
	/// Обход снизу. Намеренно опускаемся в подзапросы.
	for (auto & child : ast->children)
		findExternalTables(child);

	/// Если идентификатор типа таблица
	StoragePtr external_storage;

	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
		if (node->kind == ASTIdentifier::Kind::Table)
			if ((external_storage = context.tryGetExternalTable(node->name)))
				external_tables[node->name] = external_storage;
}


A
Alexey Milovidov 已提交
185
NamesAndTypesList::iterator ExpressionAnalyzer::findColumn(const String & name, NamesAndTypesList & cols)
186
{
A
Alexey Milovidov 已提交
187 188
	return std::find_if(cols.begin(), cols.end(),
		[&](const NamesAndTypesList::value_type & val) { return val.first == name; });
189 190 191
}


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

198
	/// Обход снизу-вверх. Не опускаемся в подзапросы.
199
	for (auto & child : ast->children)
200 201
	{
		int new_ignore_levels = std::max(0, ignore_levels - 1);
A
Alexey Milovidov 已提交
202

203 204
		/// Алиасы верхнего уровня в секции ARRAY JOIN имеют особый смысл, их добавлять не будем
		///  (пропустим сам expression list и его детей).
205
		if (select && child == select->array_join_expression_list)
206
			new_ignore_levels = 2;
A
Alexey Milovidov 已提交
207

208 209
		if (!typeid_cast<ASTSelectQuery *>(&*child))
			createAliasesDict(child, new_ignore_levels);
210 211 212 213 214
	}

	if (ignore_levels > 0)
		return;

A
Alexey Milovidov 已提交
215 216
	String alias = ast->tryGetAlias();
	if (!alias.empty())
217
	{
A
Alexey Milovidov 已提交
218 219
		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 已提交
220

A
Alexey Milovidov 已提交
221
		aliases[alias] = ast;
222 223 224 225 226 227
	}
}


StoragePtr ExpressionAnalyzer::getTable()
{
228
	if (const ASTSelectQuery * select = typeid_cast<const ASTSelectQuery *>(&*ast))
229
	{
230
		if (select->table && !typeid_cast<const ASTSelectQuery *>(&*select->table) && !typeid_cast<const ASTFunction *>(&*select->table))
231
		{
A
Alexey Milovidov 已提交
232
			String database = select->database
233
				? typeid_cast<const ASTIdentifier &>(*select->database).name
A
Alexey Milovidov 已提交
234
				: "";
235
			const String & table = typeid_cast<const ASTIdentifier &>(*select->table).name;
236 237 238
			return context.tryGetTable(database, table);
		}
	}
A
Alexey Milovidov 已提交
239

240 241 242 243 244 245 246 247
	return StoragePtr();
}


void ExpressionAnalyzer::normalizeTree()
{
	SetOfASTs tmp_set;
	MapOfASTs tmp_map;
248
	normalizeTreeImpl(ast, tmp_map, tmp_set, "");
249 250 251 252 253
}


/// finished_asts - уже обработанные вершины (и на что они заменены)
/// current_asts - вершины в текущем стеке вызовов этого метода
254
/// current_alias - алиас, повешенный на предка ast (самого глубокого из предков с алиасами)
255
void ExpressionAnalyzer::normalizeTreeImpl(ASTPtr & ast, MapOfASTs & finished_asts, SetOfASTs & current_asts, std::string current_alias)
256 257 258 259 260 261
{
	if (finished_asts.count(ast))
	{
		ast = finished_asts[ast];
		return;
	}
262

263 264
	ASTPtr initial_ast = ast;
	current_asts.insert(initial_ast);
265

A
Alexey Milovidov 已提交
266 267 268
	String my_alias = ast->tryGetAlias();
	if (!my_alias.empty())
		current_alias = my_alias;
269

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

273
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
274 275
	{
		/** Нет ли в таблице столбца, название которого полностью совпадает с записью функции?
A
Alexey Milovidov 已提交
276 277
		  * Например, в таблице есть столбец "domain(URL)", и мы запросили domain(URL).
		  */
278 279 280 281 282 283 284
		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);
285
			replaced = true;
286
		}
287 288

		/// может быть указано IN t, где t - таблица, что равносильно IN (SELECT * FROM t).
289
		if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
290
			if (ASTIdentifier * right = typeid_cast<ASTIdentifier *>(&*node->arguments->children.at(1)))
291
				right->kind = ASTIdentifier::Table;
292
	}
293
	else if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
294
	{
295
		if (node->kind == ASTIdentifier::Column)
296
		{
M
Merge  
Michael Kolupaev 已提交
297
			/// Если это алиас, но не родительский алиас (чтобы работали конструкции вроде "SELECT column+1 AS column").
298
			Aliases::const_iterator jt = aliases.find(node->name);
M
Merge  
Michael Kolupaev 已提交
299
			if (jt != aliases.end() && current_alias != node->name)
300
			{
301
				/// Заменим его на соответствующий узел дерева.
302 303
				if (current_asts.count(jt->second))
					throw Exception("Cyclic aliases", ErrorCodes::CYCLIC_ALIASES);
A
Alexey Milovidov 已提交
304
				if (!my_alias.empty() && my_alias != jt->second->getAliasOrColumnName())
305 306 307
				{
					/// В конструкции вроде "a AS b", где a - алиас, нужно перевесить алиас b на результат подстановки алиаса a.
					ast = jt->second->clone();
A
Alexey Milovidov 已提交
308
					ast->setAlias(my_alias);
309 310 311 312 313 314 315
				}
				else
				{
					ast = jt->second;
				}

				replaced = true;
316 317 318
			}
		}
	}
319
	else if (ASTExpressionList * node = typeid_cast<ASTExpressionList *>(&*ast))
320 321 322 323 324
	{
		/// Заменим * на список столбцов.
		ASTs & asts = node->children;
		for (int i = static_cast<int>(asts.size()) - 1; i >= 0; --i)
		{
325
			if (ASTAsterisk * asterisk = typeid_cast<ASTAsterisk *>(&*asts[i]))
326 327
			{
				ASTs all_columns;
A
Alexey Milovidov 已提交
328
				for (const auto & column_name_type : columns)
329
					all_columns.emplace_back(new ASTIdentifier(asterisk->range, column_name_type.first));
A
Alexey Milovidov 已提交
330

331 332 333 334 335
				asts.erase(asts.begin() + i);
				asts.insert(asts.begin() + i, all_columns.begin(), all_columns.end());
			}
		}
	}
336 337 338 339 340 341
	else if (ASTJoin * node = typeid_cast<ASTJoin *>(&*ast))
	{
		/// может быть указано JOIN t, где t - таблица, что равносильно JOIN (SELECT * FROM t).
		if (ASTIdentifier * right = typeid_cast<ASTIdentifier *>(&*node->table))
			right->kind = ASTIdentifier::Table;
	}
342

343 344 345
	/// Если заменили корень поддерева вызовемся для нового корня снова - на случай, если алиас заменился на алиас.
	if (replaced)
	{
346
		normalizeTreeImpl(ast, finished_asts, current_asts, current_alias);
347 348 349 350 351 352
		current_asts.erase(initial_ast);
		current_asts.erase(ast);
		finished_asts[initial_ast] = ast;
		return;
	}

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

355 356 357
	for (auto & child : ast->children)
		if (!typeid_cast<ASTSelectQuery *>(&*child))
			normalizeTreeImpl(child, finished_asts, current_asts, current_alias);
358

359
	/// Если секция WHERE или HAVING состоит из одного алиаса, ссылку нужно заменить не только в children, но и в where_expression и having_expression.
360
	if (ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast))
361
	{
362
		if (select->prewhere_expression)
363
			normalizeTreeImpl(select->prewhere_expression, finished_asts, current_asts, current_alias);
364
		if (select->where_expression)
365
			normalizeTreeImpl(select->where_expression, finished_asts, current_asts, current_alias);
366
		if (select->having_expression)
367
			normalizeTreeImpl(select->having_expression, finished_asts, current_asts, current_alias);
368
	}
369

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

372
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
373
	{
374 375 376 377
		if (node->kind == ASTFunction::TABLE_FUNCTION)
		{
		}
		else if (node->name == "lambda")
378
		{
379
			node->kind = ASTFunction::LAMBDA_EXPRESSION;
380 381 382
		}
		else if (context.getAggregateFunctionFactory().isAggregateFunctionName(node->name))
		{
383
			node->kind = ASTFunction::AGGREGATE_FUNCTION;
384
		}
385 386 387 388 389 390 391 392
		else if (node->name == "arrayJoin")
		{
			node->kind = ASTFunction::ARRAY_JOIN;
		}
		else
		{
			node->kind = ASTFunction::FUNCTION;
		}
393
	}
394

395 396 397 398 399
	current_asts.erase(initial_ast);
	current_asts.erase(ast);
	finished_asts[initial_ast] = ast;
}

A
Alexey Milovidov 已提交
400

401
void ExpressionAnalyzer::makeSetsForIndex()
P
Pavel Kartavyy 已提交
402
{
403
	if (storage && ast && storage->supportsIndexForIn())
A
Alexey Milovidov 已提交
404
		makeSetsForIndexImpl(ast, storage->getSampleBlock());
P
Pavel Kartavyy 已提交
405 406
}

A
Alexey Milovidov 已提交
407
void ExpressionAnalyzer::makeSetsForIndexImpl(ASTPtr & node, const Block & sample_block)
P
Pavel Kartavyy 已提交
408 409
{
	for (auto & child : node->children)
A
Alexey Milovidov 已提交
410
		makeSetsForIndexImpl(child, sample_block);
P
Pavel Kartavyy 已提交
411

412
	ASTFunction * func = typeid_cast<ASTFunction *>(node.get());
P
Pavel Kartavyy 已提交
413 414 415
	if (func && func->kind == ASTFunction::FUNCTION && (func->name == "in" || func->name == "notIn"))
	{
		IAST & args = *func->arguments;
416
		ASTPtr & arg = args.children.at(1);
P
Pavel Kartavyy 已提交
417

418
		if (!typeid_cast<ASTSet *>(&*arg) && !typeid_cast<ASTSubquery *>(&*arg) && !typeid_cast<ASTIdentifier *>(&*arg))
419 420 421
		{
			try
			{
422
				makeExplicitSet(func, sample_block, true);
423 424 425 426 427 428 429 430
			}
			catch (const DB::Exception & e)
			{
				/// в sample_block нет колонок, которые добаляет getActions
				if (e.code() != ErrorCodes::NOT_FOUND_COLUMN_IN_BLOCK)
					throw;
			}
		}
P
Pavel Kartavyy 已提交
431 432
	}
}
433

434

435
void ExpressionAnalyzer::addExternalStorage(ASTPtr & subquery_or_table_name)
436
{
A
Alexey Milovidov 已提交
437
	/// Сгенерируем имя для внешней таблицы.
438
	while (context.tryGetExternalTable("_data" + toString(external_table_id)))
439 440
		++external_table_id;

441
	StoragePtr external_storage;
442

443 444 445
	/// Подзапрос или имя таблицы. Имя таблицы аналогично подзапросу SELECT * FROM t.
	const ASTSubquery * subquery = typeid_cast<const ASTSubquery *>(&*subquery_or_table_name);
	const ASTIdentifier * table = typeid_cast<const ASTIdentifier *>(&*subquery_or_table_name);
446

447 448
	if (!subquery && !table)
		throw Exception("IN/JOIN supports only SELECT subqueries.", ErrorCodes::BAD_ARGUMENTS);
449

450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
	/** Для подзапроса в секции IN/JOIN не действуют ограничения на максимальный размер результата.
	  * Так как результат этого поздапроса - ещё не результат всего запроса.
	  * Вместо этого работают ограничения
	  *  max_rows_in_set, max_bytes_in_set, set_overflow_mode,
	  *  max_rows_in_join, max_bytes_in_join, join_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 query;
	if (table)
	{
		ParserSelectQuery parser;
468

469
		StoragePtr existing_storage;
470

471 472 473 474 475
		/// Если это уже внешняя таблица, ничего заполять не нужно. Просто запоминаем ее наличие.
		if ((existing_storage = context.tryGetExternalTable(table->name)))
		{
			external_tables[table->name] = existing_storage;
			return;
476 477
		}

478 479 480 481 482
		String query_str = "SELECT * FROM " + table->name;
		const char * begin = query_str.data();
		const char * end = begin + query_str.size();
		const char * pos = begin;
		Expected expected = "";
483

484 485 486 487
		bool parse_res = parser.parse(pos, end, query, expected);
		if (!parse_res)
			throw Exception("Error in parsing SELECT query while creating set or join for table " + table->name + ".",
				ErrorCodes::LOGICAL_ERROR);
488 489
	}
	else
490 491 492 493 494 495 496
		query = subquery->children.at(0);

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

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

497 498
	String external_table_name = "_data" + toString(external_table_id);
	++external_table_id;
499 500 501 502 503 504 505 506 507 508
	external_storage = StorageMemory::create(external_table_name, columns);

	ASTIdentifier * ast_ident = new ASTIdentifier;
	ast_ident->kind = ASTIdentifier::Table;
	ast_ident->name = external_storage->getTableName();
	subquery_or_table_name = ast_ident;
	external_tables[external_table_name] = external_storage;
	external_data[external_table_name] = interpreter.execute();

	/// Добавляем множество, при обработке которого будет заполнена внешняя таблица. // TODO JOIN
509 510 511 512 513
	SetPtr set = new Set(settings.limits);
	set->setSource(external_data[external_table_name]);
	set->setExternalOutput(external_tables[external_table_name]);
	set->setOnlyExternal(true);
	sets_with_subqueries["external_" + subquery_or_table_name->getColumnName()] = set;
514 515 516
}


517
void ExpressionAnalyzer::makeSet(ASTFunction * node, const Block & sample_block)
518
{
519
	/** Нужно преобразовать правый аргумент в множество.
520
	  * Это может быть имя таблицы, значение, перечисление значений или подзапрос.
521 522 523
	  * Перечисление значений парсится как функция tuple.
	  */
	IAST & args = *node->arguments;
524
	ASTPtr & arg = args.children.at(1);
525

526
	if (typeid_cast<ASTSet *>(&*arg))
527
		return;
528

529
	/// Если подзапрос или имя таблицы для SELECT.
530
	if (typeid_cast<ASTSubquery *>(&*arg) || typeid_cast<ASTIdentifier *>(&*arg))
531
	{
532
		/// Получаем поток блоков для подзапроса, отдаем его множеству, и кладём это множество на место подзапроса.
533
		ASTSet * ast_set = new ASTSet(arg->getColumnName());
534
		ASTPtr ast_set_ptr = ast_set;
535

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

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

A
Alexey Milovidov 已提交
542
		if (sets_with_subqueries.count(set_id))
543
		{
A
Alexey Milovidov 已提交
544
			ast_set->set = sets_with_subqueries[set_id];
545 546 547
		}
		else
		{
548 549
			ast_set->set = new Set(settings.limits);

550
			ASTPtr subquery;
551
			bool external = false;
A
Alexey Milovidov 已提交
552 553 554 555

			/** В правой части IN-а может стоять подзапрос или имя таблицы.
			  * Во втором случае, это эквивалентно подзапросу (SELECT * FROM t).
			  */
556
			if (ASTIdentifier * table = typeid_cast<ASTIdentifier *>(&*arg))
557
			{
558 559 560 561 562 563 564 565 566 567 568 569 570 571
				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;
572
					Expected expected = "";
573 574 575 576 577 578

					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);
				}
579 580
			}
			else
581
				subquery = arg->children.at(0);
582

583 584 585
			/// Если чтение из внешней таблицы, то источник данных уже вычислен.
			if (!external)
			{
586 587 588 589 590 591 592 593 594 595 596 597
				/** Для подзапроса в секции 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);

598 599 600
				InterpreterSelectQuery interpreter(subquery, subquery_context, QueryProcessingStage::Complete, subquery_depth + 1);
				ast_set->set->setSource(interpreter.execute());
			}
601

A
Alexey Milovidov 已提交
602
			sets_with_subqueries[set_id] = ast_set->set;
603
		}
A
Alexey Milovidov 已提交
604

605
		arg = ast_set_ptr;
606
	}
607
	else
608
	{
A
Alexey Milovidov 已提交
609
		/// Явное перечисление значений в скобках.
P
Pavel Kartavyy 已提交
610
		makeExplicitSet(node, sample_block, false);
P
Pavel Kartavyy 已提交
611 612 613 614
	}
}

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

620
		DataTypes set_element_types;
621
		ASTPtr & left_arg = args.children.at(0);
622

623
		ASTFunction * left_arg_tuple = typeid_cast<ASTFunction *>(&*left_arg);
624 625 626 627 628 629

		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)
630
				set_element_types.push_back(sample_block.getByName((*it)->getColumnName()).type);
631 632 633
		}
		else
		{
634
			DataTypePtr left_type = sample_block.getByName(left_arg->getColumnName()).type;
635
			if (DataTypeArray * array_type = typeid_cast<DataTypeArray *>(&*left_type))
636 637 638 639
				set_element_types.push_back(array_type->getNestedType());
			else
				set_element_types.push_back(left_type);
		}
640

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

645
		if (ASTFunction * set_func = typeid_cast<ASTFunction *>(&*arg))
646 647 648 649
		{
			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);
650

651
			/// Отличм случай (x, y) in ((1, 2), (3, 4)) от случая (x, y) in (1, 2).
652
			ASTFunction * any_element = typeid_cast<ASTFunction *>(&*set_func->arguments->children.at(0));
653 654 655 656 657
			if (set_element_types.size() >= 2 && (!any_element || any_element->name != "tuple"))
				single_value = true;
			else
				elements_ast = set_func->arguments;
		}
658
		else if (typeid_cast<ASTLiteral *>(&*arg))
659 660 661 662 663 664 665 666
		{
			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);
		}
667

668 669 670 671 672 673
		if (single_value)
		{
			ASTPtr exp_list = new ASTExpressionList;
			exp_list->children.push_back(elements_ast);
			elements_ast = exp_list;
		}
674

675
		ASTSet * ast_set = new ASTSet(arg->getColumnName());
676
		ASTPtr ast_set_ptr = ast_set;
677
		ast_set->set = new Set(settings.limits);
P
Pavel Kartavyy 已提交
678
		ast_set->set->createFromAST(set_element_types, elements_ast, create_ordered_set);
679
		arg = ast_set_ptr;
680 681 682
}


683
static String getUniqueName(const Block & block, const String & prefix)
684 685
{
	int i = 1;
686
	while (block.has(prefix + toString(i)))
687
		++i;
688
	return prefix + toString(i);
689 690 691
}


A
Alexey Milovidov 已提交
692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
/** Для 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;

711
	ScopeStack(const ExpressionActionsPtr & actions, const Settings & settings_)
A
Alexey Milovidov 已提交
712 713
		: settings(settings_)
	{
714
		stack.emplace_back();
715
		stack.back().actions = actions;
716 717 718 719

		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 已提交
720 721 722 723
	}

	void pushLevel(const NamesAndTypesList & input_columns)
	{
724
		stack.emplace_back();
A
Alexey Milovidov 已提交
725 726 727 728 729 730 731
		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)
		{
732
			all_columns.emplace_back(nullptr, it->second, it->first);
A
Alexey Milovidov 已提交
733 734 735 736
			new_names.insert(it->first);
			stack.back().new_columns.insert(it->first);
		}

737 738
		const Block & prev_sample_block = prev.actions->getSampleBlock();
		for (size_t i = 0, size = prev_sample_block.columns(); i < size; ++i)
A
Alexey Milovidov 已提交
739
		{
740 741 742
			const ColumnWithNameAndType & col = prev_sample_block.unsafeGetByPosition(i);
			if (!new_names.count(col.name))
				all_columns.push_back(col);
A
Alexey Milovidov 已提交
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 781 782 783 784 785 786 787 788 789 790 791 792
		}

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


793
void ExpressionAnalyzer::getRootActions(ASTPtr ast, bool no_subqueries, bool only_consts, ExpressionActionsPtr & actions)
794 795
{
	ScopeStack scopes(actions, settings);
796
	getActionsImpl(ast, no_subqueries, only_consts, scopes);
797
	actions = scopes.popLevel();
798 799 800
}


801 802
void ExpressionAnalyzer::getArrayJoinedColumns()
{
803 804
	if (select_query && select_query->array_join_expression_list)
	{
805 806 807 808 809 810
		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();
A
Alexey Milovidov 已提交
811
			String nested_table_alias = ast->getAliasOrColumnName();
812
			if (nested_table_alias == nested_table_name && !typeid_cast<ASTIdentifier *>(&*ast))
813 814 815 816 817 818 819 820 821 822 823 824 825 826 827
				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);
		}
828 829 830

		/// Если результат ARRAY JOIN не используется, придется все равно по-ARRAY-JOIN-ить какой-нибудь столбец,
		/// чтобы получить правильное количество строк.
831
		if (array_join_result_to_source.empty())
832
		{
833
			ASTPtr expr = select_query->array_join_expression_list->children.at(0);
834
			String source_name = expr->getColumnName();
A
Alexey Milovidov 已提交
835
			String result_name = expr->getAliasOrColumnName();
A
Alexey Milovidov 已提交
836

837
			/// Это массив.
838
			if (!typeid_cast<ASTIdentifier *>(&*expr) || findColumn(source_name, columns) != columns.end())
839
			{
840
				array_join_result_to_source[result_name] = source_name;
841 842 843 844
			}
			else /// Это вложенная таблица.
			{
				bool found = false;
A
Alexey Milovidov 已提交
845
				for (const auto & column_name_type : columns)
846
				{
A
Alexey Milovidov 已提交
847 848
					String table_name = DataTypeNested::extractNestedTableName(column_name_type.first);
					String column_name = DataTypeNested::extractNestedColumnName(column_name_type.first);
849 850
					if (table_name == source_name)
					{
A
Alexey Milovidov 已提交
851
						array_join_result_to_source[DataTypeNested::concatenateNestedName(result_name, column_name)] = column_name_type.first;
852 853 854 855
						found = true;
						break;
					}
				}
856 857
				if (!found)
					throw Exception("No columns in nested table " + source_name, ErrorCodes::EMPTY_NESTED_TABLE);
858 859
			}
		}
860
	}
861 862 863 864
}


void ExpressionAnalyzer::getArrayJoinedColumnsImpl(ASTPtr ast)
865
{
866
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
867
	{
868 869 870 871 872 873 874 875 876 877 878 879
		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);
			}
		}
880 881 882
	}
	else
	{
883 884 885
		for (auto & child : ast->children)
			if (!typeid_cast<ASTSelectQuery *>(&*child))
				getArrayJoinedColumnsImpl(child);
886 887 888 889 890
	}
}


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

897
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
898 899 900 901 902
	{
		std::string name = node->getColumnName();
		if (!only_consts && !actions_stack.getSampleBlock().has(name))
		{
			/// Запрошенного столбца нет в блоке.
903
			/// Если такой столбец есть в таблице, значит пользователь наверно забыл окружить его агрегатной функцией или добавить в GROUP BY.
904 905

			bool found = false;
A
Alexey Milovidov 已提交
906 907
			for (const auto & column_name_type : columns)
				if (column_name_type.first == name)
908 909 910 911
					found = true;

			if (found)
				throw Exception("Column " + name + " is not under aggregate function and not in GROUP BY.",
912
					ErrorCodes::NOT_AN_AGGREGATE);
913 914
		}
	}
915
	else if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
916
	{
917
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
918
			throw Exception("Unexpected expression", ErrorCodes::UNEXPECTED_EXPRESSION);
919

920 921 922 923
		if (node->kind == ASTFunction::ARRAY_JOIN)
		{
			if (node->arguments->children.size() != 1)
				throw Exception("arrayJoin requires exactly 1 argument", ErrorCodes::TYPE_MISMATCH);
924
			ASTPtr arg = node->arguments->children.at(0);
925
			getActionsImpl(arg, no_subqueries, only_consts, actions_stack);
926
			if (!only_consts)
927
			{
928
				String result_name = node->getColumnName();
929
				actions_stack.addAction(ExpressionAction::copyColumn(arg->getColumnName(), result_name));
930 931
				NameSet joined_columns;
				joined_columns.insert(result_name);
932
				actions_stack.addAction(ExpressionAction::arrayJoin(joined_columns));
933
			}
934

935 936
			return;
		}
937

938
		if (node->kind == ASTFunction::FUNCTION)
939
		{
940
			if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
941 942 943
			{
				if (!no_subqueries)
				{
944
					/// Найдем тип первого аргумента (потом getActionsImpl вызовется для него снова и ни на что не повлияет).
945
					getActionsImpl(node->arguments->children.at(0), no_subqueries, only_consts, actions_stack);
946

947
					/// Превратим tuple или подзапрос в множество.
948
					makeSet(node, actions_stack.getSampleBlock());
949 950 951
				}
				else
				{
952 953 954 955 956 957 958 959
					if (!only_consts)
					{
						/// Мы в той части дерева, которую не собираемся вычислять. Нужно только определить типы.
						/// Не будем выполнять подзапросы и составлять множества. Вставим произвольный столбец правильного типа.
						ColumnWithNameAndType fake_column;
						fake_column.name = node->getColumnName();
						fake_column.type = new DataTypeUInt8;
						fake_column.column = new ColumnConstUInt8(1, 0);
960
						actions_stack.addAction(ExpressionAction::addColumn(fake_column));
961
						getActionsImpl(node->arguments->children.at(0), no_subqueries, only_consts, actions_stack);
962
					}
963 964 965
					return;
				}
			}
966

967
			FunctionPtr function = context.getFunctionFactory().get(node->name, context);
968

969 970
			Names argument_names;
			DataTypes argument_types;
M
Merge  
Michael Kolupaev 已提交
971
			bool arguments_present = true;
972

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

976
			for (auto & child : node->arguments->children)
977
			{
978 979
				ASTFunction * lambda = typeid_cast<ASTFunction *>(&*child);
				ASTSet * set = typeid_cast<ASTSet *>(&*child);
980 981
				if (lambda && lambda->name == "lambda")
				{
M
Merge  
Michael Kolupaev 已提交
982
					/// Если аргумент - лямбда-выражение, только запомним его примерный тип.
983 984
					if (lambda->arguments->children.size() != 2)
						throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
985

986
					ASTFunction * lambda_args_tuple = typeid_cast<ASTFunction *>(&*lambda->arguments->children.at(0));
987

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

991
					has_lambda_arguments = true;
992
					argument_types.emplace_back(new DataTypeExpression(DataTypes(lambda_args_tuple->arguments->children.size())));
993
					/// Выберем название в следующем цикле.
994
					argument_names.emplace_back();
995
				}
996 997 998 999
				else if (set)
				{
					ColumnWithNameAndType column;
					column.type = new DataTypeSet;
1000

1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
					/// Если аргумент - множество, заданное перечислением значений, дадим ему уникальное имя,
					///  чтобы множества с одинаковой записью не склеивались (у них может быть разный тип).
					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);

1012
						actions_stack.addAction(ExpressionAction::addColumn(column));
1013
					}
1014

1015 1016 1017
					argument_types.push_back(column.type);
					argument_names.push_back(column.name);
				}
1018 1019
				else
				{
M
Merge  
Michael Kolupaev 已提交
1020
					/// Если аргумент не лямбда-выражение, вызовемся рекурсивно и узнаем его тип.
1021
					getActionsImpl(child, no_subqueries, only_consts, actions_stack);
1022
					std::string name = child->getColumnName();
1023
					if (actions_stack.getSampleBlock().has(name))
M
Merge  
Michael Kolupaev 已提交
1024
					{
1025
						argument_types.push_back(actions_stack.getSampleBlock().getByName(name).type);
M
Merge  
Michael Kolupaev 已提交
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
						argument_names.push_back(name);
					}
					else
					{
						if (only_consts)
						{
							arguments_present = false;
						}
						else
						{
							throw Exception("Unknown identifier: " + name, ErrorCodes::UNKNOWN_IDENTIFIER);
						}
					}
1039 1040
				}
			}
1041

M
Merge  
Michael Kolupaev 已提交
1042 1043
			if (only_consts && !arguments_present)
				return;
1044

1045
			Names additional_requirements;
1046

1047 1048 1049
			if (has_lambda_arguments && !only_consts)
			{
				function->getLambdaArgumentTypes(argument_types);
1050

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

1056
					ASTFunction * lambda = typeid_cast<ASTFunction *>(&*child);
1057 1058
					if (lambda && lambda->name == "lambda")
					{
1059
						DataTypeExpression * lambda_type = typeid_cast<DataTypeExpression *>(&*argument_types[i]);
1060
						ASTFunction * lambda_args_tuple = typeid_cast<ASTFunction *>(&*lambda->arguments->children.at(0));
1061
						ASTs lambda_arg_asts = lambda_args_tuple->arguments->children;
1062
						NamesAndTypesList lambda_arguments;
1063

1064 1065
						for (size_t j = 0; j < lambda_arg_asts.size(); ++j)
						{
1066
							ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*lambda_arg_asts[j]);
1067 1068
							if (!identifier)
								throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1069

1070 1071
							String arg_name = identifier->name;
							NameAndTypePair arg(arg_name, lambda_type->getArgumentTypes()[j]);
1072

1073
							lambda_arguments.push_back(arg);
1074
						}
1075

1076
						actions_stack.pushLevel(lambda_arguments);
1077
						getActionsImpl(lambda->arguments->children.at(1), no_subqueries, only_consts, actions_stack);
1078
						ExpressionActionsPtr lambda_actions = actions_stack.popLevel();
1079

1080
						String result_name = lambda->arguments->children.at(1)->getColumnName();
1081
						lambda_actions->finalize(Names(1, result_name));
1082
						DataTypePtr result_type = lambda_actions->getSampleBlock().getByName(result_name).type;
1083
						argument_types[i] = new DataTypeExpression(lambda_type->getArgumentTypes(), result_type);
1084

1085 1086 1087 1088
						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]);
1089

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

1094
						ColumnWithNameAndType lambda_column;
1095
						lambda_column.column = new ColumnExpression(1, lambda_actions, lambda_arguments, result_type, result_name);
1096 1097
						lambda_column.type = argument_types[i];
						lambda_column.name = argument_names[i];
1098
						actions_stack.addAction(ExpressionAction::addColumn(lambda_column));
1099 1100 1101
					}
				}
			}
1102

1103 1104 1105 1106
			if (only_consts)
			{
				for (size_t i = 0; i < argument_names.size(); ++i)
				{
1107
					if (!actions_stack.getSampleBlock().has(argument_names[i]))
1108
					{
M
Merge  
Michael Kolupaev 已提交
1109
						arguments_present = false;
1110 1111 1112 1113
						break;
					}
				}
			}
1114

M
Merge  
Michael Kolupaev 已提交
1115
			if (arguments_present)
1116
				actions_stack.addAction(ExpressionAction::applyFunction(function, argument_names, node->getColumnName()),
1117
										additional_requirements);
1118 1119
		}
	}
1120
	else if (ASTLiteral * node = typeid_cast<ASTLiteral *>(&*ast))
1121 1122 1123 1124 1125 1126
	{
		DataTypePtr type = apply_visitor(FieldToDataType(), node->value);
		ColumnWithNameAndType column;
		column.column = type->createConstColumn(1, node->value);
		column.type = type;
		column.name = node->getColumnName();
1127

1128
		actions_stack.addAction(ExpressionAction::addColumn(column));
1129 1130 1131
	}
	else
	{
1132 1133
		for (auto & child : ast->children)
			getActionsImpl(child, no_subqueries, only_consts, actions_stack);
1134 1135 1136 1137
	}
}


1138
void ExpressionAnalyzer::getAggregates(ASTPtr ast, ExpressionActionsPtr & actions)
1139
{
1140
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1141
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
1142
	{
1143
		has_aggregation = true;
1144 1145
		AggregateDescription aggregate;
		aggregate.column_name = node->getColumnName();
1146

1147 1148 1149
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
			if (aggregate_descriptions[i].column_name == aggregate.column_name)
				return;
1150

1151 1152 1153
		ASTs & arguments = node->arguments->children;
		aggregate.argument_names.resize(arguments.size());
		DataTypes types(arguments.size());
1154

1155 1156
		for (size_t i = 0; i < arguments.size(); ++i)
		{
1157
			getRootActions(arguments[i], true, false, actions);
1158
			const std::string & name = arguments[i]->getColumnName();
1159
			types[i] = actions->getSampleBlock().getByName(name).type;
1160 1161
			aggregate.argument_names[i] = name;
		}
1162

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

1165 1166
		if (node->parameters)
		{
1167
			ASTs & parameters = typeid_cast<ASTExpressionList &>(*node->parameters).children;
1168
			Array params_row(parameters.size());
1169

1170 1171
			for (size_t i = 0; i < parameters.size(); ++i)
			{
1172
				ASTLiteral * lit = typeid_cast<ASTLiteral *>(&*parameters[i]);
1173 1174
				if (!lit)
					throw Exception("Parameters to aggregate functions must be literals", ErrorCodes::PARAMETERS_TO_AGGREGATE_FUNCTIONS_MUST_BE_LITERALS);
1175

1176 1177
				params_row[i] = lit->value;
			}
1178

1179
			aggregate.parameters = params_row;
1180 1181
			aggregate.function->setParameters(params_row);
		}
1182

1183
		aggregate.function->setArguments(types);
1184

1185 1186 1187 1188 1189 1190
		aggregate_descriptions.push_back(aggregate);
	}
	else
	{
		for (size_t i = 0; i < ast->children.size(); ++i)
		{
1191
			ASTPtr child = ast->children[i];
1192
			if (!typeid_cast<ASTSubquery *>(&*child) && !typeid_cast<ASTSelectQuery *>(&*child))
1193
				getAggregates(child, actions);
1194 1195 1196 1197
		}
	}
}

1198 1199 1200 1201 1202
void ExpressionAnalyzer::assertSelect()
{
	if (!select_query)
		throw Exception("Not a select query", ErrorCodes::LOGICAL_ERROR);
}
1203

1204
void ExpressionAnalyzer::assertAggregation()
1205 1206 1207
{
	if (!has_aggregation)
		throw Exception("No aggregation", ErrorCodes::LOGICAL_ERROR);
1208
}
1209

1210 1211 1212 1213 1214
void ExpressionAnalyzer::initChain(ExpressionActionsChain & chain, NamesAndTypesList & columns)
{
	if (chain.steps.empty())
	{
		chain.settings = settings;
1215
		chain.steps.emplace_back(new ExpressionActions(columns, settings));
1216 1217
	}
}
1218

1219
void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actions)
1220
{
1221 1222
	NameSet result_columns;
	for (NameToNameMap::iterator it = array_join_result_to_source.begin(); it != array_join_result_to_source.end(); ++it)
1223
	{
1224
		if (it->first != it->second)
1225
			actions->add(ExpressionAction::copyColumn(it->second, it->first));
1226
		result_columns.insert(it->first);
1227 1228
	}

1229
	actions->add(ExpressionAction::arrayJoin(result_columns));
1230 1231
}

1232
bool ExpressionAnalyzer::appendArrayJoin(ExpressionActionsChain & chain, bool only_types)
1233 1234
{
	assertSelect();
1235 1236

	if (!select_query->array_join_expression_list)
1237
		return false;
1238

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

1242
	getRootActions(select_query->array_join_expression_list, only_types, false, step.actions);
1243

1244
	addMultipleArrayJoinAction(step.actions);
1245

1246 1247 1248
	return true;
}

1249
void ExpressionAnalyzer::addJoinAction(ExpressionActionsPtr & actions, bool only_types)
1250
{
1251
	actions->add(ExpressionAction::ordinaryJoin(only_types ? nullptr : joins[0], columns_added_by_join));
1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263
}

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

	if (!select_query->join)
		return false;

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

1264
	ASTJoin & ast_join = typeid_cast<ASTJoin &>(*select_query->join);
1265
	getRootActions(ast_join.using_expr_list, only_types, false, step.actions);
1266

1267
	{
1268 1269 1270
		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);
1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284

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

1285 1286 1287 1288
		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());
1289 1290 1291
		for (const auto & name_type : columns_added_by_join)
			required_joined_columns.push_back(name_type.first);

1292
		/// TODO: поддержка идентификаторов вместо подзапросов.
1293
		InterpreterSelectQuery interpreter(
1294
			typeid_cast<ASTJoin &>(*select_query->join).table->children.at(0), subquery_context,
1295
			required_joined_columns,
1296 1297 1298 1299 1300 1301 1302 1303
			QueryProcessingStage::Complete, subquery_depth + 1);

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

		joins.push_back(join);
	}

1304
	addJoinAction(step.actions, false);
1305 1306 1307 1308

	return true;
}

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

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

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

1319
	step.required_output.push_back(select_query->where_expression->getColumnName());
1320
	getRootActions(select_query->where_expression, only_types, false, step.actions);
1321

1322 1323 1324
	return true;
}

1325
bool ExpressionAnalyzer::appendGroupBy(ExpressionActionsChain & chain, bool only_types)
1326 1327
{
	assertAggregation();
1328

1329 1330
	if (!select_query->group_expression_list)
		return false;
1331

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

1335
	ASTs asts = select_query->group_expression_list->children;
1336 1337
	for (size_t i = 0; i < asts.size(); ++i)
	{
1338
		step.required_output.push_back(asts[i]->getColumnName());
1339
		getRootActions(asts[i], only_types, false, step.actions);
1340
	}
1341

1342 1343 1344
	return true;
}

1345
void ExpressionAnalyzer::appendAggregateFunctionsArguments(ExpressionActionsChain & chain, bool only_types)
1346 1347
{
	assertAggregation();
1348

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

1352 1353 1354 1355 1356 1357 1358
	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]);
		}
	}
1359

1360
	getActionsBeforeAggregation(select_query->select_expression_list, step.actions, only_types);
1361

1362
	if (select_query->having_expression)
1363
		getActionsBeforeAggregation(select_query->having_expression, step.actions, only_types);
1364

1365
	if (select_query->order_expression_list)
1366
		getActionsBeforeAggregation(select_query->order_expression_list, step.actions, only_types);
1367 1368
}

1369
bool ExpressionAnalyzer::appendHaving(ExpressionActionsChain & chain, bool only_types)
1370 1371
{
	assertAggregation();
1372

1373 1374
	if (!select_query->having_expression)
		return false;
1375

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

1379
	step.required_output.push_back(select_query->having_expression->getColumnName());
1380
	getRootActions(select_query->having_expression, only_types, false, step.actions);
1381

1382
	return true;
1383 1384
}

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

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

1392
	getRootActions(select_query->select_expression_list, only_types, false, step.actions);
1393

1394 1395 1396 1397 1398
	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());
	}
1399
}
1400

1401
bool ExpressionAnalyzer::appendOrderBy(ExpressionActionsChain & chain, bool only_types)
1402
{
1403
	assertSelect();
1404

1405 1406
	if (!select_query->order_expression_list)
		return false;
1407

1408 1409
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1410

1411
	getRootActions(select_query->order_expression_list, only_types, false, step.actions);
1412

1413 1414 1415
	ASTs asts = select_query->order_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
1416
		ASTOrderByElement * ast = typeid_cast<ASTOrderByElement *>(&*asts[i]);
1417 1418
		if (!ast || ast->children.size() != 1)
			throw Exception("Bad order expression AST", ErrorCodes::UNKNOWN_TYPE_OF_AST_NODE);
1419
		ASTPtr order_expression = ast->children.at(0);
1420 1421
		step.required_output.push_back(order_expression->getColumnName());
	}
1422

1423 1424 1425
	return true;
}

1426
void ExpressionAnalyzer::appendProjectResult(DB::ExpressionActionsChain & chain, bool only_types)
1427 1428
{
	assertSelect();
1429

1430 1431
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1432

1433
	NamesWithAliases result_columns;
1434

1435 1436
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
1437
	{
1438
		result_columns.emplace_back(asts[i]->getColumnName(), asts[i]->getAliasOrColumnName());
1439
		step.required_output.push_back(result_columns.back().second);
1440
	}
1441

1442
	step.actions->add(ExpressionAction::project(result_columns));
1443 1444 1445
}


1446 1447 1448 1449 1450 1451 1452 1453
Sets ExpressionAnalyzer::getSetsWithSubqueries()
{
	Sets res;
	for (auto & s : sets_with_subqueries)
		res.push_back(s.second);
	return res;
}

1454 1455
Joins ExpressionAnalyzer::getJoinsWithSubqueries()
{
1456
	return joins;
1457 1458
}

1459

1460 1461 1462
Block ExpressionAnalyzer::getSelectSampleBlock()
{
	assertSelect();
1463

1464
	ExpressionActionsPtr temp_actions = new ExpressionActions(aggregated_columns, settings);
1465
	NamesWithAliases result_columns;
1466

1467 1468 1469
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
1470
		result_columns.emplace_back(asts[i]->getColumnName(), asts[i]->getAliasOrColumnName());
1471
		getRootActions(asts[i], true, false, temp_actions);
1472
	}
1473

1474
	temp_actions->add(ExpressionAction::project(result_columns));
1475

1476
	return temp_actions->getSampleBlock();
1477 1478
}

1479
void ExpressionAnalyzer::getActionsBeforeAggregation(ASTPtr ast, ExpressionActionsPtr & actions, bool no_subqueries)
1480
{
1481
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1482

1483 1484 1485
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
		for (auto & argument : node->arguments->children)
			getRootActions(argument, no_subqueries, false, actions);
1486
	else
1487 1488
		for (auto & child : ast->children)
			getActionsBeforeAggregation(child, actions, no_subqueries);
1489 1490 1491
}


M
Merge  
Michael Kolupaev 已提交
1492
ExpressionActionsPtr ExpressionAnalyzer::getActions(bool project_result)
1493
{
1494
	ExpressionActionsPtr actions = new ExpressionActions(columns, settings);
1495
	NamesWithAliases result_columns;
1496
	Names result_names;
1497

1498
	ASTs asts;
1499

1500
	if (ASTExpressionList * node = typeid_cast<ASTExpressionList *>(&*ast))
1501
		asts = node->children;
1502
	else
1503
		asts = ASTs(1, ast);
1504

1505
	for (size_t i = 0; i < asts.size(); ++i)
1506
	{
1507 1508 1509
		std::string name = asts[i]->getColumnName();
		std::string alias;
		if (project_result)
A
Alexey Milovidov 已提交
1510
			alias = asts[i]->getAliasOrColumnName();
1511 1512
		else
			alias = name;
1513
		result_columns.emplace_back(name, alias);
1514
		result_names.push_back(alias);
1515
		getRootActions(asts[i], false, false, actions);
1516
	}
1517

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

1529
	actions->finalize(result_names);
1530

1531 1532 1533 1534 1535 1536
	return actions;
}


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

1539
	getRootActions(ast, true, true, actions);
1540

1541 1542 1543 1544 1545 1546 1547 1548 1549 1550
	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;
}

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

	NameSet required;
	NameSet ignored;
1560

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

A
Alexey Milovidov 已提交
1579
			ignored.insert(expressions[i]->getAliasOrColumnName());
1580 1581
		}
	}
1582

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

1600
/*	for (const auto & name_type : columns_added_by_join)
1601
		std::cerr << "JOINed column (required, not key): " << name_type.first << std::endl;
1602
	std::cerr << std::endl;*/
1603

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

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

1617
	unknown_required_columns = required;
1618

1619 1620
	for (NamesAndTypesList::iterator it = columns.begin(); it != columns.end();)
	{
A
Alexey Milovidov 已提交
1621
		unknown_required_columns.erase(it->first);
1622

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

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

1646
void ExpressionAnalyzer::collectJoinedColumns(NameSet & joined_columns, NamesAndTypesList & joined_columns_name_type)
1647 1648 1649 1650
{
	if (!select_query || !select_query->join)
		return;

1651
	std::cerr << "collectJoinedColumns" << std::endl;
1652

1653 1654
	auto & node = typeid_cast<ASTJoin &>(*select_query->join);
	auto & keys = typeid_cast<ASTExpressionList &>(*node.using_expr_list);
1655
	auto & table = node.table->children.at(0);		/// TODO: поддержка идентификаторов.
1656

1657
	size_t num_join_keys = keys.children.size();
1658 1659

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

A
Alexey Milovidov 已提交
1664
		if (!join_key_names_right_set.insert(keys.children[i]->getAliasOrColumnName()).second)
1665 1666 1667
			throw Exception("Duplicate column in USING list", ErrorCodes::DUPLICATE_COLUMN);
	}

1668
	Block nested_result_sample = ExpressionAnalyzer(table, context, subquery_depth + 1).getSelectSampleBlock();
1669

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

1681 1682 1683 1684
	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;
1685 1686 1687 1688
	std::cerr << std::endl;
	for (const auto & name : joined_columns)
		std::cerr << "JOINed column: " << name << std::endl;
	std::cerr << std::endl;
1689 1690
}

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

1696
	Names res;
1697 1698
	for (const auto & column_name_type : columns)
		res.push_back(column_name_type.first);
A
Alexey Milovidov 已提交
1699

1700 1701 1702
	return res;
}

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

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

1728 1729
		return;
	}
1730

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

1738
			ASTFunction * lambda_args_tuple = typeid_cast<ASTFunction *>(&*node->arguments->children.at(0));
1739

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

1743
			/// Не нужно добавлять формальные параметры лямбда-выражения в required_columns.
1744
			Names added_ignored;
1745
			for (auto & child : lambda_args_tuple->arguments->children)
1746
			{
1747
				ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*child);
1748 1749
				if (!identifier)
					throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1750 1751

				String & name = identifier->name;
1752 1753 1754 1755 1756 1757
				if (!ignored_names.count(name))
				{
					ignored_names.insert(name);
					added_ignored.push_back(name);
				}
			}
1758

1759
			getRequiredColumnsImpl(node->arguments->children.at(1),
1760 1761
				required_columns, ignored_names,
				available_joined_columns, required_joined_columns);
1762

1763 1764
			for (size_t i = 0; i < added_ignored.size(); ++i)
				ignored_names.erase(added_ignored[i]);
1765

1766 1767 1768
			return;
		}
	}
1769

1770
	ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast);
1771

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

1784
}