[BUGFIX] fix dbms_lob erase process utf16
This commit is contained in:
@ -2826,20 +2826,37 @@ int ObLobManager::do_delete_one_piece(ObLobAccessParam& param, ObLobQueryResult
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObLobManager::fill_zero(char *ptr, uint64_t length, bool is_char,
|
int ObLobManager::fill_zero(char *ptr, uint64_t length, bool is_char,
|
||||||
uint32_t byte_len, uint32_t byte_offset, uint32_t char_len)
|
const ObCollationType coll_type, uint32_t byte_len, uint32_t byte_offset, uint32_t &char_len)
|
||||||
{
|
{
|
||||||
char* dst_start = ptr + byte_offset + char_len;
|
int ret = OB_SUCCESS;
|
||||||
char* src_start = ptr + byte_offset + byte_len;
|
ObString space = ObCharsetUtils::get_const_str(coll_type, ' ');
|
||||||
uint32_t cp_len = length - (byte_len + byte_offset);
|
uint32_t space_len = space.length();
|
||||||
if (cp_len > 0 && char_len != byte_len) {
|
uint32_t converted_len = space.length() * char_len;
|
||||||
MEMMOVE(dst_start, src_start, cp_len);
|
if (converted_len > byte_len) {
|
||||||
}
|
ret = OB_ERR_UNEXPECTED;
|
||||||
if (!is_char) {
|
LOG_WARN("fail to fill zero for length invalid", K(ret), K(space_len), K(char_len), K(byte_len));
|
||||||
MEMSET(ptr + byte_offset, 0x00, char_len);
|
|
||||||
} else {
|
} else {
|
||||||
MEMSET(ptr + byte_offset, ' ', char_len);
|
char* dst_start = ptr + byte_offset + converted_len;
|
||||||
|
char* src_start = ptr + byte_offset + byte_len;
|
||||||
|
uint32_t cp_len = length - (byte_len + byte_offset);
|
||||||
|
if (cp_len > 0 && dst_start != src_start) {
|
||||||
|
MEMMOVE(dst_start, src_start, cp_len);
|
||||||
|
}
|
||||||
|
if (!is_char) {
|
||||||
|
MEMSET(ptr + byte_offset, 0x00, converted_len);
|
||||||
|
} else {
|
||||||
|
if (space_len > 1) {
|
||||||
|
for (int i = 0; i < char_len; i++) {
|
||||||
|
MEMCPY(ptr + byte_offset + i * space_len, space.ptr(), space_len);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
MEMSET(ptr + byte_offset, ' ', char_len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
char_len = converted_len;
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObLobManager::erase_process_meta_info(ObLobAccessParam& param, ObLobMetaScanIter &meta_iter,
|
int ObLobManager::erase_process_meta_info(ObLobAccessParam& param, ObLobMetaScanIter &meta_iter,
|
||||||
@ -2925,9 +2942,12 @@ int ObLobManager::erase_process_meta_info(ObLobAccessParam& param, ObLobMetaScan
|
|||||||
}
|
}
|
||||||
if (param.is_fill_zero_) {
|
if (param.is_fill_zero_) {
|
||||||
uint32_t fill_char_len = local_end - local_begin;
|
uint32_t fill_char_len = local_end - local_begin;
|
||||||
fill_zero(read_data.ptr(), read_data.length(), is_char, by_len, by_st, fill_char_len);
|
if (OB_FAIL(fill_zero(read_data.ptr(), read_data.length(), is_char, param.coll_type_, by_len, by_st, fill_char_len))) {
|
||||||
read_data.set_length(read_data.length() - by_len + fill_char_len);
|
LOG_WARN("failed to fill zero", K(ret));
|
||||||
new_meta_row.byte_len_ = read_data.length();
|
} else {
|
||||||
|
read_data.set_length(read_data.length() - by_len + fill_char_len);
|
||||||
|
new_meta_row.byte_len_ = read_data.length();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
read_data.assign_buffer(tmp_buf, result.meta_result_.info_.byte_len_);
|
read_data.assign_buffer(tmp_buf, result.meta_result_.info_.byte_len_);
|
||||||
if (OB_FAIL(get_real_data(param, result, read_data))) {
|
if (OB_FAIL(get_real_data(param, result, read_data))) {
|
||||||
@ -2957,10 +2977,13 @@ int ObLobManager::erase_process_meta_info(ObLobAccessParam& param, ObLobMetaScan
|
|||||||
}
|
}
|
||||||
if (param.is_fill_zero_) {
|
if (param.is_fill_zero_) {
|
||||||
uint32_t fill_char_len = piece_char_len - local_begin;
|
uint32_t fill_char_len = piece_char_len - local_begin;
|
||||||
fill_zero(read_data.ptr(), read_data.length(), is_char,
|
if (OB_FAIL(fill_zero(read_data.ptr(), read_data.length(), is_char, param.coll_type_,
|
||||||
read_data.length() - by_len, by_len, fill_char_len);
|
read_data.length() - by_len, by_len, fill_char_len))) {
|
||||||
read_data.set_length(by_len + fill_char_len);
|
LOG_WARN("failed to fill zero", K(ret));
|
||||||
new_meta_row.byte_len_ = read_data.length();
|
} else {
|
||||||
|
read_data.set_length(by_len + fill_char_len);
|
||||||
|
new_meta_row.byte_len_ = read_data.length();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
read_data.assign_ptr(read_data.ptr(), by_len);
|
read_data.assign_ptr(read_data.ptr(), by_len);
|
||||||
new_meta_row.byte_len_ = by_len;
|
new_meta_row.byte_len_ = by_len;
|
||||||
@ -2982,9 +3005,12 @@ int ObLobManager::erase_process_meta_info(ObLobAccessParam& param, ObLobMetaScan
|
|||||||
}
|
}
|
||||||
if (param.is_fill_zero_) {
|
if (param.is_fill_zero_) {
|
||||||
uint32_t fill_char_len = local_end;
|
uint32_t fill_char_len = local_end;
|
||||||
fill_zero(read_data.ptr(), read_data.length(), is_char, by_len, 0, fill_char_len);
|
if (OB_FAIL(fill_zero(read_data.ptr(), read_data.length(), is_char, param.coll_type_, by_len, 0, fill_char_len))) {
|
||||||
read_data.set_length(fill_char_len + read_data.length() - by_len);
|
LOG_WARN("failed to fill zero", K(ret));
|
||||||
new_meta_row.byte_len_ = read_data.length();
|
} else {
|
||||||
|
read_data.set_length(fill_char_len + read_data.length() - by_len);
|
||||||
|
new_meta_row.byte_len_ = read_data.length();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
read_data.assign_buffer(tmp_buf, result.meta_result_.info_.byte_len_);
|
read_data.assign_buffer(tmp_buf, result.meta_result_.info_.byte_len_);
|
||||||
if (OB_FAIL(get_real_data(param, result, read_data))) {
|
if (OB_FAIL(get_real_data(param, result, read_data))) {
|
||||||
@ -3121,15 +3147,18 @@ int ObLobManager::erase(ObLobAccessParam& param)
|
|||||||
} else {
|
} else {
|
||||||
if (param.is_fill_zero_) { // do fill zero
|
if (param.is_fill_zero_) { // do fill zero
|
||||||
bool is_char = (param.coll_type_ != CS_TYPE_BINARY);
|
bool is_char = (param.coll_type_ != CS_TYPE_BINARY);
|
||||||
fill_zero(data.ptr(), data.length(), is_char, byte_len, byte_offset, char_len);
|
if (OB_FAIL(fill_zero(data.ptr(), data.length(), is_char, param.coll_type_, byte_len, byte_offset, char_len))) {
|
||||||
param.byte_size_ = param.byte_size_ - byte_len + char_len;
|
LOG_WARN("failed to fill zero", K(ret));
|
||||||
if (param.lob_data_ != nullptr) {
|
} else {
|
||||||
param.lob_data_->byte_size_ = param.byte_size_;
|
param.byte_size_ = param.byte_size_ - byte_len + char_len;
|
||||||
}
|
if (param.lob_data_ != nullptr) {
|
||||||
if (OB_NOT_NULL(param.lob_locator_)) {
|
param.lob_data_->byte_size_ = param.byte_size_;
|
||||||
param.lob_locator_->size_ = param.lob_locator_->size_ - byte_len + char_len;
|
}
|
||||||
if (OB_FAIL(fill_lob_locator_extern(param))) {
|
if (OB_NOT_NULL(param.lob_locator_)) {
|
||||||
LOG_WARN("fail to fill lob locator extern", K(ret), KPC(param.lob_locator_));
|
param.lob_locator_->size_ = param.lob_locator_->size_ - byte_len + char_len;
|
||||||
|
if (OB_FAIL(fill_lob_locator_extern(param))) {
|
||||||
|
LOG_WARN("fail to fill lob locator extern", K(ret), KPC(param.lob_locator_));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { // do erase
|
} else { // do erase
|
||||||
|
|||||||
@ -293,7 +293,8 @@ private:
|
|||||||
int getlength_remote(ObLobAccessParam& param, common::ObAddr& dst_addr, uint64_t &len);
|
int getlength_remote(ObLobAccessParam& param, common::ObAddr& dst_addr, uint64_t &len);
|
||||||
int do_delete_one_piece(ObLobAccessParam& param, ObLobQueryResult &result, ObString &tmp_buff);
|
int do_delete_one_piece(ObLobAccessParam& param, ObLobQueryResult &result, ObString &tmp_buff);
|
||||||
int prepare_erase_buffer(ObLobAccessParam& param, ObString &tmp_buff);
|
int prepare_erase_buffer(ObLobAccessParam& param, ObString &tmp_buff);
|
||||||
void fill_zero(char *ptr, uint64_t length, bool is_char, uint32_t byte_len, uint32_t byte_offset, uint32_t char_len);
|
int fill_zero(char *ptr, uint64_t length, bool is_char,
|
||||||
|
const ObCollationType coll_type, uint32_t byte_len, uint32_t byte_offset, uint32_t &char_len);
|
||||||
int prepare_lob_common(ObLobAccessParam& param, bool &alloc_inside);
|
int prepare_lob_common(ObLobAccessParam& param, bool &alloc_inside);
|
||||||
bool lob_handle_has_char_len(ObLobAccessParam& param);
|
bool lob_handle_has_char_len(ObLobAccessParam& param);
|
||||||
int64_t* get_char_len_ptr(ObLobAccessParam& param);
|
int64_t* get_char_len_ptr(ObLobAccessParam& param);
|
||||||
|
|||||||
Reference in New Issue
Block a user