@@ -383,11 +383,17 @@ bool ParquetReader::_type_matches(const VSlotRef* slot_ref) const {
383383 !is_complex_type (table_col_type->get_primitive_type ());
384384}
385385
386- Status ParquetReader::set_fill_columns (
387- const std::unordered_map<std::string, std::tuple<std::string, const SlotDescriptor*>>&
388- partition_columns,
389- const std::unordered_map<std::string, VExprContextSPtr>& missing_columns) {
390- SCOPED_RAW_TIMER (&_statistics.parse_meta_time );
386+ Status ParquetReader::_update_lazy_read_ctx (const VExprContextSPtrs& new_conjuncts) {
387+ RowGroupReader::LazyReadContext new_lazy_read_ctx;
388+ new_lazy_read_ctx.conjuncts = new_conjuncts;
389+ new_lazy_read_ctx.fill_partition_columns = std::move (_lazy_read_ctx.fill_partition_columns );
390+ new_lazy_read_ctx.fill_missing_columns = std::move (_lazy_read_ctx.fill_missing_columns );
391+ _lazy_read_ctx = std::move (new_lazy_read_ctx);
392+
393+ _top_runtime_vexprs.clear ();
394+ _push_down_predicates.clear ();
395+ _useless_predicates.clear ();
396+
391397 // std::unordered_map<column_name, std::pair<col_id, slot_id>>
392398 std::unordered_map<std::string, std::pair<uint32_t , int >> predicate_columns;
393399 // visit_slot for lazy mat.
@@ -494,7 +500,7 @@ Status ParquetReader::set_fill_columns(
494500 _lazy_read_ctx.all_predicate_col_ids .emplace_back (_row_id_column_iterator_pair.second );
495501 }
496502
497- for (auto & kv : partition_columns ) {
503+ for (auto & kv : _lazy_read_ctx. fill_partition_columns ) {
498504 auto iter = predicate_columns.find (kv.first );
499505 if (iter == predicate_columns.end ()) {
500506 _lazy_read_ctx.partition_columns .emplace (kv.first , kv.second );
@@ -504,7 +510,7 @@ Status ParquetReader::set_fill_columns(
504510 }
505511 }
506512
507- for (auto & kv : missing_columns ) {
513+ for (auto & kv : _lazy_read_ctx. fill_missing_columns ) {
508514 auto iter = predicate_columns.find (kv.first );
509515 if (iter == predicate_columns.end ()) {
510516 _lazy_read_ctx.missing_columns .emplace (kv.first , kv.second );
@@ -536,6 +542,17 @@ Status ParquetReader::set_fill_columns(
536542 }
537543 }
538544
545+ return Status::OK ();
546+ }
547+
548+ Status ParquetReader::set_fill_columns (
549+ const std::unordered_map<std::string, std::tuple<std::string, const SlotDescriptor*>>&
550+ partition_columns,
551+ const std::unordered_map<std::string, VExprContextSPtr>& missing_columns) {
552+ _lazy_read_ctx.fill_partition_columns = partition_columns;
553+ _lazy_read_ctx.fill_missing_columns = missing_columns;
554+ RETURN_IF_ERROR (_update_lazy_read_ctx (_lazy_read_ctx.conjuncts ));
555+
539556 if (_filter_groups && (_total_groups == 0 || _t_metadata->num_rows == 0 || _range_size < 0 )) {
540557 return Status::EndOfFile (" No row group to read" );
541558 }
@@ -673,6 +690,13 @@ Status ParquetReader::_next_row_group_reader() {
673690 continue ;
674691 }
675692
693+ bool has_late_rf_cond = false ;
694+ VExprContextSPtrs new_push_down_conjuncts;
695+ RETURN_IF_ERROR (_call_late_rf_func (&has_late_rf_cond, new_push_down_conjuncts));
696+ if (has_late_rf_cond) {
697+ RETURN_IF_ERROR (_update_lazy_read_ctx (new_push_down_conjuncts));
698+ }
699+
676700 size_t before_predicate_size = _push_down_predicates.size ();
677701 _push_down_predicates.reserve (before_predicate_size + _top_runtime_vexprs.size ());
678702 for (const auto & vexpr : _top_runtime_vexprs) {
0 commit comments