@@ -178,6 +178,12 @@ class SegmentIterator : public RowwiseIterator {
178
178
179
179
bool _can_evaluated_by_vectorized (ColumnPredicate* predicate);
180
180
181
+ Status _extract_remaining_expr_columns (vectorized::VExpr* expr);
182
+ uint16_t _execute_remaining_expr (uint16_t * sel_rowid_idx, uint16_t selected_size,
183
+ vectorized::Block* block);
184
+ uint16_t _evaluate_remaining_expr_filter (uint16_t * sel_rowid_idx, uint16_t selected_size,
185
+ const vectorized::IColumn::Filter& filter);
186
+
181
187
// Dictionary column should do something to initial.
182
188
void _convert_dict_code_for_predicate_if_necessary ();
183
189
@@ -279,18 +285,21 @@ class SegmentIterator : public RowwiseIterator {
279
285
std::vector<ColumnId> _predicate_columns;
280
286
// columns to read after predicate evaluation
281
287
std::vector<ColumnId> _non_predicate_columns;
288
+ std::vector<ColumnId> _remaining_expr_columns;
282
289
// remember the rowids we've read for the current row block.
283
290
// could be a local variable of next_batch(), kept here to reuse vector memory
284
291
std::vector<rowid_t > _block_rowids;
285
292
bool _is_need_vec_eval = false ;
286
293
bool _is_need_short_eval = false ;
294
+ bool _is_need_expr_eval = false ;
287
295
288
296
// fields for vectorization execution
289
297
std::vector<ColumnId>
290
298
_vec_pred_column_ids; // keep columnId of columns for vectorized predicate evaluation
291
299
std::vector<ColumnId>
292
300
_short_cir_pred_column_ids; // keep columnId of columns for short circuit predicate evaluation
293
301
std::vector<bool > _is_pred_column; // columns hold by segmentIter
302
+ std::vector<bool > _is_remaining_expr_column;
294
303
vectorized::MutableColumns _current_return_columns;
295
304
std::vector<ColumnPredicate*> _pre_eval_block_predicate;
296
305
std::vector<ColumnPredicate*> _short_cir_eval_predicate;
@@ -301,6 +310,8 @@ class SegmentIterator : public RowwiseIterator {
301
310
// second, read non-predicate columns
302
311
// so we need a field to stand for columns first time to read
303
312
std::vector<ColumnId> _first_read_column_ids;
313
+ std::vector<ColumnId> _second_read_column_ids;
314
+ std::vector<ColumnId> _columns_to_filter;
304
315
std::vector<int > _schema_block_id_map; // map from schema column id to column idx in Block
305
316
306
317
// the actual init process is delayed to the first call to next_batch()
@@ -311,6 +322,7 @@ class SegmentIterator : public RowwiseIterator {
311
322
// make a copy of `_opts.column_predicates` in order to make local changes
312
323
std::vector<ColumnPredicate*> _col_predicates;
313
324
std::vector<ColumnPredicate*> _col_preds_except_leafnode_of_andnode;
325
+ doris::vectorized::VExprContext* _remaining_vconjunct_ctx;
314
326
doris::vectorized::VExpr* _remaining_vconjunct_root;
315
327
std::vector<roaring::Roaring> _pred_except_leafnode_of_andnode_evaluate_result;
316
328
std::unique_ptr<ColumnPredicateInfo> _column_predicate_info;
0 commit comments