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,
 | 
					                                       int64_t row_num,
 | 
				
			||||||
                                       const ColContentIArray &column_infos,
 | 
					                                       const ColContentIArray &column_infos,
 | 
				
			||||||
                                       bool is_ignore,
 | 
					                                       bool is_ignore,
 | 
				
			||||||
 | 
					                                       bool is_single_value,
 | 
				
			||||||
                                       ObTableModifyOp &dml_op)
 | 
					                                       ObTableModifyOp &dml_op)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
 | 
					  ObSQLSessionInfo *session = NULL;
 | 
				
			||||||
  CK(row.count() >= column_infos.count());
 | 
					  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++) {
 | 
					  for (int i = 0; OB_SUCC(ret) && i < column_infos.count(); i++) {
 | 
				
			||||||
    ObDatum *datum = NULL;
 | 
					    ObDatum *datum = NULL;
 | 
				
			||||||
    const bool is_nullable = column_infos.at(i).is_nullable_;
 | 
					    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))) {
 | 
					    if (OB_FAIL(row.at(col_idx)->eval(eval_ctx, datum))) {
 | 
				
			||||||
      dml_op.log_user_error_inner(ret, row_num, column_infos.at(i));
 | 
					      dml_op.log_user_error_inner(ret, row_num, column_infos.at(i));
 | 
				
			||||||
    } else if (!is_nullable && datum->is_null()) {
 | 
					    } 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;
 | 
					        ObObj zero_obj;
 | 
				
			||||||
        ObDatum &row_datum = row.at(col_idx)->locate_datum_for_write(eval_ctx);
 | 
					        ObDatum &row_datum = row.at(col_idx)->locate_datum_for_write(eval_ctx);
 | 
				
			||||||
        if (is_oracle_mode()) {
 | 
					        if (is_oracle_mode()) {
 | 
				
			||||||
@ -588,6 +595,7 @@ int ObDMLService::process_insert_row(const ObInsCtDef &ins_ctdef,
 | 
				
			|||||||
                                      ins_rtdef.cur_row_num_,
 | 
					                                      ins_rtdef.cur_row_num_,
 | 
				
			||||||
                                      ins_ctdef.column_infos_,
 | 
					                                      ins_ctdef.column_infos_,
 | 
				
			||||||
                                      ins_ctdef.das_ctdef_.is_ignore_,
 | 
					                                      ins_ctdef.das_ctdef_.is_ignore_,
 | 
				
			||||||
 | 
					                                      ins_ctdef.is_single_value_,
 | 
				
			||||||
                                      dml_op))) {
 | 
					                                      dml_op))) {
 | 
				
			||||||
      LOG_WARN("check row null failed", K(ret));
 | 
					      LOG_WARN("check row null failed", K(ret));
 | 
				
			||||||
    } else if (OB_FAIL(filter_row_for_view_check(ins_ctdef.view_check_exprs_,
 | 
					    } 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_rtdef.cur_row_num_,
 | 
				
			||||||
                                        upd_ctdef.assign_columns_,
 | 
					                                        upd_ctdef.assign_columns_,
 | 
				
			||||||
                                        upd_ctdef.dupd_ctdef_.is_ignore_,
 | 
					                                        upd_ctdef.dupd_ctdef_.is_ignore_,
 | 
				
			||||||
 | 
					                                        false,
 | 
				
			||||||
                                        dml_op))) {
 | 
					                                        dml_op))) {
 | 
				
			||||||
        LOG_WARN("check row null failed", K(ret), K(upd_ctdef), K(upd_rtdef));
 | 
					        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()))) {
 | 
					      } 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,
 | 
					                            int64_t row_num,
 | 
				
			||||||
                            const ColContentIArray &column_infos,
 | 
					                            const ColContentIArray &column_infos,
 | 
				
			||||||
                            bool is_ignore,
 | 
					                            bool is_ignore,
 | 
				
			||||||
 | 
					                            bool is_single_value,
 | 
				
			||||||
                            ObTableModifyOp &dml_op);
 | 
					                            ObTableModifyOp &dml_op);
 | 
				
			||||||
  static int check_column_type(const ExprFixedArray &dml_row,
 | 
					  static int check_column_type(const ExprFixedArray &dml_row,
 | 
				
			||||||
                               int64_t row_num,
 | 
					                               int64_t row_num,
 | 
				
			||||||
 | 
				
			|||||||
@ -133,6 +133,7 @@ int ObPxMultiPartInsertOp::process_row()
 | 
				
			|||||||
                                   ins_rtdef_.cur_row_num_,
 | 
					                                   ins_rtdef_.cur_row_num_,
 | 
				
			||||||
                                   MY_SPEC.ins_ctdef_.column_infos_,
 | 
					                                   MY_SPEC.ins_ctdef_.column_infos_,
 | 
				
			||||||
                                   MY_SPEC.is_ignore_,
 | 
					                                   MY_SPEC.is_ignore_,
 | 
				
			||||||
 | 
					                                   MY_SPEC.ins_ctdef_.is_single_value_,
 | 
				
			||||||
                                   *this));
 | 
					                                   *this));
 | 
				
			||||||
  OZ(ObDMLService::filter_row_for_view_check(MY_SPEC.ins_ctdef_.view_check_exprs_, eval_ctx_, is_filtered));
 | 
					  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);
 | 
					  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;
 | 
					    ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
    LOG_WARN("get unexpected null", K(ret));
 | 
					    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 (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,并且是分区表插入时,不能优化
 | 
					    // insert ignore,并且是分区表插入时,不能优化
 | 
				
			||||||
 | 
					    // mysql non strict mode can not optimize as multi part dml
 | 
				
			||||||
    is_multi_part_dml = true;
 | 
					    is_multi_part_dml = true;
 | 
				
			||||||
  } else if (!insert_stmt->get_insert_table_info().part_ids_.empty() &&
 | 
					  } else if (!insert_stmt->get_insert_table_info().part_ids_.empty() &&
 | 
				
			||||||
             insert_stmt->value_from_select()) {
 | 
					             insert_stmt->value_from_select()) {
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user