@@ -388,11 +388,16 @@ bool ParquetReader::_type_matches(const VSlotRef* slot_ref) const {
388388 !is_complex_type (table_col_type->get_primitive_type ());
389389}
390390
391- Status ParquetReader::set_fill_columns (
392- const std::unordered_map<std::string, std::tuple<std::string, const SlotDescriptor*>>&
393- partition_columns,
394- const std::unordered_map<std::string, VExprContextSPtr>& missing_columns) {
395- SCOPED_RAW_TIMER (&_statistics.parse_meta_time );
391+ Status ParquetReader::_update_lazy_read_ctx (const VExprContextSPtrs& new_conjuncts) {
392+ RowGroupReader::LazyReadContext new_lazy_read_ctx;
393+ new_lazy_read_ctx.conjuncts = new_conjuncts;
394+ new_lazy_read_ctx.fill_partition_columns = std::move (_lazy_read_ctx.fill_partition_columns );
395+ new_lazy_read_ctx.fill_missing_columns = std::move (_lazy_read_ctx.fill_missing_columns );
396+ _lazy_read_ctx = std::move (new_lazy_read_ctx);
397+
398+ _top_runtime_vexprs.clear ();
399+ _push_down_predicates.clear ();
400+
396401 // std::unordered_map<column_name, std::pair<col_id, slot_id>>
397402 std::unordered_map<std::string, std::pair<uint32_t , int >> predicate_columns;
398403 // visit_slot for lazy mat.
@@ -499,7 +504,7 @@ Status ParquetReader::set_fill_columns(
499504 _lazy_read_ctx.all_predicate_col_ids .emplace_back (_row_id_column_iterator_pair.second );
500505 }
501506
502- for (auto & kv : partition_columns ) {
507+ for (auto & kv : _lazy_read_ctx. fill_partition_columns ) {
503508 auto iter = predicate_columns.find (kv.first );
504509 if (iter == predicate_columns.end ()) {
505510 _lazy_read_ctx.partition_columns .emplace (kv.first , kv.second );
@@ -509,7 +514,7 @@ Status ParquetReader::set_fill_columns(
509514 }
510515 }
511516
512- for (auto & kv : missing_columns ) {
517+ for (auto & kv : _lazy_read_ctx. fill_missing_columns ) {
513518 auto iter = predicate_columns.find (kv.first );
514519 if (iter == predicate_columns.end ()) {
515520 _lazy_read_ctx.missing_columns .emplace (kv.first , kv.second );
@@ -541,6 +546,17 @@ Status ParquetReader::set_fill_columns(
541546 }
542547 }
543548
549+ return Status::OK ();
550+ }
551+
552+ Status ParquetReader::set_fill_columns (
553+ const std::unordered_map<std::string, std::tuple<std::string, const SlotDescriptor*>>&
554+ partition_columns,
555+ const std::unordered_map<std::string, VExprContextSPtr>& missing_columns) {
556+ _lazy_read_ctx.fill_partition_columns = partition_columns;
557+ _lazy_read_ctx.fill_missing_columns = missing_columns;
558+ RETURN_IF_ERROR (_update_lazy_read_ctx (_lazy_read_ctx.conjuncts ));
559+
544560 if (_filter_groups && (_total_groups == 0 || _t_metadata->num_rows == 0 || _range_size < 0 )) {
545561 return Status::EndOfFile (" No row group to read" );
546562 }
@@ -678,6 +694,13 @@ Status ParquetReader::_next_row_group_reader() {
678694 continue ;
679695 }
680696
697+ bool has_late_rf_cond = false ;
698+ VExprContextSPtrs new_push_down_conjuncts;
699+ RETURN_IF_ERROR (_call_late_rf_func (&has_late_rf_cond, new_push_down_conjuncts));
700+ if (has_late_rf_cond) {
701+ RETURN_IF_ERROR (_update_lazy_read_ctx (new_push_down_conjuncts));
702+ }
703+
681704 size_t before_predicate_size = _push_down_predicates.size ();
682705 _push_down_predicates.reserve (before_predicate_size + _top_runtime_vexprs.size ());
683706 for (const auto & vexpr : _top_runtime_vexprs) {
0 commit comments