| 558 | } |
| 559 | |
| 560 | StructVal SlotRef::GetStructValInterpreted( |
| 561 | ScalarExprEvaluator* eval, const TupleRow* row) const { |
| 562 | DCHECK(type_.IsStructType() && children_.size() > 0); |
| 563 | DCHECK_EQ(children_.size(), eval->GetChildEvaluators().size()); |
| 564 | Tuple* t = row->GetTuple(tuple_idx_); |
| 565 | if (t == nullptr || t->IsNull(null_indicator_offset_)) return StructVal::null(); |
| 566 | |
| 567 | FunctionContext* fn_ctx = eval->fn_context(fn_ctx_idx_); |
| 568 | DCHECK(fn_ctx != nullptr); |
| 569 | StructVal struct_val(fn_ctx, children_.size()); |
| 570 | vector<ScalarExprEvaluator*>& child_evaluators = eval->GetChildEvaluators(); |
| 571 | for (int i = 0; i < child_evaluators.size(); ++i) { |
| 572 | ScalarExpr* child_expr = children_[i]; |
| 573 | ScalarExprEvaluator* child_eval = child_evaluators[i]; |
| 574 | DCHECK(child_eval != nullptr); |
| 575 | void* child_val = child_eval->GetValue(*child_expr, row); |
| 576 | struct_val.addChild(child_val, i); |
| 577 | } |
| 578 | return struct_val; |
| 579 | } |
| 580 | |
| 581 | const TupleDescriptor* SlotRef::GetCollectionTupleDesc() const { |
| 582 | return slot_desc_->children_tuple_descriptor(); |
nothing calls this directly
no test coverage detected