| 34 | using namespace impala; |
| 35 | |
| 36 | Status UnionPlanNode::Init(const TPlanNode& tnode, FragmentState* state) { |
| 37 | RETURN_IF_ERROR(PlanNode::Init(tnode, state)); |
| 38 | DCHECK(tnode_->__isset.union_node); |
| 39 | DCHECK_EQ(conjuncts_.size(), 0); |
| 40 | tuple_desc_ = state->desc_tbl().GetTupleDescriptor(tnode_->union_node.tuple_id); |
| 41 | DCHECK(tuple_desc_ != nullptr); |
| 42 | first_materialized_child_idx_ = tnode_->union_node.first_materialized_child_idx; |
| 43 | DCHECK_GT(first_materialized_child_idx_, -1); |
| 44 | const int64_t num_nonconst_scalar_expr_to_be_codegened = |
| 45 | state->NumScalarExprNeedsCodegen(); |
| 46 | // Create const_exprs_lists_ from thrift exprs. |
| 47 | const vector<vector<TExpr>>& const_texpr_lists = tnode_->union_node.const_expr_lists; |
| 48 | for (const vector<TExpr>& texprs : const_texpr_lists) { |
| 49 | vector<ScalarExpr*> const_exprs; |
| 50 | RETURN_IF_ERROR(ScalarExpr::Create(texprs, *row_descriptor_, state, &const_exprs)); |
| 51 | DCHECK_EQ(const_exprs.size(), tuple_desc_->slots().size()); |
| 52 | const_exprs_lists_.push_back(const_exprs); |
| 53 | } |
| 54 | num_const_scalar_expr_to_be_codegened_ = |
| 55 | state->NumScalarExprNeedsCodegen() - num_nonconst_scalar_expr_to_be_codegened; |
| 56 | // Create child_exprs_lists_ from thrift exprs. |
| 57 | const vector<vector<TExpr>>& thrift_result_exprs = tnode_->union_node.result_expr_lists; |
| 58 | for (int i = 0; i < thrift_result_exprs.size(); ++i) { |
| 59 | const vector<TExpr>& texprs = thrift_result_exprs[i]; |
| 60 | vector<ScalarExpr*> child_exprs; |
| 61 | RETURN_IF_ERROR( |
| 62 | ScalarExpr::Create(texprs, *children_[i]->row_descriptor_, state, &child_exprs)); |
| 63 | child_exprs_lists_.push_back(child_exprs); |
| 64 | DCHECK_EQ(child_exprs.size(), tuple_desc_->slots().size()); |
| 65 | } |
| 66 | codegend_union_materialize_batch_fns_ = |
| 67 | std::vector<CodegenFnPtr<UnionMaterializeBatchFn>>(child_exprs_lists_.size()); |
| 68 | return Status::OK(); |
| 69 | } |
| 70 | |
| 71 | void UnionPlanNode::Close() { |
| 72 | for (const vector<ScalarExpr*>& const_exprs : const_exprs_lists_) { |
nothing calls this directly
no test coverage detected