ExpressionAnalyzer.cpp 72.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 13 14 15

#include <DB/DataTypes/DataTypeSet.h>
#include <DB/DataTypes/DataTypeTuple.h>
#include <DB/DataTypes/DataTypeExpression.h>
16
#include <DB/DataTypes/DataTypeNested.h>
17

18 19 20 21 22
#include <DB/Columns/ColumnSet.h>
#include <DB/Columns/ColumnExpression.h>

#include <DB/Interpreters/InterpreterSelectQuery.h>
#include <DB/Interpreters/ExpressionAnalyzer.h>
23
#include <DB/Interpreters/LogicalExpressionsOptimizer.h>
24
#include <DB/Interpreters/ExternalDictionaries.h>
25

26 27
#include <DB/AggregateFunctions/AggregateFunctionFactory.h>

28
#include <DB/Storages/StorageDistributed.h>
29
#include <DB/Storages/StorageMemory.h>
30
#include <DB/Storages/StorageSet.h>
31
#include <DB/Storages/StorageJoin.h>
32

33
#include <DB/DataStreams/LazyBlockInputStream.h>
34 35
#include <DB/DataStreams/copyData.h>

36 37
#include <DB/Dictionaries/IDictionary.h>

38 39
#include <DB/Common/typeid_cast.h>

40
#include <DB/Parsers/formatAST.h>
41

A
Andrey Mironov 已提交
42 43
#include <DB/Functions/FunctionFactory.h>

44 45
#include <statdaemons/ext/range.hpp>

46 47 48 49 50

namespace DB
{


51 52
/** Calls to these functions in the GROUP BY statement would be
  * replaced by their immediate argument.
53
  */
A
Alexey Milovidov 已提交
54 55
const std::unordered_set<String> injective_function_names
{
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
	"negate",
	"bitNot",
	"reverse",
	"reverseUTF8",
	"toString",
	"toFixedString",
	"toStringCutToZero",
	"IPv4NumToString",
	"IPv4StringToNum",
	"hex",
	"unhex",
	"bitmaskToList",
	"bitmaskToArray",
	"tuple",
	"regionToName",
};

73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
const std::unordered_set<String> possibly_injective_function_names
{
	"dictGetString",
	"dictGetUInt8",
	"dictGetUInt16",
	"dictGetUInt32",
	"dictGetUInt64",
	"dictGetInt8",
	"dictGetInt16",
	"dictGetInt32",
	"dictGetInt64",
	"dictGetFloat32",
	"dictGetFloat64",
	"dictGetDate",
	"dictGetDateTime"
};

90 91
void ExpressionAnalyzer::init()
{
92
	select_query = typeid_cast<ASTSelectQuery *>(&*ast);
93

94 95
	/// Оптимизирует логические выражения.
	LogicalExpressionsOptimizer logical_expressions_optimizer(select_query, settings);
96
	logical_expressions_optimizer.optimizeDisjunctiveEqualityChains();
97

98 99
	addStorageAliases();

100
	/// Создаёт словарь aliases: alias -> ASTPtr
101
	addASTAliases(ast);
102

103
	/// Common subexpression elimination. Rewrite rules.
104
	normalizeTree();
105

A
Alexey Milovidov 已提交
106
	/// GROUP BY injective function elimination.
107
	optimizeGroupBy();
108

109 110 111
	/// Удалить из ORDER BY повторяющиеся элементы.
	optimizeOrderBy();

112
	/// array_join_alias_to_name, array_join_result_to_source.
113
	getArrayJoinedColumns();
114

115 116 117 118 119
	/// Удалить ненужное из списка columns. Создать unknown_required_columns. Сформировать columns_added_by_join.
	collectUsedColumns();

	/// has_aggregation, aggregation_keys, aggregate_descriptions, aggregated_columns.
	analyzeAggregation();
120

121
	/// external_tables, subqueries_for_sets для глобальных подзапросов.
122 123
	/// Заменяет глобальные подзапросы на сгенерированные имена временных таблиц, которые будут отправлены на удалённые серверы.
	initGlobalSubqueriesAndExternalTables();
124 125 126 127 128 129 130 131 132 133 134
}


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

136 137
	if (select_query && (select_query->group_expression_list || select_query->having_expression))
		has_aggregation = true;
138

139
	ExpressionActionsPtr temp_actions = new ExpressionActions(columns, settings);
140 141 142

	if (select_query && select_query->array_join_expression_list)
	{
143
		getRootActions(select_query->array_join_expression_list, true, false, temp_actions);
144
		addMultipleArrayJoinAction(temp_actions);
145
	}
146

147 148
	if (select_query && select_query->join)
	{
149
		getRootActions(typeid_cast<ASTJoin &>(*select_query->join).using_expr_list, true, false, temp_actions);
150
		addJoinAction(temp_actions, true);
151 152
	}

153
	getAggregates(ast, temp_actions);
154

155 156
	if (has_aggregation)
	{
157
		assertSelect();
158

159 160 161
		/// Найдем ключи агрегации.
		if (select_query->group_expression_list)
		{
162
			NameSet unique_keys;
163
			auto & group_asts = select_query->group_expression_list->children;
164 165
			for (size_t i = 0; i < group_asts.size(); ++i)
			{
166
				getRootActions(group_asts[i], true, false, temp_actions);
167

168 169
				const auto & column_name = group_asts[i]->getColumnName();
				const auto & block = temp_actions->getSampleBlock();
170

171 172 173 174 175
				if (!block.has(column_name))
					throw Exception("Unknown identifier (in GROUP BY): " + column_name, ErrorCodes::UNKNOWN_IDENTIFIER);

				const auto & col = block.getByName(column_name);

176 177 178 179 180 181 182 183
				/// constant expressions have non-null column pointer at this stage
				if (const auto is_constexpr = col.column)
				{
					if (i < group_asts.size() - 1)
						group_asts[i] = std::move(group_asts.back());

					group_asts.pop_back();
					i -= 1;
184

185 186 187
					continue;
				}

188
				NameAndTypePair key{column_name, col.type};
189

190
				/// Ключи агрегации уникализируются.
191
				if (!unique_keys.count(key.name))
192
				{
193
					unique_keys.insert(key.name);
194 195
					aggregation_keys.push_back(key);

196 197
					/// key is no longer needed, therefore we can save a little by moving it
					aggregated_columns.push_back(std::move(key));
198
				}
199
			}
200 201 202 203 204 205

			if (group_asts.empty())
			{
				select_query->group_expression_list = nullptr;
				has_aggregation = select_query->having_expression || aggregate_descriptions.size();
			}
206
		}
207

208 209 210
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
		{
			AggregateDescription & desc = aggregate_descriptions[i];
211
			aggregated_columns.emplace_back(desc.column_name, desc.function->getReturnType());
212 213 214 215
		}
	}
	else
	{
216
		aggregated_columns = temp_actions->getSampleBlock().getColumnsList();
217 218 219 220
	}
}


221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
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 已提交
271
NamesAndTypesList::iterator ExpressionAnalyzer::findColumn(const String & name, NamesAndTypesList & cols)
272
{
A
Alexey Milovidov 已提交
273
	return std::find_if(cols.begin(), cols.end(),
274
		[&](const NamesAndTypesList::value_type & val) { return val.name == name; });
275 276 277
}


278 279 280 281 282
void ExpressionAnalyzer::addStorageAliases()
{
	if (!storage)
		return;

283
	/// @todo: consider storing default expressions with alias set to avoid cloning
284
	for (const auto & alias : storage->alias_columns)
285
		(aliases[alias.name] = storage->column_defaults[alias.name].expression->clone())->setAlias(alias.name);
286 287 288
}


289 290
/// ignore_levels - алиасы в скольки верхних уровнях поддерева нужно игнорировать.
/// Например, при ignore_levels=1 ast не может быть занесен в словарь, но его дети могут.
291
void ExpressionAnalyzer::addASTAliases(ASTPtr & ast, int ignore_levels)
292
{
293
	ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast);
294

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

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

305
		if (!typeid_cast<ASTSelectQuery *>(&*child))
306
			addASTAliases(child, new_ignore_levels);
307 308 309 310 311
	}

	if (ignore_levels > 0)
		return;

A
Alexey Milovidov 已提交
312 313
	String alias = ast->tryGetAlias();
	if (!alias.empty())
314
	{
A
Alexey Milovidov 已提交
315 316
		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 已提交
317

A
Alexey Milovidov 已提交
318
		aliases[alias] = ast;
319 320 321 322 323 324
	}
}


StoragePtr ExpressionAnalyzer::getTable()
{
325
	if (const ASTSelectQuery * select = typeid_cast<const ASTSelectQuery *>(&*ast))
326
	{
327
		if (select->table && !typeid_cast<const ASTSelectQuery *>(&*select->table) && !typeid_cast<const ASTFunction *>(&*select->table))
328
		{
A
Alexey Milovidov 已提交
329
			String database = select->database
330
				? typeid_cast<const ASTIdentifier &>(*select->database).name
A
Alexey Milovidov 已提交
331
				: "";
332
			const String & table = typeid_cast<const ASTIdentifier &>(*select->table).name;
333 334 335
			return context.tryGetTable(database, table);
		}
	}
A
Alexey Milovidov 已提交
336

337 338 339 340 341 342 343 344
	return StoragePtr();
}


