From 88451e8b98bc0e405cbaa3520032fbaa225366a7 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 29 Nov 2023 11:46:05 +0000 Subject: [PATCH] [CP] fix: fix the correctness problem induced by batch rescan not supported reverse order --- src/sql/engine/table/ob_table_scan_op.cpp | 12 +++++++++++- src/sql/optimizer/ob_log_join.cpp | 2 ++ src/sql/optimizer/ob_log_subplan_filter.cpp | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/sql/engine/table/ob_table_scan_op.cpp b/src/sql/engine/table/ob_table_scan_op.cpp index 9f20587c5..d24c77f53 100644 --- a/src/sql/engine/table/ob_table_scan_op.cpp +++ b/src/sql/engine/table/ob_table_scan_op.cpp @@ -895,7 +895,17 @@ OB_INLINE int ObTableScanOp::init_das_scan_rtdef(const ObDASScanCtDef &das_ctdef das_rtdef.scan_flag_.set_iter_uncommitted_row(); } } - if (MY_SPEC.batch_scan_flag_ || is_lookup) { + if (MY_SPEC.batch_scan_flag_) { + // if tsc enable batch rescan, the output order of tsc is determined by group id + if (das_rtdef.scan_flag_.scan_order_ == ObQueryFlag::Reverse) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Scan order is not supported in batch rescan", K(ret), K(das_rtdef.scan_flag_.scan_order_)); + } else { + das_rtdef.scan_flag_.scan_order_ = ObQueryFlag::KeepOrder; + } + } + + if (is_lookup) { das_rtdef.scan_flag_.scan_order_ = ObQueryFlag::KeepOrder; } das_rtdef.scan_flag_.is_lookup_for_4377_ = is_lookup; diff --git a/src/sql/optimizer/ob_log_join.cpp b/src/sql/optimizer/ob_log_join.cpp index 3e5388c2c..98958b06f 100644 --- a/src/sql/optimizer/ob_log_join.cpp +++ b/src/sql/optimizer/ob_log_join.cpp @@ -1392,6 +1392,8 @@ int ObLogJoin::check_if_disable_batch(ObLogicalOperator* root, bool &can_use_bat // For the global index lookup, if there is a pushdown filter when scanning the index, // batch cannot be used. can_use_batch_nlj = false; + } else if (ts->get_scan_direction() != default_asc_direction() && ts->get_scan_direction() != ObOrderDirection::UNORDERED) { + can_use_batch_nlj = false; } else { SMART_VAR(ObTablePartitionInfo, tmp_info) { ObTablePartitionInfo *tmp_info_ptr = &tmp_info; diff --git a/src/sql/optimizer/ob_log_subplan_filter.cpp b/src/sql/optimizer/ob_log_subplan_filter.cpp index b79ebbee5..78b22362e 100644 --- a/src/sql/optimizer/ob_log_subplan_filter.cpp +++ b/src/sql/optimizer/ob_log_subplan_filter.cpp @@ -483,7 +483,7 @@ int ObLogSubPlanFilter::check_if_match_das_group_rescan(ObLogicalOperator *root, LOG_WARN("failed to check query range contribution", K(ret)); } else if (!is_valid) { group_rescan = false; - } else if (tsc->get_scan_direction() != default_asc_direction()) { + } else if (tsc->get_scan_direction() != default_asc_direction() && tsc->get_scan_direction() != ObOrderDirection::UNORDERED) { group_rescan = false; } else if (tsc->has_index_scan_filter() && tsc->get_index_back() && tsc->get_is_index_global()) { // For the global index lookup, if there is a pushdown filter when scanning the index,