/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #define USING_LOG_PREFIX SQL_ENG #include "sql/engine/dml/ob_dml_ctx_define.h" #include "sql/das/ob_das_utils.h" namespace oceanbase { namespace sql { OB_SERIALIZE_MEMBER(ObTrigDMLCtDef, tg_event_, tg_args_, trig_col_info_, all_tm_points_.bit_value_, old_row_exprs_, new_row_exprs_, rowid_old_expr_, rowid_new_expr_); OB_SERIALIZE_MEMBER(ObErrLogCtDef, is_error_logging_, err_log_database_name_, err_log_table_name_, reject_limit_, err_log_values_, err_log_column_names_); OB_SERIALIZE_MEMBER(ObTriggerColumnsInfo::Flags, flags_); OB_DEF_SERIALIZE(ObTriggerColumnsInfo) { int ret = OB_SUCCESS; OB_UNIS_ENCODE_ARRAY(flags_, count_); return ret; } OB_DEF_DESERIALIZE(ObTriggerColumnsInfo) { int ret = OB_SUCCESS; int64_t flags_count = 0; OB_UNIS_DECODE(flags_count); if (flags_count > 0) { if (OB_FAIL(init(flags_count))) { LOG_WARN("failed to init trigger column infos", K(ret)); } else { OB_UNIS_DECODE_ARRAY(flags_, flags_count); count_ = flags_count; } } else { flags_ = NULL; } return ret; } OB_DEF_SERIALIZE_SIZE(ObTriggerColumnsInfo) { int64_t len = 0; OB_UNIS_ADD_LEN_ARRAY(flags_, count_); return len; } int ObTriggerColumnsInfo::init(int64_t count) { int ret = OB_SUCCESS; if (OB_ISNULL(allocator_) || 0 == count) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected status: allocator is null", K(ret), K(count)); } else if (OB_ISNULL(flags_ = static_cast(allocator_->alloc(sizeof(Flags) * count)))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("failed to allocate memory", K(ret)); } else { capacity_ = count; } return ret; } int ObTriggerColumnsInfo::set_trigger_column( bool is_hidden, bool is_update, bool is_gen_col, bool is_gen_col_dep, bool is_rowid) { int ret = OB_SUCCESS; if (OB_ISNULL(flags_) || 0 == capacity_ || count_ >= capacity_) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected status: flags_ is null", K(ret), K(count_), KP(flags_)); } else { flags_[count_].is_hidden_ = is_hidden; flags_[count_].is_update_ = is_update; flags_[count_].is_gen_col_ = is_gen_col; flags_[count_].is_gen_col_dep_ = is_gen_col_dep; flags_[count_].is_rowid_ = is_rowid; ++count_; } return ret; } int ObTriggerColumnsInfo::set_trigger_rowid() { return set_trigger_column(true, false, false, false, true); } OB_SERIALIZE_MEMBER(ObTriggerArg, trigger_id_, trigger_events_.bit_value_, timing_points_.bit_value_); OB_SERIALIZE_MEMBER(ObForeignKeyColumn, name_, idx_, name_idx_); OB_SERIALIZE_MEMBER(ObForeignKeyArg, ref_action_, table_name_, columns_, database_name_, is_self_ref_); OB_SERIALIZE_MEMBER(ColumnContent, projector_index_, auto_filled_timestamp_, column_name_, is_nullable_, is_implicit_, is_predicate_column_, srs_id_); int SeRowkeyItem::init( const ObExprPtrIArray &row, ObEvalCtx &ctx, ObIAllocator &alloc, const int64_t rowkey_cnt) { int ret = OB_SUCCESS; CK(rowkey_cnt <= row.count()); if (OB_SUCC(ret)) { // the %alloc is arena allocator, no need to free. if (OB_ISNULL(datums_ = static_cast(alloc.alloc( rowkey_cnt * sizeof(*datums_))))) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("allocate memory failed", K(ret)); } else { new (datums_)ObDatum[rowkey_cnt]; } row_ = row.get_data(); cnt_ = rowkey_cnt; } ObDatum *datum = NULL; for (int i = 0; OB_SUCC(ret) && i < rowkey_cnt; ++i) { if (OB_FAIL((row.at(i)->eval(ctx, datum)))) { LOG_WARN("evaluate expression failed", K(ret)); } else { datums_[i] = *datum; } } return ret; } bool SeRowkeyItem::operator==( const SeRowkeyItem &other) const { bool equal = true; if (cnt_ != other.cnt_) { equal = false; } else { for (int64_t i = 0; equal && i < cnt_; ++i) { ObExprCmpFuncType cmp_func = row_[i]->basic_funcs_->null_first_cmp_; equal = cmp_func(datums_[i], other.datums_[i]) == 0; } } return equal; } uint64_t SeRowkeyItem::hash() const { uint64_t hash_val = 0; for (int64_t i = 0; i < cnt_; ++i) { ObExprHashFuncType hash_func = row_[i]->basic_funcs_->default_hash_; hash_val = hash_func(datums_[i], hash_val); } return hash_val; } int SeRowkeyItem::copy_datum_data(ObIAllocator &alloc) { // the %alloc is arena allocator, no need to free. int ret = OB_SUCCESS; if (OB_LIKELY(NULL != datums_)) { for (int64_t i = 0; OB_SUCC(ret) && i < cnt_; i++) { if (OB_FAIL(datums_[i].deep_copy(datums_[i], alloc))) { LOG_WARN("copy datum data failed", K(ret)); } } } return ret; } OB_SERIALIZE_MEMBER(ObDMLBaseCtDef, check_cst_exprs_, fk_args_, trig_ctdef_, column_ids_, old_row_, new_row_, error_logging_ctdef_, view_check_exprs_, is_primary_index_, is_heap_table_, has_instead_of_trigger_); OB_SERIALIZE_MEMBER(ObMultiInsCtDef, calc_part_id_expr_, hint_part_ids_, loc_meta_); OB_DEF_SERIALIZE(ObInsCtDef) { int ret = OB_SUCCESS; BASE_SER((ObInsCtDef,ObDMLBaseCtDef)); bool has_multi_ctx = (multi_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ENCODE, das_ctdef_, column_infos_, has_multi_ctx); if (has_multi_ctx) { OB_UNIS_ENCODE(*multi_ctdef_); } OZ(ObDASUtils::serialize_das_ctdefs(buf, buf_len, pos, related_ctdefs_)); OB_UNIS_ENCODE(is_single_value_); return ret; } OB_DEF_DESERIALIZE(ObInsCtDef) { int ret = OB_SUCCESS; BASE_DESER((ObInsCtDef,ObDMLBaseCtDef)); bool has_multi_ctx = false; LST_DO_CODE(OB_UNIS_DECODE, das_ctdef_, column_infos_, has_multi_ctx); if (OB_SUCC(ret) && has_multi_ctx) { ObDMLCtDefAllocator multi_ctdef_allocator(alloc_); multi_ctdef_ = multi_ctdef_allocator.alloc(); if (OB_ISNULL(multi_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc multi_ctdef failed", K(ret)); } OB_UNIS_DECODE(*multi_ctdef_); } OZ(ObDASUtils::deserialize_das_ctdefs(buf, data_len, pos, alloc_, DAS_OP_TABLE_INSERT, related_ctdefs_)); OB_UNIS_DECODE(is_single_value_); return ret; } OB_DEF_SERIALIZE_SIZE(ObInsCtDef) { int64_t len = 0; BASE_ADD_LEN((ObInsCtDef,ObDMLBaseCtDef)); bool has_multi_ctx = (multi_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ADD_LEN, das_ctdef_, column_infos_, has_multi_ctx); if (has_multi_ctx) { OB_UNIS_ADD_LEN(*multi_ctdef_); } len += ObDASUtils::das_ctdefs_serialize_size(related_ctdefs_); OB_UNIS_ADD_LEN(is_single_value_); return len; } OB_SERIALIZE_MEMBER(ObMultiDelCtDef, calc_part_id_expr_, loc_meta_); OB_DEF_SERIALIZE(ObDelCtDef) { int ret = OB_SUCCESS; BASE_SER((ObDelCtDef,ObDMLBaseCtDef)); bool has_multi_ctx = (multi_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ENCODE, das_ctdef_, need_check_filter_null_, distinct_algo_, has_multi_ctx); if (has_multi_ctx) { OB_UNIS_ENCODE(*multi_ctdef_); } OZ(ObDASUtils::serialize_das_ctdefs(buf, buf_len, pos, related_ctdefs_)); OB_UNIS_ENCODE(distinct_key_); return ret; } OB_DEF_DESERIALIZE(ObDelCtDef) { int ret = OB_SUCCESS; BASE_DESER((ObDelCtDef,ObDMLBaseCtDef)); bool has_multi_ctx = false; LST_DO_CODE(OB_UNIS_DECODE, das_ctdef_, need_check_filter_null_, distinct_algo_, has_multi_ctx); if (OB_SUCC(ret) && has_multi_ctx) { ObDMLCtDefAllocator multi_ctdef_allocator(alloc_); multi_ctdef_ = multi_ctdef_allocator.alloc(); if (OB_ISNULL(multi_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc multi_ctdef failed", K(ret)); } OB_UNIS_DECODE(*multi_ctdef_); } OZ(ObDASUtils::deserialize_das_ctdefs(buf, data_len, pos, alloc_, DAS_OP_TABLE_DELETE, related_ctdefs_)); OB_UNIS_DECODE(distinct_key_); return ret; } OB_DEF_SERIALIZE_SIZE(ObDelCtDef) { int64_t len = 0; BASE_ADD_LEN((ObDelCtDef,ObDMLBaseCtDef)); bool has_multi_ctx = (multi_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ADD_LEN, das_ctdef_, need_check_filter_null_, distinct_algo_, has_multi_ctx); if (has_multi_ctx) { OB_UNIS_ADD_LEN(*multi_ctdef_); } len += ObDASUtils::das_ctdefs_serialize_size(related_ctdefs_); OB_UNIS_ADD_LEN(distinct_key_); return len; } OB_SERIALIZE_MEMBER(ObMultiLockCtDef, calc_part_id_expr_, partition_cnt_, loc_meta_); OB_DEF_SERIALIZE(ObLockCtDef) { int ret = OB_SUCCESS; BASE_SER((ObLockCtDef,ObDMLBaseCtDef)); bool has_multi_ctx = (multi_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ENCODE, das_ctdef_, need_check_filter_null_, distinct_algo_, has_multi_ctx); if (has_multi_ctx) { OB_UNIS_ENCODE(*multi_ctdef_); } return ret; } OB_DEF_DESERIALIZE(ObLockCtDef) { int ret = OB_SUCCESS; BASE_DESER((ObLockCtDef,ObDMLBaseCtDef)); bool has_multi_ctx = false; LST_DO_CODE(OB_UNIS_DECODE, das_ctdef_, need_check_filter_null_, distinct_algo_, has_multi_ctx); if (OB_SUCC(ret) && has_multi_ctx) { ObDMLCtDefAllocator multi_ctdef_allocator(alloc_); multi_ctdef_ = multi_ctdef_allocator.alloc(); if (OB_ISNULL(multi_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc multi_ctdef failed", K(ret)); } OB_UNIS_DECODE(*multi_ctdef_); } return ret; } OB_DEF_SERIALIZE_SIZE(ObLockCtDef) { int64_t len = 0; BASE_ADD_LEN((ObLockCtDef,ObDMLBaseCtDef)); bool has_multi_ctx = (multi_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ADD_LEN, das_ctdef_, need_check_filter_null_, distinct_algo_, has_multi_ctx); if (has_multi_ctx) { OB_UNIS_ADD_LEN(*multi_ctdef_); } return len; } OB_SERIALIZE_MEMBER(ObMultiUpdCtDef, calc_part_id_old_, calc_part_id_new_, is_enable_row_movement_, loc_meta_); OB_DEF_SERIALIZE(ObUpdCtDef) { int ret = OB_SUCCESS; BASE_SER((ObUpdCtDef,ObDMLBaseCtDef)); bool has_pkey_upd = (ddel_ctdef_ != nullptr); bool has_lock_def = (dlock_ctdef_ != nullptr); bool has_multi_def = (multi_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ENCODE, full_row_, dupd_ctdef_, need_check_filter_null_, distinct_algo_, assign_columns_, distinct_key_, has_pkey_upd, has_lock_def, has_multi_def); if (has_pkey_upd) { OB_UNIS_ENCODE(*ddel_ctdef_); OB_UNIS_ENCODE(*dins_ctdef_); } if (has_lock_def) { OB_UNIS_ENCODE(*dlock_ctdef_); } if (has_multi_def) { OB_UNIS_ENCODE(*multi_ctdef_); } OZ(ObDASUtils::serialize_das_ctdefs(buf, buf_len, pos, related_upd_ctdefs_)); OZ(ObDASUtils::serialize_das_ctdefs(buf, buf_len, pos, related_del_ctdefs_)); OZ(ObDASUtils::serialize_das_ctdefs(buf, buf_len, pos, related_ins_ctdefs_)); return ret; } OB_DEF_DESERIALIZE(ObUpdCtDef) { int ret = OB_SUCCESS; BASE_DESER((ObUpdCtDef,ObDMLBaseCtDef)); bool has_pkey_upd = false; bool has_lock_def = false; bool has_multi_def = false; LST_DO_CODE(OB_UNIS_DECODE, full_row_, dupd_ctdef_, need_check_filter_null_, distinct_algo_, assign_columns_, distinct_key_, has_pkey_upd, has_lock_def, has_multi_def); if (OB_SUCC(ret) && has_pkey_upd) { ObDMLCtDefAllocator ddel_allocator(alloc_); ObDMLCtDefAllocator dins_allocator(alloc_); ddel_ctdef_ = ddel_allocator.alloc(); dins_ctdef_ = dins_allocator.alloc(); if (OB_ISNULL(ddel_ctdef_) || OB_ISNULL(dins_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc das ctdef failed", K(ret), K(ddel_ctdef_), K(dins_ctdef_)); } OB_UNIS_DECODE(*ddel_ctdef_); OB_UNIS_DECODE(*dins_ctdef_); } if (OB_SUCC(ret) && has_lock_def) { ObDMLCtDefAllocator dlock_allocator(alloc_); dlock_ctdef_ = dlock_allocator.alloc(); if (OB_ISNULL(dlock_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc das lock ctdef failed", K(ret)); } OB_UNIS_DECODE(*dlock_ctdef_); } if (OB_SUCC(ret) && has_multi_def) { ObDMLCtDefAllocator mctdef_allocator(alloc_); multi_ctdef_ = mctdef_allocator.alloc(); if (OB_ISNULL(multi_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc multi_ctdef failed", K(ret)); } OB_UNIS_DECODE(*multi_ctdef_); } OZ(ObDASUtils::deserialize_das_ctdefs(buf, data_len, pos, alloc_, DAS_OP_TABLE_UPDATE, related_upd_ctdefs_)); OZ(ObDASUtils::deserialize_das_ctdefs(buf, data_len, pos, alloc_, DAS_OP_TABLE_DELETE, related_del_ctdefs_)); OZ(ObDASUtils::deserialize_das_ctdefs(buf, data_len, pos, alloc_, DAS_OP_TABLE_INSERT, related_ins_ctdefs_)); return ret; } OB_DEF_SERIALIZE_SIZE(ObUpdCtDef) { int64_t len = 0; BASE_ADD_LEN((ObUpdCtDef,ObDMLBaseCtDef)); bool has_pkey_upd = (ddel_ctdef_ != nullptr); bool has_lock_def = (dlock_ctdef_ != nullptr); bool has_multi_def = (multi_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ADD_LEN, full_row_, dupd_ctdef_, need_check_filter_null_, distinct_algo_, assign_columns_, distinct_key_, has_pkey_upd, has_lock_def, has_multi_def); if (has_pkey_upd) { OB_UNIS_ADD_LEN(*ddel_ctdef_); OB_UNIS_ADD_LEN(*dins_ctdef_); } if (has_lock_def) { OB_UNIS_ADD_LEN(*dlock_ctdef_); } if (has_multi_def) { OB_UNIS_ADD_LEN(*multi_ctdef_); } len += ObDASUtils::das_ctdefs_serialize_size(related_upd_ctdefs_); len += ObDASUtils::das_ctdefs_serialize_size(related_del_ctdefs_); len += ObDASUtils::das_ctdefs_serialize_size(related_ins_ctdefs_); return len; } OB_DEF_SERIALIZE(ObMergeCtDef) { int ret = OB_SUCCESS; bool has_insert = (ins_ctdef_ != nullptr); bool has_update = (upd_ctdef_ != nullptr); bool has_delete = (del_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ENCODE, has_insert, has_update, has_delete); if (has_insert) { OB_UNIS_ENCODE(*ins_ctdef_); } if (has_update) { OB_UNIS_ENCODE(*upd_ctdef_); } if (has_delete) { OB_UNIS_ENCODE(*del_ctdef_); } return ret; } OB_DEF_DESERIALIZE(ObMergeCtDef) { int ret = OB_SUCCESS; bool has_insert = false; bool has_update = false; bool has_delete = false; LST_DO_CODE(OB_UNIS_DECODE, has_insert, has_update, has_delete); if (OB_SUCC(ret) && has_insert) { ObDMLCtDefAllocator ins_ctdef_allocator(alloc_); ins_ctdef_ = ins_ctdef_allocator.alloc(); if (OB_ISNULL(ins_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc ins_ctdef failed", K(ret)); } OB_UNIS_DECODE(*ins_ctdef_); } if (OB_SUCC(ret) && has_update) { ObDMLCtDefAllocator upd_ctdef_allocator(alloc_); upd_ctdef_ = upd_ctdef_allocator.alloc(); if (OB_ISNULL(upd_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc upd_ctdef_ failed", K(ret)); } OB_UNIS_DECODE(*upd_ctdef_); } if (OB_SUCC(ret) && has_delete) { ObDMLCtDefAllocator ins_ctdef_allocator(alloc_); del_ctdef_ = ins_ctdef_allocator.alloc(); if (OB_ISNULL(del_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc del_ctdef_ failed", K(ret)); } OB_UNIS_DECODE(*del_ctdef_); } return ret; } OB_DEF_SERIALIZE_SIZE(ObMergeCtDef) { int64_t len = 0; bool has_insert = (ins_ctdef_ != nullptr); bool has_update = (upd_ctdef_ != nullptr); bool has_delete = (del_ctdef_ != nullptr); LST_DO_CODE(OB_UNIS_ADD_LEN, has_insert, has_update, has_delete); if (has_insert) { OB_UNIS_ADD_LEN(*ins_ctdef_); } if (has_update) { OB_UNIS_ADD_LEN(*upd_ctdef_); } if (has_delete) { OB_UNIS_ADD_LEN(*del_ctdef_); } return len; } // replace into serialize and deserialize OB_DEF_SERIALIZE(ObReplaceCtDef) { int ret = OB_SUCCESS; OB_UNIS_ENCODE(*ins_ctdef_); OB_UNIS_ENCODE(*del_ctdef_); return ret; } OB_DEF_DESERIALIZE(ObReplaceCtDef) { int ret = OB_SUCCESS; ObDMLCtDefAllocator ins_ctdef_allocator(alloc_); ins_ctdef_ = ins_ctdef_allocator.alloc(); if (OB_ISNULL(ins_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc ins_ctdef failed", K(ret)); } OB_UNIS_DECODE(*ins_ctdef_); ObDMLCtDefAllocator del_ctdef_allocator(alloc_); del_ctdef_ = del_ctdef_allocator.alloc(); if (OB_ISNULL(del_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc del_ctdef_ failed", K(ret)); } OB_UNIS_DECODE(*del_ctdef_); return ret; } OB_DEF_SERIALIZE_SIZE(ObReplaceCtDef) { int64_t len = 0; OB_UNIS_ADD_LEN(*ins_ctdef_); OB_UNIS_ADD_LEN(*del_ctdef_); return len; } // insert up serialize and deserialize OB_DEF_SERIALIZE(ObInsertUpCtDef) { int ret = OB_SUCCESS; OB_UNIS_ENCODE(*ins_ctdef_); OB_UNIS_ENCODE(*upd_ctdef_); return ret; } OB_DEF_DESERIALIZE(ObInsertUpCtDef) { int ret = OB_SUCCESS; ObDMLCtDefAllocator ins_ctdef_allocator(alloc_); ins_ctdef_ = ins_ctdef_allocator.alloc(); if (OB_ISNULL(ins_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc ins_ctdef failed", K(ret)); } OB_UNIS_DECODE(*ins_ctdef_); ObDMLCtDefAllocator upd_ctdef_allocator(alloc_); upd_ctdef_ = upd_ctdef_allocator.alloc(); if (OB_ISNULL(upd_ctdef_)) { ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("alloc upd_ctdef failed", K(ret)); } OB_UNIS_DECODE(*upd_ctdef_); return ret; } OB_DEF_SERIALIZE_SIZE(ObInsertUpCtDef) { int64_t len = 0; OB_UNIS_ADD_LEN(*ins_ctdef_); OB_UNIS_ADD_LEN(*upd_ctdef_); return len; } } // namespace sql } // namespace oceanbase