diff --git a/src/sql/engine/dml/ob_dml_service.cpp b/src/sql/engine/dml/ob_dml_service.cpp index 2daa314877..c500fdee47 100644 --- a/src/sql/engine/dml/ob_dml_service.cpp +++ b/src/sql/engine/dml/ob_dml_service.cpp @@ -42,10 +42,16 @@ int ObDMLService::check_row_null(const ObExprPtrIArray &row, int64_t row_num, const ColContentIArray &column_infos, bool is_ignore, + bool is_single_value, ObTableModifyOp &dml_op) { int ret = OB_SUCCESS; + ObSQLSessionInfo *session = NULL; CK(row.count() >= column_infos.count()); + if (OB_ISNULL(session = dml_op.get_exec_ctx().get_my_session())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("session is NULL", K(ret)); + } for (int i = 0; OB_SUCC(ret) && i < column_infos.count(); i++) { ObDatum *datum = NULL; const bool is_nullable = column_infos.at(i).is_nullable_; @@ -53,7 +59,8 @@ int ObDMLService::check_row_null(const ObExprPtrIArray &row, if (OB_FAIL(row.at(col_idx)->eval(eval_ctx, datum))) { dml_op.log_user_error_inner(ret, row_num, column_infos.at(i)); } else if (!is_nullable && datum->is_null()) { - if (is_ignore) { + if (is_ignore || + (lib::is_mysql_mode() && !is_single_value && !is_strict_mode(session->get_sql_mode()))) { ObObj zero_obj; ObDatum &row_datum = row.at(col_idx)->locate_datum_for_write(eval_ctx); if (is_oracle_mode()) { @@ -588,6 +595,7 @@ int ObDMLService::process_insert_row(const ObInsCtDef &ins_ctdef, ins_rtdef.cur_row_num_, ins_ctdef.column_infos_, ins_ctdef.das_ctdef_.is_ignore_, + ins_ctdef.is_single_value_, dml_op))) { LOG_WARN("check row null failed", K(ret)); } else if (OB_FAIL(filter_row_for_view_check(ins_ctdef.view_check_exprs_, @@ -803,6 +811,7 @@ int ObDMLService::process_update_row(const ObUpdCtDef &upd_ctdef, upd_rtdef.cur_row_num_, upd_ctdef.assign_columns_, upd_ctdef.dupd_ctdef_.is_ignore_, + false, dml_op))) { LOG_WARN("check row null failed", K(ret), K(upd_ctdef), K(upd_rtdef)); } else if (OB_FAIL(check_row_whether_changed(upd_ctdef, upd_rtdef, dml_op.get_eval_ctx()))) { diff --git a/src/sql/engine/dml/ob_dml_service.h b/src/sql/engine/dml/ob_dml_service.h index 6f829c8ea4..7afb5f5870 100644 --- a/src/sql/engine/dml/ob_dml_service.h +++ b/src/sql/engine/dml/ob_dml_service.h @@ -29,6 +29,7 @@ public: int64_t row_num, const ColContentIArray &column_infos, bool is_ignore, + bool is_single_value, ObTableModifyOp &dml_op); static int check_column_type(const ExprFixedArray &dml_row, int64_t row_num, diff --git a/src/sql/engine/pdml/static/ob_px_multi_part_insert_op.cpp b/src/sql/engine/pdml/static/ob_px_multi_part_insert_op.cpp index 6d7a73d769..ecbd2f8762 100644 --- a/src/sql/engine/pdml/static/ob_px_multi_part_insert_op.cpp +++ b/src/sql/engine/pdml/static/ob_px_multi_part_insert_op.cpp @@ -133,6 +133,7 @@ int ObPxMultiPartInsertOp::process_row() ins_rtdef_.cur_row_num_, MY_SPEC.ins_ctdef_.column_infos_, MY_SPEC.is_ignore_, + MY_SPEC.ins_ctdef_.is_single_value_, *this)); OZ(ObDMLService::filter_row_for_view_check(MY_SPEC.ins_ctdef_.view_check_exprs_, eval_ctx_, is_filtered)); OV(!is_filtered, OB_ERR_CHECK_OPTION_VIOLATED); diff --git a/src/sql/optimizer/ob_insert_log_plan.cpp b/src/sql/optimizer/ob_insert_log_plan.cpp index bd2fccbf75..9206a7b5ec 100644 --- a/src/sql/optimizer/ob_insert_log_plan.cpp +++ b/src/sql/optimizer/ob_insert_log_plan.cpp @@ -614,8 +614,10 @@ int ObInsertLogPlan::check_insert_stmt_need_multi_partition_dml(bool &is_multi_p ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); } else if (OB_FALSE_IT(is_one_part_table = ObSQLUtils::is_one_part_table_can_skip_part_calc(*table_schema))) { - } else if (insert_stmt->is_ignore() && !is_one_part_table) { + } else if ((insert_stmt->is_ignore() && !is_one_part_table) || + (lib::is_mysql_mode() && !is_strict_mode(session_info->get_sql_mode()))) { // insert ignore,并且是分区表插入时,不能优化 + // mysql non strict mode can not optimize as multi part dml is_multi_part_dml = true; } else if (!insert_stmt->get_insert_table_info().part_ids_.empty() && insert_stmt->value_from_select()) {