void ExpressionAnalyzer::normalizeTree()
{
	SetOfASTs tmp_set;
	MapOfASTs tmp_map;
345
	normalizeTreeImpl(ast, tmp_map, tmp_set, "");
346 347 348 349 350
}


/// finished_asts - уже обработанные вершины (и на что они заменены)
/// current_asts - вершины в текущем стеке вызовов этого метода
351
/// current_alias - алиас, повешенный на предка ast (самого глубокого из предков с алиасами)
352 353
void ExpressionAnalyzer::normalizeTreeImpl(
	ASTPtr & ast, MapOfASTs & finished_asts, SetOfASTs & current_asts, std::string current_alias)
354 355 356 357 358 359
{
	if (finished_asts.count(ast))
	{
		ast = finished_asts[ast];
		return;
	}
360

361 362
	ASTPtr initial_ast = ast;
	current_asts.insert(initial_ast);
363

A
Alexey Milovidov 已提交
364 365 366
	String my_alias = ast->tryGetAlias();
	if (!my_alias.empty())
		current_alias = my_alias;
367

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

371 372
	ASTFunction * func_node = typeid_cast<ASTFunction *>(&*ast);
	if (func_node)
373 374
	{
		/** Нет ли в таблице столбца, название которого полностью совпадает с записью функции?
A
Alexey Milovidov 已提交
375 376
		  * Например, в таблице есть столбец "domain(URL)", и мы запросили domain(URL).
		  */
377
		String function_string = func_node->getColumnName();
378 379 380
		NamesAndTypesList::const_iterator it = findColumn(function_string);
		if (columns.end() != it)
		{
381
			ASTIdentifier * ast_id = new ASTIdentifier(func_node->range, function_string);
382 383
			ast = ast_id;
			current_asts.insert(ast);
384
			replaced = true;
385
		}
386

387
		/// Может быть указано IN t, где t - таблица, что равносильно IN (SELECT * FROM t).
388 389
		if (func_node->name == "in" || func_node->name == "notIn" || func_node->name == "globalIn" || func_node->name == "globalNotIn")
			if (ASTIdentifier * right = typeid_cast<ASTIdentifier *>(&*func_node->arguments->children.at(1)))
390
				right->kind = ASTIdentifier::Table;
391 392 393 394 395 396 397

		/// А ещё, в качестве исключения, будем понимать count(*) как count(), а не count(список всех столбцов).
		if (func_node->name == "count" && func_node->arguments->children.size() == 1
			&& typeid_cast<const ASTAsterisk *>(func_node->arguments->children[0].get()))
		{
			func_node->arguments->children.clear();
		}
398
	}
399
	else if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
400
	{
401
		if (node->kind == ASTIdentifier::Column)
402
		{
M
Merge  
Michael Kolupaev 已提交
403
			/// Если это алиас, но не родительский алиас (чтобы работали конструкции вроде "SELECT column+1 AS column").
404
			Aliases::const_iterator jt = aliases.find(node->name);
M
Merge  
Michael Kolupaev 已提交
405
			if (jt != aliases.end() && current_alias != node->name)
406
			{
407
				/// Заменим его на соответствующий узел дерева.
408 409
				if (current_asts.count(jt->second))
					throw Exception("Cyclic aliases", ErrorCodes::CYCLIC_ALIASES);
A
Alexey Milovidov 已提交
410
				if (!my_alias.empty() && my_alias != jt->second->getAliasOrColumnName())
411 412 413
				{
					/// В конструкции вроде "a AS b", где a - алиас, нужно перевесить алиас b на результат подстановки алиаса a.
					ast = jt->second->clone();
A
Alexey Milovidov 已提交
414
					ast->setAlias(my_alias);
415 416 417 418 419 420 421
				}
				else
				{
					ast = jt->second;
				}

				replaced = true;
422 423 424
			}
		}
	}
425
	else if (ASTExpressionList * node = typeid_cast<ASTExpressionList *>(&*ast))
426 427 428 429 430
	{
		/// Заменим * на список столбцов.
		ASTs & asts = node->children;
		for (int i = static_cast<int>(asts.size()) - 1; i >= 0; --i)
		{
431
			if (ASTAsterisk * asterisk = typeid_cast<ASTAsterisk *>(&*asts[i]))
432 433
			{
				ASTs all_columns;
A
Alexey Milovidov 已提交
434
				for (const auto & column_name_type : columns)
435
					all_columns.emplace_back(new ASTIdentifier(asterisk->range, column_name_type.name));
A
Alexey Milovidov 已提交
436

437 438 439 440 441
				asts.erase(asts.begin() + i);
				asts.insert(asts.begin() + i, all_columns.begin(), all_columns.end());
			}
		}
	}
442 443 444 445 446 447
	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;
	}
448

449 450 451
	/// Если заменили корень поддерева вызовемся для нового корня снова - на случай, если алиас заменился на алиас.
	if (replaced)
	{
452
		normalizeTreeImpl(ast, finished_asts, current_asts, current_alias);
453 454 455 456 457 458
		current_asts.erase(initial_ast);
		current_asts.erase(ast);
		finished_asts[initial_ast] = ast;
		return;
	}

459
	/// Рекурсивные вызовы. Не опускаемся в подзапросы.
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
	/// Также не опускаемся в левый аргумент лямбда-выражений, чтобы не заменять формальные параметры
	///  по алиасам в выражениях вида 123 AS x, arrayMap(x -> 1, [2]).

	if (func_node && func_node->name == "lambda")
	{
		/// Пропускаем первый аргумент. Также предполагаем, что у функции lambda не может быть parameters.
		for (size_t i = 1, size = func_node->arguments->children.size(); i < size; ++i)
		{
			auto & child = func_node->arguments->children[i];

			if (typeid_cast<ASTSelectQuery *>(&*child))
				continue;

			normalizeTreeImpl(child, finished_asts, current_asts, current_alias);
		}
	}
	else
	{
		for (auto & child : ast->children)
		{
			if (typeid_cast<ASTSelectQuery *>(&*child))
				continue;
482

483
			normalizeTreeImpl(child, finished_asts, current_asts, current_alias);
484 485
		}
	}
486

487
	/// Если секция WHERE или HAVING состоит из одного алиаса, ссылку нужно заменить не только в children, но и в where_expression и having_expression.
488
	if (ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast))
489
	{
490
		if (select->prewhere_expression)
491
			normalizeTreeImpl(select->prewhere_expression, finished_asts, current_asts, current_alias);
492
		if (select->where_expression)
493
			normalizeTreeImpl(select->where_expression, finished_asts, current_asts, current_alias);
494
		if (select->having_expression)
495
			normalizeTreeImpl(select->having_expression, finished_asts, current_asts, current_alias);
496
	}
497

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

500
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
501
	{
502 503 504 505
		if (node->kind == ASTFunction::TABLE_FUNCTION)
		{
		}
		else if (node->name == "lambda")
506
		{
507
			node->kind = ASTFunction::LAMBDA_EXPRESSION;
508 509 510
		}
		else if (context.getAggregateFunctionFactory().isAggregateFunctionName(node->name))
		{
511
			node->kind = ASTFunction::AGGREGATE_FUNCTION;
512
		}
513 514 515 516 517 518 519 520
		else if (node->name == "arrayJoin")
		{
			node->kind = ASTFunction::ARRAY_JOIN;
		}
		else
		{
			node->kind = ASTFunction::FUNCTION;
		}
521
	}
522

523 524 525 526 527
	current_asts.erase(initial_ast);
	current_asts.erase(ast);
	finished_asts[initial_ast] = ast;
}

