ExpressionAnalyzer.cpp 69.3 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
#include <DB/Columns/ColumnSet.h>
#include <DB/Columns/ColumnExpression.h>

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

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

31
#include <DB/DataStreams/LazyBlockInputStream.h>
32 33
#include <DB/DataStreams/copyData.h>

34 35
#include <DB/Common/typeid_cast.h>

36
#include <DB/Parsers/formatAST.h>
37

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

40 41
#include <statdaemons/ext/range.hpp>

42 43 44 45 46

namespace DB
{


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

69 70
void ExpressionAnalyzer::init()
{
71
	select_query = typeid_cast<ASTSelectQuery *>(&*ast);
72

73 74 75 76 77 78 79
	{
		std::ostringstream os;
		ast->dumpTree(os);
		LOG_DEBUG(&Logger::get("ExpressionAnalyzer"), "Before: " << os.str());
		LOG_DEBUG(&Logger::get("ExpressionAnalyzer"), "######################################");
	}

80
	LogicalExpressionsOptimizer logical_expressions_optimizer(select_query);
81
	logical_expressions_optimizer.optimizeDisjunctiveEqualityChains();
82

83 84 85 86 87 88
	{
		std::ostringstream os;
		ast->dumpTree(os);
		LOG_DEBUG(&Logger::get("ExpressionAnalyzer"), "After: " << os.str());
	}

89 90
	addStorageAliases();

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

94
	/// Common subexpression elimination. Rewrite rules.
95
	normalizeTree();
96

A
Alexey Milovidov 已提交
97
	/// GROUP BY injective function elimination.
98
	optimizeGroupBy();
99

100
	/// array_join_alias_to_name, array_join_result_to_source.
101
	getArrayJoinedColumns();
102

103 104 105 106 107
	/// Удалить ненужное из списка columns. Создать unknown_required_columns. Сформировать columns_added_by_join.
	collectUsedColumns();

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

109
	/// external_tables, subqueries_for_sets для глобальных подзапросов.
110 111
	/// Заменяет глобальные подзапросы на сгенерированные имена временных таблиц, которые будут отправлены на удалённые серверы.
	initGlobalSubqueriesAndExternalTables();
112 113 114 115 116 117 118 119 120 121 122
}


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

124 125
	if (select_query && (select_query->group_expression_list || select_query->having_expression))
		has_aggregation = true;
126

127
	ExpressionActionsPtr temp_actions = new ExpressionActions(columns, settings);
128 129 130

	if (select_query && select_query->array_join_expression_list)
	{
131
		getRootActions(select_query->array_join_expression_list, true, false, temp_actions);
132
		addMultipleArrayJoinAction(temp_actions);
133
	}
134

135 136
	if (select_query && select_query->join)
	{
137
		getRootActions(typeid_cast<ASTJoin &>(*select_query->join).using_expr_list, true, false, temp_actions);
138
		addJoinAction(temp_actions, true);
139 140
	}

141
	getAggregates(ast, temp_actions);
142

143 144
	if (has_aggregation)
	{
145
		assertSelect();
146

147 148 149
		/// Найдем ключи агрегации.
		if (select_query->group_expression_list)
		{
150
			NameSet unique_keys;
151
			auto & group_asts = select_query->group_expression_list->children;
152 153
			for (size_t i = 0; i < group_asts.size(); ++i)
			{
154
				getRootActions(group_asts[i], true, false, temp_actions);
155

156 157
				const auto & column_name = group_asts[i]->getColumnName();
				const auto & block = temp_actions->getSampleBlock();
158

159 160 161 162 163
				if (!block.has(column_name))
					throw Exception("Unknown identifier (in GROUP BY): " + column_name, ErrorCodes::UNKNOWN_IDENTIFIER);

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

164 165 166 167 168 169 170 171
				/// 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;
172

173 174 175
					continue;
				}

176
				NameAndTypePair key{column_name, col.type};
177
				aggregation_keys.push_back(key);
178

179
				if (!unique_keys.count(key.name))
180
				{
181
					unique_keys.insert(key.name);
182 183
					/// key is no longer needed, therefore we can save a little by moving it
					aggregated_columns.push_back(std::move(key));
184
				}
185
			}
186 187 188 189 190 191

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

194 195 196
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
		{
			AggregateDescription & desc = aggregate_descriptions[i];
197
			aggregated_columns.emplace_back(desc.column_name, desc.function->getReturnType());
198 199 200 201
		}
	}
	else
	{
202
		aggregated_columns = temp_actions->getSampleBlock().getColumnsList();
203 204 205 206
	}
}


207 208 209 210 211 212 213 214 215 216 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
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 已提交
257
NamesAndTypesList::iterator ExpressionAnalyzer::findColumn(const String & name, NamesAndTypesList & cols)
258
{
A
Alexey Milovidov 已提交
259
	return std::find_if(cols.begin(), cols.end(),
260
		[&](const NamesAndTypesList::value_type & val) { return val.name == name; });
261 262 263
}


264 265 266 267 268 269 270 271 272 273
void ExpressionAnalyzer::addStorageAliases()
{
	if (!storage)
		return;

	for (const auto & alias : storage->alias_columns)
		aliases[alias.name] = storage->column_defaults[alias.name].expression;
}


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

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

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

290
		if (!typeid_cast<ASTSelectQuery *>(&*child))
291
			addASTAliases(child, new_ignore_levels);
292 293 294 295 296
	}

	if (ignore_levels > 0)
		return;

A
Alexey Milovidov 已提交
297 298
	String alias = ast->tryGetAlias();
	if (!alias.empty())
299
	{
A
Alexey Milovidov 已提交
300 301
		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 已提交
302

A
Alexey Milovidov 已提交
303
		aliases[alias] = ast;
304 305 306 307 308 309
	}
}


StoragePtr ExpressionAnalyzer::getTable()
{
310
	if (const ASTSelectQuery * select = typeid_cast<const ASTSelectQuery *>(&*ast))
311
	{
312
		if (select->table && !typeid_cast<const ASTSelectQuery *>(&*select->table) && !typeid_cast<const ASTFunction *>(&*select->table))
313
		{
A
Alexey Milovidov 已提交
314
			String database = select->database
315
				? typeid_cast<const ASTIdentifier &>(*select->database).name
A
Alexey Milovidov 已提交
316
				: "";
317
			const String & table = typeid_cast<const ASTIdentifier &>(*select->table).name;
318 319 320
			return context.tryGetTable(database, table);
		}
	}
A
Alexey Milovidov 已提交
321

322 323 324 325 326 327 328 329
	return StoragePtr();
}


void ExpressionAnalyzer::normalizeTree()
{
	SetOfASTs tmp_set;
	MapOfASTs tmp_map;
330
	normalizeTreeImpl(ast, tmp_map, tmp_set, "");
331 332 333 334 335
}


