ExpressionAnalyzer.cpp 63.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
#include <DB/DataTypes/FieldToDataType.h>

#include <DB/Parsers/ASTFunction.h>
#include <DB/Parsers/ASTIdentifier.h>
#include <DB/Parsers/ASTLiteral.h>
#include <DB/Parsers/ASTAsterisk.h>
#include <DB/Parsers/ASTExpressionList.h>
#include <DB/Parsers/ASTSelectQuery.h>
#include <DB/Parsers/ASTSubquery.h>
#include <DB/Parsers/ASTSet.h>
11
#include <DB/Parsers/ASTOrderByElement.h>
12
#include <DB/Parsers/ParserSelectQuery.h>
13 14 15 16

#include <DB/DataTypes/DataTypeSet.h>
#include <DB/DataTypes/DataTypeTuple.h>
#include <DB/DataTypes/DataTypeExpression.h>
17
#include <DB/DataTypes/DataTypeNested.h>
18 19 20 21 22 23 24 25
#include <DB/Columns/ColumnSet.h>
#include <DB/Columns/ColumnExpression.h>

#include <DB/Interpreters/InterpreterSelectQuery.h>
#include <DB/Interpreters/ExpressionAnalyzer.h>

#include <DB/Storages/StorageMergeTree.h>
#include <DB/Storages/StorageDistributed.h>
26
#include <DB/Storages/StorageMemory.h>
27
#include <DB/Storages/StorageReplicatedMergeTree.h>
28 29 30

#include <DB/DataStreams/copyData.h>

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

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


namespace DB
{


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

62 63
void ExpressionAnalyzer::init()
{
64
	select_query = typeid_cast<ASTSelectQuery *>(&*ast);
65

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

69
	/// Common subexpression elimination. Rewrite rules.
70
	normalizeTree();
71

A
Alexey Milovidov 已提交
72
	/// GROUP BY injective function elimination.
73
	optimizeGroupBy();
74

75
	/// array_join_alias_to_name, array_join_result_to_source.
76
	getArrayJoinedColumns();
77

78 79 80 81 82
	/// Удалить ненужное из списка columns. Создать unknown_required_columns. Сформировать columns_added_by_join.
	collectUsedColumns();

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

84
	/// external_tables, subqueries_for_sets для глобальных подзапросов.
85 86
	/// Заменяет глобальные подзапросы на сгенерированные имена временных таблиц, которые будут отправлены на удалённые серверы.
	initGlobalSubqueriesAndExternalTables();
87 88 89 90 91 92 93 94 95 96 97
}


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

99 100
	if (select_query && (select_query->group_expression_list || select_query->having_expression))
		has_aggregation = true;
101

102
	ExpressionActionsPtr temp_actions = new ExpressionActions(columns, settings);
103 104 105

	if (select_query && select_query->array_join_expression_list)
	{
106
		getRootActions(select_query->array_join_expression_list, true, false, temp_actions);
107
		addMultipleArrayJoinAction(temp_actions);
108
	}
109

110 111
	if (select_query && select_query->join)
	{
112
		getRootActions(typeid_cast<ASTJoin &>(*select_query->join).using_expr_list, true, false, temp_actions);
113
		addJoinAction(temp_actions, true);
114 115
	}

116
	getAggregates(ast, temp_actions);
117

118 119
	if (has_aggregation)
	{
120
		assertSelect();
121

122 123 124
		/// Найдем ключи агрегации.
		if (select_query->group_expression_list)
		{
125
			NameSet unique_keys;
126
			auto & group_asts = select_query->group_expression_list->children;
127 128
			for (size_t i = 0; i < group_asts.size(); ++i)
			{
129
				getRootActions(group_asts[i], true, false, temp_actions);
130

131 132
				const auto & column_name = group_asts[i]->getColumnName();
				const auto & block = temp_actions->getSampleBlock();
133

134 135 136 137 138
				if (!block.has(column_name))
					throw Exception("Unknown identifier (in GROUP BY): " + column_name, ErrorCodes::UNKNOWN_IDENTIFIER);

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

139 140 141 142 143 144 145 146 147 148 149
				/// 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;
					continue;
				}

150
				NameAndTypePair key{column_name, col.type};
151
				aggregation_keys.push_back(key);
152

153
				if (!unique_keys.count(key.name))
154
				{
155
					unique_keys.insert(key.name);
156 157
					/// key is no longer needed, therefore we can save a little by moving it
					aggregated_columns.push_back(std::move(key));
158
				}
159
			}
160 161 162 163 164 165

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

168 169 170
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
		{
			AggregateDescription & desc = aggregate_descriptions[i];
171
			aggregated_columns.emplace_back(desc.column_name, desc.function->getReturnType());
172 173 174 175
		}
	}
	else
	{
176
		aggregated_columns = temp_actions->getSampleBlock().getColumnsList();
177 178 179 180
	}
}


181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 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
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 已提交
231
NamesAndTypesList::iterator ExpressionAnalyzer::findColumn(const String & name, NamesAndTypesList & cols)
232
{
A
Alexey Milovidov 已提交
233
	return std::find_if(cols.begin(), cols.end(),
234
		[&](const NamesAndTypesList::value_type & val) { return val.name == name; });
235 236 237
}


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

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

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

254 255
		if (!typeid_cast<ASTSelectQuery *>(&*child))
			createAliasesDict(child, new_ignore_levels);
256 257 258 259 260
	}

	if (ignore_levels > 0)
		return;

A
Alexey Milovidov 已提交
261 262
	String alias = ast->tryGetAlias();
	if (!alias.empty())
263
	{
A
Alexey Milovidov 已提交
264 265
		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 已提交
266

A
Alexey Milovidov 已提交
267
		aliases[alias] = ast;
268 269 270 271 272 273
	}
}


StoragePtr ExpressionAnalyzer::getTable()
{
274
	if (const ASTSelectQuery * select = typeid_cast<const ASTSelectQuery *>(&*ast))
275
	{
276
		if (select->table && !typeid_cast<const ASTSelectQuery *>(&*select->table) && !typeid_cast<const ASTFunction *>(&*select->table))
277
		{
A
Alexey Milovidov 已提交
278
			String database = select->database
279
				? typeid_cast<const ASTIdentifier &>(*select->database).name
A
Alexey Milovidov 已提交
280
				: "";
281
			const String & table = typeid_cast<const ASTIdentifier &>(*select->table).name;
282 283 284
			return context.tryGetTable(database, table);
		}
	}
A
Alexey Milovidov 已提交
285

286 287 288 289 290 291 292 293
	return StoragePtr();
}


void ExpressionAnalyzer::normalizeTree()
{
	SetOfASTs tmp_set;
	MapOfASTs tmp_map;
294
	normalizeTreeImpl(ast, tmp_map, tmp_set, "");
295 296 297 298 299
}