528
void ExpressionAnalyzer::optimizeGroupBy()
529 530 531 532
{
	if (!(select_query && select_query->group_expression_list))
		return;

533 534 535
	const auto is_literal = [] (const ASTPtr& ast) {
		return typeid_cast<const ASTLiteral*>(ast.get());
	};
536

537
	auto & group_exprs = select_query->group_expression_list->children;
538

539
	/// removes expression at index idx by making it last one and calling .pop_back()
A
Alexey Milovidov 已提交
540 541
	const auto remove_expr_at_index = [&group_exprs] (const size_t idx)
	{
542
		if (idx < group_exprs.size() - 1)
A
Merge  
Andrey Mironov 已提交
543
			std::swap(group_exprs[idx], group_exprs.back());
544

545 546
		group_exprs.pop_back();
	};
547

A
Andrey Mironov 已提交
548
	/// iterate over each GROUP BY expression, eliminate injective function calls and literals
549
	for (size_t i = 0; i < group_exprs.size();)
550
	{
551
		if (const auto function = typeid_cast<ASTFunction *>(group_exprs[i].get()))
552 553
		{
			/// assert function is injective
554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
			if (possibly_injective_function_names.count(function->name))
			{
				/// do not handle semantic errors here
				if (function->arguments->children.size() < 2)
				{
					++i;
					continue;
				}

				const auto & dict_name = typeid_cast<const ASTLiteral &>(*function->arguments->children[0])
					.value.safeGet<String>();

				const auto & dict_ptr = context.getExternalDictionaries().getDictionary(dict_name);

				const auto & attr_name = typeid_cast<const ASTLiteral &>(*function->arguments->children[1])
					.value.safeGet<String>();

				if (!dict_ptr->isInjective(attr_name))
				{
					++i;
					continue;
				}
			}
			else if (!injective_function_names.count(function->name))
578 579
			{
				++i;
580
				continue;
581
			}
582 583 584 585 586 587 588 589 590 591 592 593 594 595 596

			/// copy shared pointer to args in order to ensure lifetime
			auto args_ast = function->arguments;

			/** remove function call and take a step back to ensure
			  * next iteration does not skip not yet processed data
			  */
			remove_expr_at_index(i);

			/// copy non-literal arguments
			std::remove_copy_if(
				std::begin(args_ast->children), std::end(args_ast->children),
				std::back_inserter(group_exprs), is_literal
			);
		}
597 598 599
		else if (is_literal(group_exprs[i]))
		{
			remove_expr_at_index(i);
600 601 602 603 604
		}
		else
		{
			/// if neither a function nor literal - advance to next expression
			++i;
605
		}
606
	}
607 608 609

	if (group_exprs.empty())
		select_query->group_expression_list = nullptr;
610 611 612
}


613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644
void ExpressionAnalyzer::optimizeOrderBy()
{
	if (!(select_query && select_query->order_expression_list))
		return;

	/// Уникализируем условия сортировки.
	using NameAndLocale = std::pair<std::string, std::string>;
	std::set<NameAndLocale> elems_set;

	ASTs & elems = select_query->order_expression_list->children;
	ASTs unique_elems;
	unique_elems.reserve(elems.size());

	for (const auto & elem : elems)
	{
		String name = elem->children.front()->getColumnName();
		const ASTOrderByElement & order_by_elem = typeid_cast<const ASTOrderByElement &>(*elem);

		if (elems_set.emplace(
			std::piecewise_construct,
			std::forward_as_tuple(name),
			std::forward_as_tuple(order_by_elem.collator ? order_by_elem.collator->getLocale() : std::string())).second)
		{
			unique_elems.emplace_back(elem);
		}
	}

	if (unique_elems.size() < elems.size())
		elems = unique_elems;
}


645
void ExpressionAnalyzer::makeSetsForIndex()
P
Pavel Kartavyy 已提交
646
{
647
	if (storage && ast && storage->supportsIndexForIn())
A
Alexey Milovidov 已提交
648
		makeSetsForIndexImpl(ast, storage->getSampleBlock());
P
Pavel Kartavyy 已提交
649 650
}

A
Alexey Milovidov 已提交
651
void ExpressionAnalyzer::makeSetsForIndexImpl(ASTPtr & node, const Block & sample_block)
P
Pavel Kartavyy 已提交
652 653
{
	for (auto & child : node->children)
A
Alexey Milovidov 已提交
654
		makeSetsForIndexImpl(child, sample_block);
P
Pavel Kartavyy 已提交
655

656
	ASTFunction * func = typeid_cast<ASTFunction *>(node.get());
P
Pavel Kartavyy 已提交
657 658 659
	if (func && func->kind == ASTFunction::FUNCTION && (func->name == "in" || func->name == "notIn"))
	{
		IAST & args = *func->arguments;
660
		ASTPtr & arg = args.children.at(1);
P
Pavel Kartavyy 已提交
661

662
		if (!typeid_cast<ASTSet *>(&*arg) && !typeid_cast<ASTSubquery *>(&*arg) && !typeid_cast<ASTIdentifier *>(&*arg))
663 664 665
		{
			try
			{
666
				makeExplicitSet(func, sample_block, true);
667 668 669 670 671 672 673 674
			}
			catch (const DB::Exception & e)
			{
				/// в sample_block нет колонок, которые добаляет getActions
				if (e.code() != ErrorCodes::NOT_FOUND_COLUMN_IN_BLOCK)
					throw;
			}
		}
P
Pavel Kartavyy 已提交
675 676
	}
}
677

678

679 680
static SharedPtr<InterpreterSelectQuery> interpretSubquery(
	ASTPtr & subquery_or_table_name, const Context & context, size_t subquery_depth, const Names & required_columns = Names())
681
{
682 683 684
	/// Подзапрос или имя таблицы. Имя таблицы аналогично подзапросу 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);
685

686 687
	if (!subquery && !table)
		throw Exception("IN/JOIN supports only SELECT subqueries.", ErrorCodes::BAD_ARGUMENTS);
688

689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
	/** Для подзапроса в секции 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)
	{
706 707 708
		/// create ASTSelectQuery for "SELECT * FROM table" as if written by hand
		const auto select_query = new ASTSelectQuery;
		query = select_query;
709

710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726
		const auto select_expression_list = new ASTExpressionList;
		select_query->select_expression_list = select_expression_list;
		select_query->children.emplace_back(select_query->select_expression_list);

		/// get columns list for target table
		const auto & storage = context.getTable("", table->name);
		const auto & columns = storage->getColumnsListNonMaterialized();
		select_expression_list->children.reserve(columns.size());

		/// manually substitute column names in place of asterisk
		for (const auto & column : columns)
			select_expression_list->children.emplace_back(new ASTIdentifier{
				StringRange{}, column.name
			});

		select_query->table = subquery_or_table_name;
		select_query->children.emplace_back(select_query->table);
727 728
	}
	else
729 730
		query = subquery->children.at(0);

731 732 733 734 735 736
	if (required_columns.empty())
		return new InterpreterSelectQuery(query, subquery_context, QueryProcessingStage::Complete, subquery_depth + 1);
	else
		return new InterpreterSelectQuery(query, subquery_context, required_columns, QueryProcessingStage::Complete, subquery_depth + 1);
}

737

738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
void ExpressionAnalyzer::addExternalStorage(ASTPtr & subquery_or_table_name)
{
	/// Сгенерируем имя для внешней таблицы.
	while (context.tryGetExternalTable("_data" + toString(external_table_id)))
		++external_table_id;

	if (const ASTIdentifier * table = typeid_cast<const ASTIdentifier *>(&*subquery_or_table_name))
	{
		/// Если это уже внешняя таблица, ничего заполять не нужно. Просто запоминаем ее наличие.
		if (StoragePtr existing_storage = context.tryGetExternalTable(table->name))
		{
			external_tables[table->name] = existing_storage;
			return;
		}
	}

754
	SharedPtr<InterpreterSelectQuery> interpreter = interpretSubquery(subquery_or_table_name, context, subquery_depth + 1);
755 756

	Block sample = interpreter->getSampleBlock();
757 758
	NamesAndTypesListPtr columns = new NamesAndTypesList(sample.getColumnsList());

759
	String external_table_name = "_data" + toString(external_table_id);
760

761 762 763 764 765 766 767 768 769
	/** Заменяем подзапрос на имя временной таблицы.
	  * Именно в таком виде, запрос отправится на удалённый сервер.
	  * На удалённый сервер отправится эта временная таблица, и на его стороне,
	  *  вместо выполнения подзапроса, надо будет просто из неё прочитать.
	  */
	subquery_or_table_name = new ASTIdentifier(StringRange(), external_table_name, ASTIdentifier::Table);

	StoragePtr external_storage = StorageMemory::create(external_table_name, columns);

770
	external_tables[external_table_name] = external_storage;
771
	subqueries_for_sets[external_table_name].source = interpreter->execute().in;
772
	subqueries_for_sets[external_table_name].source_sample = interpreter->getSampleBlock();
773
	subqueries_for_sets[external_table_name].table = external_storage;
774 775 776 777 778 779

	/** NOTE Если было написано IN tmp_table - существующая временная (но не внешняя) таблица,
	  *  то здесь будет создана новая временная таблица (например, _data1),
	  *  и данные будут затем в неё скопированы.
	  * Может быть, этого можно избежать.
	  */
780 781 782
}


783
void ExpressionAnalyzer::makeSet(ASTFunction * node, const Block & sample_block)
784
{
785
	/** Нужно преобразовать правый аргумент в множество.
786
	  * Это может быть имя таблицы, значение, перечисление значений или подзапрос.
787 788 789
	  * Перечисление значений парсится как функция tuple.
	  */
	IAST & args = *node->arguments;
790
	ASTPtr & arg = args.children.at(1);
791

792
	/// Уже преобразовали.
793
	if (typeid_cast<ASTSet *>(&*arg))
794
		return;
795

796
	/// Если подзапрос или имя таблицы для SELECT.
797 798
	ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*arg);
	if (typeid_cast<ASTSubquery *>(&*arg) || identifier)