/// finished_asts - уже обработанные вершины (и на что они заменены)
/// current_asts - вершины в текущем стеке вызовов этого метода
336
/// current_alias - алиас, повешенный на предка ast (самого глубокого из предков с алиасами)
337
void ExpressionAnalyzer::normalizeTreeImpl(ASTPtr & ast, MapOfASTs & finished_asts, SetOfASTs & current_asts, std::string current_alias)
338 339 340 341 342 343
{
	if (finished_asts.count(ast))
	{
		ast = finished_asts[ast];
		return;
	}
344

345 346
	ASTPtr initial_ast = ast;
	current_asts.insert(initial_ast);
347

A
Alexey Milovidov 已提交
348 349 350
	String my_alias = ast->tryGetAlias();
	if (!my_alias.empty())
		current_alias = my_alias;
351

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

355
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
356 357
	{
		/** Нет ли в таблице столбца, название которого полностью совпадает с записью функции?
A
Alexey Milovidov 已提交
358 359
		  * Например, в таблице есть столбец "domain(URL)", и мы запросили domain(URL).
		  */
360 361 362 363
		String function_string = node->getColumnName();
		NamesAndTypesList::const_iterator it = findColumn(function_string);
		if (columns.end() != it)
		{
364
			ASTIdentifier * ast_id = new ASTIdentifier(node->range, function_string);
365 366
			ast = ast_id;
			current_asts.insert(ast);
367
			replaced = true;
368
		}
369 370

		/// может быть указано IN t, где t - таблица, что равносильно IN (SELECT * FROM t).
371
		if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
372
			if (ASTIdentifier * right = typeid_cast<ASTIdentifier *>(&*node->arguments->children.at(1)))
373
				right->kind = ASTIdentifier::Table;
374
	}
375
	else if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
376
	{
377
		if (node->kind == ASTIdentifier::Column)
378
		{
M
Merge  
Michael Kolupaev 已提交
379
			/// Если это алиас, но не родительский алиас (чтобы работали конструкции вроде "SELECT column+1 AS column").
380
			Aliases::const_iterator jt = aliases.find(node->name);
M
Merge  
Michael Kolupaev 已提交
381
			if (jt != aliases.end() && current_alias != node->name)
382
			{
383
				/// Заменим его на соответствующий узел дерева.
384 385
				if (current_asts.count(jt->second))
					throw Exception("Cyclic aliases", ErrorCodes::CYCLIC_ALIASES);
A
Alexey Milovidov 已提交
386
				if (!my_alias.empty() && my_alias != jt->second->getAliasOrColumnName())
387 388 389
				{
					/// В конструкции вроде "a AS b", где a - алиас, нужно перевесить алиас b на результат подстановки алиаса a.
					ast = jt->second->clone();
A
Alexey Milovidov 已提交
390
					ast->setAlias(my_alias);
391 392 393 394 395 396 397
				}
				else
				{
					ast = jt->second;
				}

				replaced = true;
398 399 400
			}
		}
	}
401
	else if (ASTExpressionList * node = typeid_cast<ASTExpressionList *>(&*ast))
402 403 404 405 406
	{
		/// Заменим * на список столбцов.
		ASTs & asts = node->children;
		for (int i = static_cast<int>(asts.size()) - 1; i >= 0; --i)
		{
407
			if (ASTAsterisk * asterisk = typeid_cast<ASTAsterisk *>(&*asts[i]))
408 409
			{
				ASTs all_columns;
A
Alexey Milovidov 已提交
410
				for (const auto & column_name_type : columns)
411
					all_columns.emplace_back(new ASTIdentifier(asterisk->range, column_name_type.name));
A
Alexey Milovidov 已提交
412

413 414 415 416 417
				asts.erase(asts.begin() + i);
				asts.insert(asts.begin() + i, all_columns.begin(), all_columns.end());
			}
		}
	}
418 419 420 421 422 423
	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;
	}
424

425 426 427
	/// Если заменили корень поддерева вызовемся для нового корня снова - на случай, если алиас заменился на алиас.
	if (replaced)
	{
428
		normalizeTreeImpl(ast, finished_asts, current_asts, current_alias);
429 430 431 432 433 434
		current_asts.erase(initial_ast);
		current_asts.erase(ast);
		finished_asts[initial_ast] = ast;
		return;
	}

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

437 438 439
	for (auto & child : ast->children)
		if (!typeid_cast<ASTSelectQuery *>(&*child))
			normalizeTreeImpl(child, finished_asts, current_asts, current_alias);
440

441
	/// Если секция WHERE или HAVING состоит из одного алиаса, ссылку нужно заменить не только в children, но и в where_expression и having_expression.
442
	if (ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast))
443
	{
444
		if (select->prewhere_expression)
445
			normalizeTreeImpl(select->prewhere_expression, finished_asts, current_asts, current_alias);
446
		if (select->where_expression)
447
			normalizeTreeImpl(select->where_expression, finished_asts, current_asts, current_alias);
448
		if (select->having_expression)
449
			normalizeTreeImpl(select->having_expression, finished_asts, current_asts, current_alias);
450
	}
451

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

454
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
455
	{
456 457 458 459
		if (node->kind == ASTFunction::TABLE_FUNCTION)
		{
		}
		else if (node->name == "lambda")
460
		{
461
			node->kind = ASTFunction::LAMBDA_EXPRESSION;
462 463 464
		}
		else if (context.getAggregateFunctionFactory().isAggregateFunctionName(node->name))
		{
465
			node->kind = ASTFunction::AGGREGATE_FUNCTION;
466
		}
467 468 469 470 471 472 473 474
		else if (node->name == "arrayJoin")
		{
			node->kind = ASTFunction::ARRAY_JOIN;
		}
		else
		{
			node->kind = ASTFunction::FUNCTION;
		}
475
	}
476

477 478 479 480 481
	current_asts.erase(initial_ast);
	current_asts.erase(ast);
	finished_asts[initial_ast] = ast;
}

482
void ExpressionAnalyzer::optimizeGroupBy()
483 484 485 486
{
	if (!(select_query && select_query->group_expression_list))
		return;

487 488 489
	const auto is_literal = [] (const ASTPtr& ast) {
		return typeid_cast<const ASTLiteral*>(ast.get());
	};
490

491
	auto & group_exprs = select_query->group_expression_list->children;
492

493
	/// removes expression at index idx by making it last one and calling .pop_back()
A
Alexey Milovidov 已提交
494 495
	const auto remove_expr_at_index = [&group_exprs] (const size_t idx)
	{
496
		if (idx < group_exprs.size() - 1)
A
Merge  
Andrey Mironov 已提交
497
			std::swap(group_exprs[idx], group_exprs.back());
498

499 500
		group_exprs.pop_back();
	};
501

A
Andrey Mironov 已提交
502
	/// iterate over each GROUP BY expression, eliminate injective function calls and literals
503
	for (size_t i = 0; i < group_exprs.size();)
504 505 506 507
	{
		if (const auto function = typeid_cast<ASTFunction*>(group_exprs[i].get()))
		{
			/// assert function is injective
A
Alexey Milovidov 已提交
508
			if (!injective_function_names.count(function->name))
509 510
			{
				++i;
511
				continue;
512
			}
513 514 515 516 517 518 519 520 521 522 523 524 525 526 527

			/// 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
			);
		}
528 529 530
		else if (is_literal(group_exprs[i]))
		{
			remove_expr_at_index(i);
531 532 533 534 535
		}
		else
		{
			/// if neither a function nor literal - advance to next expression
			++i;
536
		}
537
	}