/// finished_asts - уже обработанные вершины (и на что они заменены)
/// current_asts - вершины в текущем стеке вызовов этого метода
300
/// current_alias - алиас, повешенный на предка ast (самого глубокого из предков с алиасами)
301
void ExpressionAnalyzer::normalizeTreeImpl(ASTPtr & ast, MapOfASTs & finished_asts, SetOfASTs & current_asts, std::string current_alias)
302 303 304 305 306 307
{
	if (finished_asts.count(ast))
	{
		ast = finished_asts[ast];
		return;
	}
308

309 310
	ASTPtr initial_ast = ast;
	current_asts.insert(initial_ast);
311

A
Alexey Milovidov 已提交
312 313 314
	String my_alias = ast->tryGetAlias();
	if (!my_alias.empty())
		current_alias = my_alias;
315

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

319
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
320 321
	{
		/** Нет ли в таблице столбца, название которого полностью совпадает с записью функции?
A
Alexey Milovidov 已提交
322 323
		  * Например, в таблице есть столбец "domain(URL)", и мы запросили domain(URL).
		  */
324 325 326 327
		String function_string = node->getColumnName();
		NamesAndTypesList::const_iterator it = findColumn(function_string);
		if (columns.end() != it)
		{
328
			ASTIdentifier * ast_id = new ASTIdentifier(node->range, function_string);
329 330
			ast = ast_id;
			current_asts.insert(ast);
331
			replaced = true;
332
		}
333 334

		/// может быть указано IN t, где t - таблица, что равносильно IN (SELECT * FROM t).
335
		if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
336
			if (ASTIdentifier * right = typeid_cast<ASTIdentifier *>(&*node->arguments->children.at(1)))
337
				right->kind = ASTIdentifier::Table;
338
	}
339
	else if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
340
	{
341
		if (node->kind == ASTIdentifier::Column)
342
		{
M
Merge  
Michael Kolupaev 已提交
343
			/// Если это алиас, но не родительский алиас (чтобы работали конструкции вроде "SELECT column+1 AS column").
344
			Aliases::const_iterator jt = aliases.find(node->name);
M
Merge  
Michael Kolupaev 已提交
345
			if (jt != aliases.end() && current_alias != node->name)
346
			{
347
				/// Заменим его на соответствующий узел дерева.
348 349
				if (current_asts.count(jt->second))
					throw Exception("Cyclic aliases", ErrorCodes::CYCLIC_ALIASES);
A
Alexey Milovidov 已提交
350
				if (!my_alias.empty() && my_alias != jt->second->getAliasOrColumnName())
351 352 353
				{
					/// В конструкции вроде "a AS b", где a - алиас, нужно перевесить алиас b на результат подстановки алиаса a.
					ast = jt->second->clone();
A
Alexey Milovidov 已提交
354
					ast->setAlias(my_alias);
355 356 357 358 359 360 361
				}
				else
				{
					ast = jt->second;
				}

				replaced = true;
362 363 364
			}
		}
	}
365
	else if (ASTExpressionList * node = typeid_cast<ASTExpressionList *>(&*ast))
366 367 368 369 370
	{
		/// Заменим * на список столбцов.
		ASTs & asts = node->children;
		for (int i = static_cast<int>(asts.size()) - 1; i >= 0; --i)
		{
371
			if (ASTAsterisk * asterisk = typeid_cast<ASTAsterisk *>(&*asts[i]))
372 373
			{
				ASTs all_columns;
A
Alexey Milovidov 已提交
374
				for (const auto & column_name_type : columns)
375
					all_columns.emplace_back(new ASTIdentifier(asterisk->range, column_name_type.name));
A
Alexey Milovidov 已提交
376

377 378 379 380 381
				asts.erase(asts.begin() + i);
				asts.insert(asts.begin() + i, all_columns.begin(), all_columns.end());
			}
		}
	}
382 383 384 385 386 387
	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;
	}
388

389 390 391
	/// Если заменили корень поддерева вызовемся для нового корня снова - на случай, если алиас заменился на алиас.
	if (replaced)
	{
392
		normalizeTreeImpl(ast, finished_asts, current_asts, current_alias);
393 394 395 396 397 398
		current_asts.erase(initial_ast);
		current_asts.erase(ast);
		finished_asts[initial_ast] = ast;
		return;
	}

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

401 402 403
	for (auto & child : ast->children)
		if (!typeid_cast<ASTSelectQuery *>(&*child))
			normalizeTreeImpl(child, finished_asts, current_asts, current_alias);
404

405
	/// Если секция WHERE или HAVING состоит из одного алиаса, ссылку нужно заменить не только в children, но и в where_expression и having_expression.
406
	if (ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast))
407
	{
408
		if (select->prewhere_expression)
409
			normalizeTreeImpl(select->prewhere_expression, finished_asts, current_asts, current_alias);
410
		if (select->where_expression)
411
			normalizeTreeImpl(select->where_expression, finished_asts, current_asts, current_alias);
412
		if (select->having_expression)
413
			normalizeTreeImpl(select->having_expression, finished_asts, current_asts, current_alias);
414
	}
415

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

418
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
419
	{
420 421 422 423
		if (node->kind == ASTFunction::TABLE_FUNCTION)
		{
		}
		else if (node->name == "lambda")
424
		{
425
			node->kind = ASTFunction::LAMBDA_EXPRESSION;
426 427 428
		}
		else if (context.getAggregateFunctionFactory().isAggregateFunctionName(node->name))
		{
429
			node->kind = ASTFunction::AGGREGATE_FUNCTION;
430
		}
431 432 433 434 435 436 437 438
		else if (node->name == "arrayJoin")
		{
			node->kind = ASTFunction::ARRAY_JOIN;
		}
		else
		{
			node->kind = ASTFunction::FUNCTION;
		}
439
	}
440

441 442 443 444 445
	current_asts.erase(initial_ast);
	current_asts.erase(ast);
	finished_asts[initial_ast] = ast;
}

A
Alexey Milovidov 已提交
446

447
void ExpressionAnalyzer::optimizeGroupBy()
448 449 450 451
{
	if (!(select_query && select_query->group_expression_list))
		return;

452 453 454
	const auto is_literal = [] (const ASTPtr& ast) {
		return typeid_cast<const ASTLiteral*>(ast.get());
	};
455

456
	auto & group_exprs = select_query->group_expression_list->children;
457

458
	/// removes expression at index idx by making it last one and calling .pop_back()
A
Alexey Milovidov 已提交
459 460
	const auto remove_expr_at_index = [&group_exprs] (const size_t idx)
	{
461
		if (idx < group_exprs.size() - 1)
A
Merge  
Andrey Mironov 已提交
462
			std::swap(group_exprs[idx], group_exprs.back());
463

464 465
		group_exprs.pop_back();
	};
466

A
Andrey Mironov 已提交
467
	/// iterate over each GROUP BY expression, eliminate injective function calls and literals
468
	for (size_t i = 0; i < group_exprs.size();)
469 470 471 472
	{
		if (const auto function = typeid_cast<ASTFunction*>(group_exprs[i].get()))
		{
			/// assert function is injective
A
Alexey Milovidov 已提交
473
			if (!injective_function_names.count(function->name))
474 475
			{
				++i;
476
				continue;
477
			}
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492

			/// 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
			);
		}
493 494 495
		else if (is_literal(group_exprs[i]))
		{
			remove_expr_at_index(i);
496 497 498 499 500
		}
		else
		{
			/// if neither a function nor literal - advance to next expression
			++i;
501
		}
502
	}
503 504 505

	if (group_exprs.empty())
		select_query->group_expression_list = nullptr;
506 507 508
}


