diff --git a/src/sql/das/ob_das_dml_ctx_define.cpp b/src/sql/das/ob_das_dml_ctx_define.cpp index a374496734315cea77c359c8ee0925239a0854bb..787431df12d78d97a78f4e692fbe3c29c9c3e3aa 100644 --- a/src/sql/das/ob_das_dml_ctx_define.cpp +++ b/src/sql/das/ob_das_dml_ctx_define.cpp @@ -234,7 +234,16 @@ void ObDASDMLIterator::set_ctdef(const ObDASDMLBaseCtDef *das_ctdef) &das_ctdef_->old_row_projector_ : &das_ctdef_->new_row_projector_; if (OB_NOT_NULL(domain_iter_)) { - domain_iter_->set_ctdef(das_ctdef, row_projector_); + if (!das_ctdef->table_param_.get_data_table().is_domain_index()) { + // This table isn't domain index, nothing to do. + } else if (domain_iter_->is_same_domain_type(das_ctdef)) { + // The das_ctdef and das_ctdef_ are either full-text search or multi-value index. + domain_iter_->set_ctdef(das_ctdef, row_projector_); + } else { + // need to reset domain iter + domain_iter_->~ObDomainDMLIterator(); + domain_iter_ = nullptr; + } } } diff --git a/src/sql/das/ob_das_domain_utils.cpp b/src/sql/das/ob_das_domain_utils.cpp index 166ee7aebbd72fd124d5fa12abe86a14d5bc0ddc..a7852555edd839413a435c78599bf14946303dad 100644 --- a/src/sql/das/ob_das_domain_utils.cpp +++ b/src/sql/das/ob_das_domain_utils.cpp @@ -490,6 +490,20 @@ void ObDomainDMLIterator::set_ctdef( row_projector_ = row_projector; } +bool ObDomainDMLIterator::is_same_domain_type(const ObDASDMLBaseCtDef *das_ctdef) const +{ + bool is_same_domain_type = false; + if (OB_NOT_NULL(das_ctdef) && OB_NOT_NULL(das_ctdef_)) { + const ObTableSchemaParam &table_param = das_ctdef->table_param_.get_data_table(); + const ObTableSchemaParam &my_table_param = das_ctdef_->table_param_.get_data_table(); + if ((table_param.is_fts_index() && my_table_param.is_fts_index()) + || (table_param.is_multivalue_index() && my_table_param.is_multivalue_index())) { + is_same_domain_type = true; + } + } + return is_same_domain_type; +} + int ObDomainDMLIterator::get_next_domain_row(ObNewRow *&row) { int ret = OB_SUCCESS; diff --git a/src/sql/das/ob_das_domain_utils.h b/src/sql/das/ob_das_domain_utils.h index dfb2e5c0ad9d953a7cc52c06e257ee7fde28f15e..2ebd935896e4ffb1f5fb6d39d55ba48d14e2c26e 100644 --- a/src/sql/das/ob_das_domain_utils.h +++ b/src/sql/das/ob_das_domain_utils.h @@ -106,6 +106,7 @@ public: void set_ctdef(const ObDASDMLBaseCtDef *das_ctdef, const IntFixedArray *row_projector); void set_row_projector(const IntFixedArray *row_projector) { row_projector_ = row_projector; } int get_next_domain_row(ObNewRow *&row); + bool is_same_domain_type(const ObDASDMLBaseCtDef *das_ctdef) const; TO_STRING_KV(K_(row_idx), K_(rows), KPC_(row_projector), KPC_(das_ctdef), K_(main_ctdef)); protected: diff --git a/src/sql/das/ob_das_update_op.cpp b/src/sql/das/ob_das_update_op.cpp index e854e9b15c5bbe1fd17a7e7caeb5d95b177d92cb..59d064dbf5f7f3faead4d0199c42c15e1bdf8385 100644 --- a/src/sql/das/ob_das_update_op.cpp +++ b/src/sql/das/ob_das_update_op.cpp @@ -73,10 +73,19 @@ public: iter_has_built_ = false; das_ctdef_ = static_cast(das_ctdef); if (OB_NOT_NULL(domain_iter_)) { - domain_iter_->set_ctdef(das_ctdef_, &(got_old_row_ ? das_ctdef_->new_row_projector_ - : das_ctdef_->old_row_projector_)); - if (OB_FAIL(domain_iter_->rewind())) { - LOG_WARN("fail to rewind for domain iterator", K(ret)); + if (!das_ctdef->table_param_.get_data_table().is_domain_index()) { + // This table isn't domain index, nothing to do. + } else if (domain_iter_->is_same_domain_type(das_ctdef)) { + // The das_ctdef and das_ctdef_ are either full-text search or multi-value index. + domain_iter_->set_ctdef(das_ctdef_, &(got_old_row_ ? das_ctdef_->new_row_projector_ + : das_ctdef_->old_row_projector_)); + if (OB_FAIL(domain_iter_->rewind())) { + LOG_WARN("fail to rewind for domain iterator", K(ret)); + } + } else { + // need to reset domain iter + domain_iter_->~ObDomainDMLIterator(); + domain_iter_ = nullptr; } } return ret;