1//===----------------------------------------------------------------------===//
2// DuckDB
3//
4// duckdb/parser/query_node/select_node.hpp
5//
6//
7//===----------------------------------------------------------------------===//
8
9#pragma once
10
11#include "duckdb/parser/parsed_expression.hpp"
12#include "duckdb/parser/query_node.hpp"
13#include "duckdb/parser/sql_statement.hpp"
14#include "duckdb/parser/tableref.hpp"
15#include "duckdb/parser/parsed_data/sample_options.hpp"
16#include "duckdb/parser/group_by_node.hpp"
17#include "duckdb/common/enums/aggregate_handling.hpp"
18
19namespace duckdb {
20
21//! SelectNode represents a standard SELECT statement
22class SelectNode : public QueryNode {
23public:
24 static constexpr const QueryNodeType TYPE = QueryNodeType::SELECT_NODE;
25
26public:
27 DUCKDB_API SelectNode();
28
29 //! The projection list
30 vector<unique_ptr<ParsedExpression>> select_list;
31 //! The FROM clause
32 unique_ptr<TableRef> from_table;
33 //! The WHERE clause
34 unique_ptr<ParsedExpression> where_clause;
35 //! list of groups
36 GroupByNode groups;
37 //! HAVING clause
38 unique_ptr<ParsedExpression> having;
39 //! QUALIFY clause
40 unique_ptr<ParsedExpression> qualify;
41 //! Aggregate handling during binding
42 AggregateHandling aggregate_handling;
43 //! The SAMPLE clause
44 unique_ptr<SampleOptions> sample;
45
46 const vector<unique_ptr<ParsedExpression>> &GetSelectList() const override {
47 return select_list;
48 }
49
50public:
51 //! Convert the query node to a string
52 string ToString() const override;
53
54 bool Equals(const QueryNode *other) const override;
55
56 //! Create a copy of this SelectNode
57 unique_ptr<QueryNode> Copy() const override;
58
59 //! Serializes a QueryNode to a stand-alone binary blob
60 void Serialize(FieldWriter &writer) const override;
61
62 //! Deserializes a blob back into a QueryNode
63 static unique_ptr<QueryNode> Deserialize(FieldReader &reader);
64
65 void FormatSerialize(FormatSerializer &serializer) const override;
66 static unique_ptr<QueryNode> FormatDeserialize(FormatDeserializer &deserializer);
67};
68
69} // namespace duckdb
70