538 539 540

	if (group_exprs.empty())
		select_query->group_expression_list = nullptr;
541 542 543
}


544
void ExpressionAnalyzer::makeSetsForIndex()
P
Pavel Kartavyy 已提交
545
{
546
	if (storage && ast && storage->supportsIndexForIn())
A
Alexey Milovidov 已提交
547
		makeSetsForIndexImpl(ast, storage->getSampleBlock());
P
Pavel Kartavyy 已提交
548 549
}

A
Alexey Milovidov 已提交
550
void ExpressionAnalyzer::makeSetsForIndexImpl(ASTPtr & node, const Block & sample_block)
P
Pavel Kartavyy 已提交
551 552
{
	for (auto & child : node->children)
A
Alexey Milovidov 已提交
553
		makeSetsForIndexImpl(child, sample_block);
P
Pavel Kartavyy 已提交
554

555
	ASTFunction * func = typeid_cast<ASTFunction *>(node.get());
P
Pavel Kartavyy 已提交
556 557 558
	if (func && func->kind == ASTFunction::FUNCTION && (func->name == "in" || func->name == "notIn"))
	{
		IAST & args = *func->arguments;
559
		ASTPtr & arg = args.children.at(1);
P
Pavel Kartavyy 已提交
560

561
		if (!typeid_cast<ASTSet *>(&*arg) && !typeid_cast<ASTSubquery *>(&*arg) && !typeid_cast<ASTIdentifier *>(&*arg))
562 563 564
		{
			try
			{
565
				makeExplicitSet(func, sample_block, true);
566 567 568 569 570 571 572 573
			}
			catch (const DB::Exception & e)
			{
				/// в sample_block нет колонок, которые добаляет getActions
				if (e.code() != ErrorCodes::NOT_FOUND_COLUMN_IN_BLOCK)
					throw;
			}
		}
P
Pavel Kartavyy 已提交
574 575
	}
}
576

577

578 579
static SharedPtr<InterpreterSelectQuery> interpretSubquery(
	ASTPtr & subquery_or_table_name, const Context & context, size_t subquery_depth, const Names & required_columns = Names())
580
{
581 582 583
	/// Подзапрос или имя таблицы. Имя таблицы аналогично подзапросу 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);
584

585 586
	if (!subquery && !table)
		throw Exception("IN/JOIN supports only SELECT subqueries.", ErrorCodes::BAD_ARGUMENTS);
587

588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604
	/** Для подзапроса в секции 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)
	{
605 606 607
		/// create ASTSelectQuery for "SELECT * FROM table" as if written by hand
		const auto select_query = new ASTSelectQuery;
		query = select_query;
608

609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
		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);
626 627
	}
	else
628 629
		query = subquery->children.at(0);

630 631 632 633 634 635
	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);
}

636

637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652
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;
		}
	}

653
	SharedPtr<InterpreterSelectQuery> interpreter = interpretSubquery(subquery_or_table_name, context, subquery_depth + 1);
654 655

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

658
	String external_table_name = "_data" + toString(external_table_id);
659

660 661 662 663 664 665 666 667 668
	/** Заменяем подзапрос на имя временной таблицы.
	  * Именно в таком виде, запрос отправится на удалённый сервер.
	  * На удалённый сервер отправится эта временная таблица, и на его стороне,
	  *  вместо выполнения подзапроса, надо будет просто из неё прочитать.
	  */
	subquery_or_table_name = new ASTIdentifier(StringRange(), external_table_name, ASTIdentifier::Table);

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

669
	external_tables[external_table_name] = external_storage;
670
	subqueries_for_sets[external_table_name].source = interpreter->execute();
671
	subqueries_for_sets[external_table_name].table = external_storage;
672 673 674 675 676 677

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


681
void ExpressionAnalyzer::makeSet(ASTFunction * node, const Block & sample_block)
682
{
683
	/** Нужно преобразовать правый аргумент в множество.
684
	  * Это может быть имя таблицы, значение, перечисление значений или подзапрос.
685 686 687
	  * Перечисление значений парсится как функция tuple.
	  */
	IAST & args = *node->arguments;
688
	ASTPtr & arg = args.children.at(1);
689

690
	/// Уже преобразовали.
691
	if (typeid_cast<ASTSet *>(&*arg))
692
		return;
693

694
	/// Если подзапрос или имя таблицы для SELECT.
695 696
	ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*arg);
	if (typeid_cast<ASTSubquery *>(&*arg) || identifier)
697
	{
698 699 700
		/// Получаем поток блоков для подзапроса. Создаём Set и кладём на место подзапроса.
		String set_id = arg->getColumnName();
		ASTSet * ast_set = new ASTSet(set_id);
701
		ASTPtr ast_set_ptr = ast_set;
702

703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722
		/// Особый случай - если справа оператора 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;
				}
			}
		}

723
		SubqueryForSet & subquery_for_set = subqueries_for_sets[set_id];
724

725
		/// Если уже создали Set с таким же подзапросом/таблицей.
726
		if (subquery_for_set.set)
727
		{
728 729 730
			ast_set->set = subquery_for_set.set;
			arg = ast_set_ptr;
			return;
731
		}
732

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

735 736 737 738 739 740
		/** Для GLOBAL IN-ов происходит следующее:
		  * - в функции addExternalStorage подзапрос IN (SELECT ...) заменяется на IN _data1,
		  *   в объекте subquery_for_set выставляется этот подзапрос в качестве source и временная таблица _data1 в качестве table.
		  * - в этой функции видно выражение IN _data1.
		  */
		if (!subquery_for_set.source)
741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771
		{
			auto interpreter = interpretSubquery(arg, context, subquery_depth);
			subquery_for_set.source = new LazyBlockInputStream([interpreter]() mutable { return interpreter->execute(); });

			/** Зачем используется 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), на котором нужная таблица будет заполнена.
			  *
			  * Замечание: это решение не очень хорошее, надо подумать лучше.
			  */
		}
772

773
		subquery_for_set.set = ast_set->set;
774
		arg = ast_set_ptr;
775
	}
776
	else
777
	{
A
Alexey Milovidov 已提交
778
		/// Явное перечисление значений в скобках.
P
Pavel Kartavyy 已提交
779
		makeExplicitSet(node, sample_block, false);
P
Pavel Kartavyy 已提交
780 781 782 783
	}
}

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

789
		DataTypes set_element_types;
790
		ASTPtr & left_arg = args.children.at(0);
791

792
		ASTFunction * left_arg_tuple = typeid_cast<ASTFunction *>(&*left_arg);
793 794 795

		if (left_arg_tuple && left_arg_tuple->name == "tuple")
		{
796 797 798 799 800 801 802 803 804 805
			for (const auto & arg : left_arg_tuple->arguments->children)
			{
				const auto & data_type = sample_block.getByName(arg->getColumnName()).type;

				/// @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);

				set_element_types.push_back(data_type);
			}
806 807 808
		}
		else
		{
809
			DataTypePtr left_type = sample_block.getByName(left_arg->getColumnName()).type;
810
			if (DataTypeArray * array_type = typeid_cast<DataTypeArray *>(&*left_type))
811 812 813 814
				set_element_types.push_back(array_type->getNestedType());
			else
				set_element_types.push_back(left_type);
		}
