From 7051c4697d22aafa4b377bf3ddc92b99f3bba172 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 13 Apr 2023 12:49:14 +0000 Subject: [PATCH] [GIS] bugfix: bypass mbr filter if index key_range is whole range --- src/sql/das/ob_das_scan_op.cpp | 2 +- src/sql/das/ob_das_spatial_index_lookup_op.cpp | 14 ++++++++------ src/sql/das/ob_das_spatial_index_lookup_op.h | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/sql/das/ob_das_scan_op.cpp b/src/sql/das/ob_das_scan_op.cpp index 777365d82a..8c6a623dc1 100644 --- a/src/sql/das/ob_das_scan_op.cpp +++ b/src/sql/das/ob_das_scan_op.cpp @@ -370,7 +370,7 @@ int ObDASScanOp::do_local_index_lookup() op->set_rowkey_iter(result_); result_ = op; if (OB_FAIL(op->init(get_lookup_ctdef(), get_lookup_rtdef(), scan_ctdef_, scan_rtdef_, - trans_desc_, snapshot_, &scan_param_.mbr_filters_))) { + trans_desc_, snapshot_, scan_param_))) { LOG_WARN("init spatial lookup op failed", K(ret)); } else { op->set_tablet_id(related_tablet_ids_.at(0)); diff --git a/src/sql/das/ob_das_spatial_index_lookup_op.cpp b/src/sql/das/ob_das_spatial_index_lookup_op.cpp index 4ea84aedea..757f7c2cc8 100644 --- a/src/sql/das/ob_das_spatial_index_lookup_op.cpp +++ b/src/sql/das/ob_das_spatial_index_lookup_op.cpp @@ -41,18 +41,21 @@ int ObSpatialIndexLookupOp::init(const ObDASScanCtDef *lookup_ctdef, ObDASScanRtDef *index_rtdef, ObTxDesc *tx_desc, ObTxReadSnapshot *snapshot, - const ObMbrFilterArray *mbr_filters) + ObTableScanParam &scan_param) { int ret = OB_SUCCESS; if (OB_FAIL(ObLocalIndexLookupOp::init(lookup_ctdef, lookup_rtdef, index_ctdef, index_rtdef, tx_desc, snapshot))) { LOG_WARN("ObLocalIndexLookupOp init failed", K(ret)); - } else if (OB_ISNULL(mbr_filters)) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("mbr filter is null", K(ret)); } else { - mbr_filters_ = mbr_filters; + mbr_filters_ = &scan_param.mbr_filters_; is_inited_ = false; + for (int64_t i = 0; OB_SUCC(ret) && i < scan_param.key_ranges_.count(); i++) { + if (scan_param.key_ranges_.at(i).is_whole_range()) { + is_whole_range_ = true; + } + } + is_whole_range_ |= (mbr_filters_->count() == 0); } return ret; } @@ -137,7 +140,6 @@ int ObSpatialIndexLookupOp::get_next_row() if (OB_FAIL(sorter_.init(buf_limit, file_buf_size, expire_timestamp, tenant_id, &comparer_))) { STORAGE_LOG(WARN, "fail to init external sorter", K(ret)); } else { - is_whole_range_ = (mbr_filters_->count() == 0); is_inited_ = true; while (OB_SUCC(ret)) { index_rtdef_->p_pd_expr_op_->clear_evaluated_flag(); diff --git a/src/sql/das/ob_das_spatial_index_lookup_op.h b/src/sql/das/ob_das_spatial_index_lookup_op.h index d1079279f3..79a6af26d5 100644 --- a/src/sql/das/ob_das_spatial_index_lookup_op.h +++ b/src/sql/das/ob_das_spatial_index_lookup_op.h @@ -46,7 +46,7 @@ public: ObDASScanRtDef *index_rtdef, transaction::ObTxDesc *tx_desc, transaction::ObTxReadSnapshot *snapshot, - const ObMbrFilterArray *mbr_filters); + storage::ObTableScanParam &scan_param); int reset_lookup_state(); int filter_by_mbr(const ObObj &mbr_obj, bool &pass_through); int get_next_row();