ClickHouse/dbms/include/DB/Parsers/ASTSelectQuery.h

92 lines
3.2 KiB
C++
Raw Normal View History

2011-08-28 00:31:30 +00:00
#pragma once
2010-06-24 19:12:10 +00:00
#include <DB/Parsers/IAST.h>
#include <DB/Parsers/ASTQueryWithOutput.h>
2016-11-20 12:43:20 +00:00
#include <DB/Core/Names.h>
2010-06-24 19:12:10 +00:00
namespace DB
{
2016-08-07 16:17:57 +00:00
struct ASTTablesInSelectQueryElement;
/** SELECT query
2010-06-24 19:12:10 +00:00
*/
class ASTSelectQuery : public ASTQueryWithOutput
2010-06-24 19:12:10 +00:00
{
2015-06-02 11:16:02 +00:00
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, чтобы вернуть только необходимые столбцы в правильном порядке.
2016-10-24 03:07:58 +00:00
void rewriteSelectExpressionList(const Names & required_column_names);
2015-06-02 11:16:02 +00:00
bool isUnionAllHead() const { return (prev_union_all == nullptr) && next_union_all != nullptr; }
2015-06-02 11:16:02 +00:00
ASTPtr clone() const override;
/// Получить глубокую копию дерева первого запроса SELECT.
ASTPtr cloneFirstSelect() const;
2015-06-25 17:38:54 +00:00
/// Возвращает указатель на формат из последнего SELECT'а цепочки UNION ALL.
const IAST * getFormat() const override;
private:
ASTPtr cloneImpl(bool traverse_union_all) const;
2010-06-24 19:12:10 +00:00
public:
bool distinct = false;
2011-08-28 00:31:30 +00:00
ASTPtr select_expression_list;
2016-07-18 00:14:24 +00:00
ASTPtr tables;
ASTPtr prewhere_expression;
2011-08-28 00:31:30 +00:00
ASTPtr where_expression;
ASTPtr group_expression_list;
bool group_by_with_totals = false;
2011-08-28 00:31:30 +00:00
ASTPtr having_expression;
ASTPtr order_expression_list;
2016-12-27 14:08:33 +00:00
ASTPtr limit_by_value;
ASTPtr limit_by_expression_list;
2011-08-28 00:31:30 +00:00
ASTPtr limit_offset;
ASTPtr limit_length;
ASTPtr settings;
/// Compatibility with old parser of tables list. TODO remove
ASTPtr database() const;
ASTPtr table() const;
ASTPtr sample_size() const;
ASTPtr sample_offset() const;
ASTPtr array_join_expression_list() const;
const ASTTablesInSelectQueryElement * join() const;
bool array_join_is_left() const;
bool final() const;
void setDatabaseIfNeeded(const String & database_name);
void replaceDatabaseAndTable(const String & database_name, const String & table_name);
2016-07-18 00:14:24 +00:00
/// Двусвязный список запросов SELECT внутри запроса UNION ALL.
/// Следующий запрос SELECT в цепочке UNION ALL, если такой есть
ASTPtr next_union_all;
/// Предыдущий запрос SELECT в цепочке UNION ALL (не вставляется в children и не клонируется)
/// Указатель голый по следующим причинам:
/// 1. чтобы предотвратить появление циклических зависимостей и, значит, утечки памяти;
IAST * prev_union_all = nullptr;
protected:
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;
2010-06-24 19:12:10 +00:00
};
}