799
	{
800 801 802
		/// Получаем поток блоков для подзапроса. Создаём Set и кладём на место подзапроса.
		String set_id = arg->getColumnName();
		ASTSet * ast_set = new ASTSet(set_id);
803
		ASTPtr ast_set_ptr = ast_set;
804

805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
		/// Особый случай - если справа оператора IN указано имя таблицы, при чём, таблица имеет тип Set (заранее подготовленное множество).
		/// TODO В этом синтаксисе не поддерживается указание имени БД.
		if (identifier)
		{
			StoragePtr table = context.tryGetTable("", identifier->name);

			if (table)
			{
				StorageSet * storage_set = typeid_cast<StorageSet *>(table.get());

				if (storage_set)
				{
					SetPtr & set = storage_set->getSet();
					ast_set->set = set;
					arg = ast_set_ptr;
					return;
				}
			}
		}

825
		SubqueryForSet & subquery_for_set = subqueries_for_sets[set_id];
826

827
		/// Если уже создали Set с таким же подзапросом/таблицей.
828
		if (subquery_for_set.set)
829
		{
830 831 832
			ast_set->set = subquery_for_set.set;
			arg = ast_set_ptr;
			return;
833
		}
834

835
		ast_set->set = new Set(settings.limits);
A
Alexey Milovidov 已提交
836

837 838 839 840 841 842
		/** Для GLOBAL IN-ов происходит следующее:
		  * - в функции addExternalStorage подзапрос IN (SELECT ...) заменяется на IN _data1,
		  *   в объекте subquery_for_set выставляется этот подзапрос в качестве source и временная таблица _data1 в качестве table.
		  * - в этой функции видно выражение IN _data1.
		  */
		if (!subquery_for_set.source)
843 844
		{
			auto interpreter = interpretSubquery(arg, context, subquery_depth);
845
			subquery_for_set.source = new LazyBlockInputStream([interpreter]() mutable { return interpreter->execute().in; });
846
			subquery_for_set.source_sample = interpreter->getSampleBlock();
847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874

			/** Зачем используется LazyBlockInputStream?
			  *
			  * Дело в том, что при обработке запроса вида
			  *  SELECT ... FROM remote_test WHERE column GLOBAL IN (subquery),
			  *  если распределённая таблица remote_test содержит в качестве одного из серверов localhost,
			  *  то запрос будет ещё раз интерпретирован локально (а не отправлен по TCP, как в случае удалённого сервера).
			  *
			  * Конвейер выполнения запроса будет такой:
			  * CreatingSets
			  *  выполнение подзапроса subquery, заполнение временной таблицы _data1 (1)
			  *  CreatingSets
			  *   чтение из таблицы _data1, создание множества (2)
			  *   чтение из таблицы, подчинённой remote_test.
			  *
			  * (Вторая часть конвейера под CreatingSets - это повторная интерпретация запроса внутри StorageDistributed,
			  *  запрос отличается тем, что имя БД и таблицы заменены на подчинённые, а также подзапрос заменён на _data1.)
			  *
			  * Но при создании конвейера, при создании источника (2), будет обнаружено, что таблица _data1 пустая
			  *  (потому что запрос ещё не начал выполняться), и будет возвращён в качестве источника пустой источник.
			  * И затем, при выполнении запроса, на шаге (2), будет создано пустое множество.
			  *
			  * Поэтому, мы делаем инициализацию шага (2) ленивой
			  *  - чтобы она произошла только после выполнения шага (1), на котором нужная таблица будет заполнена.
			  *
			  * Замечание: это решение не очень хорошее, надо подумать лучше.
			  */
		}
875

876
		subquery_for_set.set = ast_set->set;
877
		arg = ast_set_ptr;
878
	}
879
	else
880
	{
A
Alexey Milovidov 已提交
881
		/// Явное перечисление значений в скобках.
P
Pavel Kartavyy 已提交
882
		makeExplicitSet(node, sample_block, false);
P
Pavel Kartavyy 已提交
883 884 885 886
	}
}

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

892 893
	DataTypes set_element_types;
	ASTPtr & left_arg = args.children.at(0);
894

895
	ASTFunction * left_arg_tuple = typeid_cast<ASTFunction *>(&*left_arg);
896

897 898 899
	if (left_arg_tuple && left_arg_tuple->name == "tuple")
	{
		for (const auto & arg : left_arg_tuple->arguments->children)
900
		{
901
			const auto & data_type = sample_block.getByName(arg->getColumnName()).type;
902

903 904 905
			/// @note prevent crash in query: SELECT (1, [1]) in (1, 1)
			if (const auto array = typeid_cast<const DataTypeArray * >(data_type.get()))
				throw Exception("Incorrect element of tuple: " + array->getName(), ErrorCodes::INCORRECT_ELEMENT_OF_SET);
906

907
			set_element_types.push_back(data_type);
908
		}
909 910 911 912 913 914
	}
	else
	{
		DataTypePtr left_type = sample_block.getByName(left_arg->getColumnName()).type;
		if (DataTypeArray * array_type = typeid_cast<DataTypeArray *>(&*left_type))
			set_element_types.push_back(array_type->getNestedType());
915
		else
916 917
			set_element_types.push_back(left_type);
	}
918

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

