@@ -408,11 +408,17 @@ 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+ Status ParquetReader::_update_lazy_read_ctx (const VExprContextSPtrs& new_conjuncts) {
412+ RowGroupReader::LazyReadContext new_lazy_read_ctx;
413+ new_lazy_read_ctx.conjuncts = new_conjuncts;
414+ new_lazy_read_ctx.fill_partition_columns = std::move (_lazy_read_ctx.fill_partition_columns );
415+ new_lazy_read_ctx.fill_missing_columns = std::move (_lazy_read_ctx.fill_missing_columns );
416+ _lazy_read_ctx = std::move (new_lazy_read_ctx);
417+
418+ _top_runtime_vexprs.clear ();
419+ _push_down_predicates.clear ();
420+ _useless_predicates.clear ();
421+
416422 // std::unordered_map<column_name, std::pair<col_id, slot_id>>
417423 std::unordered_map<std::string, std::pair<uint32_t , int >> predicate_columns;
418424 // visit_slot for lazy mat.
@@ -519,7 +525,7 @@ Status ParquetReader::set_fill_columns(
519525 _lazy_read_ctx.all_predicate_col_ids .emplace_back (_row_id_column_iterator_pair.second );
520526 }
521527
522- for (auto & kv : partition_columns ) {
528+ for (auto & kv : _lazy_read_ctx. fill_partition_columns ) {
523529 auto iter = predicate_columns.find (kv.first );
524530 if (iter == predicate_columns.end ()) {
525531 _lazy_read_ctx.partition_columns .emplace (kv.first , kv.second );
@@ -529,7 +535,7 @@ Status ParquetReader::set_fill_columns(
529535 }
530536 }
531537
532- for (auto & kv : missing_columns ) {
538+ for (auto & kv : _lazy_read_ctx. fill_missing_columns ) {
533539 auto iter = predicate_columns.find (kv.first );
534540 if (iter == predicate_columns.end ()) {
535541 _lazy_read_ctx.missing_columns .emplace (kv.first , kv.second );
@@ -561,6 +567,17 @@ Status ParquetReader::set_fill_columns(
561567 }
562568 }
563569
570+ return Status::OK ();
571+ }
572+
573+ Status ParquetReader::set_fill_columns (
574+ const std::unordered_map<std::string, std::tuple<std::string, const SlotDescriptor*>>&
575+ partition_columns,
576+ const std::unordered_map<std::string, VExprContextSPtr>& missing_columns) {
577+ _lazy_read_ctx.fill_partition_columns = partition_columns;
578+ _lazy_read_ctx.fill_missing_columns = missing_columns;
579+ RETURN_IF_ERROR (_update_lazy_read_ctx (_lazy_read_ctx.conjuncts ));
580+
564581 if (_filter_groups && (_total_groups == 0 || _t_metadata->num_rows == 0 || _range_size < 0 )) {
565582 return Status::EndOfFile (" No row group to read" );
566583 }
@@ -698,6 +715,13 @@ Status ParquetReader::_next_row_group_reader() {
698715 continue ;
699716 }
700717
718+ bool has_late_rf_cond = false ;
719+ VExprContextSPtrs new_push_down_conjuncts;
720+ RETURN_IF_ERROR (_call_late_rf_func (&has_late_rf_cond, new_push_down_conjuncts));
721+ if (has_late_rf_cond) {
722+ RETURN_IF_ERROR (_update_lazy_read_ctx (new_push_down_conjuncts));
723+ }
724+
701725 size_t before_predicate_size = _push_down_predicates.size ();
702726 _push_down_predicates.reserve (before_predicate_size + _top_runtime_vexprs.size ());
703727 for (const auto & vexpr : _top_runtime_vexprs) {
0 commit comments