[CP] fix update with non-strict mode core
Co-authored-by: leslieyuchen <leslieyuchen@gmail.com>
This commit is contained in:
@ -257,10 +257,23 @@ int ObDASUtils::reshape_storage_value(const ObObjMeta &col_type,
|
||||
const ObAccuracy &col_accuracy,
|
||||
ObIAllocator &allocator,
|
||||
ObObj &value)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (lib::is_oracle_mode() && value.is_character_type() && value.get_string_len() == 0) {
|
||||
// Oracle compatibility mode: '' as null
|
||||
LOG_DEBUG("reshape empty string to null", K(value));
|
||||
value.set_null();
|
||||
} else if (OB_FAIL(padding_fixed_string_value(col_accuracy.get_length(), allocator, value))) {
|
||||
LOG_WARN("padding char value failed", K(ret), K(col_accuracy), K(value));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObDASUtils::padding_fixed_string_value(int64_t max_len, ObIAllocator &allocator, ObObj &value)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (value.is_binary()) {
|
||||
int32_t binary_len = col_accuracy.get_length();
|
||||
int32_t binary_len = max_len;
|
||||
int32_t len = value.get_string_len();
|
||||
if (binary_len > len) {
|
||||
char *dest_str = NULL;
|
||||
@ -275,10 +288,6 @@ int ObDASUtils::reshape_storage_value(const ObObjMeta &col_type,
|
||||
value.set_binary(ObString(binary_len, dest_str));
|
||||
}
|
||||
}
|
||||
} else if (lib::is_oracle_mode() && value.is_character_type() && value.get_string_len() == 0) {
|
||||
// Oracle compatibility mode: '' as null
|
||||
LOG_DEBUG("reshape empty string to null", K(value));
|
||||
value.set_null();
|
||||
} else if (value.is_fixed_len_char_type()) {
|
||||
const char *str = value.get_string_ptr();
|
||||
int32_t len = value.get_string_len();
|
||||
|
||||
@ -62,6 +62,7 @@ public:
|
||||
const bool enable_oracle_empty_char_reshape_to_null,
|
||||
ObIAllocator &allocator,
|
||||
blocksstable::ObStorageDatum &datum_value);
|
||||
static int padding_fixed_string_value(int64_t max_len, ObIAllocator &alloc, ObObj &value);
|
||||
static int generate_spatial_index_rows(ObIAllocator &allocator,
|
||||
const ObDASDMLBaseCtDef &das_ctdef,
|
||||
const ObString &wkb_str,
|
||||
|
||||
@ -39,15 +39,14 @@ using namespace transaction;
|
||||
namespace sql
|
||||
{
|
||||
int ObDMLService::check_row_null(const ObExprPtrIArray &row,
|
||||
ObEvalCtx &eval_ctx,
|
||||
int64_t row_num,
|
||||
const ColContentIArray &column_infos,
|
||||
const ObDASDMLBaseCtDef &das_ctdef,
|
||||
bool is_single_value,
|
||||
ObTableModifyOp &dml_op)
|
||||
ObEvalCtx &eval_ctx,
|
||||
int64_t row_num,
|
||||
const ColContentIArray &column_infos,
|
||||
bool is_ignore,
|
||||
bool is_single_value,
|
||||
ObTableModifyOp &dml_op)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
const bool is_ignore = das_ctdef.is_ignore_;
|
||||
ObSQLSessionInfo *session = NULL;
|
||||
CK(row.count() >= column_infos.count());
|
||||
if (OB_ISNULL(session = dml_op.get_exec_ctx().get_my_session())) {
|
||||
@ -65,6 +64,7 @@ int ObDMLService::check_row_null(const ObExprPtrIArray &row,
|
||||
if (is_ignore ||
|
||||
(lib::is_mysql_mode() && !is_single_value && !is_strict_mode(session->get_sql_mode()))) {
|
||||
ObObj zero_obj;
|
||||
ObExprStrResAlloc res_alloc(*row.at(col_idx), eval_ctx);
|
||||
ObDatum &row_datum = row.at(col_idx)->locate_datum_for_write(eval_ctx);
|
||||
bool is_decimal_int = ob_is_decimal_int(row.at(col_idx)->datum_meta_.type_);
|
||||
if (is_oracle_mode()) {
|
||||
@ -77,8 +77,6 @@ int ObDMLService::check_row_null(const ObExprPtrIArray &row,
|
||||
} else if (OB_FAIL(ObObjCaster::get_zero_value(
|
||||
row.at(col_idx)->obj_meta_.get_type(),
|
||||
row.at(col_idx)->obj_meta_.get_collation_type(),
|
||||
das_ctdef.column_accuracys_.at(col_idx).get_length(),
|
||||
eval_ctx.exec_ctx_.get_allocator(),
|
||||
zero_obj))) {
|
||||
LOG_WARN("get column default zero value failed", K(ret), K(column_infos.at(i)), K(row.at(col_idx)->max_length_));
|
||||
} else if (is_decimal_int) {
|
||||
@ -88,6 +86,11 @@ int ObDMLService::check_row_null(const ObExprPtrIArray &row,
|
||||
row_datum.set_decimal_int(dec_val.get_decimal_int(), dec_val.get_int_bytes());
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
LOG_WARN("get column default zero value failed", K(ret), K(column_infos.at(i)));
|
||||
} else if (OB_FAIL(ObDASUtils::padding_fixed_string_value(row.at(col_idx)->max_length_,
|
||||
res_alloc,
|
||||
zero_obj))) {
|
||||
LOG_WARN("padding fixed string value failed", K(ret));
|
||||
} else if (OB_FAIL(ObTextStringResult::ob_convert_obj_temporay_lob(zero_obj, eval_ctx.exec_ctx_.get_allocator()))) {
|
||||
LOG_WARN("convert lob types zero obj failed", K(ret), K(zero_obj));
|
||||
} else if (OB_FAIL(!is_decimal_int && row_datum.from_obj(zero_obj))) {
|
||||
@ -613,7 +616,7 @@ int ObDMLService::process_insert_row(const ObInsCtDef &ins_ctdef,
|
||||
dml_op.get_eval_ctx(),
|
||||
ins_rtdef.cur_row_num_,
|
||||
ins_ctdef.column_infos_,
|
||||
ins_ctdef.das_ctdef_,
|
||||
ins_ctdef.das_ctdef_.is_ignore_,
|
||||
ins_ctdef.is_single_value_,
|
||||
dml_op))) {
|
||||
LOG_WARN("check row null failed", K(ret));
|
||||
@ -829,7 +832,7 @@ int ObDMLService::process_update_row(const ObUpdCtDef &upd_ctdef,
|
||||
dml_op.get_eval_ctx(),
|
||||
upd_rtdef.cur_row_num_,
|
||||
upd_ctdef.assign_columns_,
|
||||
upd_ctdef.dupd_ctdef_,
|
||||
upd_ctdef.dupd_ctdef_.is_ignore_,
|
||||
false,
|
||||
dml_op))) {
|
||||
LOG_WARN("check row null failed", K(ret), K(upd_ctdef), K(upd_rtdef));
|
||||
|
||||
@ -28,7 +28,7 @@ public:
|
||||
ObEvalCtx &eval_ctx,
|
||||
int64_t row_num,
|
||||
const ColContentIArray &column_infos,
|
||||
const ObDASDMLBaseCtDef &das_ctdef,
|
||||
bool is_ignore,
|
||||
bool is_single_value,
|
||||
ObTableModifyOp &dml_op);
|
||||
static int check_column_type(const ExprFixedArray &dml_row,
|
||||
|
||||
Reference in New Issue
Block a user