923 924
	if (ASTFunction * set_func = typeid_cast<ASTFunction *>(&*arg))
	{
925 926 927 928 929 930 931 932 933 934 935 936 937 938 939
		if (set_func->name == "tuple")
		{
			/// Отличм случай (x, y) in ((1, 2), (3, 4)) от случая (x, y) in (1, 2).
			ASTFunction * any_element = typeid_cast<ASTFunction *>(&*set_func->arguments->children.at(0));
			if (set_element_types.size() >= 2 && (!any_element || any_element->name != "tuple"))
				single_value = true;
			else
				elements_ast = set_func->arguments;
		}
		else
		{
			if (set_element_types.size() >= 2)
				throw Exception("Incorrect type of 2nd argument for function " + node->name
					+ ". Must be subquery or set of " + toString(set_element_types.size()) + "-element tuples.",
					ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
940

941
			single_value = true;
942
		}
943 944 945 946 947 948 949 950 951 952
	}
	else if (typeid_cast<ASTLiteral *>(&*arg))
	{
		single_value = true;
	}
	else
	{
		throw Exception("Incorrect type of 2nd argument for function " + node->name + ". Must be subquery or set of values.",
						ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
	}
953

954 955 956 957 958 959 960 961 962 963 964
	if (single_value)
	{
		ASTPtr exp_list = new ASTExpressionList;
		exp_list->children.push_back(elements_ast);
		elements_ast = exp_list;
	}

	ASTSet * ast_set = new ASTSet(arg->getColumnName());
	ASTPtr ast_set_ptr = ast_set;
	ast_set->set = new Set(settings.limits);
	ast_set->is_explicit = true;
965
	ast_set->set->createFromAST(set_element_types, elements_ast, context, create_ordered_set);
966
	arg = ast_set_ptr;
967 968 969
}


970
static String getUniqueName(const Block & block, const String & prefix)
971 972
{
	int i = 1;
973
	while (block.has(prefix + toString(i)))
974
		++i;
975
	return prefix + toString(i);
976 977 978
}


A
Alexey Milovidov 已提交
979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
/** Для 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;

998
	ScopeStack(const ExpressionActionsPtr & actions, const Settings & settings_)
A
Alexey Milovidov 已提交
999 1000
		: settings(settings_)
	{
1001
		stack.emplace_back();
1002
		stack.back().actions = actions;
1003 1004 1005 1006

		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 已提交
1007 1008 1009 1010
	}

	void pushLevel(const NamesAndTypesList & input_columns)
	{
1011
		stack.emplace_back();
A
Alexey Milovidov 已提交
1012 1013 1014 1015 1016 1017 1018
		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)
		{
1019 1020 1021
			all_columns.emplace_back(nullptr, it->type, it->name);
			new_names.insert(it->name);
			stack.back().new_columns.insert(it->name);
A
Alexey Milovidov 已提交
1022 1023
		}

1024 1025
		const Block & prev_sample_block = prev.actions->getSampleBlock();
		for (size_t i = 0, size = prev_sample_block.columns(); i < size; ++i)
A
Alexey Milovidov 已提交
1026
		{
1027 1028 1029
			const ColumnWithNameAndType & col = prev_sample_block.unsafeGetByPosition(i);
			if (!new_names.count(col.name))
				all_columns.push_back(col);
A
Alexey Milovidov 已提交
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
		}

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

1073
	const Block & getSampleBlock() const
A
Alexey Milovidov 已提交
1074 1075 1076 1077 1078 1079
	{
		return stack.back().actions->getSampleBlock();
	}
};


1080
void ExpressionAnalyzer::getRootActions(ASTPtr ast, bool no_subqueries, bool only_consts, ExpressionActionsPtr & actions)
1081 1082
{
	ScopeStack scopes(actions, settings);
1083
	getActionsImpl(ast, no_subqueries, only_consts, scopes);
1084
	actions = scopes.popLevel();
1085 1086 1087
}


1088 1089
void ExpressionAnalyzer::getArrayJoinedColumns()
{
1090 1091
	if (select_query && select_query->array_join_expression_list)
	{
1092
		ASTs & array_join_asts = select_query->array_join_expression_list->children;
1093
		for (const auto & ast : array_join_asts)
1094
		{
1095 1096 1097
			const String nested_table_name = ast->getColumnName();
			const String nested_table_alias = ast->getAliasOrColumnName();
			if (nested_table_alias == nested_table_name && !typeid_cast<const ASTIdentifier *>(&*ast))
1098 1099 1100 1101 1102 1103 1104 1105
				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;
1106 1107 1108
		for (const auto & ast : query_asts)
			if (ast != select_query->array_join_expression_list)
				getArrayJoinedColumnsImpl(ast);
1109 1110 1111

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

1118
			/// Это массив.
1119
			if (!typeid_cast<ASTIdentifier *>(&*expr) || findColumn(source_name, columns) != columns.end())
1120
			{
1121
				array_join_result_to_source[result_name] = source_name;
1122 1123 1124 1125
			}
			else /// Это вложенная таблица.
			{
				bool found = false;
A
Alexey Milovidov 已提交
1126
				for (const auto & column_name_type : columns)
1127
				{
1128 1129
					String table_name = DataTypeNested::extractNestedTableName(column_name_type.name);
					String column_name = DataTypeNested::extractNestedColumnName(column_name_type.name);
1130 1131
					if (table_name == source_name)
					{
1132
						array_join_result_to_source[DataTypeNested::concatenateNestedName(result_name, column_name)] = column_name_type.name;
1133 1134 1135 1136
						found = true;
						break;
					}
				}
1137 1138
				if (!found)
					throw Exception("No columns in nested table " + source_name, ErrorCodes::EMPTY_NESTED_TABLE);
1139 1140
			}
		}
1141
	}
1142 1143 1144 1145
}


void ExpressionAnalyzer::getArrayJoinedColumnsImpl(ASTPtr ast)
1146
{
1147
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
1148
	{
1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160
		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);
			}
		}
1161 1162 1163
	}
	else
	{
1164 1165 1166
		for (auto & child : ast->children)
			if (!typeid_cast<ASTSelectQuery *>(&*child))
				getArrayJoinedColumnsImpl(child);
1167 1168 1169 1170 1171
	}
}


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

1178
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
1179 1180 1181 1182 1183
	{
		std::string name = node->getColumnName();
		if (!only_consts && !actions_stack.getSampleBlock().has(name))
		{
			/// Запрошенного столбца нет в блоке.
1184
			/// Если такой столбец есть в таблице, значит пользователь наверно забыл окружить его агрегатной функцией или добавить в GROUP BY.
1185 1186

			bool found = false;
A
Alexey Milovidov 已提交
1187
			for (const auto & column_name_type : columns)
1188
				if (column_name_type.name == name)
1189 1190 1191 1192
					found = true;

			if (found)
				throw Exception("Column " + name + " is not under aggregate function and not in GROUP BY.",
1193
					ErrorCodes::NOT_AN_AGGREGATE);
1194 1195
		}
	}
1196
	else if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
1197
	{
1198
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
1199
			throw Exception("Unexpected expression", ErrorCodes::UNEXPECTED_EXPRESSION);
1200

1201 1202 1203 1204
		if (node->kind == ASTFunction::ARRAY_JOIN)
		{
			if (node->arguments->children.size() != 1)
				throw Exception("arrayJoin requires exactly 1 argument", ErrorCodes::TYPE_MISMATCH);
1205
			ASTPtr arg = node->arguments->children.at(0);
1206
			getActionsImpl(arg, no_subqueries, only_consts, actions_stack);
1207
			if (!only_consts)
1208
			{
1209
				String result_name = node->getColumnName();
1210
				actions_stack.addAction(ExpressionAction::copyColumn(arg->getColumnName(), result_name));
1211 1212
				NameSet joined_columns;
				joined_columns.insert(result_name);
1213
				actions_stack.addAction(ExpressionAction::arrayJoin(joined_columns));
1214
			}
1215

1216 1217
			return;
		}
1218

1219
		if (node->kind == ASTFunction::FUNCTION)
1220
		{
1221
			if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
1222 1223 1224
			{
				if (!no_subqueries)
				{
1225
					/// Найдем тип первого аргумента (потом getActionsImpl вызовется для него снова и ни на что не повлияет).
1226
					getActionsImpl(node->arguments->children.at(0), no_subqueries, only_consts, actions_stack);
1227

1228
					/// Превратим tuple или подзапрос в множество.
1229
					makeSet(node, actions_stack.getSampleBlock());
1230 1231 1232
				}
				else
				{
1233 1234 1235 1236 1237 1238 1239
					if (!only_consts)
					{
						/// Мы в той части дерева, которую не собираемся вычислять. Нужно только определить типы.
						/// Не будем выполнять подзапросы и составлять множества. Вставим произвольный столбец правильного типа.
						ColumnWithNameAndType fake_column;
						fake_column.name = node->getColumnName();
						fake_column.type = new DataTypeUInt8;
1240
						actions_stack.addAction(ExpressionAction::addColumn(fake_column));
1241
						getActionsImpl(node->arguments->children.at(0), no_subqueries, only_consts, actions_stack);
1242
					}
1243 1244 1245
					return;
				}
			}
1246

1247
			const FunctionPtr & function = FunctionFactory::instance().get(node->name, context);
1248

1249 1250
			Names argument_names;
			DataTypes argument_types;
M
Merge  
Michael Kolupaev 已提交
1251
			bool arguments_present = true;
1252

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

1256
			for (auto & child : node->arguments->children)
1257
			{
1258 1259
				ASTFunction * lambda = typeid_cast<ASTFunction *>(&*child);
				ASTSet * set = typeid_cast<ASTSet *>(&*child);
1260 1261
				if (lambda && lambda->name == "lambda")
				{
M
Merge  
Michael Kolupaev 已提交
1262
					/// Если аргумент - лямбда-выражение, только запомним его примерный тип.
1263 1264
					if (lambda->arguments->children.size() != 2)
						throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
1265

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

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

1271
					has_lambda_arguments = true;
1272
					argument_types.emplace_back(new DataTypeExpression(DataTypes(lambda_args_tuple->arguments->children.size())));
1273
					/// Выберем название в следующем цикле.
1274
					argument_names.emplace_back();
1275
				}
1276 1277 1278 1279
				else if (set)
				{
					ColumnWithNameAndType column;
					column.type = new DataTypeSet;
1280

1281 1282
					/// Если аргумент - множество, заданное перечислением значений, дадим ему уникальное имя,
					///  чтобы множества с одинаковой записью не склеивались (у них может быть разный тип).
1283
					if (set->is_explicit)
1284 1285 1286 1287 1288 1289 1290 1291
						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);

1292
						actions_stack.addAction(ExpressionAction::addColumn(column));
1293
					}
1294

1295 1296 1297
					argument_types.push_back(column.type);
					argument_names.push_back(column.name);
				}
1298 1299
				else
				{
M
Merge  
Michael Kolupaev 已提交
1300
					/// Если аргумент не лямбда-выражение, вызовемся рекурсивно и узнаем его тип.
1301
					getActionsImpl(child, no_subqueries, only_consts, actions_stack);
1302
					std::string name = child->getColumnName();
1303
					if (actions_stack.getSampleBlock().has(name))
M
Merge  
Michael Kolupaev 已提交
1304
					{
1305
						argument_types.push_back(actions_stack.getSampleBlock().getByName(name).type);
M
Merge  
Michael Kolupaev 已提交
1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318
						argument_names.push_back(name);
					}
					else
					{
						if (only_consts)
						{
							arguments_present = false;
						}
						else
						{
							throw Exception("Unknown identifier: " + name, ErrorCodes::UNKNOWN_IDENTIFIER);
						}
					}
1319 1320
				}
			}
1321

M
Merge  
Michael Kolupaev 已提交
1322 1323
			if (only_consts && !arguments_present)
				return;
1324

1325
			Names additional_requirements;
1326

1327 1328 1329
			if (has_lambda_arguments && !only_consts)
			{
				function->getLambdaArgumentTypes(argument_types);
1330

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

1336
					ASTFunction * lambda = typeid_cast<ASTFunction *>(&*child);
1337 1338
					if (lambda && lambda->name == "lambda")
					{
1339
						DataTypeExpression * lambda_type = typeid_cast<DataTypeExpression *>(&*argument_types[i]);
1340
						ASTFunction * lambda_args_tuple = typeid_cast<ASTFunction *>(&*lambda->arguments->children.at(0));
1341
						ASTs lambda_arg_asts = lambda_args_tuple->arguments->children;
1342
						NamesAndTypesList lambda_arguments;
1343

1344 1345
						for (size_t j = 0; j < lambda_arg_asts.size(); ++j)
						{
1346
							ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*lambda_arg_asts[j]);
1347 1348
							if (!identifier)
								throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1349

1350
							String arg_name = identifier->name;
1351

1352
							lambda_arguments.emplace_back(arg_name, lambda_type->getArgumentTypes()[j]);
1353
						}
1354

1355
						actions_stack.pushLevel(lambda_arguments);
1356
						getActionsImpl(lambda->arguments->children.at(1), no_subqueries, only_consts, actions_stack);
1357
						ExpressionActionsPtr lambda_actions = actions_stack.popLevel();
1358

1359
						String result_name = lambda->arguments->children.at(1)->getColumnName();
1360
						lambda_actions->finalize(Names(1, result_name));
1361
						DataTypePtr result_type = lambda_actions->getSampleBlock().getByName(result_name).type;
1362
						argument_types[i] = new DataTypeExpression(lambda_type->getArgumentTypes(), result_type);
1363

1364 1365 1366 1367
						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]);
1368

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

1373
						ColumnWithNameAndType lambda_column;
1374
						lambda_column.column = new ColumnExpression(1, lambda_actions, lambda_arguments, result_type, result_name);
1375 1376
						lambda_column.type = argument_types[i];
						lambda_column.name = argument_names[i];
1377
						actions_stack.addAction(ExpressionAction::addColumn(lambda_column));
1378 1379 1380
					}
				}
			}
1381

1382 1383 1384 1385
			if (only_consts)
			{
				for (size_t i = 0; i < argument_names.size(); ++i)
				{
1386
					if (!actions_stack.getSampleBlock().has(argument_names[i]))
1387
					{
M
Merge  
Michael Kolupaev 已提交
1388
						arguments_present = false;
1389 1390 1391 1392
						break;
					}
				}
			}
1393

M
Merge  
Michael Kolupaev 已提交
1394
			if (arguments_present)
1395
				actions_stack.addAction(ExpressionAction::applyFunction(function, argument_names, node->getColumnName()),
1396
										additional_requirements);
1397 1398
		}
	}
1399
	else if (ASTLiteral * node = typeid_cast<ASTLiteral *>(&*ast))
1400 1401
	{
		DataTypePtr type = apply_visitor(FieldToDataType(), node->value);
1402

1403 1404 1405 1406
		ColumnWithNameAndType column;
		column.column = type->createConstColumn(1, node->value);
		column.type = type;
		column.name = node->getColumnName();
1407

1408
		actions_stack.addAction(ExpressionAction::addColumn(column));
1409 1410 1411
	}
	else
	{
1412 1413
		for (auto & child : ast->children)
			getActionsImpl(child, no_subqueries, only_consts, actions_stack);
1414 1415 1416 1417
	}
}


1418
void ExpressionAnalyzer::getAggregates(ASTPtr ast, ExpressionActionsPtr & actions)
1419
{
1420
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1421
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
1422
	{
1423
		has_aggregation = true;
1424 1425
		AggregateDescription aggregate;
		aggregate.column_name = node->getColumnName();
1426

1427
		/// Агрегатные функции уникализируются.
1428 1429 1430
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
			if (aggregate_descriptions[i].column_name == aggregate.column_name)
				return;
1431

1432 1433 1434
		ASTs & arguments = node->arguments->children;
		aggregate.argument_names.resize(arguments.size());
		DataTypes types(arguments.size());
1435

1436 1437
		for (size_t i = 0; i < arguments.size(); ++i)
		{
1438
			getRootActions(arguments[i], true, false, actions);
1439
			const std::string & name = arguments[i]->getColumnName();
1440
			types[i] = actions->getSampleBlock().getByName(name).type;
1441 1442
			aggregate.argument_names[i] = name;
		}
1443

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

1446 1447
		if (node->parameters)
		{
1448
			ASTs & parameters = typeid_cast<ASTExpressionList &>(*node->parameters).children;
1449
			Array params_row(parameters.size());
1450

1451 1452
			for (size_t i = 0; i < parameters.size(); ++i)
			{
1453
				ASTLiteral * lit = typeid_cast<ASTLiteral *>(&*parameters[i]);
1454 1455
				if (!lit)
					throw Exception("Parameters to aggregate functions must be literals", ErrorCodes::PARAMETERS_TO_AGGREGATE_FUNCTIONS_MUST_BE_LITERALS);
1456

1457 1458
				params_row[i] = lit->value;
			}
1459

1460
			aggregate.parameters = params_row;
1461 1462
			aggregate.function->setParameters(params_row);
		}
1463

1464
		aggregate.function->setArguments(types);
1465

1466 1467 1468 1469 1470 1471
		aggregate_descriptions.push_back(aggregate);
	}
	else
	{
		for (size_t i = 0; i < ast->children.size(); ++i)
		{
1472
			ASTPtr child = ast->children[i];
1473
			if (!typeid_cast<ASTSubquery *>(&*child) && !typeid_cast<ASTSelectQuery *>(&*child))
1474
				getAggregates(child, actions);
1475 1476 1477 1478
		}
	}
}

1479
void ExpressionAnalyzer::assertSelect() const
1480 1481 1482 1483
{
	if (!select_query)
		throw Exception("Not a select query", ErrorCodes::LOGICAL_ERROR);
}
1484

1485
void ExpressionAnalyzer::assertAggregation() const
1486 1487 1488
{
	if (!has_aggregation)
		throw Exception("No aggregation", ErrorCodes::LOGICAL_ERROR);
1489
}
1490

1491
void ExpressionAnalyzer::initChain(ExpressionActionsChain & chain, const NamesAndTypesList & columns) const
1492 1493 1494 1495
{
	if (chain.steps.empty())
	{
		chain.settings = settings;
1496
		chain.steps.emplace_back(new ExpressionActions(columns, settings));
1497 1498
	}
}
1499

1500
void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actions) const
1501
{
1502
	NameSet result_columns;
1503
	for (const auto & result_source : array_join_result_to_source)
1504
	{
1505 1506 1507
		if (result_source.first != result_source.second)
			actions->add(ExpressionAction::copyColumn(result_source.second, result_source.first));
		result_columns.insert(result_source.first);
1508 1509
	}

1510
	actions->add(ExpressionAction::arrayJoin(result_columns));
1511 1512
}

1513
bool ExpressionAnalyzer::appendArrayJoin(ExpressionActionsChain & chain, bool only_types)
1514 1515
{
	assertSelect();
1516 1517

	if (!select_query->array_join_expression_list)
1518
		return false;
1519

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

1523
	getRootActions(select_query->array_join_expression_list, only_types, false, step.actions);
1524

1525
	addMultipleArrayJoinAction(step.actions);
1526

1527 1528 1529
	return true;
}

1530
void ExpressionAnalyzer::addJoinAction(ExpressionActionsPtr & actions, bool only_types) const
1531
{
1532 1533 1534 1535 1536 1537
	if (only_types)
		actions->add(ExpressionAction::ordinaryJoin(nullptr, columns_added_by_join));
	else
		for (auto & subquery_for_set : subqueries_for_sets)
			if (subquery_for_set.second.join)
				actions->add(ExpressionAction::ordinaryJoin(subquery_for_set.second.join, columns_added_by_join));
1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549
}

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

	if (!select_query->join)
		return false;

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

1550
	ASTJoin & ast_join = typeid_cast<ASTJoin &>(*select_query->join);
1551
	getRootActions(ast_join.using_expr_list, only_types, false, step.actions);
1552

1553 1554 1555 1556
	/// Не поддерживается два JOIN-а с одинаковым подзапросом, но разными USING-ами.
	String join_id = ast_join.table->getColumnName();

	SubqueryForSet & subquery_for_set = subqueries_for_sets[join_id];
1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579

	/// Особый случай - если справа JOIN указано имя таблицы, при чём, таблица имеет тип Join (заранее подготовленное отображение).
	/// TODO В этом синтаксисе не поддерживается указание имени БД.
	ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*ast_join.table);
	if (identifier)
	{
		StoragePtr table = context.tryGetTable("", identifier->name);

		if (table)
		{
			StorageJoin * storage_join = typeid_cast<StorageJoin *>(table.get());

			if (storage_join)
			{
				storage_join->assertCompatible(ast_join.kind, ast_join.strictness);
				/// TODO Проверять набор ключей.

				JoinPtr & join = storage_join->getJoin();
				subquery_for_set.join = join;
			}
		}
	}

1580
	if (!subquery_for_set.join)
1581
	{
1582 1583 1584
		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);
1585

1586
		Names required_joined_columns(join_key_names_right.begin(), join_key_names_right.end());
1587
		for (const auto & name_type : columns_added_by_join)
1588
			required_joined_columns.push_back(name_type.name);
1589

1590 1591 1592 1593 1594 1595
		/** Для GLOBAL JOIN-ов происходит следующее:
		  * - в функции addExternalStorage подзапрос JOIN (SELECT ...) заменяется на JOIN _data1,
		  *   в объекте subquery_for_set выставляется этот подзапрос в качестве source и временная таблица _data1 в качестве table.
		  * - в этой функции видно выражение JOIN _data1.
		  */
		if (!subquery_for_set.source)
1596 1597
		{
			auto interpreter = interpretSubquery(ast_join.table, context, subquery_depth, required_joined_columns);
1598
			subquery_for_set.source = new LazyBlockInputStream([interpreter]() mutable { return interpreter->execute().in; });
1599
			subquery_for_set.source_sample = interpreter->getSampleBlock();
1600
		}
1601

1602
		/// TODO Это не нужно выставлять, когда JOIN нужен только на удалённых серверах.
1603
		subquery_for_set.join = join;
1604
		subquery_for_set.join->setSampleBlock(subquery_for_set.source_sample);
1605 1606
	}