509
void ExpressionAnalyzer::makeSetsForIndex()
P
Pavel Kartavyy 已提交
510
{
511
	if (storage && ast && storage->supportsIndexForIn())
A
Alexey Milovidov 已提交
512
		makeSetsForIndexImpl(ast, storage->getSampleBlock());
P
Pavel Kartavyy 已提交
513 514
}

A
Alexey Milovidov 已提交
515
void ExpressionAnalyzer::makeSetsForIndexImpl(ASTPtr & node, const Block & sample_block)
P
Pavel Kartavyy 已提交
516 517
{
	for (auto & child : node->children)
A
Alexey Milovidov 已提交
518
		makeSetsForIndexImpl(child, sample_block);
P
Pavel Kartavyy 已提交
519

520
	ASTFunction * func = typeid_cast<ASTFunction *>(node.get());
P
Pavel Kartavyy 已提交
521 522 523
	if (func && func->kind == ASTFunction::FUNCTION && (func->name == "in" || func->name == "notIn"))
	{
		IAST & args = *func->arguments;
524
		ASTPtr & arg = args.children.at(1);
P
Pavel Kartavyy 已提交
525

526
		if (!typeid_cast<ASTSet *>(&*arg) && !typeid_cast<ASTSubquery *>(&*arg) && !typeid_cast<ASTIdentifier *>(&*arg))
527 528 529
		{
			try
			{
530
				makeExplicitSet(func, sample_block, true);
531 532 533 534 535 536 537 538
			}
			catch (const DB::Exception & e)
			{
				/// в sample_block нет колонок, которые добаляет getActions
				if (e.code() != ErrorCodes::NOT_FOUND_COLUMN_IN_BLOCK)
					throw;
			}
		}
P
Pavel Kartavyy 已提交
539 540
	}
}
541

542

543 544
static SharedPtr<InterpreterSelectQuery> interpretSubquery(
	ASTPtr & subquery_or_table_name, const Context & context, size_t subquery_depth, const Names & required_columns = Names())
545
{
546 547 548
	/// Подзапрос или имя таблицы. Имя таблицы аналогично подзапросу 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);
549

550 551
	if (!subquery && !table)
		throw Exception("IN/JOIN supports only SELECT subqueries.", ErrorCodes::BAD_ARGUMENTS);
552

553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569
	/** Для подзапроса в секции 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)
	{
570
		String query_str = "SELECT * FROM " + backQuoteIfNeed(table->name);
571 572 573 574
		const char * begin = query_str.data();
		const char * end = begin + query_str.size();
		const char * pos = begin;
		Expected expected = "";
575

576
		bool parse_res = ParserSelectQuery().parse(pos, end, query, expected);
577 578 579
		if (!parse_res)
			throw Exception("Error in parsing SELECT query while creating set or join for table " + table->name + ".",
				ErrorCodes::LOGICAL_ERROR);
580 581
	}
	else
582 583
		query = subquery->children.at(0);

584 585 586 587 588 589
	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);
}

590

591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609
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;
		}
	}

	SharedPtr<InterpreterSelectQuery> interpreter = interpretSubquery(subquery_or_table_name, context, subquery_depth);

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

612 613
	String external_table_name = "_data" + toString(external_table_id);
	++external_table_id;
614

615 616 617 618 619 620 621 622 623
	/** Заменяем подзапрос на имя временной таблицы.
	  * Именно в таком виде, запрос отправится на удалённый сервер.
	  * На удалённый сервер отправится эта временная таблица, и на его стороне,
	  *  вместо выполнения подзапроса, надо будет просто из неё прочитать.
	  */
	subquery_or_table_name = new ASTIdentifier(StringRange(), external_table_name, ASTIdentifier::Table);

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

624
	external_tables[external_table_name] = external_storage;
625
	subqueries_for_sets[external_table_name].source = interpreter->execute();
626
	subqueries_for_sets[external_table_name].table = external_storage;
627 628 629 630 631 632

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


636
void ExpressionAnalyzer::makeSet(ASTFunction * node, const Block & sample_block)
637
{
638
	/** Нужно преобразовать правый аргумент в множество.
639
	  * Это может быть имя таблицы, значение, перечисление значений или подзапрос.
640 641 642
	  * Перечисление значений парсится как функция tuple.
	  */
	IAST & args = *node->arguments;
643
	ASTPtr & arg = args.children.at(1);
644

645
	/// Уже преобразовали.
646
	if (typeid_cast<ASTSet *>(&*arg))
647
		return;
648

649
	/// Если подзапрос или имя таблицы для SELECT.
650
	if (typeid_cast<ASTSubquery *>(&*arg) || typeid_cast<ASTIdentifier *>(&*arg))
651
	{
652 653 654
		/// Получаем поток блоков для подзапроса. Создаём Set и кладём на место подзапроса.
		String set_id = arg->getColumnName();
		ASTSet * ast_set = new ASTSet(set_id);
655
		ASTPtr ast_set_ptr = ast_set;
656

657
		SubqueryForSet & subquery_for_set = subqueries_for_sets[set_id];
658

659 660
		/// Если уже создали Set с таким же подзапросом.
		if (subquery_for_set.set)
661
		{
662 663 664
			ast_set->set = subquery_for_set.set;
			arg = ast_set_ptr;
			return;
665
		}
666

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

669 670 671 672 673 674 675 676
		/** Для GLOBAL IN-ов происходит следующее:
		  * - в функции addExternalStorage подзапрос IN (SELECT ...) заменяется на IN _data1,
		  *   в объекте subquery_for_set выставляется этот подзапрос в качестве source и временная таблица _data1 в качестве table.
		  * - в этой функции видно выражение IN _data1.
		  */
		if (!subquery_for_set.source)
			subquery_for_set.source = interpretSubquery(arg, context, subquery_depth)->execute();

677
		subquery_for_set.set = ast_set->set;
678
		arg = ast_set_ptr;
679
	}
680
	else
681
	{
A
Alexey Milovidov 已提交
682
		/// Явное перечисление значений в скобках.
P
Pavel Kartavyy 已提交
683
		makeExplicitSet(node, sample_block, false);
P
Pavel Kartavyy 已提交
684 685 686 687
	}
}

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

693
		DataTypes set_element_types;
694
		ASTPtr & left_arg = args.children.at(0);
695

696
		ASTFunction * left_arg_tuple = typeid_cast<ASTFunction *>(&*left_arg);
697 698 699 700 701 702

		if (left_arg_tuple && left_arg_tuple->name == "tuple")
		{
			for (ASTs::const_iterator it = left_arg_tuple->arguments->children.begin();
				it != left_arg_tuple->arguments->children.end();
				++it)
703
				set_element_types.push_back(sample_block.getByName((*it)->getColumnName()).type);
704 705 706
		}
		else
		{
707
			DataTypePtr left_type = sample_block.getByName(left_arg->getColumnName()).type;
708
			if (DataTypeArray * array_type = typeid_cast<DataTypeArray *>(&*left_type))
709 710 711 712
				set_element_types.push_back(array_type->getNestedType());
			else
				set_element_types.push_back(left_type);
		}
713

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

718
		if (ASTFunction * set_func = typeid_cast<ASTFunction *>(&*arg))
719 720 721 722
		{
			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);
723

724
			/// Отличм случай (x, y) in ((1, 2), (3, 4)) от случая (x, y) in (1, 2).
725
			ASTFunction * any_element = typeid_cast<ASTFunction *>(&*set_func->arguments->children.at(0));
726 727 728 729 730
			if (set_element_types.size() >= 2 && (!any_element || any_element->name != "tuple"))
				single_value = true;
			else
				elements_ast = set_func->arguments;
		}