815

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

820
		if (ASTFunction * set_func = typeid_cast<ASTFunction *>(&*arg))
821 822 823 824
		{
			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);
825

826
			/// Отличм случай (x, y) in ((1, 2), (3, 4)) от случая (x, y) in (1, 2).
827
			ASTFunction * any_element = typeid_cast<ASTFunction *>(&*set_func->arguments->children.at(0));
828 829 830 831 832
			if (set_element_types.size() >= 2 && (!any_element || any_element->name != "tuple"))
				single_value = true;
			else
				elements_ast = set_func->arguments;
		}
833
		else if (typeid_cast<ASTLiteral *>(&*arg))
834 835 836 837 838 839 840 841
		{
			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);
		}
842

843 844 845 846 847 848
		if (single_value)
		{
			ASTPtr exp_list = new ASTExpressionList;
			exp_list->children.push_back(elements_ast);
			elements_ast = exp_list;
		}
849

850
		ASTSet * ast_set = new ASTSet(arg->getColumnName());
851
		ASTPtr ast_set_ptr = ast_set;
852
		ast_set->set = new Set(settings.limits);
853
		ast_set->is_explicit = true;
P
Pavel Kartavyy 已提交
854
		ast_set->set->createFromAST(set_element_types, elements_ast, create_ordered_set);
855
		arg = ast_set_ptr;
856 857 858
}


859
static String getUniqueName(const Block & block, const String & prefix)
860 861
{
	int i = 1;
862
	while (block.has(prefix + toString(i)))
863
		++i;
864
	return prefix + toString(i);
865 866 867
}


