ClickHouse/dbms/include/DB/Parsers/ASTSelectQuery.h
2016-03-07 04:08:01 +03:00

84 lines
3.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <DB/Parsers/IAST.h>
#include <DB/Parsers/ASTQueryWithOutput.h>
#include <DB/Parsers/ASTExpressionList.h>
#include <DB/Parsers/ASTFunction.h>
#include <DB/Parsers/ASTAsterisk.h>
namespace DB
{
/** SELECT запрос
*/
class ASTSelectQuery : public ASTQueryWithOutput
{
public:
ASTSelectQuery() = default;
ASTSelectQuery(const StringRange range_);
/** Получить текст, который идентифицирует этот элемент. */
String getID() const override { return "SelectQuery"; };
/// Проверить наличие функции arrayJoin. (Не большого ARRAY JOIN.)
static bool hasArrayJoin(const ASTPtr & ast);
/// Содержит ли запрос астериск?
bool hasAsterisk() const;
/// Переименовать столбцы запроса в такие же имена, как в исходном запросе.
void renameColumns(const ASTSelectQuery & source);
/// Переписывает select_expression_list, чтобы вернуть только необходимые столбцы в правильном порядке.
void rewriteSelectExpressionList(const Names & column_names);
bool isUnionAllHead() const { return (prev_union_all == nullptr) && !next_union_all.isNull(); }
ASTPtr clone() const override;
/// Получить глубокую копию дерева первого запроса SELECT.
ASTPtr cloneFirstSelect() const;
/// Возвращает указатель на формат из последнего SELECT'а цепочки UNION ALL.
const IAST * getFormat() const override;
private:
ASTPtr cloneImpl(bool traverse_union_all) const;
public:
bool distinct = false;
ASTPtr select_expression_list;
ASTPtr database;
ASTPtr table; /// Имя таблицы, табличная функция или подзапрос (рекурсивно ASTSelectQuery)
bool array_join_is_left = false; /// LEFT ARRAY JOIN
ASTPtr array_join_expression_list; /// ARRAY JOIN
ASTPtr join; /// Обычный (не ARRAY) JOIN.
bool final = false;
ASTPtr sample_size;
ASTPtr sample_offset;
ASTPtr prewhere_expression;
ASTPtr where_expression;
ASTPtr group_expression_list;
bool group_by_with_totals = false;
ASTPtr having_expression;
ASTPtr order_expression_list;
ASTPtr limit_offset;
ASTPtr limit_length;
ASTPtr settings;
/// Двусвязный список запросов SELECT внутри запроса UNION ALL.
/// Следующий запрос SELECT в цепочке UNION ALL, если такой есть
ASTPtr next_union_all;
/// Предыдущий запрос SELECT в цепочке UNION ALL (не вставляется в children и не клонируется)
/// Указатель голый по следующим двум причинам:
/// 1. чтобы предотвратить появление циклических зависимостей и, значит, утечки памяти;
/// 2. библиотека Poco не поддерживает указателей наподобие std::weak_ptr.
IAST * prev_union_all = nullptr;
protected:
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;
};
}