731
		else if (typeid_cast<ASTLiteral *>(&*arg))
732 733 734 735 736 737 738 739
		{
			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);
		}
740

741 742 743 744 745 746
		if (single_value)
		{
			ASTPtr exp_list = new ASTExpressionList;
			exp_list->children.push_back(elements_ast);
			elements_ast = exp_list;
		}
747

748
		ASTSet * ast_set = new ASTSet(arg->getColumnName());
749
		ASTPtr ast_set_ptr = ast_set;
750
		ast_set->set = new Set(settings.limits);
751
		ast_set->is_explicit = true;
P
Pavel Kartavyy 已提交
752
		ast_set->set->createFromAST(set_element_types, elements_ast, create_ordered_set);
753
		arg = ast_set_ptr;
754 755 756
}


757
static String getUniqueName(const Block & block, const String & prefix)
758 759
{
	int i = 1;
760
	while (block.has(prefix + toString(i)))
761
		++i;
762
	return prefix + toString(i);
763 764 765
}


A
Alexey Milovidov 已提交
766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784
/** Для 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;

785
	ScopeStack(const ExpressionActionsPtr & actions, const Settings & settings_)
A
Alexey Milovidov 已提交
786 787
		: settings(settings_)
	{
788
		stack.emplace_back();
789
		stack.back().actions = actions;
790 791 792 793

		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 已提交
794 795 796 797
	}

	void pushLevel(const NamesAndTypesList & input_columns)
	{
798
		stack.emplace_back();
A
Alexey Milovidov 已提交
799 800 801 802 803 804 805
		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)
		{
806 807 808
			all_columns.emplace_back(nullptr, it->type, it->name);
			new_names.insert(it->name);
			stack.back().new_columns.insert(it->name);
A
Alexey Milovidov 已提交
809 810
		}

811 812
		const Block & prev_sample_block = prev.actions->getSampleBlock();
		for (size_t i = 0, size = prev_sample_block.columns(); i < size; ++i)
A
Alexey Milovidov 已提交
813
		{
814 815 816
			const ColumnWithNameAndType & col = prev_sample_block.unsafeGetByPosition(i);
			if (!new_names.count(col.name))
				all_columns.push_back(col);
A
Alexey Milovidov 已提交
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
		}

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


867
void ExpressionAnalyzer::getRootActions(ASTPtr ast, bool no_subqueries, bool only_consts, ExpressionActionsPtr & actions)
868 869
{
	ScopeStack scopes(actions, settings);
870
	getActionsImpl(ast, no_subqueries, only_consts, scopes);
871
	actions = scopes.popLevel();
872 873 874
}


875 876
void ExpressionAnalyzer::getArrayJoinedColumns()
{
877 878
	if (select_query && select_query->array_join_expression_list)
	{
879 880 881 882 883 884
		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 已提交
885
			String nested_table_alias = ast->getAliasOrColumnName();
886
			if (nested_table_alias == nested_table_name && !typeid_cast<ASTIdentifier *>(&*ast))
887 888 889 890 891 892 893 894 895 896 897 898 899 900 901
				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);
		}
902 903 904

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

911
			/// Это массив.
912
			if (!typeid_cast<ASTIdentifier *>(&*expr) || findColumn(source_name, columns) != columns.end())
913
			{
914
				array_join_result_to_source[result_name] = source_name;
915 916 917 918
			}
			else /// Это вложенная таблица.
			{
				bool found = false;
A
Alexey Milovidov 已提交
919
				for (const auto & column_name_type : columns)
920
				{
921 922
					String table_name = DataTypeNested::extractNestedTableName(column_name_type.name);
					String column_name = DataTypeNested::extractNestedColumnName(column_name_type.name);
923 924
					if (table_name == source_name)
					{
925
						array_join_result_to_source[DataTypeNested::concatenateNestedName(result_name, column_name)] = column_name_type.name;
926 927 928 929
						found = true;
						break;
					}
				}
930 931
				if (!found)
					throw Exception("No columns in nested table " + source_name, ErrorCodes::EMPTY_NESTED_TABLE);
932 933
			}
		}
934
	}
935 936 937 938
}


void ExpressionAnalyzer::getArrayJoinedColumnsImpl(ASTPtr ast)
939
{
940
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
941
	{
942 943 944 945 946 947 948 949 950 951 952 953
		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);
			}
		}
954 955 956
	}
	else
	{
957 958 959
		for (auto & child : ast->children)
			if (!typeid_cast<ASTSelectQuery *>(&*child))
				getArrayJoinedColumnsImpl(child);
960 961 962 963 964
	}
}


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

971
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
972 973 974 975 976
	{
		std::string name = node->getColumnName();
		if (!only_consts && !actions_stack.getSampleBlock().has(name))
		{
			/// Запрошенного столбца нет в блоке.
977
			/// Если такой столбец есть в таблице, значит пользователь наверно забыл окружить его агрегатной функцией или добавить в GROUP BY.
978 979

			bool found = false;
A
Alexey Milovidov 已提交
980
			for (const auto & column_name_type : columns)
981
				if (column_name_type.name == name)
982 983 984 985
					found = true;

			if (found)
				throw Exception("Column " + name + " is not under aggregate function and not in GROUP BY.",
986
					ErrorCodes::NOT_AN_AGGREGATE);
987 988
		}
	}
989
	else if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
990
	{
991
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
992
			throw Exception("Unexpected expression", ErrorCodes::UNEXPECTED_EXPRESSION);
993

994 995 996 997
		if (node->kind == ASTFunction::ARRAY_JOIN)
		{
			if (node->arguments->children.size() != 1)
				throw Exception("arrayJoin requires exactly 1 argument", ErrorCodes::TYPE_MISMATCH);
998
			ASTPtr arg = node->arguments->children.at(0);
999
			getActionsImpl(arg, no_subqueries, only_consts, actions_stack);
1000
			if (!only_consts)
1001
			{
1002
				String result_name = node->getColumnName();
1003
				actions_stack.addAction(ExpressionAction::copyColumn(arg->getColumnName(), result_name));
1004 1005
				NameSet joined_columns;
				joined_columns.insert(result_name);
1006
				actions_stack.addAction(ExpressionAction::arrayJoin(joined_columns));
1007
			}
1008

1009 1010
			return;
		}
1011

1012
		if (node->kind == ASTFunction::FUNCTION)
1013
		{
1014
			if (node->name == "in" || node->name == "notIn" || node->name == "globalIn" || node->name == "globalNotIn")
1015 1016 1017
			{
				if (!no_subqueries)
				{
1018
					/// Найдем тип первого аргумента (потом getActionsImpl вызовется для него снова и ни на что не повлияет).
1019
					getActionsImpl(node->arguments->children.at(0), no_subqueries, only_consts, actions_stack);
1020

1021
					/// Превратим tuple или подзапрос в множество.
1022
					makeSet(node, actions_stack.getSampleBlock());
1023 1024 1025
				}
				else
				{
1026 1027 1028 1029 1030 1031 1032
					if (!only_consts)
					{
						/// Мы в той части дерева, которую не собираемся вычислять. Нужно только определить типы.
						/// Не будем выполнять подзапросы и составлять множества. Вставим произвольный столбец правильного типа.
						ColumnWithNameAndType fake_column;
						fake_column.name = node->getColumnName();
						fake_column.type = new DataTypeUInt8;
1033
						actions_stack.addAction(ExpressionAction::addColumn(fake_column));
1034
						getActionsImpl(node->arguments->children.at(0), no_subqueries, only_consts, actions_stack);
1035
					}
1036 1037 1038
					return;
				}
			}
1039

1040
			FunctionPtr function = context.getFunctionFactory().get(node->name, context);
1041

1042 1043
			Names argument_names;
			DataTypes argument_types;
M
Merge  
Michael Kolupaev 已提交
1044
			bool arguments_present = true;
1045

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

1049
			for (auto & child : node->arguments->children)
1050
			{
1051 1052
				ASTFunction * lambda = typeid_cast<ASTFunction *>(&*child);
				ASTSet * set = typeid_cast<ASTSet *>(&*child);
1053 1054
				if (lambda && lambda->name == "lambda")
				{
M
Merge  
Michael Kolupaev 已提交
1055
					/// Если аргумент - лямбда-выражение, только запомним его примерный тип.
1056 1057
					if (lambda->arguments->children.size() != 2)
						throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
1058

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

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

1064
					has_lambda_arguments = true;
1065
					argument_types.emplace_back(new DataTypeExpression(DataTypes(lambda_args_tuple->arguments->children.size())));
1066
					/// Выберем название в следующем цикле.
1067
					argument_names.emplace_back();
1068
				}
1069 1070 1071 1072
				else if (set)
				{
					ColumnWithNameAndType column;
					column.type = new DataTypeSet;
1073

1074 1075
					/// Если аргумент - множество, заданное перечислением значений, дадим ему уникальное имя,
					///  чтобы множества с одинаковой записью не склеивались (у них может быть разный тип).
1076
					if (set->is_explicit)
1077 1078 1079 1080 1081 1082 1083 1084
						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);

1085
						actions_stack.addAction(ExpressionAction::addColumn(column));
1086
					}
1087

1088 1089 1090
					argument_types.push_back(column.type);
					argument_names.push_back(column.name);
				}
1091 1092
				else
				{
M
Merge  
Michael Kolupaev 已提交
1093
					/// Если аргумент не лямбда-выражение, вызовемся рекурсивно и узнаем его тип.
1094
					getActionsImpl(child, no_subqueries, only_consts, actions_stack);
1095
					std::string name = child->getColumnName();
1096
					if (actions_stack.getSampleBlock().has(name))
M
Merge  
Michael Kolupaev 已提交
1097
					{
1098
						argument_types.push_back(actions_stack.getSampleBlock().getByName(name).type);
M
Merge  
Michael Kolupaev 已提交
1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111
						argument_names.push_back(name);
					}
					else
					{
						if (only_consts)
						{
							arguments_present = false;
						}
						else
						{
							throw Exception("Unknown identifier: " + name, ErrorCodes::UNKNOWN_IDENTIFIER);
						}
					}
1112 1113
				}
			}
1114

M
Merge  
Michael Kolupaev 已提交
1115 1116
			if (only_consts && !arguments_present)
				return;
1117

1118
			Names additional_requirements;
1119

1120 1121 1122
			if (has_lambda_arguments && !only_consts)
			{
				function->getLambdaArgumentTypes(argument_types);
1123

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

1129
					ASTFunction * lambda = typeid_cast<ASTFunction *>(&*child);
1130 1131
					if (lambda && lambda->name == "lambda")
					{
1132
						DataTypeExpression * lambda_type = typeid_cast<DataTypeExpression *>(&*argument_types[i]);
1133
						ASTFunction * lambda_args_tuple = typeid_cast<ASTFunction *>(&*lambda->arguments->children.at(0));
1134
						ASTs lambda_arg_asts = lambda_args_tuple->arguments->children;
1135
						NamesAndTypesList lambda_arguments;
1136

1137 1138
						for (size_t j = 0; j < lambda_arg_asts.size(); ++j)
						{
1139
							ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*lambda_arg_asts[j]);
1140 1141
							if (!identifier)
								throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1142

1143
							String arg_name = identifier->name;
1144

1145
							lambda_arguments.emplace_back(arg_name, lambda_type->getArgumentTypes()[j]);
1146
						}
1147

1148
						actions_stack.pushLevel(lambda_arguments);
1149
						getActionsImpl(lambda->arguments->children.at(1), no_subqueries, only_consts, actions_stack);
1150
						ExpressionActionsPtr lambda_actions = actions_stack.popLevel();
1151

1152
						String result_name = lambda->arguments->children.at(1)->getColumnName();
1153
						lambda_actions->finalize(Names(1, result_name));
1154
						DataTypePtr result_type = lambda_actions->getSampleBlock().getByName(result_name).type;
1155
						argument_types[i] = new DataTypeExpression(lambda_type->getArgumentTypes(), result_type);
1156

1157 1158 1159 1160
						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]);
1161

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

1166
						ColumnWithNameAndType lambda_column;
1167
						lambda_column.column = new ColumnExpression(1, lambda_actions, lambda_arguments, result_type, result_name);
1168 1169
						lambda_column.type = argument_types[i];
						lambda_column.name = argument_names[i];
1170
						actions_stack.addAction(ExpressionAction::addColumn(lambda_column));
1171 1172 1173
					}
				}
			}
1174

1175 1176 1177 1178
			if (only_consts)
			{
				for (size_t i = 0; i < argument_names.size(); ++i)
				{
1179
					if (!actions_stack.getSampleBlock().has(argument_names[i]))
1180
					{
M
Merge  
Michael Kolupaev 已提交
1181
						arguments_present = false;
1182 1183 1184 1185
						break;
					}
				}
			}
1186

M
Merge  
Michael Kolupaev 已提交
1187
			if (arguments_present)
1188
				actions_stack.addAction(ExpressionAction::applyFunction(function, argument_names, node->getColumnName()),
1189
										additional_requirements);
1190 1191
		}
	}
1192
	else if (ASTLiteral * node = typeid_cast<ASTLiteral *>(&*ast))
1193 1194 1195 1196 1197 1198
	{
		DataTypePtr type = apply_visitor(FieldToDataType(), node->value);
		ColumnWithNameAndType column;
		column.column = type->createConstColumn(1, node->value);
		column.type = type;
		column.name = node->getColumnName();
1199

1200
		actions_stack.addAction(ExpressionAction::addColumn(column));
1201 1202 1203
	}
	else
	{
1204 1205
		for (auto & child : ast->children)
			getActionsImpl(child, no_subqueries, only_consts, actions_stack);
1206 1207 1208 1209
	}
}


1210
void ExpressionAnalyzer::getAggregates(ASTPtr ast, ExpressionActionsPtr & actions)
1211
{
1212
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1213
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
1214
	{
1215
		has_aggregation = true;
1216 1217
		AggregateDescription aggregate;
		aggregate.column_name = node->getColumnName();
1218

1219 1220 1221
		for (size_t i = 0; i < aggregate_descriptions.size(); ++i)
			if (aggregate_descriptions[i].column_name == aggregate.column_name)
				return;
1222

1223 1224 1225
		ASTs & arguments = node->arguments->children;
		aggregate.argument_names.resize(arguments.size());
		DataTypes types(arguments.size());
1226

1227 1228
		for (size_t i = 0; i < arguments.size(); ++i)
		{
1229
			getRootActions(arguments[i], true, false, actions);
1230
			const std::string & name = arguments[i]->getColumnName();
1231
			types[i] = actions->getSampleBlock().getByName(name).type;
1232 1233
			aggregate.argument_names[i] = name;
		}
1234

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

1237 1238
		if (node->parameters)
		{
1239
			ASTs & parameters = typeid_cast<ASTExpressionList &>(*node->parameters).children;
1240
			Array params_row(parameters.size());
1241

1242 1243
			for (size_t i = 0; i < parameters.size(); ++i)
			{
1244
				ASTLiteral * lit = typeid_cast<ASTLiteral *>(&*parameters[i]);
1245 1246
				if (!lit)
					throw Exception("Parameters to aggregate functions must be literals", ErrorCodes::PARAMETERS_TO_AGGREGATE_FUNCTIONS_MUST_BE_LITERALS);
1247

1248 1249
				params_row[i] = lit->value;
			}
1250

1251
			aggregate.parameters = params_row;
1252 1253
			aggregate.function->setParameters(params_row);
		}
1254

1255
		aggregate.function->setArguments(types);
1256

1257 1258 1259 1260 1261 1262
		aggregate_descriptions.push_back(aggregate);
	}
	else
	{
		for (size_t i = 0; i < ast->children.size(); ++i)
		{
1263
			ASTPtr child = ast->children[i];
1264
			if (!typeid_cast<ASTSubquery *>(&*child) && !typeid_cast<ASTSelectQuery *>(&*child))
1265
				getAggregates(child, actions);
1266 1267 1268 1269
		}
	}
}

1270 1271 1272 1273 1274
void ExpressionAnalyzer::assertSelect()
{
	if (!select_query)
		throw Exception("Not a select query", ErrorCodes::LOGICAL_ERROR);
}
1275

1276
void ExpressionAnalyzer::assertAggregation()
1277 1278 1279
{
	if (!has_aggregation)
		throw Exception("No aggregation", ErrorCodes::LOGICAL_ERROR);
1280
}
1281

1282 1283 1284 1285 1286
void ExpressionAnalyzer::initChain(ExpressionActionsChain & chain, NamesAndTypesList & columns)
{
	if (chain.steps.empty())
	{
		chain.settings = settings;
1287
		chain.steps.emplace_back(new ExpressionActions(columns, settings));
1288 1289
	}
}
1290

1291
void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actions)
1292
{
1293 1294
	NameSet result_columns;
	for (NameToNameMap::iterator it = array_join_result_to_source.begin(); it != array_join_result_to_source.end(); ++it)
1295
	{
1296
		if (it->first != it->second)
1297
			actions->add(ExpressionAction::copyColumn(it->second, it->first));
1298
		result_columns.insert(it->first);
1299 1300
	}

1301
	actions->add(ExpressionAction::arrayJoin(result_columns));
1302 1303
}

1304
bool ExpressionAnalyzer::appendArrayJoin(ExpressionActionsChain & chain, bool only_types)
1305 1306
{
	assertSelect();
1307 1308

	if (!select_query->array_join_expression_list)
1309
		return false;
1310

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

1314
	getRootActions(select_query->array_join_expression_list, only_types, false, step.actions);
1315

1316
	addMultipleArrayJoinAction(step.actions);
1317

1318 1319 1320
	return true;
}

1321
void ExpressionAnalyzer::addJoinAction(ExpressionActionsPtr & actions, bool only_types)
1322
{
1323 1324 1325 1326 1327 1328
	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));
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340
}

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

	if (!select_query->join)
		return false;

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

1341
	ASTJoin & ast_join = typeid_cast<ASTJoin &>(*select_query->join);
1342
	getRootActions(ast_join.using_expr_list, only_types, false, step.actions);
1343

1344 1345 1346 1347 1348
	/// Не поддерживается два JOIN-а с одинаковым подзапросом, но разными USING-ами.
	String join_id = ast_join.table->getColumnName();

	SubqueryForSet & subquery_for_set = subqueries_for_sets[join_id];
	if (!subquery_for_set.join)
1349
	{
1350 1351 1352
		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);
1353

1354 1355
/*		for (const auto & name_type : columns_added_by_join)
			std::cerr << "! Column added by JOIN: " << name_type.name << std::endl;*/