1607
	addJoinAction(step.actions, false);
1608 1609 1610 1611

	return true;
}

1612
bool ExpressionAnalyzer::appendWhere(ExpressionActionsChain & chain, bool only_types)
1613 1614
{
	assertSelect();
1615

1616 1617
	if (!select_query->where_expression)
		return false;
1618

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

1622
	step.required_output.push_back(select_query->where_expression->getColumnName());
1623
	getRootActions(select_query->where_expression, only_types, false, step.actions);
1624

1625 1626 1627
	return true;
}

1628
bool ExpressionAnalyzer::appendGroupBy(ExpressionActionsChain & chain, bool only_types)
1629 1630
{
	assertAggregation();
1631

1632 1633
	if (!select_query->group_expression_list)
		return false;
1634

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

1638
	ASTs asts = select_query->group_expression_list->children;
1639 1640
	for (size_t i = 0; i < asts.size(); ++i)
	{
1641
		step.required_output.push_back(asts[i]->getColumnName());
1642
		getRootActions(asts[i], only_types, false, step.actions);
1643
	}
1644

1645 1646 1647
	return true;
}

1648
void ExpressionAnalyzer::appendAggregateFunctionsArguments(ExpressionActionsChain & chain, bool only_types)
1649 1650
{
	assertAggregation();
1651

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

1655 1656 1657 1658 1659 1660 1661
	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]);
		}
	}
