Packages

An Elixir DuckDB library

Current section

Files

Jump to
exduckdb c_src duckdb src parser query_node select_node.cpp
Raw

c_src/duckdb/src/parser/query_node/select_node.cpp

#include "duckdb/parser/query_node/select_node.hpp"
#include "duckdb/parser/expression_util.hpp"
namespace duckdb {
bool SelectNode::Equals(const QueryNode *other_p) const {
if (!QueryNode::Equals(other_p)) {
return false;
}
if (this == other_p) {
return true;
}
auto other = (SelectNode *)other_p;
// SELECT
if (!ExpressionUtil::ListEquals(select_list, other->select_list)) {
return false;
}
// FROM
if (from_table) {
// we have a FROM clause, compare to the other one
if (!from_table->Equals(other->from_table.get())) {
return false;
}
} else if (other->from_table) {
// we don't have a FROM clause, if the other statement has one they are
// not equal
return false;
}
// WHERE
if (!BaseExpression::Equals(where_clause.get(), other->where_clause.get())) {
return false;
}
// GROUP BY
if (!ExpressionUtil::ListEquals(groups.group_expressions, other->groups.group_expressions)) {
return false;
}
if (groups.grouping_sets != other->groups.grouping_sets) {
return false;
}
if (!SampleOptions::Equals(sample.get(), other->sample.get())) {
return false;
}
// HAVING
if (!BaseExpression::Equals(having.get(), other->having.get())) {
return false;
}
return true;
}
unique_ptr<QueryNode> SelectNode::Copy() {
auto result = make_unique<SelectNode>();
for (auto &child : select_list) {
result->select_list.push_back(child->Copy());
}
result->from_table = from_table ? from_table->Copy() : nullptr;
result->where_clause = where_clause ? where_clause->Copy() : nullptr;
// groups
for (auto &group : groups.group_expressions) {
result->groups.group_expressions.push_back(group->Copy());
}
result->groups.grouping_sets = groups.grouping_sets;
result->having = having ? having->Copy() : nullptr;
result->sample = sample ? sample->Copy() : nullptr;
this->CopyProperties(*result);
return move(result);
}
void SelectNode::Serialize(Serializer &serializer) {
QueryNode::Serialize(serializer);
// select_list
serializer.WriteList(select_list);
// from clause
serializer.WriteOptional(from_table);
// where_clause
serializer.WriteOptional(where_clause);
// group by
serializer.WriteList(groups.group_expressions);
serializer.Write<idx_t>(groups.grouping_sets.size());
for (auto &grouping_set : groups.grouping_sets) {
serializer.Write<idx_t>(grouping_set.size());
for (auto &idx : grouping_set) {
serializer.Write<idx_t>(idx);
}
}
// having / sample
serializer.WriteOptional(having);
serializer.WriteOptional(sample);
}
unique_ptr<QueryNode> SelectNode::Deserialize(Deserializer &source) {
auto result = make_unique<SelectNode>();
// select_list
source.ReadList<ParsedExpression>(result->select_list);
// from clause
result->from_table = source.ReadOptional<TableRef>();
// where_clause
result->where_clause = source.ReadOptional<ParsedExpression>();
// group by
source.ReadList<ParsedExpression>(result->groups.group_expressions);
auto grouping_set_count = source.Read<idx_t>();
for (idx_t set_idx = 0; set_idx < grouping_set_count; set_idx++) {
auto set_entries = source.Read<idx_t>();
GroupingSet grouping_set;
for (idx_t i = 0; i < set_entries; i++) {
grouping_set.insert(source.Read<idx_t>());
}
result->groups.grouping_sets.push_back(grouping_set);
}
// having / sample
result->having = source.ReadOptional<ParsedExpression>();
result->sample = source.ReadOptional<SampleOptions>();
return move(result);
}
} // namespace duckdb