1#include "duckdb/parser/expression/columnref_expression.hpp"
2
3#include "duckdb/common/exception.hpp"
4#include "duckdb/common/serializer.hpp"
5#include "duckdb/common/types/hash.hpp"
6
7using namespace duckdb;
8using namespace std;
9
10//! Specify both the column and table name
11ColumnRefExpression::ColumnRefExpression(string column_name, string table_name)
12 : ParsedExpression(ExpressionType::COLUMN_REF, ExpressionClass::COLUMN_REF), column_name(column_name),
13 table_name(table_name) {
14}
15
16ColumnRefExpression::ColumnRefExpression(string column_name) : ColumnRefExpression(column_name, string()) {
17}
18
19string ColumnRefExpression::GetName() const {
20 return !alias.empty() ? alias : column_name;
21}
22
23string ColumnRefExpression::ToString() const {
24 if (table_name.empty()) {
25 return column_name;
26 } else {
27 return table_name + "." + column_name;
28 }
29}
30
31bool ColumnRefExpression::Equals(const ColumnRefExpression *a, const ColumnRefExpression *b) {
32 return a->column_name == b->column_name && a->table_name == b->table_name;
33}
34
35hash_t ColumnRefExpression::Hash() const {
36 hash_t result = ParsedExpression::Hash();
37 result = CombineHash(result, duckdb::Hash<const char *>(column_name.c_str()));
38 return result;
39}
40
41unique_ptr<ParsedExpression> ColumnRefExpression::Copy() const {
42 auto copy = make_unique<ColumnRefExpression>(column_name, table_name);
43 copy->CopyProperties(*this);
44 return move(copy);
45}
46
47void ColumnRefExpression::Serialize(Serializer &serializer) {
48 ParsedExpression::Serialize(serializer);
49 serializer.WriteString(table_name);
50 serializer.WriteString(column_name);
51}
52
53unique_ptr<ParsedExpression> ColumnRefExpression::Deserialize(ExpressionType type, Deserializer &source) {
54 auto table_name = source.Read<string>();
55 auto column_name = source.Read<string>();
56 auto expression = make_unique<ColumnRefExpression>(column_name, table_name);
57 return move(expression);
58}
59