A
Alexey Milovidov 已提交
868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886
/** Для 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;

887
	ScopeStack(const ExpressionActionsPtr & actions, const Settings & settings_)
A
Alexey Milovidov 已提交
888 889
		: settings(settings_)
	{
890
		stack.emplace_back();
891
		stack.back().actions = actions;
892 893 894 895

		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 已提交
896 897 898 899
	}

	void pushLevel(const NamesAndTypesList & input_columns)
	{
900
		stack.emplace_back();
A
Alexey Milovidov 已提交
901 902 903 904 905 906 907
		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)
		{
908 909 910
			all_columns.emplace_back(nullptr, it->type, it->name);
			new_names.insert(it->name);
			stack.back().new_columns.insert(it->name);
A
Alexey Milovidov 已提交
911 912
		}

913 914
		const Block & prev_sample_block = prev.actions->getSampleBlock();
		for (size_t i = 0, size = prev_sample_block.columns(); i < size; ++i)
A
Alexey Milovidov 已提交
915
		{
916 917 918
			const ColumnWithNameAndType & col = prev_sample_block.unsafeGetByPosition(i);
			if (!new_names.count(col.name))
				all_columns.push_back(col);
A
Alexey Milovidov 已提交
919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968
		}

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


969
void ExpressionAnalyzer::getRootActions(ASTPtr ast, bool no_subqueries, bool only_consts, ExpressionActionsPtr & actions)
970 971
{
	ScopeStack scopes(actions, settings);
972
	getActionsImpl(ast, no_subqueries, only_consts, scopes);
973
	actions = scopes.popLevel();
974 975 976
}


977 978
void ExpressionAnalyzer::getArrayJoinedColumns()
{
979 980
	if (select_query && select_query->array_join_expression_list)
	{
981 982 983 984 985 986
		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 已提交
987
			String nested_table_alias = ast->getAliasOrColumnName();
988
			if (nested_table_alias == nested_table_name && !typeid_cast<ASTIdentifier *>(&*ast))
989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
				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);
		}
1004 1005 1006

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

1013
			/// Это массив.
1014
			if (!typeid_cast<ASTIdentifier *>(&*expr) || findColumn(source_name, columns) != columns.end())
1015
			{
1016
				array_join_result_to_source[result_name] = source_name;
1017 1018 1019 1020
			}
			else /// Это вложенная таблица.
			{
				bool found = false;
A
Alexey Milovidov 已提交
1021
				for (const auto & column_name_type : columns)
1022
				{
1023 1024
					String table_name = DataTypeNested::extractNestedTableName(column_name_type.name);
					String column_name = DataTypeNested::extractNestedColumnName(column_name_type.name);
1025 1026
					if (table_name == source_name)
					{
1027
						array_join_result_to_source[DataTypeNested::concatenateNestedName(result_name, column_name)] = column_name_type.name;
1028 1029 1030 1031
						found = true;
						break;
					}
				}
1032 1033
				if (!found)
					throw Exception("No columns in nested table " + source_name, ErrorCodes::EMPTY_NESTED_TABLE);
1034 1035
			}
		}
1036
	}
1037 1038 1039 1040
}


void ExpressionAnalyzer::getArrayJoinedColumnsImpl(ASTPtr ast)
1041
{
1042
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
1043
	{
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
		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);
			}
		}
1056 1057 1058
	}
	else
	{
1059 1060 1061
		for (auto & child : ast->children)
			if (!typeid_cast<ASTSelectQuery *>(&*child))
				getArrayJoinedColumnsImpl(child);
1062 1063 1064 1065 1066
	}
}


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

1073
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
1074 1075 1076 1077 1078
	{
		std::string name = node->getColumnName();
		if (!only_consts && !actions_stack.getSampleBlock().has(name))
		{
			/// Запрошенного столбца нет в блоке.
1079
			/// Если такой столбец есть в таблице, значит пользователь наверно забыл окружить его агрегатной функцией или добавить в GROUP BY.
1080 1081

			bool found = false;
A
Alexey Milovidov 已提交
1082
			for (const auto & column_name_type : columns)
1083
				if (column_name_type.name == name)
1084 1085 1086 1087
					found = true;

			if (found)
				throw Exception("Column " + name + " is not under aggregate function and not in GROUP BY.",
1088
					ErrorCodes::NOT_AN_AGGREGATE);
1089 1090
		}
	}
1091
	else if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
1092
	{
1093
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
1094
			throw Exception("Unexpected expression", ErrorCodes::UNEXPECTED_EXPRESSION);
1095

1096 1097 1098 1099
		if (node->kind == ASTFunction::ARRAY_JOIN)
		{
			if (node->arguments->children.size() != 1)
				throw Exception("arrayJoin requires exactly 1 argument", ErrorCodes::TYPE_MISMATCH);
1100
			ASTPtr arg = node->arguments->children.at(0);
1101
			getActionsImpl(arg, no_subqueries, only_consts, actions_stack);
1102
			if (!only_consts)
1103
			{
1104
				String result_name = node->getColumnName();
1105
				actions_stack.addAction(ExpressionAction::copyColumn(arg->getColumnName(), result_name));
1106 1107
				NameSet joined_columns;
				joined_columns.insert(result_name);
1108
				actions_stack.addAction(ExpressionAction::arrayJoin(joined_columns));
1109
			}
1110

1111 1112
			return;
		}
1113

1114
		if (node->kind == ASTFunction::FUNCTION)
1115
		{
1116
			if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
1117 1118 1119
			{
				if (!no_subqueries)
				{
1120
					/// Найдем тип первого аргумента (потом getActionsImpl вызовется для него снова и ни на что не повлияет).
1121
					getActionsImpl(node->arguments->children.at(0), no_subqueries, only_consts, actions_stack);
1122

1123
					/// Превратим tuple или подзапрос в множество.
1124
					makeSet(node, actions_stack.getSampleBlock());
1125 1126 1127
				}
				else
				{
1128 1129 1130 1131 1132 1133 1134
					if (!only_consts)
					{
						/// Мы в той части дерева, которую не собираемся вычислять. Нужно только определить типы.
						/// Не будем выполнять подзапросы и составлять множества. Вставим произвольный столбец правильного типа.
						ColumnWithNameAndType fake_column;
						fake_column.name = node->getColumnName();
						fake_column.type = new DataTypeUInt8;
1135
						actions_stack.addAction(ExpressionAction::addColumn(fake_column));
1136
						getActionsImpl(node->arguments->children.at(0), no_subqueries, only_consts, actions_stack);
1137
					}
1138 1139 1140
					return;
				}
			}
1141

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

1144 1145
			Names argument_names;
			DataTypes argument_types;
M
Merge  
Michael Kolupaev 已提交
1146
			bool arguments_present = true;
1147

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

1151
			for (auto & child : node->arguments->children)
1152
			{
1153 1154
				ASTFunction * lambda = typeid_cast<ASTFunction *>(&*child);
				ASTSet * set = typeid_cast<ASTSet *>(&*child);
1155 1156
				if (lambda && lambda->name == "lambda")
				{
M
Merge  
Michael Kolupaev 已提交
1157
					/// Если аргумент - лямбда-выражение, только запомним его примерный тип.
1158 1159
					if (lambda->arguments->children.size() != 2)
						throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
1160

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

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

1166
					has_lambda_arguments = true;
1167
					argument_types.emplace_back(new DataTypeExpression(DataTypes(lambda_args_tuple->arguments->children.size())));
1168
					/// Выберем название в следующем цикле.
1169
					argument_names.emplace_back();
1170
				}
1171 1172 1173 1174
				else if (set)
				{
					ColumnWithNameAndType column;
					column.type = new DataTypeSet;
1175

1176 1177
					/// Если аргумент - множество, заданное перечислением значений, дадим ему уникальное имя,
					///  чтобы множества с одинаковой записью не склеивались (у них может быть разный тип).
1178
					if (set->is_explicit)
1179 1180 1181 1182 1183 1184 1185 1186
						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);

1187
						actions_stack.addAction(ExpressionAction::addColumn(column));
1188
					}
1189

1190 1191 1192
					argument_types.push_back(column.type);
					argument_names.push_back(column.name);
				}
1193 1194
				else
				{
M
Merge  
Michael Kolupaev 已提交
1195
					/// Если аргумент не лямбда-выражение, вызовемся рекурсивно и узнаем его тип.
1196
					getActionsImpl(child, no_subqueries, only_consts, actions_stack);
1197
					std::string name = child->getColumnName();
1198
					if (actions_stack.getSampleBlock().has(name))
M
Merge  
Michael Kolupaev 已提交
1199
					{
1200
						argument_types.push_back(actions_stack.getSampleBlock().getByName(name).type);
M
Merge  
Michael Kolupaev 已提交
1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
						argument_names.push_back(name);
					}
					else
					{
						if (only_consts)
						{
							arguments_present = false;
						}
						else
						{
							throw Exception("Unknown identifier: " + name, ErrorCodes::UNKNOWN_IDENTIFIER);
						}
					}
1214 1215
				}
			}
1216

M
Merge  
Michael Kolupaev 已提交
1217 1218
			if (only_consts && !arguments_present)
				return;
1219

1220
			Names additional_requirements;
1221

1222 1223 1224
			if (has_lambda_arguments && !only_consts)
			{
				function->getLambdaArgumentTypes(argument_types);
1225

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

1231
					ASTFunction * lambda = typeid_cast<ASTFunction *>(&*child);
1232 1233
					if (lambda && lambda->name == "lambda")
					{
1234
						DataTypeExpression * lambda_type = typeid_cast<DataTypeExpression *>(&*argument_types[i]);
1235
						ASTFunction * lambda_args_tuple = typeid_cast<ASTFunction *>(&*lambda->arguments->children.at(0));
1236
						ASTs lambda_arg_asts = lambda_args_tuple->arguments->children;
1237
						NamesAndTypesList lambda_arguments;
1238

1239 1240
						for (size_t j = 0; j < lambda_arg_asts.size(); ++j)
						{
1241
							ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*lambda_arg_asts[j]);
1242 1243
							if (!identifier)
								throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1244

1245
							String arg_name = identifier->name;
1246

1247
							lambda_arguments.emplace_back(arg_name, lambda_type->getArgumentTypes()[j]);
1248
						}
1249

1250
						actions_stack.pushLevel(lambda_arguments);
1251
						getActionsImpl(lambda->arguments->children.at(1), no_subqueries, only_consts, actions_stack);
1252
						ExpressionActionsPtr lambda_actions = actions_stack.popLevel();
1253

1254
						String result_name = lambda->arguments->children.at(1)->getColumnName();
1255
						lambda_actions->finalize(Names(1, result_name));
1256
						DataTypePtr result_type = lambda_actions->getSampleBlock().getByName(result_name).type;
1257
						argument_types[i] = new DataTypeExpression(lambda_type->getArgumentTypes(), result_type);
1258

1259 1260 1261 1262
						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]);
1263

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

1268
						ColumnWithNameAndType lambda_column;
1269
						lambda_column.column = new ColumnExpression(1, lambda_actions, lambda_arguments, result_type, result_name);
1270 1271
						lambda_column.type = argument_types[i];
						lambda_column.name = argument_names[i];
1272
						actions_stack.addAction(ExpressionAction::addColumn(lambda_column));
1273 1274 1275
					}
				}
			}
1276

1277 1278 1279 1280
			if (only_consts)
			{
				for (size_t i = 0; i < argument_names.size(); ++i)
				{
1281
					if (!actions_stack.getSampleBlock().has(argument_names[i]))
1282
					{
M
Merge  
Michael Kolupaev 已提交
1283
						arguments_present = false;
1284 1285 1286 1287
						break;
					}
				}
			}
1288

M
Merge  
Michael Kolupaev 已提交
1289
			if (arguments_present)
1290
				actions_stack.addAction(ExpressionAction::applyFunction(function, argument_names, node->getColumnName()),
1291
										additional_requirements);
1292 1293
		}
	}
1294
	else if (ASTLiteral * node = typeid_cast<ASTLiteral *>(&*ast))
1295 1296 1297 1298 1299 1300
	{
		DataTypePtr type = apply_visitor(FieldToDataType(), node->value);
		ColumnWithNameAndType column;
		column.column = type->createConstColumn(1, node->value);
		column.type = type;
		column.name = node->getColumnName();
1301

1302
		actions_stack.addAction(ExpressionAction::addColumn(column));
1303 1304 1305
	}
	else
	{
1306 1307
		for (auto & child : ast->children)
			getActionsImpl(child, no_subqueries, only_consts, actions_stack);
1308 1309 1310 1311
	}
}


1312
void ExpressionAnalyzer::getAggregates(ASTPtr ast, ExpressionActionsPtr & actions)
1313
{
1314
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1315
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
1316
	{
1317
		has_aggregation = true;
1318 1319
		AggregateDescription aggregate;
		aggregate.column_name = node->getColumnName();
1320

1321 1322 1323
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
			if (aggregate_descriptions[i].column_name == aggregate.column_name)
				return;
1324

1325 1326 1327
		ASTs & arguments = node->arguments->children;
		aggregate.argument_names.resize(arguments.size());
		DataTypes types(arguments.size());
1328

1329 1330
		for (size_t i = 0; i < arguments.size(); ++i)
		{
1331
			getRootActions(arguments[i], true, false, actions);
1332
			const std::string & name = arguments[i]->getColumnName();
1333
			types[i] = actions->getSampleBlock().getByName(name).type;
1334 1335
			aggregate.argument_names[i] = name;
		}
1336

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

1339 1340
		if (node->parameters)
		{
1341
			ASTs & parameters = typeid_cast<ASTExpressionList &>(*node->parameters).children;
1342
			Array params_row(parameters.size());
1343

1344 1345
			for (size_t i = 0; i < parameters.size(); ++i)
			{
1346
				ASTLiteral * lit = typeid_cast<ASTLiteral *>(&*parameters[i]);
1347 1348
				if (!lit)
					throw Exception("Parameters to aggregate functions must be literals", ErrorCodes::PARAMETERS_TO_AGGREGATE_FUNCTIONS_MUST_BE_LITERALS);
1349

1350 1351
				params_row[i] = lit->value;
			}
1352

1353
			aggregate.parameters = params_row;
1354 1355
			aggregate.function->setParameters(params_row);
		}
1356

1357
		aggregate.function->setArguments(types);
1358

1359 1360 1361 1362 1363 1364
		aggregate_descriptions.push_back(aggregate);
	}
	else
	{
		for (size_t i = 0; i < ast->children.size(); ++i)
		{
1365
			ASTPtr child = ast->children[i];
1366
			if (!typeid_cast<ASTSubquery *>(&*child) && !typeid_cast<ASTSelectQuery *>(&*child))
1367
				getAggregates(child, actions);
1368 1369 1370 1371
		}
	}
}

1372 1373 1374 1375 1376
void ExpressionAnalyzer::assertSelect()
{
	if (!select_query)
		throw Exception("Not a select query", ErrorCodes::LOGICAL_ERROR);
}
1377

1378
void ExpressionAnalyzer::assertAggregation()
1379 1380 1381
{
	if (!has_aggregation)
		throw Exception("No aggregation", ErrorCodes::LOGICAL_ERROR);
1382
}
1383

1384 1385 1386 1387 1388
void ExpressionAnalyzer::initChain(ExpressionActionsChain & chain, NamesAndTypesList & columns)
{
	if (chain.steps.empty())
	{
		chain.settings = settings;
1389
		chain.steps.emplace_back(new ExpressionActions(columns, settings));
1390 1391
	}
}
1392

1393
void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actions)
1394
{
1395 1396
	NameSet result_columns;
	for (NameToNameMap::iterator it = array_join_result_to_source.begin(); it != array_join_result_to_source.end(); ++it)
1397
	{
1398
		if (it->first != it->second)
1399
			actions->add(ExpressionAction::copyColumn(it->second, it->first));
1400
		result_columns.insert(it->first);
1401 1402
	}

1403
	actions->add(ExpressionAction::arrayJoin(result_columns));
1404 1405
}

1406
bool ExpressionAnalyzer::appendArrayJoin(ExpressionActionsChain & chain, bool only_types)
1407 1408
{
	assertSelect();
1409 1410

	if (!select_query->array_join_expression_list)
1411
		return false;
1412

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

1416
	getRootActions(select_query->array_join_expression_list, only_types, false, step.actions);
1417

1418
	addMultipleArrayJoinAction(step.actions);
1419

1420 1421 1422
	return true;
}

1423
void ExpressionAnalyzer::addJoinAction(ExpressionActionsPtr & actions, bool only_types)
1424
{
1425 1426 1427 1428 1429 1430
	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));
1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442
}

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

	if (!select_query->join)
		return false;

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

1443
	ASTJoin & ast_join = typeid_cast<ASTJoin &>(*select_query->join);
1444
	getRootActions(ast_join.using_expr_list, only_types, false, step.actions);
1445

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

	SubqueryForSet & subquery_for_set = subqueries_for_sets[join_id];
1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472

	/// Особый случай - если справа 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;
			}
		}
	}

1473
	if (!subquery_for_set.join)
1474
	{
1475 1476 1477
		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);
1478

1479
		Names required_joined_columns(join_key_names_right.begin(), join_key_names_right.end());
1480
		for (const auto & name_type : columns_added_by_join)
1481
			required_joined_columns.push_back(name_type.name);
1482

1483 1484 1485 1486 1487 1488
		/** Для GLOBAL JOIN-ов происходит следующее:
		  * - в функции addExternalStorage подзапрос JOIN (SELECT ...) заменяется на JOIN _data1,
		  *   в объекте subquery_for_set выставляется этот подзапрос в качестве source и временная таблица _data1 в качестве table.
		  * - в этой функции видно выражение JOIN _data1.
		  */
		if (!subquery_for_set.source)
