1//===----------------------------------------------------------------------===//
2// DuckDB
3//
4// duckdb/parser/tableref/joinref.hpp
5//
6//
7//===----------------------------------------------------------------------===//
8
9#pragma once
10
11#include "duckdb/common/enums/join_type.hpp"
12#include "duckdb/common/enums/joinref_type.hpp"
13#include "duckdb/common/unordered_set.hpp"
14#include "duckdb/parser/parsed_expression.hpp"
15#include "duckdb/parser/tableref.hpp"
16#include "duckdb/common/vector.hpp"
17
18namespace duckdb {
19
20//! Represents a JOIN between two expressions
21class JoinRef : public TableRef {
22public:
23 static constexpr const TableReferenceType TYPE = TableReferenceType::JOIN;
24
25public:
26 explicit JoinRef(JoinRefType ref_type)
27 : TableRef(TableReferenceType::JOIN), type(JoinType::INNER), ref_type(ref_type) {
28 }
29
30 //! The left hand side of the join
31 unique_ptr<TableRef> left;
32 //! The right hand side of the join
33 unique_ptr<TableRef> right;
34 //! The join condition
35 unique_ptr<ParsedExpression> condition;
36 //! The join type
37 JoinType type;
38 //! Join condition type
39 JoinRefType ref_type;
40 //! The set of USING columns (if any)
41 vector<string> using_columns;
42
43public:
44 string ToString() const override;
45 bool Equals(const TableRef &other_p) const override;
46
47 unique_ptr<TableRef> Copy() override;
48
49 //! Serializes a blob into a JoinRef
50 void Serialize(FieldWriter &serializer) const override;
51 //! Deserializes a blob back into a JoinRef
52 static unique_ptr<TableRef> Deserialize(FieldReader &source);
53
54 void FormatSerialize(FormatSerializer &serializer) const override;
55 static unique_ptr<TableRef> FormatDeserialize(FormatDeserializer &source);
56};
57} // namespace duckdb
58