fix mode compatibility bug

This commit is contained in:
akaError
2023-07-11 10:24:58 +00:00
committed by ob-robot
parent 781d80c9b4
commit c5c92dfe7c
4 changed files with 15 additions and 2 deletions

View File

@ -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()))) {

View File

@ -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,

View File

@ -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);

View File

@ -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()) {