1489 1490 1491 1492
		{
			auto interpreter = interpretSubquery(ast_join.table, context, subquery_depth, required_joined_columns);
			subquery_for_set.source = new LazyBlockInputStream([interpreter]() mutable { return interpreter->execute(); });
		}
1493

1494
		subquery_for_set.join = join;
1495 1496
	}

1497
	addJoinAction(step.actions, false);
1498 1499 1500 1501

	return true;
}

1502
bool ExpressionAnalyzer::appendWhere(ExpressionActionsChain & chain, bool only_types)
1503 1504
{
	assertSelect();
1505

1506 1507
	if (!select_query->where_expression)
		return false;
1508

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

1512
	step.required_output.push_back(select_query->where_expression->getColumnName());
1513
	getRootActions(select_query->where_expression, only_types, false, step.actions);
1514

1515 1516 1517
	return true;
}

1518
bool ExpressionAnalyzer::appendGroupBy(ExpressionActionsChain & chain, bool only_types)
1519 1520
{
	assertAggregation();
1521

1522 1523
	if (!select_query->group_expression_list)
		return false;
1524

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

1528
	ASTs asts = select_query->group_expression_list->children;
1529 1530
	for (size_t i = 0; i < asts.size(); ++i)
	{
1531
		step.required_output.push_back(asts[i]->getColumnName());
1532
		getRootActions(asts[i], only_types, false, step.actions);
1533
	}
1534

1535 1536 1537
	return true;
}

1538
void ExpressionAnalyzer::appendAggregateFunctionsArguments(ExpressionActionsChain & chain, bool only_types)
1539 1540
{
	assertAggregation();
1541

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

1545 1546 1547 1548 1549 1550 1551
	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]);
		}
	}
1552

