| 184 | } |
| 185 | |
| 186 | Status ScalarExprEvaluator::Clone(ObjectPool* pool, RuntimeState* state, |
| 187 | MemPool* expr_perm_pool, MemPool* expr_results_pool, |
| 188 | ScalarExprEvaluator** cloned_eval) const { |
| 189 | DCHECK(initialized_); |
| 190 | DCHECK(opened_); |
| 191 | *cloned_eval = pool->Add( |
| 192 | new ScalarExprEvaluator(root_, expr_perm_pool, expr_results_pool)); |
| 193 | for (int i = 0; i < fn_ctxs_.size(); ++i) { |
| 194 | (*cloned_eval)->fn_ctxs_.push_back( |
| 195 | fn_ctxs_[i]->impl()->Clone(expr_perm_pool, expr_results_pool)); |
| 196 | } |
| 197 | (*cloned_eval)->fn_ctxs_ptr_ = (*cloned_eval)->fn_ctxs_.data(); |
| 198 | (*cloned_eval)->is_clone_ = true; |
| 199 | (*cloned_eval)->initialized_ = true; |
| 200 | (*cloned_eval)->opened_ = true; |
| 201 | (*cloned_eval)->output_scale_ = output_scale_; |
| 202 | return root_.OpenEvaluator(FunctionContext::THREAD_LOCAL, state, *cloned_eval); |
| 203 | } |
| 204 | |
| 205 | Status ScalarExprEvaluator::Clone(ObjectPool* pool, RuntimeState* state, |
| 206 | MemPool* expr_perm_pool, MemPool* expr_results_pool, |