1356 1357

		Names required_joined_columns(join_key_names_right.begin(), join_key_names_right.end());
1358
		for (const auto & name_type : columns_added_by_join)
1359
			required_joined_columns.push_back(name_type.name);
1360

1361 1362 1363 1364 1365 1366 1367 1368
		/** Для GLOBAL JOIN-ов происходит следующее:
		  * - в функции addExternalStorage подзапрос JOIN (SELECT ...) заменяется на JOIN _data1,
		  *   в объекте subquery_for_set выставляется этот подзапрос в качестве source и временная таблица _data1 в качестве table.
		  * - в этой функции видно выражение JOIN _data1.
		  */
		if (!subquery_for_set.source)
			subquery_for_set.source = interpretSubquery(ast_join.table, context, subquery_depth, required_joined_columns)->execute();

1369
		subquery_for_set.join = join;
1370 1371
	}

1372
	addJoinAction(step.actions, false);
1373 1374 1375 1376

	return true;
}

1377
bool ExpressionAnalyzer::appendWhere(ExpressionActionsChain & chain, bool only_types)
1378 1379
{
	assertSelect();
1380

1381 1382
	if (!select_query->where_expression)
		return false;
1383

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

1387
	step.required_output.push_back(select_query->where_expression->getColumnName());
1388
	getRootActions(select_query->where_expression, only_types, false, step.actions);
1389

1390 1391 1392
	return true;
}