1662

1663
	getActionsBeforeAggregation(select_query->select_expression_list, step.actions, only_types);
1664

1665
	if (select_query->having_expression)
1666
		getActionsBeforeAggregation(select_query->having_expression, step.actions, only_types);
1667

1668
	if (select_query->order_expression_list)
1669
		getActionsBeforeAggregation(select_query->order_expression_list, step.actions, only_types);
1670 1671
}

1672
bool ExpressionAnalyzer::appendHaving(ExpressionActionsChain & chain, bool only_types)
1673 1674
{
	assertAggregation();
1675

1676 1677
	if (!select_query->having_expression)
		return false;
1678

1679 1680
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1681

1682
	step.required_output.push_back(select_query->having_expression->getColumnName());
1683
	getRootActions(select_query->having_expression, only_types, false, step.actions);
1684

1685
	return true;
1686 1687
}

1688
void ExpressionAnalyzer::appendSelect(ExpressionActionsChain & chain, bool only_types)
1689 1690
{
	assertSelect();
1691

1692 1693
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1694

1695
	getRootActions(select_query->select_expression_list, only_types, false, step.actions);
1696

1697 1698 1699 1700 1701
	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());
	}
1702
}
1703

1704
bool ExpressionAnalyzer::appendOrderBy(ExpressionActionsChain & chain, bool only_types)
1705
{
1706
	assertSelect();
1707

1708 1709
	if (!select_query->order_expression_list)
		return false;
1710

1711 1712
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1713

1714
	getRootActions(select_query->order_expression_list, only_types, false, step.actions);
1715

1716 1717 1718
	ASTs asts = select_query->order_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
1719
		ASTOrderByElement * ast = typeid_cast<ASTOrderByElement *>(&*asts[i]);
1720 1721
		if (!ast || ast->children.size() != 1)
			throw Exception("Bad order expression AST", ErrorCodes::UNKNOWN_TYPE_OF_AST_NODE);
1722
		ASTPtr order_expression = ast->children.at(0);
1723 1724
		step.required_output.push_back(order_expression->getColumnName());
	}
1725

1726 1727 1728
	return true;
}

1729
void ExpressionAnalyzer::appendProjectResult(DB::ExpressionActionsChain & chain, bool only_types) const
1730 1731
{
	assertSelect();
1732

1733 1734
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1735

1736
	NamesWithAliases result_columns;
1737

1738
	ASTs asts = select_query->select_expression_list->children;
1739
	for (size_t i = 0; i < asts.size(); ++i)
1740
	{
1741 1742
		result_columns.emplace_back(asts[i]->getColumnName(), asts[i]->getAliasOrColumnName());
		step.required_output.push_back(result_columns.back().second);
1743
	}
1744

1745
	step.actions->add(ExpressionAction::project(result_columns));
1746 1747 1748
}


1749 1750 1751
Block ExpressionAnalyzer::getSelectSampleBlock()
{
	assertSelect();
1752

1753
	ExpressionActionsPtr temp_actions = new ExpressionActions(aggregated_columns, settings);
1754
	NamesWithAliases result_columns;
1755

1756 1757 1758
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
1759
		result_columns.emplace_back(asts[i]->getColumnName(), asts[i]->getAliasOrColumnName());
1760
		getRootActions(asts[i], true, false, temp_actions);
1761
	}
1762

1763
	temp_actions->add(ExpressionAction::project(result_columns));
1764

1765
	return temp_actions->getSampleBlock();
1766 1767
}

1768
void ExpressionAnalyzer::getActionsBeforeAggregation(ASTPtr ast, ExpressionActionsPtr & actions, bool no_subqueries)
1769
{
1770
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1771

1772 1773 1774
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
		for (auto & argument : node->arguments->children)
			getRootActions(argument, no_subqueries, false, actions);
1775
	else
1776 1777
		for (auto & child : ast->children)
			getActionsBeforeAggregation(child, actions, no_subqueries);
1778 1779 1780
}


M
Merge  
Michael Kolupaev 已提交
1781
ExpressionActionsPtr ExpressionAnalyzer::getActions(bool project_result)
1782
{
1783
	ExpressionActionsPtr actions = new ExpressionActions(columns, settings);
1784
	NamesWithAliases result_columns;
1785
	Names result_names;
1786

1787
	ASTs asts;
1788

1789
	if (auto node = typeid_cast<const ASTExpressionList *>(&*ast))
1790
		asts = node->children;
1791
	else
1792
		asts = ASTs(1, ast);
1793

1794
	for (size_t i = 0; i < asts.size(); ++i)
1795
	{
1796 1797 1798
		std::string name = asts[i]->getColumnName();
		std::string alias;
		if (project_result)
A
Alexey Milovidov 已提交
1799
			alias = asts[i]->getAliasOrColumnName();
1800 1801
		else
			alias = name;
1802
		result_columns.emplace_back(name, alias);
1803
		result_names.push_back(alias);
1804
		getRootActions(asts[i], false, false, actions);
1805
	}
1806

M
Merge  
Michael Kolupaev 已提交
1807 1808
	if (project_result)
	{
1809
		actions->add(ExpressionAction::project(result_columns));
M
Merge  
Michael Kolupaev 已提交
1810
	}
M
Merge  
Michael Kolupaev 已提交
1811 1812 1813
	else
	{
		/// Не будем удалять исходные столбцы.
A
Alexey Milovidov 已提交
1814
		for (const auto & column_name_type : columns)
1815
			result_names.push_back(column_name_type.name);
M
Merge  
Michael Kolupaev 已提交
1816
	}
1817

1818
	actions->finalize(result_names);
1819

1820 1821 1822 1823 1824 1825
	return actions;
}


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

1828
	getRootActions(ast, true, true, actions);
1829

1830 1831 1832
	return actions;
}

1833
void ExpressionAnalyzer::getAggregateInfo(Names & key_names, AggregateDescriptions & aggregates) const
1834
{
1835 1836
	for (const auto & name_and_type : aggregation_keys)
		key_names.emplace_back(name_and_type.name);
1837

1838 1839 1840
	aggregates = aggregate_descriptions;
}

1841
void ExpressionAnalyzer::collectUsedColumns()
1842
{
A
Alexey Milovidov 已提交
1843 1844 1845 1846 1847 1848 1849
	/** Вычислим, какие столбцы требуются для выполнения выражения.
	  * Затем, удалим все остальные столбцы из списка доступных столбцов.
	  * После выполнения, columns будет содержать только список столбцов, нужных для чтения из таблицы.
	  */

	NameSet required;
	NameSet ignored;
1850

1851 1852 1853 1854 1855 1856
	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.
1857
			/// Их потом добавим отдельно.
1858
			if (typeid_cast<ASTIdentifier *>(&*expressions[i]))
1859
			{
1860
				ignored.insert(expressions[i]->getColumnName());
1861 1862 1863 1864
			}
			else
			{
				/// Для выражений в ARRAY JOIN ничего игнорировать не нужно.
A
Alexey Milovidov 已提交
1865
				NameSet empty;
1866
				getRequiredColumnsImpl(expressions[i], required, empty, empty, empty);
1867
			}
1868

A
Alexey Milovidov 已提交
1869
			ignored.insert(expressions[i]->getAliasOrColumnName());
1870 1871
		}
	}
