fix mode compatibility bug
This commit is contained in:
@ -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()))) {
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user