1393
bool ExpressionAnalyzer::appendGroupBy(ExpressionActionsChain & chain, bool only_types)
1394 1395
{
	assertAggregation();
1396

1397 1398
	if (!select_query->group_expression_list)
		return false;
1399

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

1403
	ASTs asts = select_query->group_expression_list->children;
1404 1405
	for (size_t i = 0; i < asts.size(); ++i)
	{
1406
		step.required_output.push_back(asts[i]->getColumnName());
1407
		getRootActions(asts[i], only_types, false, step.actions);
1408
	}
1409

1410 1411 1412
	return true;
}

1413
void ExpressionAnalyzer::appendAggregateFunctionsArguments(ExpressionActionsChain & chain, bool only_types)
1414 1415
{
	assertAggregation();
1416

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

1420 1421 1422 1423 1424 1425 1426
	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]);
		}
	}
1427

1428
	getActionsBeforeAggregation(select_query->select_expression_list, step.actions, only_types);
1429

1430
	if (select_query->having_expression)
1431
		getActionsBeforeAggregation(select_query->having_expression, step.actions, only_types);
1432

1433
	if (select_query->order_expression_list)
1434
		getActionsBeforeAggregation(select_query->order_expression_list, step.actions, only_types);
1435 1436
}

1437
bool ExpressionAnalyzer::appendHaving(ExpressionActionsChain & chain, bool only_types)
1438 1439
{
	assertAggregation();
1440

1441 1442
	if (!select_query->having_expression)
		return false;
1443

1444 1445
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1446

1447
	step.required_output.push_back(select_query->having_expression->getColumnName());
1448
	getRootActions(select_query->having_expression, only_types, false, step.actions);
1449

1450
	return true;
1451 1452
}