1553
	getActionsBeforeAggregation(select_query->select_expression_list, step.actions, only_types);
1554

1555
	if (select_query->having_expression)
1556
		getActionsBeforeAggregation(select_query->having_expression, step.actions, only_types);
1557

1558
	if (select_query->order_expression_list)
1559
		getActionsBeforeAggregation(select_query->order_expression_list, step.actions, only_types);
1560 1561
}

1562
bool ExpressionAnalyzer::appendHaving(ExpressionActionsChain & chain, bool only_types)
1563 1564
{
	assertAggregation();
1565

1566 1567
	if (!select_query->having_expression)
		return false;
1568

1569 1570
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1571

1572
	step.required_output.push_back(select_query->having_expression->getColumnName());
1573
	getRootActions(select_query->having_expression, only_types, false, step.actions);
1574

1575
	return true;
1576 1577
}

1578
void ExpressionAnalyzer::appendSelect(ExpressionActionsChain & chain, bool only_types)
1579 1580
{
	assertSelect();
1581

1582 1583
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1584

1585
	getRootActions(select_query->select_expression_list, only_types, false, step.actions);
1586

1587 1588 1589 1590 1591
	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());
	}
1592
}
1593

1594
bool ExpressionAnalyzer::appendOrderBy(ExpressionActionsChain & chain, bool only_types)
1595
{
1596
	assertSelect();
1597

1598 1599
	if (!select_query->order_expression_list)
		return false;
1600

1601 1602
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1603

1604
	getRootActions(select_query->order_expression_list, only_types, false, step.actions);
1605

1606 1607 1608
	ASTs asts = select_query->order_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
1609
		ASTOrderByElement * ast = typeid_cast<ASTOrderByElement *>(&*asts[i]);
1610 1611
		if (!ast || ast->children.size() != 1)
			throw Exception("Bad order expression AST", ErrorCodes::UNKNOWN_TYPE_OF_AST_NODE);
1612
		ASTPtr order_expression = ast->children.at(0);
1613 1614
		step.required_output.push_back(order_expression->getColumnName());
	}
1615

1616 1617 1618
	return true;
}

1619
void ExpressionAnalyzer::appendProjectResult(DB::ExpressionActionsChain & chain, bool only_types)
1620 1621
{
	assertSelect();
1622

1623 1624
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1625

1626
	NamesWithAliases result_columns;
1627

1628 1629
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
1630
	{
1631
		result_columns.emplace_back(asts[i]->getColumnName(), asts[i]->getAliasOrColumnName());
1632
		step.required_output.push_back(result_columns.back().second);
1633
	}
1634

1635
	step.actions->add(ExpressionAction::project(result_columns));
1636 1637 1638
}


1639 1640 1641
Block ExpressionAnalyzer::getSelectSampleBlock()
{
	assertSelect();
1642

1643
	ExpressionActionsPtr temp_actions = new ExpressionActions(aggregated_columns, settings);
1644
	NamesWithAliases result_columns;
1645

1646 1647 1648
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
1649
		result_columns.emplace_back(asts[i]->getColumnName(), asts[i]->getAliasOrColumnName());
1650
		getRootActions(asts[i], true, false, temp_actions);
1651
	}
1652

1653
	temp_actions->add(ExpressionAction::project(result_columns));
1654

1655
	return temp_actions->getSampleBlock();
1656 1657
}

1658
void ExpressionAnalyzer::getActionsBeforeAggregation(ASTPtr ast, ExpressionActionsPtr & actions, bool no_subqueries)
1659
{
1660
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1661

1662 1663 1664
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
		for (auto & argument : node->arguments->children)
			getRootActions(argument, no_subqueries, false, actions);
1665
	else
1666 1667
		for (auto & child : ast->children)
			getActionsBeforeAggregation(child, actions, no_subqueries);
1668 1669 1670
}


M
Merge  
Michael Kolupaev 已提交
1671
ExpressionActionsPtr ExpressionAnalyzer::getActions(bool project_result)
1672
{
1673
	ExpressionActionsPtr actions = new ExpressionActions(columns, settings);
1674
	NamesWithAliases result_columns;
1675
	Names result_names;
1676

1677
	ASTs asts;
1678

1679
	if (ASTExpressionList * node = typeid_cast<ASTExpressionList *>(&*ast))
1680
		asts = node->children;
1681
	else
1682
		asts = ASTs(1, ast);
1683

1684
	for (size_t i = 0; i < asts.size(); ++i)
1685
	{
1686 1687 1688
		std::string name = asts[i]->getColumnName();
		std::string alias;
		if (project_result)
A
Alexey Milovidov 已提交
1689
			alias = asts[i]->getAliasOrColumnName();
1690 1691
		else
			alias = name;
1692
		result_columns.emplace_back(name, alias);
1693
		result_names.push_back(alias);
1694
		getRootActions(asts[i], false, false, actions);
1695
	}
1696

M
Merge  
Michael Kolupaev 已提交
1697 1698
	if (project_result)
	{
1699
		actions->add(ExpressionAction::project(result_columns));
M
Merge  
Michael Kolupaev 已提交
1700
	}
M
Merge  
Michael Kolupaev 已提交
1701 1702 1703
	else
	{
		/// Не будем удалять исходные столбцы.
A
Alexey Milovidov 已提交
1704
		for (const auto & column_name_type : columns)
1705
			result_names.push_back(column_name_type.name);
M
Merge  
Michael Kolupaev 已提交
1706
	}
1707

1708
	actions->finalize(result_names);
1709

1710 1711 1712 1713 1714 1715
	return actions;
}


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

1718
	getRootActions(ast, true, true, actions);
1719

1720 1721 1722 1723 1724 1725
	return actions;
}

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

1730
void ExpressionAnalyzer::collectUsedColumns()
1731
{
A
Alexey Milovidov 已提交
1732 1733 1734 1735 1736 1737 1738
	/** Вычислим, какие столбцы требуются для выполнения выражения.
	  * Затем, удалим все остальные столбцы из списка доступных столбцов.
	  * После выполнения, columns будет содержать только список столбцов, нужных для чтения из таблицы.
	  */

	NameSet required;
	NameSet ignored;
1739

1740 1741 1742 1743 1744 1745
	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.
1746
			/// Их потом добавим отдельно.
1747
			if (typeid_cast<ASTIdentifier *>(&*expressions[i]))
1748
			{
1749
				ignored.insert(expressions[i]->getColumnName());
1750 1751 1752 1753
			}
			else
			{
				/// Для выражений в ARRAY JOIN ничего игнорировать не нужно.
A
Alexey Milovidov 已提交
1754
				NameSet empty;
1755
				getRequiredColumnsImpl(expressions[i], required, empty, empty, empty);
1756
			}
1757

A
Alexey Milovidov 已提交
1758
			ignored.insert(expressions[i]->getAliasOrColumnName());
1759 1760
		}
	}
1761

1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772
	/** Также нужно не учитывать идентификаторы столбцов, получающихся путём 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();)
	{
1773
		if (required_joined_columns.count(it->name))
1774 1775 1776 1777 1778
			++it;
		else
			columns_added_by_join.erase(it++);
	}

1779
/*	for (const auto & name_type : columns_added_by_join)
1780
		std::cerr << "JOINed column (required, not key): " << name_type.first << std::endl;
1781
	std::cerr << std::endl;*/
