[FEAT MERGE]:Merge foreign key feature to master
Co-authored-by: YangEfei <yangyifei96@outlook.com>
This commit is contained in:
@ -660,6 +660,8 @@ int ObLogDelUpd::inner_get_op_exprs(ObIArray<ObRawExpr*> &all_exprs, bool need_c
|
||||
LOG_WARN("failed to find trasn info producer", K(ret));
|
||||
} else if (OB_FAIL(generate_rowid_expr_for_trigger())) {
|
||||
LOG_WARN("failed to try add rowid col expr for trigger", K(ret));
|
||||
} else if (OB_FAIL(generate_part_id_expr_for_foreign_key(all_exprs))) {
|
||||
LOG_WARN("failed to generate part expr for foreign key", K(ret));
|
||||
} else if (NULL != lock_row_flag_expr_ && OB_FAIL(all_exprs.push_back(lock_row_flag_expr_))) {
|
||||
LOG_WARN("failed to push back expr", K(ret));
|
||||
} else if (OB_FAIL(append(all_exprs, view_check_exprs_))) {
|
||||
@ -1307,6 +1309,134 @@ int ObLogDelUpd::generate_lookup_part_id_expr(IndexDMLInfo &index_info)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogDelUpd::generate_fk_lookup_part_id_expr(IndexDMLInfo &index_dml_info)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
const uint64_t table_id = index_dml_info.ref_table_id_;
|
||||
ObLogPlan *log_plan = NULL;
|
||||
ObSchemaGetterGuard *schema_guard = NULL;
|
||||
ObSQLSessionInfo *session_info = NULL;
|
||||
const ObIArray<ObForeignKeyInfo> *fk_infos = NULL;
|
||||
const ObTableSchema *table_schema = NULL;
|
||||
if (OB_ISNULL(log_plan = get_plan())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table schema or plan is NULL", K(ret), KP(schema_guard), KP(get_plan()));
|
||||
} else if (OB_ISNULL(schema_guard = get_plan()->get_optimizer_context().get_schema_guard()) ||
|
||||
OB_ISNULL(session_info = get_plan()->get_optimizer_context().get_session_info())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("failed to get schama guart", K(ret), K(schema_guard), K(session_info));
|
||||
} else if (OB_FAIL(schema_guard->get_table_schema(session_info->get_effective_tenant_id(),
|
||||
index_dml_info.ref_table_id_,
|
||||
table_schema))) {
|
||||
LOG_WARN("failed to get table schema", K(index_dml_info.ref_table_id_), K(ret));
|
||||
} else if (OB_ISNULL(table_schema)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table schema is null", K(index_dml_info.ref_table_id_), K(ret));
|
||||
} else if (!table_schema->is_user_table()) {
|
||||
// do nothing, especially for global index.
|
||||
LOG_DEBUG("skip generate partition key for foreign key",
|
||||
"table_name", table_schema->get_table_name_str(),
|
||||
"table_type", table_schema->get_table_type());
|
||||
} else if (OB_ISNULL(fk_infos = &table_schema->get_foreign_key_infos())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("foreign key infos is null", K(ret));
|
||||
} else {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < fk_infos->count(); i++) {
|
||||
const ObForeignKeyInfo &fk_info = fk_infos->at(i);
|
||||
ObRawExpr* fk_scan_part_expr = nullptr;
|
||||
if (fk_info.table_id_ != fk_info.child_table_id_) {
|
||||
// update parent table, check child table, don't use das task to perform foreign key check
|
||||
ret = index_dml_info.fk_lookup_part_id_expr_.push_back(fk_scan_part_expr);
|
||||
} else if (!fk_info.is_parent_table_mock_) {
|
||||
const uint64_t parent_table_id = fk_info.parent_table_id_;
|
||||
const ObTableSchema *parent_table_schema = NULL;
|
||||
uint64_t scan_index_tid = OB_INVALID_ID;
|
||||
if (OB_FAIL(schema_guard->get_table_schema(session_info->get_effective_tenant_id(),
|
||||
parent_table_id,
|
||||
parent_table_schema))) {
|
||||
LOG_WARN("failed to get table schema of parent table", K(ret), K(parent_table_id));
|
||||
} else if (OB_ISNULL(parent_table_schema)) {
|
||||
ret = OB_TABLE_NOT_EXIST;
|
||||
LOG_WARN("parent table not exist", K(ret), K(parent_table_id));
|
||||
} else if (OB_FAIL(parent_table_schema->get_fk_check_index_tid(*schema_guard, fk_info.parent_column_ids_, scan_index_tid))) {
|
||||
LOG_WARN("failed to get index tid used to build scan das task for foreign key checks", K(ret));
|
||||
} else if (OB_INVALID_ID == scan_index_tid) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get invalid table id to build das scan task for foreign key checks", K(ret));
|
||||
} else {
|
||||
ObRawExpr* fk_look_up_part_id_expr = nullptr;
|
||||
const ObTableSchema* scan_table_schema = nullptr;
|
||||
if (schema_guard->get_table_schema(session_info->get_effective_tenant_id(),
|
||||
scan_index_tid,
|
||||
scan_table_schema)) {
|
||||
LOG_WARN("failed to get scan table schema to perform foreign key check", K(ret), K(scan_index_tid));
|
||||
} else if (OB_ISNULL(scan_table_schema)) {
|
||||
ret = OB_TABLE_NOT_EXIST;
|
||||
LOG_WARN("table schema scanned for foreign key check not exist", K(ret));
|
||||
} else if (scan_table_schema->get_part_level() != PARTITION_LEVEL_ZERO &&
|
||||
OB_FAIL(log_plan->gen_calc_part_id_expr(fk_info.foreign_key_id_, // init table_id by foreign key id
|
||||
scan_index_tid,
|
||||
CALC_PARTITION_TABLET_ID,
|
||||
fk_look_up_part_id_expr))) {
|
||||
LOG_WARN("failed to gen calc part id expr", K(ret));
|
||||
} else if (OB_FAIL(index_dml_info.fk_lookup_part_id_expr_.push_back(fk_look_up_part_id_expr))) {
|
||||
LOG_WARN("failed to push part id expr to array", K(ret), K(index_dml_info.fk_lookup_part_id_expr_));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogDelUpd::convert_insert_new_fk_lookup_part_id_expr(ObIArray<ObRawExpr*> &all_exprs, IndexDMLInfo &index_dml_info)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObRawExpr *, 4> dml_columns;
|
||||
ObSEArray<ObRawExpr *, 4> dml_values;
|
||||
if (OB_FAIL(get_insert_exprs(index_dml_info, dml_columns, dml_values))) {
|
||||
LOG_WARN("failed to get insert exprs", K(ret));
|
||||
} else {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < index_dml_info.fk_lookup_part_id_expr_.count(); ++i) {
|
||||
ObRawExpr *fk_look_up_part_id_expr = index_dml_info.fk_lookup_part_id_expr_.at(i);
|
||||
if (OB_ISNULL(fk_look_up_part_id_expr)) {
|
||||
//nothing to do
|
||||
} else if (OB_FAIL(replace_expr_for_fk_part_expr(dml_columns,
|
||||
dml_values,
|
||||
fk_look_up_part_id_expr))) {
|
||||
LOG_WARN("failed to replace column ref expr for partition expr used for foreign key check", K(ret));
|
||||
} else if (OB_FAIL(all_exprs.push_back(fk_look_up_part_id_expr))) {
|
||||
LOG_WARN("failed to push foreign key check partition expr to all exprs", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogDelUpd::convert_update_new_fk_lookup_part_id_expr(ObIArray<ObRawExpr*> &all_exprs, IndexDMLInfo &index_dml_info)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObRawExpr *, 4> dml_columns;
|
||||
ObSEArray<ObRawExpr *, 4> dml_values;
|
||||
if (OB_FAIL(get_update_exprs(index_dml_info, dml_columns, dml_values))) {
|
||||
LOG_WARN("failed to get insert exprs", K(ret));
|
||||
} else {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < index_dml_info.fk_lookup_part_id_expr_.count(); ++i) {
|
||||
ObRawExpr *fk_look_up_part_id_expr = index_dml_info.fk_lookup_part_id_expr_.at(i);
|
||||
if (OB_ISNULL(fk_look_up_part_id_expr)) {
|
||||
|
||||
} else if (OB_FAIL(replace_expr_for_fk_part_expr(dml_columns,
|
||||
dml_values,
|
||||
fk_look_up_part_id_expr))) {
|
||||
LOG_WARN("failed to replace column ref expr for partition expr used for foreign key check", K(ret));
|
||||
} else if (OB_FAIL(all_exprs.push_back(fk_look_up_part_id_expr))) {
|
||||
LOG_WARN("failed to push foreign key check partition expr to all exprs", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogDelUpd::generate_insert_new_calc_partid_expr(IndexDMLInfo &index_dml_info)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
@ -1364,6 +1494,33 @@ int ObLogDelUpd::convert_expr_by_dml_operation(const ObIArray<ObRawExpr *> &dml_
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogDelUpd::replace_expr_for_fk_part_expr(const ObIArray<ObRawExpr *> &dml_columns,
|
||||
const ObIArray<ObRawExpr *> &dml_new_values,
|
||||
ObRawExpr *fk_part_id_expr)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (OB_ISNULL(get_plan())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("current value expr is null", K(ret), K(get_plan()));
|
||||
} else {
|
||||
ObRawExprCopier copier(get_plan()->get_optimizer_context().get_expr_factory());
|
||||
if (OB_FAIL(copier.add_replaced_expr(dml_columns, dml_new_values))) {
|
||||
LOG_WARN("failed to add replace pair", K(ret));
|
||||
} else {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < fk_part_id_expr->get_param_count(); ++i) {
|
||||
ObRawExpr *param = fk_part_id_expr->get_param_expr(i);
|
||||
ObRawExpr *new_param = NULL;
|
||||
if (OB_FAIL(copier.copy_on_replace(param, new_param))) {
|
||||
LOG_WARN("failed to static replace expr", K(ret));
|
||||
} else {
|
||||
fk_part_id_expr->get_param_expr(i) = new_param;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogDelUpd::get_update_exprs(const IndexDMLInfo &dml_info,
|
||||
ObIArray<ObRawExpr *> &dml_columns,
|
||||
ObIArray<ObRawExpr *> &dml_values)
|
||||
|
||||
@ -43,7 +43,8 @@ public:
|
||||
old_rowid_expr_(NULL),
|
||||
new_rowid_expr_(NULL),
|
||||
trans_info_expr_(NULL),
|
||||
related_index_ids_()
|
||||
related_index_ids_(),
|
||||
fk_lookup_part_id_expr_()
|
||||
{
|
||||
}
|
||||
inline void reset()
|
||||
@ -72,6 +73,7 @@ public:
|
||||
new_rowid_expr_ = NULL,
|
||||
trans_info_expr_ = NULL,
|
||||
related_index_ids_.reset();
|
||||
fk_lookup_part_id_expr_.reset();
|
||||
}
|
||||
int64_t to_explain_string(char *buf, int64_t buf_len, ExplainType type) const;
|
||||
int init_assignment_info(const ObAssignments &assignments,
|
||||
@ -169,6 +171,8 @@ public:
|
||||
// local index id related to current dml
|
||||
TableIDArray related_index_ids_;
|
||||
|
||||
common::ObSEArray<ObRawExpr*, 4, common::ModulePageAllocator, true> fk_lookup_part_id_expr_;
|
||||
|
||||
TO_STRING_KV(K_(table_id),
|
||||
K_(ref_table_id),
|
||||
K_(loc_table_id),
|
||||
@ -330,12 +334,19 @@ public:
|
||||
virtual int is_my_fixed_expr(const ObRawExpr *expr, bool &is_fixed) override;
|
||||
protected:
|
||||
virtual int generate_rowid_expr_for_trigger() = 0;
|
||||
virtual int generate_part_id_expr_for_foreign_key(ObIArray<ObRawExpr*> &all_exprs) = 0;
|
||||
virtual int generate_multi_part_partition_id_expr() = 0;
|
||||
int generate_old_rowid_expr(IndexDMLInfo &table_dml_info);
|
||||
int generate_update_new_rowid_expr(IndexDMLInfo &table_dml_info);
|
||||
int generate_insert_new_rowid_expr(IndexDMLInfo &table_dml_info);
|
||||
int generate_old_calc_partid_expr(IndexDMLInfo &index_info);
|
||||
int generate_lookup_part_id_expr(IndexDMLInfo &index_info);
|
||||
int generate_fk_lookup_part_id_expr(IndexDMLInfo &index_info);
|
||||
int convert_insert_new_fk_lookup_part_id_expr(ObIArray<ObRawExpr*> &all_exprs,IndexDMLInfo &index_dml_info);
|
||||
int convert_update_new_fk_lookup_part_id_expr(ObIArray<ObRawExpr*> &all_exprs, IndexDMLInfo &index_dml_info);
|
||||
int replace_expr_for_fk_part_expr(const ObIArray<ObRawExpr *> &dml_columns,
|
||||
const ObIArray<ObRawExpr *> &dml_new_values,
|
||||
ObRawExpr *fk_part_id_expr);
|
||||
int generate_insert_new_calc_partid_expr(IndexDMLInfo &index_dml_info);
|
||||
int generate_update_new_calc_partid_expr(IndexDMLInfo &index_dml_info);
|
||||
|
||||
|
||||
@ -149,6 +149,15 @@ int ObLogDelete::generate_rowid_expr_for_trigger()
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogDelete::generate_part_id_expr_for_foreign_key(ObIArray<ObRawExpr*> &all_exprs)
|
||||
{
|
||||
// NOTE: for delete parent table, don't support foregin key checks use das task now,
|
||||
// no need to generate part id expr, do nothing here
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogDelete::get_plan_item_info(PlanText &plan_text,
|
||||
ObSqlPlanItem &plan_item)
|
||||
{
|
||||
|
||||
@ -36,6 +36,7 @@ public:
|
||||
ObSqlPlanItem &plan_item) override;
|
||||
protected:
|
||||
virtual int generate_rowid_expr_for_trigger() override;
|
||||
virtual int generate_part_id_expr_for_foreign_key(ObIArray<ObRawExpr*> &all_exprs) override;
|
||||
virtual int generate_multi_part_partition_id_expr() override;
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ObLogDelete);
|
||||
|
||||
@ -365,6 +365,58 @@ int ObLogInsert::generate_rowid_expr_for_trigger()
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogInsert::generate_part_id_expr_for_foreign_key(ObIArray<ObRawExpr*> &all_exprs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < get_index_dml_infos().count(); ++i) {
|
||||
IndexDMLInfo *dml_info = get_index_dml_infos().at(i);
|
||||
if (OB_ISNULL(dml_info)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("dml info is null", K(ret), K(dml_info));
|
||||
} else if (!dml_info->is_primary_index_) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(generate_fk_lookup_part_id_expr(*dml_info))) {
|
||||
LOG_WARN("failed to generate lookup part expr for foreign key", K(ret));
|
||||
} else if (OB_FAIL(convert_insert_new_fk_lookup_part_id_expr(all_exprs, *dml_info))) {
|
||||
LOG_WARN("failed to convert lookup part expr for foreign key", K(ret));
|
||||
}
|
||||
}
|
||||
|
||||
if (OB_FAIL(ret)) {
|
||||
/*do nothing*/
|
||||
} else if (is_replace()) {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < get_replace_index_dml_infos().count(); ++i) {
|
||||
IndexDMLInfo *dml_info = get_replace_index_dml_infos().at(i);
|
||||
if (OB_ISNULL(dml_info)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("dml info is null", K(ret), K(dml_info));
|
||||
} else if (!dml_info->is_primary_index_) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(generate_fk_lookup_part_id_expr(*dml_info))) {
|
||||
LOG_WARN("failed to generate lookup part expr for foreign key", K(ret));
|
||||
} else if (OB_FAIL(convert_update_new_fk_lookup_part_id_expr(all_exprs, *dml_info))) {
|
||||
LOG_WARN("failed to convert lookup part expr for foreign key", K(ret));
|
||||
}
|
||||
}
|
||||
} else if (get_insert_up()) {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < get_insert_up_index_dml_infos().count(); ++i) {
|
||||
IndexDMLInfo *dml_info = get_insert_up_index_dml_infos().at(i);
|
||||
if (OB_ISNULL(dml_info)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("dml info is null", K(ret), K(dml_info));
|
||||
} else if (!dml_info->is_primary_index_) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(generate_fk_lookup_part_id_expr(*dml_info))) {
|
||||
LOG_WARN("failed to generate lookup part expr for foreign key", K(ret));
|
||||
} else if (OB_FAIL(convert_update_new_fk_lookup_part_id_expr(all_exprs, *dml_info))) {
|
||||
LOG_WARN("failed to convert lookup part expr for foreign key", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogInsert::generate_multi_part_partition_id_expr()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
@ -113,6 +113,7 @@ public:
|
||||
protected:
|
||||
int get_constraint_info_exprs(ObIArray<ObRawExpr*> &all_exprs);
|
||||
virtual int generate_rowid_expr_for_trigger() override;
|
||||
virtual int generate_part_id_expr_for_foreign_key(ObIArray<ObRawExpr*> &all_exprs) override;
|
||||
virtual int generate_multi_part_partition_id_expr() override;
|
||||
protected:
|
||||
bool is_replace_;
|
||||
|
||||
@ -300,6 +300,45 @@ int ObLogMerge::generate_rowid_expr_for_trigger()
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogMerge::generate_part_id_expr_for_foreign_key(ObIArray<ObRawExpr*> &all_exprs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
const ObMergeStmt *merge_stmt = static_cast<const ObMergeStmt *>(get_stmt());
|
||||
if (OB_ISNULL(merge_stmt)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("merge stmt is null", K(ret), K(merge_stmt));
|
||||
} else if (merge_stmt->has_insert_clause()) {
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < get_index_dml_infos().count(); ++i) {
|
||||
IndexDMLInfo *ins_info = get_index_dml_infos().at(i);
|
||||
if (OB_ISNULL(ins_info)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("dml info is null", K(ret), K(ins_info));
|
||||
} else if (!ins_info->is_primary_index_) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(generate_fk_lookup_part_id_expr(*ins_info))) {
|
||||
LOG_WARN("failed to generate lookup part expr for foreign key", K(ret));
|
||||
} else if (OB_FAIL(convert_insert_new_fk_lookup_part_id_expr(all_exprs,*ins_info))) {
|
||||
LOG_WARN("failed to convert lookup part expr for foreign key", K(ret));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < get_update_infos().count(); ++i) {
|
||||
IndexDMLInfo *upd_info = get_update_infos().at(i);
|
||||
if (OB_ISNULL(upd_info)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("update info is null", K(ret), K(upd_info));
|
||||
} else if (!upd_info->is_primary_index_) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(generate_fk_lookup_part_id_expr(*upd_info))) {
|
||||
LOG_WARN("failed to generate lookup part expr for foreign key", K(ret));
|
||||
} else if (OB_FAIL(convert_update_new_fk_lookup_part_id_expr(all_exprs, *upd_info))) {
|
||||
LOG_WARN("failed to convert lookup part expr for foreign key", K(ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogMerge::generate_multi_part_partition_id_expr()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
@ -57,6 +57,7 @@ public:
|
||||
ObSqlPlanItem &plan_item) override;
|
||||
protected:
|
||||
int generate_rowid_expr_for_trigger() override;
|
||||
virtual int generate_part_id_expr_for_foreign_key(ObIArray<ObRawExpr*> &all_exprs) override;
|
||||
int generate_multi_part_partition_id_expr() override;
|
||||
virtual int gen_location_constraint(void *ctx) override;
|
||||
DISALLOW_COPY_AND_ASSIGN(ObLogMerge);
|
||||
|
||||
@ -200,6 +200,25 @@ int ObLogUpdate::generate_rowid_expr_for_trigger()
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogUpdate::generate_part_id_expr_for_foreign_key(ObIArray<ObRawExpr*> &all_exprs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < get_index_dml_infos().count(); ++i) {
|
||||
IndexDMLInfo *dml_info = get_index_dml_infos().at(i);
|
||||
if (OB_ISNULL(dml_info)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("dml info is null", K(ret), K(dml_info));
|
||||
} else if (!dml_info->is_primary_index_) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(generate_fk_lookup_part_id_expr(*dml_info))) {
|
||||
LOG_WARN("failed to generate lookup part expr for foreign key", K(ret));
|
||||
} else if (OB_FAIL(convert_update_new_fk_lookup_part_id_expr(all_exprs, *dml_info))) {
|
||||
LOG_WARN("failed to convert lookup part expr for foreign key", K(ret));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObLogUpdate::generate_multi_part_partition_id_expr()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
@ -35,6 +35,7 @@ public:
|
||||
ObSqlPlanItem &plan_item) override;
|
||||
private:
|
||||
virtual int generate_rowid_expr_for_trigger() override;
|
||||
virtual int generate_part_id_expr_for_foreign_key(ObIArray<ObRawExpr*> &all_exprs) override;
|
||||
virtual int generate_multi_part_partition_id_expr() override;
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ObLogUpdate);
|
||||
|
||||
Reference in New Issue
Block a user