1453
void ExpressionAnalyzer::appendSelect(ExpressionActionsChain & chain, bool only_types)
1454 1455
{
	assertSelect();
1456

1457 1458
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1459

1460
	getRootActions(select_query->select_expression_list, only_types, false, step.actions);
1461

1462 1463 1464 1465 1466
	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());
	}
1467
}
1468

1469
bool ExpressionAnalyzer::appendOrderBy(ExpressionActionsChain & chain, bool only_types)
1470
{
1471
	assertSelect();
1472

1473 1474
	if (!select_query->order_expression_list)
		return false;
1475

1476 1477
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1478

1479
	getRootActions(select_query->order_expression_list, only_types, false, step.actions);
1480

1481 1482 1483
	ASTs asts = select_query->order_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
1484
		ASTOrderByElement * ast = typeid_cast<ASTOrderByElement *>(&*asts[i]);
1485 1486
		if (!ast || ast->children.size() != 1)
			throw Exception("Bad order expression AST", ErrorCodes::UNKNOWN_TYPE_OF_AST_NODE);
1487
		ASTPtr order_expression = ast->children.at(0);
1488 1489
		step.required_output.push_back(order_expression->getColumnName());
	}
1490

1491 1492 1493
	return true;
}

1494
void ExpressionAnalyzer::appendProjectResult(DB::ExpressionActionsChain & chain, bool only_types)
1495 1496
{
	assertSelect();
1497

1498 1499
	initChain(chain, aggregated_columns);
	ExpressionActionsChain::Step & step = chain.steps.back();
1500

1501
	NamesWithAliases result_columns;
1502

1503 1504
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
1505
	{
1506
		result_columns.emplace_back(asts[i]->getColumnName(), asts[i]->getAliasOrColumnName());
1507
		step.required_output.push_back(result_columns.back().second);
1508
	}
1509

1510
	step.actions->add(ExpressionAction::project(result_columns));
1511 1512 1513
}


1514 1515 1516
Block ExpressionAnalyzer::getSelectSampleBlock()
{
	assertSelect();
1517

1518
	ExpressionActionsPtr temp_actions = new ExpressionActions(aggregated_columns, settings);
1519
	NamesWithAliases result_columns;
1520

1521 1522 1523
	ASTs asts = select_query->select_expression_list->children;
	for (size_t i = 0; i < asts.size(); ++i)
	{
1524
		result_columns.emplace_back(asts[i]->getColumnName(), asts[i]->getAliasOrColumnName());
1525
		getRootActions(asts[i], true, false, temp_actions);
1526
	}
1527

1528
	temp_actions->add(ExpressionAction::project(result_columns));
1529

1530
	return temp_actions->getSampleBlock();
1531 1532
}

1533
void ExpressionAnalyzer::getActionsBeforeAggregation(ASTPtr ast, ExpressionActionsPtr & actions, bool no_subqueries)
1534
{
1535
	ASTFunction * node = typeid_cast<ASTFunction *>(&*ast);
1536

1537 1538 1539
	if (node && node->kind == ASTFunction::AGGREGATE_FUNCTION)
		for (auto & argument : node->arguments->children)
			getRootActions(argument, no_subqueries, false, actions);
1540
	else
1541 1542
		for (auto & child : ast->children)
			getActionsBeforeAggregation(child, actions, no_subqueries);
1543 1544 1545
}


M
Merge  
Michael Kolupaev 已提交
1546
ExpressionActionsPtr ExpressionAnalyzer::getActions(bool project_result)
1547
{
1548
	ExpressionActionsPtr actions = new ExpressionActions(columns, settings);
1549
	NamesWithAliases result_columns;
1550
	Names result_names;
1551

1552
	ASTs asts;
1553

1554
	if (ASTExpressionList * node = typeid_cast<ASTExpressionList *>(&*ast))
1555
		asts = node->children;
1556
	else
1557
		asts = ASTs(1, ast);
1558

1559
	for (size_t i = 0; i < asts.size(); ++i)
1560
	{
1561 1562 1563
		std::string name = asts[i]->getColumnName();
		std::string alias;
		if (project_result)
A
Alexey Milovidov 已提交
1564
			alias = asts[i]->getAliasOrColumnName();
1565 1566
		else
			alias = name;
1567
		result_columns.emplace_back(name, alias);
1568
		result_names.push_back(alias);
1569
		getRootActions(asts[i], false, false, actions);
1570
	}
1571

M
Merge  
Michael Kolupaev 已提交
1572 1573
	if (project_result)
	{
1574
		actions->add(ExpressionAction::project(result_columns));
M
Merge  
Michael Kolupaev 已提交
1575
	}
M
Merge  
Michael Kolupaev 已提交
1576 1577 1578
	else
	{
		/// Не будем удалять исходные столбцы.
A
Alexey Milovidov 已提交
1579
		for (const auto & column_name_type : columns)
1580
			result_names.push_back(column_name_type.name);
M
Merge  
Michael Kolupaev 已提交
1581
	}
1582

1583
	actions->finalize(result_names);
1584

1585 1586 1587 1588 1589 1590
	return actions;
}


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

1593
	getRootActions(ast, true, true, actions);
1594

1595 1596 1597 1598 1599 1600
	return actions;
}

void ExpressionAnalyzer::getAggregateInfo(Names & key_names, AggregateDescriptions & aggregates)
{
	for (NamesAndTypesList::iterator it = aggregation_keys.begin(); it != aggregation_keys.end(); ++it)
1601
		key_names.push_back(it->name);
1602 1603 1604
	aggregates = aggregate_descriptions;
}

1605
void ExpressionAnalyzer::collectUsedColumns()
1606
{
A
Alexey Milovidov 已提交
1607 1608 1609 1610 1611 1612 1613
	/** Вычислим, какие столбцы требуются для выполнения выражения.
	  * Затем, удалим все остальные столбцы из списка доступных столбцов.
	  * После выполнения, columns будет содержать только список столбцов, нужных для чтения из таблицы.
	  */

	NameSet required;
	NameSet ignored;
1614

1615 1616 1617 1618 1619 1620
	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.
1621
			/// Их потом добавим отдельно.
1622
			if (typeid_cast<ASTIdentifier *>(&*expressions[i]))
1623
			{
1624
				ignored.insert(expressions[i]->getColumnName());
1625 1626 1627 1628
			}
			else
			{
				/// Для выражений в ARRAY JOIN ничего игнорировать не нужно.
A
Alexey Milovidov 已提交
1629
				NameSet empty;
1630
				getRequiredColumnsImpl(expressions[i], required, empty, empty, empty);
1631
			}
1632

A
Alexey Milovidov 已提交
1633
			ignored.insert(expressions[i]->getAliasOrColumnName());
1634 1635
		}
	}
1636

