Current section
Files
Jump to
Current section
Files
c_src/duckdb/src/main/relation/projection_relation.cpp
#include "duckdb/main/relation/projection_relation.hpp"
#include "duckdb/main/client_context.hpp"
#include "duckdb/parser/query_node/select_node.hpp"
#include "duckdb/parser/tableref/subqueryref.hpp"
namespace duckdb {
ProjectionRelation::ProjectionRelation(shared_ptr<Relation> child_p,
vector<unique_ptr<ParsedExpression>> parsed_expressions, vector<string> aliases)
: Relation(child_p->context, RelationType::PROJECTION_RELATION), expressions(move(parsed_expressions)),
child(move(child_p)) {
if (!aliases.empty()) {
if (aliases.size() != expressions.size()) {
throw ParserException("Aliases list length must match expression list length!");
}
for (idx_t i = 0; i < aliases.size(); i++) {
expressions[i]->alias = aliases[i];
}
}
// bind the expressions
context.TryBindRelation(*this, this->columns);
}
unique_ptr<QueryNode> ProjectionRelation::GetQueryNode() {
auto child_ptr = child.get();
while (child_ptr->InheritsColumnBindings()) {
child_ptr = child_ptr->ChildRelation();
}
unique_ptr<QueryNode> result;
if (child_ptr->type == RelationType::JOIN_RELATION) {
// child node is a join: push projection into the child query node
result = child->GetQueryNode();
} else {
// child node is not a join: create a new select node and push the child as a table reference
auto select = make_unique<SelectNode>();
select->from_table = child->GetTableRef();
result = move(select);
}
D_ASSERT(result->type == QueryNodeType::SELECT_NODE);
auto &select_node = (SelectNode &)*result;
select_node.aggregate_handling = AggregateHandling::NO_AGGREGATES_ALLOWED;
select_node.select_list.clear();
for (auto &expr : expressions) {
select_node.select_list.push_back(expr->Copy());
}
return result;
}
string ProjectionRelation::GetAlias() {
return child->GetAlias();
}
const vector<ColumnDefinition> &ProjectionRelation::Columns() {
return columns;
}
string ProjectionRelation::ToString(idx_t depth) {
string str = RenderWhitespace(depth) + "Projection [";
for (idx_t i = 0; i < expressions.size(); i++) {
if (i != 0) {
str += ", ";
}
str += expressions[i]->ToString();
}
str += "]\n";
return str + child->ToString(depth + 1);
}
} // namespace duckdb