diff --git a/src/sql/code_generator/ob_dml_cg_service.cpp b/src/sql/code_generator/ob_dml_cg_service.cpp index 06e7fd4a80..759d69acdf 100644 --- a/src/sql/code_generator/ob_dml_cg_service.cpp +++ b/src/sql/code_generator/ob_dml_cg_service.cpp @@ -2016,12 +2016,31 @@ int ObDmlCgService::convert_normal_triggers(ObLogDelUpd &log_op, LOG_DEBUG("debug trigger normal column", K(ret), K(is_instead_of), K(dml_ctdef.old_row_.count()), K(dml_ctdef.new_row_.count())); if (ObTriggerEvents::is_insert_event(dml_event)) { - new_expr = dml_ctdef.new_row_.at(col_idx); + if (OB_UNLIKELY(col_idx < 0) || + OB_UNLIKELY(col_idx >= dml_ctdef.new_row_.count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected col idx", K(col_idx), K(dml_ctdef.new_row_)); + } else { + new_expr = dml_ctdef.new_row_.at(col_idx); + } } else if (ObTriggerEvents::is_update_event(dml_event)) { - new_expr = dml_ctdef.new_row_.at(col_idx); - old_expr = dml_ctdef.old_row_.at(col_idx); + if (OB_UNLIKELY(col_idx < 0) || + OB_UNLIKELY(col_idx >= dml_ctdef.new_row_.count()) || + OB_UNLIKELY(col_idx >= dml_ctdef.old_row_.count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected col idx", K(col_idx), K(dml_ctdef.new_row_), K(dml_ctdef.old_row_)); + } else { + new_expr = dml_ctdef.new_row_.at(col_idx); + old_expr = dml_ctdef.old_row_.at(col_idx); + } } else if (ObTriggerEvents::is_delete_event(dml_event)) { - old_expr = dml_ctdef.old_row_.at(col_idx); + if (OB_UNLIKELY(col_idx < 0) || + OB_UNLIKELY(col_idx >= dml_ctdef.old_row_.count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected col idx", K(col_idx), K(dml_ctdef.old_row_)); + } else { + old_expr = dml_ctdef.old_row_.at(col_idx); + } } else { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected status: not supported dml type", diff --git a/src/sql/rewrite/ob_transform_rule.cpp b/src/sql/rewrite/ob_transform_rule.cpp index 35de111bee..8222962829 100644 --- a/src/sql/rewrite/ob_transform_rule.cpp +++ b/src/sql/rewrite/ob_transform_rule.cpp @@ -624,6 +624,9 @@ int ObTransformRule::need_transform(const common::ObIArray &par if (is_normal_disabled_transform(stmt)) { need_trans = false; OPT_TRACE("hierarchical query or insert query can not transform"); + } else if (stmt.has_instead_of_trigger()) { + need_trans = false; + OPT_TRACE("stmt with instead of trigger can not transform"); } else if (OB_FAIL(check_hint_status(stmt, need_trans))) { LOG_WARN("failed to check hint status", K(ret)); }