@@ -405,11 +405,17 @@ bool ParquetReader::_type_matches(const VSlotRef* slot_ref) const {
405405 !is_complex_type (table_col_type->get_primitive_type ());
406406}
407407
408- Status ParquetReader::set_fill_columns (
409- const std::unordered_map<std::string, std::tuple<std::string, const SlotDescriptor*>>&
410- partition_columns,
411- const std::unordered_map<std::string, VExprContextSPtr>& missing_columns) {
412- SCOPED_RAW_TIMER (&_reader_statistics.parse_meta_time );
408+ Status ParquetReader::_update_lazy_read_ctx (const VExprContextSPtrs& new_conjuncts) {
409+ RowGroupReader::LazyReadContext new_lazy_read_ctx;
410+ new_lazy_read_ctx.conjuncts = new_conjuncts;
411+ new_lazy_read_ctx.fill_partition_columns = std::move (_lazy_read_ctx.fill_partition_columns );
412+ new_lazy_read_ctx.fill_missing_columns = std::move (_lazy_read_ctx.fill_missing_columns );
413+ _lazy_read_ctx = std::move (new_lazy_read_ctx);
414+
415+ _top_runtime_vexprs.clear ();
416+ _push_down_predicates.clear ();
417+ _useless_predicates.clear ();
418+
413419 // std::unordered_map<column_name, std::pair<col_id, slot_id>>
414420 std::unordered_map<std::string, std::pair<uint32_t , int >> predicate_columns;
415421 // visit_slot for lazy mat.
@@ -516,7 +522,7 @@ Status ParquetReader::set_fill_columns(
516522 _lazy_read_ctx.all_predicate_col_ids .emplace_back (_row_id_column_iterator_pair.second );
517523 }
518524
519- for (auto & kv : partition_columns ) {
525+ for (auto & kv : _lazy_read_ctx. fill_partition_columns ) {
520526 auto iter = predicate_columns.find (kv.first );
521527 if (iter == predicate_columns.end ()) {
522528 _lazy_read_ctx.partition_columns .emplace (kv.first , kv.second );
@@ -526,7 +532,7 @@ Status ParquetReader::set_fill_columns(
526532 }
527533 }
528534
529- for (auto & kv : missing_columns ) {
535+ for (auto & kv : _lazy_read_ctx. fill_missing_columns ) {
530536 auto iter = predicate_columns.find (kv.first );
531537 if (iter == predicate_columns.end ()) {
532538 _lazy_read_ctx.missing_columns .emplace (kv.first , kv.second );
@@ -558,6 +564,17 @@ Status ParquetReader::set_fill_columns(
558564 }
559565 }
560566
567+ return Status::OK ();
568+ }
569+
570+ Status ParquetReader::set_fill_columns (
571+ const std::unordered_map<std::string, std::tuple<std::string, const SlotDescriptor*>>&
572+ partition_columns,
573+ const std::unordered_map<std::string, VExprContextSPtr>& missing_columns) {
574+ _lazy_read_ctx.fill_partition_columns = partition_columns;
575+ _lazy_read_ctx.fill_missing_columns = missing_columns;
576+ RETURN_IF_ERROR (_update_lazy_read_ctx (_lazy_read_ctx.conjuncts ));
577+
561578 if (_filter_groups && (_total_groups == 0 || _t_metadata->num_rows == 0 || _range_size < 0 )) {
562579 return Status::EndOfFile (" No row group to read" );
563580 }
@@ -697,6 +714,13 @@ Status ParquetReader::_next_row_group_reader() {
697714 continue ;
698715 }
699716
717+ bool has_late_rf_cond = false ;
718+ VExprContextSPtrs new_push_down_conjuncts;
719+ RETURN_IF_ERROR (_call_late_rf_func (&has_late_rf_cond, new_push_down_conjuncts));
720+ if (has_late_rf_cond) {
721+ RETURN_IF_ERROR (_update_lazy_read_ctx (new_push_down_conjuncts));
722+ }
723+
700724 size_t before_predicate_size = _push_down_predicates.size ();
701725 _push_down_predicates.reserve (before_predicate_size + _top_runtime_vexprs.size ());
702726 for (const auto & vexpr : _top_runtime_vexprs) {
0 commit comments