1782

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

	for (const auto & column_name_type : columns)
1789 1790
		if (array_join_sources.count(column_name_type.name))
			required.insert(column_name_type.name);
1791

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

1796
	unknown_required_columns = required;
1797

1798 1799
	for (NamesAndTypesList::iterator it = columns.begin(); it != columns.end();)
	{
1800
		unknown_required_columns.erase(it->name);
1801

1802
		if (!required.count(it->name))
1803
		{
1804
			required.erase(it->name);
A
Alexey Milovidov 已提交
1805
			columns.erase(it++);
1806
		}
A
Alexey Milovidov 已提交
1807 1808
		else
			++it;
1809
	}
S
Merge  
Sergey Fedorov 已提交
1810

1811
	for (NamesAndTypesList::iterator it = columns.begin(); it != columns.end();)
S
Merge  
Sergey Fedorov 已提交
1812
	{
1813 1814 1815
		unknown_required_columns.erase(it->name);

		if (!required.count(it->name))
S
Merge  
Sergey Fedorov 已提交
1816
		{
1817 1818
			required.erase(it->name);
			columns.erase(it++);
A
Alexey Milovidov 已提交
1819 1820
		}
		else
S
Merge  
Sergey Fedorov 已提交
1821
			++it;
S
Merge  
Sergey Fedorov 已提交
1822
	}
1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838

	/// Возможно, среди неизвестных столбцов есть виртуальные. Удаляем их из списка неизвестных и добавляем
	/// в 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;
		}
	}
1839 1840
}

1841
void ExpressionAnalyzer::collectJoinedColumns(NameSet & joined_columns, NamesAndTypesList & joined_columns_name_type)
1842 1843 1844 1845
{
	if (!select_query || !select_query->join)
		return;

1846
	auto & node = typeid_cast<ASTJoin &>(*select_query->join);
1847

1848 1849 1850 1851 1852 1853 1854 1855
	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()))
	{
1856 1857
		const auto & subquery = node.table->children.at(0);
		nested_result_sample = InterpreterSelectQuery(subquery, context, QueryProcessingStage::Complete, subquery_depth + 1).getSampleBlock();
1858
	}
1859

1860 1861
	auto & keys = typeid_cast<ASTExpressionList &>(*node.using_expr_list);
	for (const auto & key : keys.children)
1862
	{
1863
		if (!join_key_names_left_set.insert(key->getColumnName()).second)
1864 1865
			throw Exception("Duplicate column in USING list", ErrorCodes::DUPLICATE_COLUMN);

1866
		if (!join_key_names_right_set.insert(key->getAliasOrColumnName()).second)
1867 1868 1869
			throw Exception("Duplicate column in USING list", ErrorCodes::DUPLICATE_COLUMN);
	}

1870
	for (const auto i : ext::range(0, nested_result_sample.columns()))
1871
	{
1872
		const auto & col = nested_result_sample.getByPosition(i);
1873
		if (!join_key_names_right_set.count(col.name))
1874
		{
1875 1876
			joined_columns.insert(col.name);
			joined_columns_name_type.emplace_back(col.name, col.type);
1877
		}
1878
	}
1879

1880
/*	for (const auto & name : join_key_names_left_set)
1881 1882 1883
		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;
1884 1885 1886
	std::cerr << std::endl;
	for (const auto & name : joined_columns)
		std::cerr << "JOINed column: " << name << std::endl;
1887
	std::cerr << std::endl;*/
1888 1889
}

1890 1891
Names ExpressionAnalyzer::getRequiredColumns()
{
M
Merge  
Michael Kolupaev 已提交
1892 1893
	if (!unknown_required_columns.empty())
		throw Exception("Unknown identifier: " + *unknown_required_columns.begin(), ErrorCodes::UNKNOWN_IDENTIFIER);
1894

1895
	Names res;
1896
	for (const auto & column_name_type : columns)
1897
		res.push_back(column_name_type.name);
A
Alexey Milovidov 已提交
1898

1899 1900 1901
	return res;
}

1902 1903 1904
void ExpressionAnalyzer::getRequiredColumnsImpl(ASTPtr ast,
	NameSet & required_columns, NameSet & ignored_names,
	const NameSet & available_joined_columns, NameSet & required_joined_columns)
1905
{
1906 1907 1908 1909 1910
	/** Найдём все идентификаторы в запросе.
	  * Будем искать их рекурсивно, обходя в глубину AST.
	  * При этом:
	  * - для лямбда функций не будем брать формальные параметры;
	  * - не опускаемся в подзапросы (там свои идентификаторы);
1911 1912
	  * - некоторое исключение для секции ARRAY JOIN (в ней идентификаторы немного другие);
	  * - идентификаторы, доступные из JOIN-а, кладём в required_joined_columns.
1913 1914
	  */

1915
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
1916
	{
1917 1918 1919
		if (node->kind == ASTIdentifier::Column
			&& !ignored_names.count(node->name)
			&& !ignored_names.count(DataTypeNested::extractNestedTableName(node->name)))
1920
		{
1921 1922 1923 1924
			if (!available_joined_columns.count(node->name))
				required_columns.insert(node->name);
			else
				required_joined_columns.insert(node->name);
1925
		}
A
Alexey Milovidov 已提交
1926

1927 1928
		return;
	}
1929

1930
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
1931 1932 1933 1934 1935
	{
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
		{
			if (node->arguments->children.size() != 2)
				throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
1936

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

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

1942
			/// Не нужно добавлять формальные параметры лямбда-выражения в required_columns.
1943
			Names added_ignored;
1944
			for (auto & child : lambda_args_tuple->arguments->children)
1945
			{
1946
				ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*child);
1947 1948
				if (!identifier)
					throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1949 1950

				String & name = identifier->name;
1951 1952 1953 1954 1955 1956
				if (!ignored_names.count(name))
				{
					ignored_names.insert(name);
					added_ignored.push_back(name);
				}
			}
1957

1958
			getRequiredColumnsImpl(node->arguments->children.at(1),
1959 1960
				required_columns, ignored_names,
				available_joined_columns, required_joined_columns);
1961

1962 1963
			for (size_t i = 0; i < added_ignored.size(); ++i)
				ignored_names.erase(added_ignored[i]);
1964

1965 1966 1967
			return;
		}
	}
1968

1969
	ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast);
1970

1971 1972
	/// Рекурсивный обход выражения.
	for (auto & child : ast->children)
1973
	{
1974
		/** Не пойдем в секцию ARRAY JOIN, потому что там нужно смотреть на имена не-ARRAY-JOIN-енных столбцов.
1975
		  * Туда collectUsedColumns отправит нас отдельно.
1976
		  */
1977
		if (!typeid_cast<ASTSubquery *>(&*child) && !typeid_cast<ASTSelectQuery *>(&*child) &&
1978
			!(select && child == select->array_join_expression_list))
1979
			getRequiredColumnsImpl(child, required_columns, ignored_names, available_joined_columns, required_joined_columns);
1980
    }
1981 1982
}

1983
}