1872

1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883
	/** Также нужно не учитывать идентификаторы столбцов, получающихся путём 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();)
	{
1884
		if (required_joined_columns.count(it->name))
1885 1886 1887 1888 1889
			++it;
		else
			columns_added_by_join.erase(it++);
	}

1890
/*	for (const auto & name_type : columns_added_by_join)
1891
		std::cerr << "JOINed column (required, not key): " << name_type.first << std::endl;
1892
	std::cerr << std::endl;*/
1893

A
Alexey Milovidov 已提交
1894
	/// Вставляем в список требуемых столбцов столбцы, нужные для вычисления ARRAY JOIN.
1895
	NameSet array_join_sources;
A
Alexey Milovidov 已提交
1896 1897 1898 1899
	for (const auto & result_source : array_join_result_to_source)
		array_join_sources.insert(result_source.second);

	for (const auto & column_name_type : columns)
1900 1901
		if (array_join_sources.count(column_name_type.name))
			required.insert(column_name_type.name);
1902

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

1907
	unknown_required_columns = required;
1908

1909 1910
	for (NamesAndTypesList::iterator it = columns.begin(); it != columns.end();)
	{
1911
		unknown_required_columns.erase(it->name);
1912

1913
		if (!required.count(it->name))
1914
		{
1915
			required.erase(it->name);
A
Alexey Milovidov 已提交
1916
			columns.erase(it++);
1917
		}
A
Alexey Milovidov 已提交
1918 1919
		else
			++it;
1920
	}
S
Merge  
Sergey Fedorov 已提交
1921

1922
	for (NamesAndTypesList::iterator it = columns.begin(); it != columns.end();)
S
Merge  
Sergey Fedorov 已提交
1923
	{
1924 1925 1926
		unknown_required_columns.erase(it->name);

		if (!required.count(it->name))
S
Merge  
Sergey Fedorov 已提交
1927
		{
1928 1929
			required.erase(it->name);
			columns.erase(it++);
A
Alexey Milovidov 已提交
1930 1931
		}
		else
S
Merge  
Sergey Fedorov 已提交
1932
			++it;
S
Merge  
Sergey Fedorov 已提交
1933
	}
1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949

	/// Возможно, среди неизвестных столбцов есть виртуальные. Удаляем их из списка неизвестных и добавляем
	/// в columns list, чтобы при дальнейшей обработке запроса они воспринимались как настоящие.
	if (storage)
	{
		for (auto it = unknown_required_columns.begin(); it != unknown_required_columns.end();)
		{
			if (storage->hasColumn(*it))
			{
				columns.push_back(storage->getColumn(*it));
				unknown_required_columns.erase(it++);
			}
			else
				++it;
		}
	}
1950 1951
}

1952
void ExpressionAnalyzer::collectJoinedColumns(NameSet & joined_columns, NamesAndTypesList & joined_columns_name_type)
1953 1954 1955 1956
{
	if (!select_query || !select_query->join)
		return;

1957
	auto & node = typeid_cast<ASTJoin &>(*select_query->join);
1958

1959 1960 1961 1962 1963 1964 1965 1966
	Block nested_result_sample;
	if (const auto identifier = typeid_cast<const ASTIdentifier *>(node.table.get()))
	{
		const auto & table = context.getTable("", identifier->name);
		nested_result_sample = table->getSampleBlockNonMaterialized();
	}
	else if (typeid_cast<const ASTSubquery *>(node.table.get()))
	{
1967
		const auto & subquery = node.table->children.at(0);
1968
		nested_result_sample = InterpreterSelectQuery::getSampleBlock(subquery, context);
1969
	}
1970

1971 1972
	auto & keys = typeid_cast<ASTExpressionList &>(*node.using_expr_list);
	for (const auto & key : keys.children)
1973
	{
1974
		if (!join_key_names_left_set.insert(key->getColumnName()).second)
1975 1976
			throw Exception("Duplicate column in USING list", ErrorCodes::DUPLICATE_COLUMN);

1977
		if (!join_key_names_right_set.insert(key->getAliasOrColumnName()).second)
1978 1979 1980
			throw Exception("Duplicate column in USING list", ErrorCodes::DUPLICATE_COLUMN);
	}

1981
	for (const auto i : ext::range(0, nested_result_sample.columns()))
1982
	{
1983
		const auto & col = nested_result_sample.getByPosition(i);
1984
		if (!join_key_names_right_set.count(col.name))
1985
		{
1986 1987
			joined_columns.insert(col.name);
			joined_columns_name_type.emplace_back(col.name, col.type);
1988
		}
1989
	}
1990

1991
/*	for (const auto & name : join_key_names_left_set)
1992 1993 1994
		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;
1995 1996 1997
	std::cerr << std::endl;
	for (const auto & name : joined_columns)
		std::cerr << "JOINed column: " << name << std::endl;
1998
	std::cerr << std::endl;*/
1999 2000
}

2001 2002
Names ExpressionAnalyzer::getRequiredColumns()
{
M
Merge  
Michael Kolupaev 已提交
2003 2004
	if (!unknown_required_columns.empty())
		throw Exception("Unknown identifier: " + *unknown_required_columns.begin(), ErrorCodes::UNKNOWN_IDENTIFIER);
2005

2006
	Names res;
2007
	for (const auto & column_name_type : columns)
2008
		res.push_back(column_name_type.name);
A
Alexey Milovidov 已提交
2009

2010 2011 2012
	return res;
}

2013 2014 2015
void ExpressionAnalyzer::getRequiredColumnsImpl(ASTPtr ast,
	NameSet & required_columns, NameSet & ignored_names,
	const NameSet & available_joined_columns, NameSet & required_joined_columns)
2016
{
2017 2018 2019 2020 2021
	/** Найдём все идентификаторы в запросе.
	  * Будем искать их рекурсивно, обходя в глубину AST.
	  * При этом:
	  * - для лямбда функций не будем брать формальные параметры;
	  * - не опускаемся в подзапросы (там свои идентификаторы);
2022 2023
	  * - некоторое исключение для секции ARRAY JOIN (в ней идентификаторы немного другие);
	  * - идентификаторы, доступные из JOIN-а, кладём в required_joined_columns.
2024 2025
	  */

2026
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
2027
	{
2028 2029 2030
		if (node->kind == ASTIdentifier::Column
			&& !ignored_names.count(node->name)
			&& !ignored_names.count(DataTypeNested::extractNestedTableName(node->name)))
2031
		{
2032 2033 2034 2035
			if (!available_joined_columns.count(node->name))
				required_columns.insert(node->name);
			else
				required_joined_columns.insert(node->name);
2036
		}
A
Alexey Milovidov 已提交
2037

2038 2039
		return;
	}
2040

2041
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
2042 2043 2044 2045 2046
	{
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
		{
			if (node->arguments->children.size() != 2)
				throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
2047

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

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

2053
			/// Не нужно добавлять формальные параметры лямбда-выражения в required_columns.
2054
			Names added_ignored;
2055
			for (auto & child : lambda_args_tuple->arguments->children)
2056
			{
2057
				ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*child);
2058 2059
				if (!identifier)
					throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
2060 2061

				String & name = identifier->name;
2062 2063 2064 2065 2066 2067
				if (!ignored_names.count(name))
				{
					ignored_names.insert(name);
					added_ignored.push_back(name);
				}
			}
2068

2069
			getRequiredColumnsImpl(node->arguments->children.at(1),
2070 2071
				required_columns, ignored_names,
				available_joined_columns, required_joined_columns);
2072

2073 2074
			for (size_t i = 0; i < added_ignored.size(); ++i)
				ignored_names.erase(added_ignored[i]);
2075

2076 2077 2078
			return;
		}
	}
2079

2080
	ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast);
2081

2082 2083
	/// Рекурсивный обход выражения.
	for (auto & child : ast->children)
2084
	{
2085
		/** Не пойдем в секцию ARRAY JOIN, потому что там нужно смотреть на имена не-ARRAY-JOIN-енных столбцов.
2086
		  * Туда collectUsedColumns отправит нас отдельно.
2087
		  */
2088
		if (!typeid_cast<ASTSubquery *>(&*child) && !typeid_cast<ASTSelectQuery *>(&*child) &&
2089
			!(select && child == select->array_join_expression_list))
2090
			getRequiredColumnsImpl(child, required_columns, ignored_names, available_joined_columns, required_joined_columns);
2091
    }
2092 2093
}

2094
}