@@ -382,7 +382,7 @@ Status ParquetReader::init_reader(
382382 }
383383 }
384384 // build column predicates for column lazy read
385- _lazy_read_ctx.conjuncts = conjuncts;
385+ _lazy_read_ctx.conjuncts = & conjuncts;
386386 return Status::OK ();
387387}
388388
@@ -408,11 +408,18 @@ bool ParquetReader::_type_matches(const VSlotRef* slot_ref) const {
408408 !is_complex_type (table_col_type->get_primitive_type ());
409409}
410410
411- Status ParquetReader::set_fill_columns (
412- const std::unordered_map<std::string, std::tuple<std::string, const SlotDescriptor*>>&
413- partition_columns,
414- const std::unordered_map<std::string, VExprContextSPtr>& missing_columns) {
415- SCOPED_RAW_TIMER (&_statistics.parse_meta_time );
411+
412+ Status ParquetReader::_update_lazy_read_ctx () {
413+ RowGroupReader::LazyReadContext new_lazy_read_ctx;
414+ new_lazy_read_ctx.conjuncts = _lazy_read_ctx.conjuncts ;
415+ new_lazy_read_ctx.fill_partition_columns = _lazy_read_ctx.fill_partition_columns ;
416+ new_lazy_read_ctx.fill_missing_columns = _lazy_read_ctx.fill_missing_columns ;
417+ _lazy_read_ctx = std::move (new_lazy_read_ctx);
418+
419+ _top_runtime_vexprs.clear ();
420+ _push_down_predicates.clear ();
421+ _useless_predicates.clear ();
422+
416423 // std::unordered_map<column_name, std::pair<col_id, slot_id>>
417424 std::unordered_map<std::string, std::pair<uint32_t , int >> predicate_columns;
418425 // visit_slot for lazy mat.
@@ -432,7 +439,7 @@ Status ParquetReader::set_fill_columns(
432439 }
433440 };
434441
435- for (const auto & conjunct : _lazy_read_ctx.conjuncts ) {
442+ for (const auto & conjunct : * _lazy_read_ctx.conjuncts ) {
436443 auto expr = conjunct->root ();
437444
438445 if (expr->is_rf_wrapper ()) {
@@ -454,8 +461,8 @@ Status ParquetReader::set_fill_columns(
454461
455462 int max_in_size =
456463 _state->query_options ().__isset .max_pushdown_conditions_per_column
457- ? _state->query_options ().max_pushdown_conditions_per_column
458- : 1024 ;
464+ ? _state->query_options ().max_pushdown_conditions_per_column
465+ : 1024 ;
459466 if (direct_in_predicate->get_set_func ()->size () == 0 ||
460467 direct_in_predicate->get_set_func ()->size () > max_in_size) {
461468 continue ;
@@ -519,7 +526,7 @@ Status ParquetReader::set_fill_columns(
519526 _lazy_read_ctx.all_predicate_col_ids .emplace_back (_row_id_column_iterator_pair.second );
520527 }
521528
522- for (auto & kv : partition_columns ) {
529+ for (auto & kv : *_lazy_read_ctx. fill_partition_columns ) {
523530 auto iter = predicate_columns.find (kv.first );
524531 if (iter == predicate_columns.end ()) {
525532 _lazy_read_ctx.partition_columns .emplace (kv.first , kv.second );
@@ -529,7 +536,7 @@ Status ParquetReader::set_fill_columns(
529536 }
530537 }
531538
532- for (auto & kv : missing_columns ) {
539+ for (auto & kv : *_lazy_read_ctx. fill_missing_columns ) {
533540 auto iter = predicate_columns.find (kv.first );
534541 if (iter == predicate_columns.end ()) {
535542 _lazy_read_ctx.missing_columns .emplace (kv.first , kv.second );
@@ -561,6 +568,19 @@ Status ParquetReader::set_fill_columns(
561568 }
562569 }
563570
571+ return Status::OK ();
572+ }
573+
574+ Status ParquetReader::set_fill_columns (
575+ const std::unordered_map<std::string, std::tuple<std::string, const SlotDescriptor*>>&
576+ partition_columns,
577+ const std::unordered_map<std::string, VExprContextSPtr>& missing_columns) {
578+ // SCOPED_RAW_TIMER(&_statistics.parse_meta_time);
579+
580+ _lazy_read_ctx.fill_partition_columns = &partition_columns;
581+ _lazy_read_ctx.fill_missing_columns = &missing_columns;
582+ RETURN_IF_ERROR (_update_lazy_read_ctx ());
583+
564584 if (_filter_groups && (_total_groups == 0 || _t_metadata->num_rows == 0 || _range_size < 0 )) {
565585 return Status::EndOfFile (" No row group to read" );
566586 }
@@ -698,6 +718,12 @@ Status ParquetReader::_next_row_group_reader() {
698718 continue ;
699719 }
700720
721+
722+ bool has_late_rf_cond = false ;
723+ RETURN_IF_ERROR (_call_late_rf_func (&has_late_rf_cond));
724+ if (has_late_rf_cond) {
725+ RETURN_IF_ERROR (_update_lazy_read_ctx ());
726+ }
701727 size_t before_predicate_size = _push_down_predicates.size ();
702728 _push_down_predicates.reserve (before_predicate_size + _top_runtime_vexprs.size ());
703729 for (const auto & vexpr : _top_runtime_vexprs) {
0 commit comments