2013-05-24 10:49:19 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <DB/Parsers/IAST.h>
|
|
|
|
|
#include <DB/Parsers/ASTFunction.h>
|
|
|
|
|
#include <DB/Parsers/ASTExpressionList.h>
|
|
|
|
|
#include <DB/Parsers/ASTSelectQuery.h>
|
|
|
|
|
|
|
|
|
|
#include <DB/Interpreters/Context.h>
|
2014-12-30 12:58:02 +00:00
|
|
|
|
#include <DB/Interpreters/AggregateDescription.h>
|
2013-05-24 10:49:19 +00:00
|
|
|
|
#include <DB/Interpreters/ExpressionActions.h>
|
2014-06-12 04:04:47 +00:00
|
|
|
|
#include <DB/Interpreters/Set.h>
|
|
|
|
|
#include <DB/Interpreters/Join.h>
|
2013-05-24 10:49:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
2014-07-06 19:48:39 +00:00
|
|
|
|
|
|
|
|
|
/** Информация о том, что делать при выполнении подзапроса в секции [GLOBAL] IN/JOIN.
|
|
|
|
|
*/
|
|
|
|
|
struct SubqueryForSet
|
|
|
|
|
{
|
|
|
|
|
/// Источник - получен с помощью InterpreterSelectQuery подзапроса.
|
|
|
|
|
BlockInputStreamPtr source;
|
2015-05-27 00:55:54 +00:00
|
|
|
|
Block source_sample;
|
2014-07-06 19:48:39 +00:00
|
|
|
|
|
|
|
|
|
/// Если задано - создать из результата Set.
|
|
|
|
|
SetPtr set;
|
|
|
|
|
|
|
|
|
|
/// Если задано - создать из результата Join.
|
|
|
|
|
JoinPtr join;
|
|
|
|
|
|
|
|
|
|
/// Если задано - положить результат в таблицу.
|
|
|
|
|
/// Это - временная таблица для передачи на удалённые серверы при распределённой обработке запроса.
|
|
|
|
|
StoragePtr table;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/// ID подзапроса -> что с ним делать.
|
|
|
|
|
typedef std::unordered_map<String, SubqueryForSet> SubqueriesForSets;
|
|
|
|
|
|
|
|
|
|
|
2013-05-24 10:49:19 +00:00
|
|
|
|
/** Превращает выражение из синтаксического дерева в последовательность действий для его выполнения.
|
2014-03-19 11:44:41 +00:00
|
|
|
|
*
|
|
|
|
|
* NOTE: если ast - запрос SELECT из таблицы, структура этой таблицы не должна меняться во все время жизни ExpressionAnalyzer-а.
|
2013-05-24 10:49:19 +00:00
|
|
|
|
*/
|
|
|
|
|
class ExpressionAnalyzer : private boost::noncopyable
|
|
|
|
|
{
|
|
|
|
|
public:
|
2015-07-15 01:26:35 +00:00
|
|
|
|
ExpressionAnalyzer(
|
|
|
|
|
const ASTPtr & ast_,
|
|
|
|
|
const Context & context_,
|
|
|
|
|
StoragePtr storage_,
|
|
|
|
|
const NamesAndTypesList & columns_,
|
|
|
|
|
size_t subquery_depth_ = 0,
|
|
|
|
|
bool do_global_ = false)
|
|
|
|
|
:
|
|
|
|
|
ast(ast_), context(context_), settings(context.getSettings()),
|
|
|
|
|
subquery_depth(subquery_depth_), columns(columns_),
|
|
|
|
|
storage(storage_ ? storage_ : getTable()),
|
|
|
|
|
do_global(do_global_)
|
2013-05-24 10:49:19 +00:00
|
|
|
|
{
|
|
|
|
|
init();
|
|
|
|
|
}
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-05-28 11:54:37 +00:00
|
|
|
|
/// Есть ли в выражении агрегатные функции или секция GROUP BY или HAVING.
|
2015-04-18 22:30:43 +00:00
|
|
|
|
bool hasAggregation() const { return has_aggregation; }
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-05-28 11:54:37 +00:00
|
|
|
|
/// Получить список ключей агрегирования и описаний агрегатных функций, если в запросе есть GROUP BY.
|
2015-04-18 22:30:43 +00:00
|
|
|
|
void getAggregateInfo(Names & key_names, AggregateDescriptions & aggregates) const;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-06-12 19:23:06 +00:00
|
|
|
|
/** Получить набор столбцов, которых достаточно прочитать из таблицы для вычисления выражения.
|
|
|
|
|
* Не учитываются столбцы, добавляемые из другой таблицы путём JOIN-а.
|
|
|
|
|
*/
|
2013-05-30 16:52:21 +00:00
|
|
|
|
Names getRequiredColumns();
|
2014-03-04 11:26:55 +00:00
|
|
|
|
|
2013-05-28 14:24:20 +00:00
|
|
|
|
/** Эти методы позволяют собрать цепочку преобразований над блоком, получающую значения в нужных секциях запроса.
|
|
|
|
|
*
|
|
|
|
|
* Пример использования:
|
|
|
|
|
* ExpressionActionsChain chain;
|
|
|
|
|
* analyzer.appendWhere(chain);
|
|
|
|
|
* chain.addStep();
|
|
|
|
|
* analyzer.appendSelect(chain);
|
|
|
|
|
* analyzer.appendOrderBy(chain);
|
|
|
|
|
* chain.finalize();
|
2014-03-28 12:13:58 +00:00
|
|
|
|
*
|
2014-07-06 19:48:39 +00:00
|
|
|
|
* Если указано only_types = true, не выполняет подзапросы в соответствующих частях запроса. Полученные таким
|
2014-03-28 12:13:58 +00:00
|
|
|
|
* образом действия не следует выполнять, они нужны только чтобы получить список столбцов с их типами.
|
2013-05-28 14:24:20 +00:00
|
|
|
|
*/
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-05-28 11:54:37 +00:00
|
|
|
|
/// До агрегации:
|
2014-03-28 12:13:58 +00:00
|
|
|
|
bool appendArrayJoin(ExpressionActionsChain & chain, bool only_types);
|
2014-06-13 02:05:05 +00:00
|
|
|
|
bool appendJoin(ExpressionActionsChain & chain, bool only_types);
|
2014-03-28 12:13:58 +00:00
|
|
|
|
bool appendWhere(ExpressionActionsChain & chain, bool only_types);
|
|
|
|
|
bool appendGroupBy(ExpressionActionsChain & chain, bool only_types);
|
|
|
|
|
void appendAggregateFunctionsArguments(ExpressionActionsChain & chain, bool only_types);
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-05-28 11:54:37 +00:00
|
|
|
|
/// После агрегации:
|
2014-03-28 12:13:58 +00:00
|
|
|
|
bool appendHaving(ExpressionActionsChain & chain, bool only_types);
|
|
|
|
|
void appendSelect(ExpressionActionsChain & chain, bool only_types);
|
|
|
|
|
bool appendOrderBy(ExpressionActionsChain & chain, bool only_types);
|
2013-05-28 14:24:20 +00:00
|
|
|
|
/// Удаляет все столбцы кроме выбираемых SELECT, упорядочивает оставшиеся столбцы и переименовывает их в алиасы.
|
2015-04-18 22:30:43 +00:00
|
|
|
|
void appendProjectResult(ExpressionActionsChain & chain, bool only_types) const;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-05-28 11:54:37 +00:00
|
|
|
|
/// Если ast не запрос SELECT, просто получает все действия для вычисления выражения.
|
2013-06-03 13:17:17 +00:00
|
|
|
|
/// Если project_result, в выходном блоке останутся только вычисленные значения в нужном порядке, переименованные в алиасы.
|
|
|
|
|
/// Иначе, из блока будут удаляться только временные столбцы.
|
|
|
|
|
ExpressionActionsPtr getActions(bool project_result);
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-05-24 10:49:19 +00:00
|
|
|
|
/// Действия, которые можно сделать над пустым блоком: добавление констант и применение функций, зависящих только от констант.
|
|
|
|
|
/// Не выполняет подзапросы.
|
|
|
|
|
ExpressionActionsPtr getConstActions();
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-03-04 11:26:55 +00:00
|
|
|
|
/** Множества, для создания которых нужно будет выполнить подзапрос.
|
|
|
|
|
* Только множества, нужные для выполнения действий, возвращенных из уже вызванных append* или getActions.
|
2014-07-06 19:48:39 +00:00
|
|
|
|
* То есть, нужно вызвать getSetsWithSubqueries после всех вызовов append* или getActions
|
|
|
|
|
* и создать все возвращенные множества перед выполнением действий.
|
|
|
|
|
*/
|
2014-07-06 20:46:17 +00:00
|
|
|
|
SubqueriesForSets getSubqueriesForSets() { return subqueries_for_sets; }
|
2014-07-06 19:48:39 +00:00
|
|
|
|
|
|
|
|
|
/** Таблицы, которые надо будет отправить на удалённые серверы при распределённой обработке запроса.
|
2014-03-04 11:26:55 +00:00
|
|
|
|
*/
|
2015-04-18 22:30:43 +00:00
|
|
|
|
const Tables & getExternalTables() const { return external_tables; }
|
2014-03-04 11:26:55 +00:00
|
|
|
|
|
2013-05-30 16:52:21 +00:00
|
|
|
|
/// Если ast - запрос SELECT, получает имена (алиасы) и типы столбцов из секции SELECT.
|
|
|
|
|
Block getSelectSampleBlock();
|
2013-05-24 10:49:19 +00:00
|
|
|
|
|
2014-07-06 19:48:39 +00:00
|
|
|
|
/// Создаем какие сможем Set из секции IN для использования индекса по ним.
|
2014-04-10 08:57:01 +00:00
|
|
|
|
void makeSetsForIndex();
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-06-12 21:12:47 +00:00
|
|
|
|
private:
|
2013-05-24 10:49:19 +00:00
|
|
|
|
ASTPtr ast;
|
|
|
|
|
ASTSelectQuery * select_query;
|
|
|
|
|
const Context & context;
|
|
|
|
|
Settings settings;
|
2013-05-29 11:46:51 +00:00
|
|
|
|
size_t subquery_depth;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-06-21 10:31:31 +00:00
|
|
|
|
/// Столбцы, которые упоминаются в выражении, но не были заданы в конструкторе.
|
|
|
|
|
NameSet unknown_required_columns;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-06-12 19:53:36 +00:00
|
|
|
|
/** Исходные столбцы.
|
|
|
|
|
* Сначала сюда помещаются все доступные столбцы таблицы. Затем (при разборе запроса) удаляются неиспользуемые столбцы.
|
|
|
|
|
*/
|
2013-05-24 10:49:19 +00:00
|
|
|
|
NamesAndTypesList columns;
|
2014-06-12 19:53:36 +00:00
|
|
|
|
|
2015-01-30 21:19:35 +00:00
|
|
|
|
/// Столбцы после ARRAY JOIN, JOIN и/или агрегации.
|
2013-05-29 11:46:51 +00:00
|
|
|
|
NamesAndTypesList aggregated_columns;
|
2013-10-17 13:32:32 +00:00
|
|
|
|
|
2014-06-12 19:23:06 +00:00
|
|
|
|
/// Таблица, из которой делается запрос.
|
2013-05-24 10:49:19 +00:00
|
|
|
|
const StoragePtr storage;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-06-12 21:12:47 +00:00
|
|
|
|
bool has_aggregation = false;
|
2013-05-24 10:49:19 +00:00
|
|
|
|
NamesAndTypesList aggregation_keys;
|
|
|
|
|
AggregateDescriptions aggregate_descriptions;
|
2014-03-04 11:26:55 +00:00
|
|
|
|
|
2014-07-06 19:48:39 +00:00
|
|
|
|
SubqueriesForSets subqueries_for_sets;
|
2014-06-13 06:39:15 +00:00
|
|
|
|
|
2014-06-18 18:31:35 +00:00
|
|
|
|
/// NOTE: Пока поддерживается только один JOIN на запрос.
|
2014-07-02 20:23:48 +00:00
|
|
|
|
|
|
|
|
|
/** Запрос вида SELECT expr(x) AS k FROM t1 ANY LEFT JOIN (SELECT expr(x) AS k FROM t2) USING k
|
|
|
|
|
* Соединение делается по столбцу k.
|
|
|
|
|
* Во время JOIN-а,
|
|
|
|
|
* - в "правой" таблице, он будет доступен по алиасу k, так как было выполнено действие Project для подзапроса.
|
|
|
|
|
* - в "левой" таблице, он будет доступен по имени expr(x), так как ещё не было выполнено действие Project.
|
|
|
|
|
* Надо запомнить оба этих варианта.
|
|
|
|
|
*/
|
|
|
|
|
NameSet join_key_names_left_set;
|
|
|
|
|
NameSet join_key_names_right_set;
|
|
|
|
|
|
2014-06-13 02:05:05 +00:00
|
|
|
|
NamesAndTypesList columns_added_by_join;
|
2014-06-12 04:04:47 +00:00
|
|
|
|
|
|
|
|
|
typedef std::unordered_map<String, ASTPtr> Aliases;
|
2013-05-24 10:49:19 +00:00
|
|
|
|
Aliases aliases;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-06-15 07:10:06 +00:00
|
|
|
|
typedef std::set<const IAST *> SetOfASTs;
|
2013-05-24 10:49:19 +00:00
|
|
|
|
typedef std::map<ASTPtr, ASTPtr> MapOfASTs;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-10-21 11:33:25 +00:00
|
|
|
|
/// Какой столбец нужно по-ARRAY-JOIN-ить, чтобы получить указанный.
|
2014-06-11 22:36:55 +00:00
|
|
|
|
/// Например, для SELECT s.v ... ARRAY JOIN a AS s сюда попадет "s.v" -> "a.v".
|
2013-10-21 11:33:25 +00:00
|
|
|
|
NameToNameMap array_join_result_to_source;
|
|
|
|
|
|
2014-06-11 22:36:55 +00:00
|
|
|
|
/// Для секции ARRAY JOIN отображение из алиаса в полное имя столбца.
|
|
|
|
|
/// Например, для ARRAY JOIN [1,2] AS b сюда попадет "b" -> "array(1,2)".
|
2013-10-21 11:33:25 +00:00
|
|
|
|
NameToNameMap array_join_alias_to_name;
|
2014-04-29 14:21:53 +00:00
|
|
|
|
|
2014-06-12 21:12:47 +00:00
|
|
|
|
/// Нужно ли подготавливать к выполнению глобальные подзапросы при анализировании запроса.
|
2014-04-29 14:21:53 +00:00
|
|
|
|
bool do_global;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-07-04 20:30:06 +00:00
|
|
|
|
/// Все новые временные таблицы, полученные при выполнении подзапросов GLOBAL IN/JOIN.
|
|
|
|
|
Tables external_tables;
|
|
|
|
|
size_t external_table_id = 1;
|
|
|
|
|
|
|
|
|
|
|
2013-05-24 10:49:19 +00:00
|
|
|
|
void init();
|
|
|
|
|
|
2014-06-12 21:17:03 +00:00
|
|
|
|
static NamesAndTypesList::iterator findColumn(const String & name, NamesAndTypesList & cols);
|
2013-05-29 11:46:51 +00:00
|
|
|
|
NamesAndTypesList::iterator findColumn(const String & name) { return findColumn(name, columns); }
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-06-12 23:21:38 +00:00
|
|
|
|
/** Из списка всех доступных столбцов таблицы (columns) удалить все ненужные.
|
2014-07-04 19:13:38 +00:00
|
|
|
|
* Заодно, сформировать множество неизвестных столбцов (unknown_required_columns),
|
|
|
|
|
* а также столбцов, добавленных JOIN-ом (columns_added_by_join).
|
2014-06-12 23:21:38 +00:00
|
|
|
|
*/
|
2014-07-04 19:13:38 +00:00
|
|
|
|
void collectUsedColumns();
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-06-13 06:39:15 +00:00
|
|
|
|
/** Найти столбцы, получаемые путём JOIN-а.
|
2014-06-12 23:21:38 +00:00
|
|
|
|
*/
|
2014-06-13 06:39:15 +00:00
|
|
|
|
void collectJoinedColumns(NameSet & joined_columns, NamesAndTypesList & joined_columns_name_type);
|
2014-06-12 23:21:38 +00:00
|
|
|
|
|
2014-10-03 15:30:10 +00:00
|
|
|
|
void addStorageAliases();
|
|
|
|
|
|
2013-05-24 10:49:19 +00:00
|
|
|
|
/** Создать словарь алиасов.
|
|
|
|
|
*/
|
2014-10-03 15:30:10 +00:00
|
|
|
|
void addASTAliases(ASTPtr & ast, int ignore_levels = 0);
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-05-24 10:49:19 +00:00
|
|
|
|
/** Для узлов-звёздочек - раскрыть их в список всех столбцов.
|
|
|
|
|
* Для узлов-литералов - подставить алиасы.
|
|
|
|
|
*/
|
|
|
|
|
void normalizeTree();
|
2014-06-12 19:23:06 +00:00
|
|
|
|
void normalizeTreeImpl(ASTPtr & ast, MapOfASTs & finished_asts, SetOfASTs & current_asts, std::string current_alias);
|
2014-03-14 14:52:48 +00:00
|
|
|
|
|
2014-08-04 15:25:38 +00:00
|
|
|
|
/// Eliminates injective function calls and constant expressions from group by statement
|
|
|
|
|
void optimizeGroupBy();
|
2014-07-31 07:24:07 +00:00
|
|
|
|
|
2015-03-12 03:31:15 +00:00
|
|
|
|
/// Удалить из ORDER BY повторяющиеся элементы.
|
|
|
|
|
void optimizeOrderBy();
|
|
|
|
|
|
2013-05-29 11:46:51 +00:00
|
|
|
|
/// Превратить перечисление значений или подзапрос в ASTSet. node - функция in или notIn.
|
2013-06-11 16:21:25 +00:00
|
|
|
|
void makeSet(ASTFunction * node, const Block & sample_block);
|
2014-06-12 21:12:47 +00:00
|
|
|
|
|
2015-07-25 11:47:50 +00:00
|
|
|
|
/// Замена скалярных подзапросов на значения-константы.
|
|
|
|
|
void executeScalarSubqueries();
|
|
|
|
|
void executeScalarSubqueriesImpl(ASTPtr & ast);
|
|
|
|
|
|
2014-07-06 19:48:39 +00:00
|
|
|
|
/// Находит глобальные подзапросы в секциях GLOBAL IN/JOIN. Заполняет external_tables.
|
2014-07-04 20:30:06 +00:00
|
|
|
|
void initGlobalSubqueriesAndExternalTables();
|
|
|
|
|
void initGlobalSubqueries(ASTPtr & ast);
|
|
|
|
|
|
|
|
|
|
/// Находит в запросе использования внешних таблиц (в виде идентификаторов таблиц). Заполняет external_tables.
|
|
|
|
|
void findExternalTables(ASTPtr & ast);
|
|
|
|
|
|
|
|
|
|
/** Инициализировать InterpreterSelectQuery для подзапроса в секции GLOBAL IN/JOIN,
|
2014-07-06 19:48:39 +00:00
|
|
|
|
* создать временную таблицу типа Memory и запомнить это в словаре external_tables.
|
2014-07-04 20:30:06 +00:00
|
|
|
|
*/
|
2014-07-04 01:40:22 +00:00
|
|
|
|
void addExternalStorage(ASTPtr & subquery_or_table_name);
|
2014-03-14 14:52:48 +00:00
|
|
|
|
|
2013-08-01 13:29:32 +00:00
|
|
|
|
void getArrayJoinedColumns();
|
|
|
|
|
void getArrayJoinedColumnsImpl(ASTPtr ast);
|
2015-04-18 22:30:43 +00:00
|
|
|
|
void addMultipleArrayJoinAction(ExpressionActionsPtr & actions) const;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2015-04-18 22:30:43 +00:00
|
|
|
|
void addJoinAction(ExpressionActionsPtr & actions, bool only_types) const;
|
2014-06-13 02:05:05 +00:00
|
|
|
|
|
2014-06-12 19:53:36 +00:00
|
|
|
|
struct ScopeStack;
|
2013-07-26 16:11:31 +00:00
|
|
|
|
void getActionsImpl(ASTPtr ast, bool no_subqueries, bool only_consts, ScopeStack & actions_stack);
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-07-04 01:40:22 +00:00
|
|
|
|
void getRootActions(ASTPtr ast, bool no_subqueries, bool only_consts, ExpressionActionsPtr & actions);
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-07-04 01:40:22 +00:00
|
|
|
|
void getActionsBeforeAggregation(ASTPtr ast, ExpressionActionsPtr & actions, bool no_subqueries);
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-07-04 19:13:38 +00:00
|
|
|
|
/** Добавить ключи агрегации в aggregation_keys, агрегатные функции в aggregate_descriptions,
|
|
|
|
|
* Создать набор столбцов aggregated_columns, получаемых после агрегации, если она есть,
|
|
|
|
|
* или после всех действий, которые обычно выполняются до агрегации.
|
|
|
|
|
* Установить has_aggregation = true, если есть GROUP BY или хотя бы одна агрегатная функция.
|
|
|
|
|
*/
|
|
|
|
|
void analyzeAggregation();
|
2014-07-04 01:40:22 +00:00
|
|
|
|
void getAggregates(ASTPtr ast, ExpressionActionsPtr & actions);
|
2013-10-17 13:32:32 +00:00
|
|
|
|
|
2014-06-13 06:39:15 +00:00
|
|
|
|
/** Получить множество нужных столбцов для чтения из таблицы.
|
|
|
|
|
* При этом, столбцы, указанные в ignored_names, считаются ненужными. И параметр ignored_names может модифицироваться.
|
|
|
|
|
* Множество столбцов available_joined_columns - столбцы, доступные из JOIN-а, они не нужны для чтения из основной таблицы.
|
|
|
|
|
* Положить в required_joined_columns множество столбцов, доступных из JOIN-а и востребованных.
|
|
|
|
|
*/
|
|
|
|
|
void getRequiredColumnsImpl(ASTPtr ast,
|
|
|
|
|
NameSet & required_columns, NameSet & ignored_names,
|
|
|
|
|
const NameSet & available_joined_columns, NameSet & required_joined_columns);
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2013-05-24 10:49:19 +00:00
|
|
|
|
/// Получить таблицу, из которой идет запрос
|
|
|
|
|
StoragePtr getTable();
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2014-06-13 02:05:05 +00:00
|
|
|
|
/// columns - столбцы, присутствующие до начала преобразований.
|
2015-04-18 22:30:43 +00:00
|
|
|
|
void initChain(ExpressionActionsChain & chain, const NamesAndTypesList & columns) const;
|
2014-06-12 18:41:09 +00:00
|
|
|
|
|
2015-04-18 22:30:43 +00:00
|
|
|
|
void assertSelect() const;
|
|
|
|
|
void assertAggregation() const;
|
2014-03-31 14:49:43 +00:00
|
|
|
|
|
2014-06-12 21:12:47 +00:00
|
|
|
|
/** Создать Set из явного перечисления значений в запросе.
|
|
|
|
|
* Если create_ordered_set = true - создать структуру данных, подходящую для использования индекса.
|
|
|
|
|
*/
|
2014-04-01 10:09:22 +00:00
|
|
|
|
void makeExplicitSet(ASTFunction * node, const Block & sample_block, bool create_ordered_set);
|
2014-06-12 21:12:47 +00:00
|
|
|
|
void makeSetsForIndexImpl(ASTPtr & node, const Block & sample_block);
|
2013-05-24 10:49:19 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}
|