1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647
	/** Также нужно не учитывать идентификаторы столбцов, получающихся путём 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();)
	{
1648
		if (required_joined_columns.count(it->name))
1649 1650 1651 1652 1653
			++it;
		else
			columns_added_by_join.erase(it++);
	}

1654
/*	for (const auto & name_type : columns_added_by_join)
1655
		std::cerr << "JOINed column (required, not key): " << name_type.first << std::endl;
1656
	std::cerr << std::endl;*/
1657

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

	for (const auto & column_name_type : columns)
1664 1665
		if (array_join_sources.count(column_name_type.name))
			required.insert(column_name_type.name);
1666

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

1671
	unknown_required_columns = required;
1672

1673 1674
	for (NamesAndTypesList::iterator it = columns.begin(); it != columns.end();)
	{
1675
		unknown_required_columns.erase(it->name);
1676

1677
		if (!required.count(it->name))
1678
		{
1679
			required.erase(it->name);
A
Alexey Milovidov 已提交
1680
			columns.erase(it++);
1681
		}
A
Alexey Milovidov 已提交
1682 1683
		else
			++it;
1684
	}
S
Merge  
Sergey Fedorov 已提交
1685 1686 1687 1688 1689

	/// Возможно, среди неизвестных столбцов есть виртуальные. Удаляем их из списка неизвестных и добавляем
	/// в columns list, чтобы при дальнейшей обработке запроса они воспринимались как настоящие.
	for (NameSet::iterator it = unknown_required_columns.begin(); it != unknown_required_columns.end();)
	{
S
Merge  
Sergey Fedorov 已提交
1690
		if (storage && storage->hasColumn(*it))
S
Merge  
Sergey Fedorov 已提交
1691
		{
S
Merge  
Sergey Fedorov 已提交
1692 1693
			columns.push_back(storage->getColumn(*it));
			unknown_required_columns.erase(it++);
A
Alexey Milovidov 已提交
1694 1695
		}
		else
S
Merge  
Sergey Fedorov 已提交
1696
			++it;
S
Merge  
Sergey Fedorov 已提交
1697
	}
1698 1699
}

1700
void ExpressionAnalyzer::collectJoinedColumns(NameSet & joined_columns, NamesAndTypesList & joined_columns_name_type)
1701 1702 1703 1704
{
	if (!select_query || !select_query->join)
		return;

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

1709
	size_t num_join_keys = keys.children.size();
1710 1711

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

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

1720
	Block nested_result_sample = ExpressionAnalyzer(table, context, subquery_depth + 1).getSelectSampleBlock();
1721

1722 1723
	size_t nested_result_columns = nested_result_sample.columns();
	for (size_t i = 0; i < nested_result_columns; ++i)
1724
	{
1725
		auto col = nested_result_sample.getByPosition(i);
1726
		if (!join_key_names_right_set.count(col.name))
1727
		{
1728 1729
			joined_columns.insert(col.name);
			joined_columns_name_type.emplace_back(col.name, col.type);
1730
		}
1731
	}
1732

1733
/*	for (const auto & name : join_key_names_left_set)
1734 1735 1736
		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;
1737 1738 1739
	std::cerr << std::endl;
	for (const auto & name : joined_columns)
		std::cerr << "JOINed column: " << name << std::endl;
1740
	std::cerr << std::endl;*/
1741 1742
}

1743 1744
Names ExpressionAnalyzer::getRequiredColumns()
{
M
Merge  
Michael Kolupaev 已提交
1745 1746
	if (!unknown_required_columns.empty())
		throw Exception("Unknown identifier: " + *unknown_required_columns.begin(), ErrorCodes::UNKNOWN_IDENTIFIER);
1747

1748
	Names res;
1749
	for (const auto & column_name_type : columns)
1750
		res.push_back(column_name_type.name);
A
Alexey Milovidov 已提交
1751

1752 1753 1754
	return res;
}

1755 1756 1757
void ExpressionAnalyzer::getRequiredColumnsImpl(ASTPtr ast,
	NameSet & required_columns, NameSet & ignored_names,
	const NameSet & available_joined_columns, NameSet & required_joined_columns)
1758
{
1759 1760 1761 1762 1763
	/** Найдём все идентификаторы в запросе.
	  * Будем искать их рекурсивно, обходя в глубину AST.
	  * При этом:
	  * - для лямбда функций не будем брать формальные параметры;
	  * - не опускаемся в подзапросы (там свои идентификаторы);
1764 1765
	  * - некоторое исключение для секции ARRAY JOIN (в ней идентификаторы немного другие);
	  * - идентификаторы, доступные из JOIN-а, кладём в required_joined_columns.
1766 1767
	  */

1768
	if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(&*ast))
1769
	{
1770 1771 1772
		if (node->kind == ASTIdentifier::Column
			&& !ignored_names.count(node->name)
			&& !ignored_names.count(DataTypeNested::extractNestedTableName(node->name)))
1773
		{
1774 1775 1776 1777
			if (!available_joined_columns.count(node->name))
				required_columns.insert(node->name);
			else
				required_joined_columns.insert(node->name);
1778
		}
A
Alexey Milovidov 已提交
1779

1780 1781
		return;
	}
1782

1783
	if (ASTFunction * node = typeid_cast<ASTFunction *>(&*ast))
1784 1785 1786 1787 1788
	{
		if (node->kind == ASTFunction::LAMBDA_EXPRESSION)
		{
			if (node->arguments->children.size() != 2)
				throw Exception("lambda requires two arguments", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
1789

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

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

1795
			/// Не нужно добавлять формальные параметры лямбда-выражения в required_columns.
1796
			Names added_ignored;
1797
			for (auto & child : lambda_args_tuple->arguments->children)
1798
			{
1799
				ASTIdentifier * identifier = typeid_cast<ASTIdentifier *>(&*child);
1800 1801
				if (!identifier)
					throw Exception("lambda argument declarations must be identifiers", ErrorCodes::TYPE_MISMATCH);
1802 1803

				String & name = identifier->name;
1804 1805 1806 1807 1808 1809
				if (!ignored_names.count(name))
				{
					ignored_names.insert(name);
					added_ignored.push_back(name);
				}
			}
1810

1811
			getRequiredColumnsImpl(node->arguments->children.at(1),
1812 1813
				required_columns, ignored_names,
				available_joined_columns, required_joined_columns);
1814

1815 1816
			for (size_t i = 0; i < added_ignored.size(); ++i)
				ignored_names.erase(added_ignored[i]);
1817

1818 1819 1820
			return;
		}
	}
1821

1822
	ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(&*ast);
1823

1824 1825
	/// Рекурсивный обход выражения.
	for (auto & child : ast->children)
1826
	{
1827
		/** Не пойдем в секцию ARRAY JOIN, потому что там нужно смотреть на имена не-ARRAY-JOIN-енных столбцов.
1828
		  * Туда collectUsedColumns отправит нас отдельно.
1829
		  */
1830
		if (!typeid_cast<ASTSubquery *>(&*child) && !typeid_cast<ASTSelectQuery *>(&*child) &&
1831
			!(select && child == select->array_join_expression_list))
1832
			getRequiredColumnsImpl(child, required_columns, ignored_names, available_joined_columns, required_joined_columns);
1833
    }
1834 1835
}

1836
}