From 9abdd6eb2c8dec9df4409345eb369cd43cf64ff5 Mon Sep 17 00:00:00 2001 From: JinmaoLi Date: Fri, 29 Nov 2024 11:15:32 +0000 Subject: [PATCH] [CP] bugfix: remove redundant copy when build calc_rowid_expr Co-authored-by: yishenglanlingzui <395329313@qq.com> --- src/sql/engine/dml/ob_table_lock_op.cpp | 3 +- src/sql/optimizer/ob_log_del_upd.cpp | 12 +- src/sql/resolver/dml/ob_del_upd_resolver.cpp | 12 +- src/sql/resolver/dml/ob_dml_resolver.cpp | 8 +- src/sql/resolver/expr/ob_raw_expr_util.cpp | 131 ++++--------------- src/sql/resolver/expr/ob_raw_expr_util.h | 19 +-- src/sql/rewrite/ob_transform_pre_process.cpp | 8 +- 7 files changed, 55 insertions(+), 138 deletions(-) diff --git a/src/sql/engine/dml/ob_table_lock_op.cpp b/src/sql/engine/dml/ob_table_lock_op.cpp index 113e95a889..142b268d07 100644 --- a/src/sql/engine/dml/ob_table_lock_op.cpp +++ b/src/sql/engine/dml/ob_table_lock_op.cpp @@ -432,7 +432,6 @@ int ObTableLockOp::lock_batch_to_das(const ObBatchRows *child_brs) brs_.skip_->set(i); } } - clear_evaluated_flag(); return ret; } @@ -441,7 +440,7 @@ OB_INLINE int ObTableLockOp::get_next_batch_from_child(const int64_t max_row_cnt const ObBatchRows *&child_brs) { int ret = OB_SUCCESS; - clear_datum_eval_flag(); + clear_evaluated_flag(); if (OB_FAIL(child_->get_next_batch(max_row_cnt, child_brs))) { LOG_WARN("fail to get next batch", K(ret)); } else if (OB_LIKELY(!child_brs->end_ && child_brs->size_ > 0)) { diff --git a/src/sql/optimizer/ob_log_del_upd.cpp b/src/sql/optimizer/ob_log_del_upd.cpp index 216551c7a4..2ae8dda73f 100644 --- a/src/sql/optimizer/ob_log_del_upd.cpp +++ b/src/sql/optimizer/ob_log_del_upd.cpp @@ -911,12 +911,16 @@ int ObLogDelUpd::build_rowid_expr(uint64_t table_id, ObSchemaGetterGuard *schema_guard = NULL; ObSQLSessionInfo *session_info = NULL; const ObTableSchema *tbl_schema = NULL; - if (OB_ISNULL(get_plan()) || + ObRawExpr *part_expr = NULL; + ObRawExpr *subpart_expr = NULL; + if (OB_ISNULL(get_plan()) || OB_ISNULL(get_stmt()) || OB_ISNULL(schema_guard = get_plan()->get_optimizer_context().get_schema_guard()) || OB_ISNULL(get_plan()->get_optimizer_context().get_session_info()) || OB_ISNULL(session_info = get_plan()->get_optimizer_context().get_session_info())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("invalid params", K(ret), KP(schema_guard), KP(get_plan())); + } else if (OB_FALSE_IT(part_expr = get_stmt()->get_part_expr(table_id, table_ref_id))) { + } else if (OB_FALSE_IT(subpart_expr = get_stmt()->get_subpart_expr(table_id, table_ref_id))) { } else if (OB_FAIL(schema_guard->get_table_schema( session_info->get_effective_tenant_id(), table_ref_id, tbl_schema))) { @@ -924,13 +928,13 @@ int ObLogDelUpd::build_rowid_expr(uint64_t table_id, } else if (OB_ISNULL(tbl_schema)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("table schema is NULL", K(ret)); - } else if (OB_FAIL(ObRawExprUtils::build_rowid_expr(get_stmt(), - get_plan()->get_optimizer_context().get_expr_factory(), + } else if (OB_FAIL(ObRawExprUtils::build_rowid_expr(get_plan()->get_optimizer_context().get_expr_factory(), get_plan()->get_optimizer_context().get_allocator(), *(get_plan()->get_optimizer_context().get_session_info()), *tbl_schema, - table_id, rowkeys, + part_expr, + subpart_expr, rowid_sysfun_expr))) { LOG_WARN("failed to build rowid col expr", K(ret)); } else if (OB_ISNULL(rowid_sysfun_expr)) { diff --git a/src/sql/resolver/dml/ob_del_upd_resolver.cpp b/src/sql/resolver/dml/ob_del_upd_resolver.cpp index 4e959be5a9..0957c77706 100644 --- a/src/sql/resolver/dml/ob_del_upd_resolver.cpp +++ b/src/sql/resolver/dml/ob_del_upd_resolver.cpp @@ -1773,6 +1773,8 @@ int ObDelUpdResolver::gen_rowid_expr_for_returning(ObSysFunRawExpr *&rowid_expr) ObDelUpdStmt *del_upd_stmt = get_del_upd_stmt(); ObSEArray rowkey_exprs; ObSEArray tables_info; + ObRawExpr *part_expr = NULL; + ObRawExpr *subpart_expr = NULL; if (OB_ISNULL(allocator_) || OB_ISNULL(session_info_) || OB_ISNULL(schema_checker_) || OB_ISNULL(del_upd_stmt)) { ret = OB_ERR_UNEXPECTED; @@ -1791,18 +1793,22 @@ int ObDelUpdResolver::gen_rowid_expr_for_returning(ObSysFunRawExpr *&rowid_expr) } else if (OB_ISNULL(table_schema)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); + } else if (OB_FALSE_IT(part_expr = del_upd_stmt->get_part_expr(tables_info.at(0)->loc_table_id_, + tables_info.at(0)->ref_table_id_))) { + } else if (OB_FALSE_IT(subpart_expr = del_upd_stmt->get_subpart_expr(tables_info.at(0)->loc_table_id_, + tables_info.at(0)->ref_table_id_))) { } else if (OB_FAIL(get_exprs_serialize_to_rowid(del_upd_stmt, table_schema, tables_info.at(0)->column_exprs_, rowkey_exprs))) { LOG_WARN("generated rowkey exprs failed", K(ret)); - } else if (OB_FAIL(ObRawExprUtils::build_rowid_expr(del_upd_stmt, - *params_.expr_factory_, + } else if (OB_FAIL(ObRawExprUtils::build_rowid_expr(*params_.expr_factory_, *allocator_, *(session_info_), *table_schema, - tables_info.at(0)->table_id_, rowkey_exprs, + part_expr, + subpart_expr, rowid_expr))) { LOG_WARN("build rowid_expr failed", K(ret)); } else { /*do nothing*/ } diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index aefb3db89a..6e43da0a6a 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -14073,6 +14073,8 @@ int ObDMLResolver::resolve_rowid_expr(ObDMLStmt *stmt, const TableItem &table_it } else { ObSEArray col_ids; int64_t rowkey_cnt = -1; + ObRawExpr *part_expr = stmt->get_part_expr(table_item.table_id_, table_item.ref_id_); + ObRawExpr *subpart_expr = stmt->get_subpart_expr(table_item.table_id_, table_item.ref_id_); if (OB_FAIL(table_schema->get_column_ids_serialize_to_rowid(col_ids, rowkey_cnt))) { LOG_WARN("get col ids failed", K(ret)); } else if (OB_UNLIKELY(col_ids.count() < rowkey_cnt)) { @@ -14096,13 +14098,13 @@ int ObDMLResolver::resolve_rowid_expr(ObDMLStmt *stmt, const TableItem &table_it } } if (OB_SUCC(ret)) { - if (OB_FAIL(ObRawExprUtils::build_rowid_expr(stmt, - *params_.expr_factory_, + if (OB_FAIL(ObRawExprUtils::build_rowid_expr(*params_.expr_factory_, *allocator_, *params_.session_info_, *table_schema, - table_item.table_id_, index_keys, + part_expr, + subpart_expr, rowid_expr))) { LOG_WARN("build rowid expr failed", K(ret)); } else { diff --git a/src/sql/resolver/expr/ob_raw_expr_util.cpp b/src/sql/resolver/expr/ob_raw_expr_util.cpp index 9d3831a6eb..b165a701bb 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_util.cpp @@ -9179,13 +9179,13 @@ int ObRawExprUtils::new_parse_node(ParseNode *& node, ObRawExprFactory &expr_fac return ret; } -int ObRawExprUtils::build_rowid_expr(const ObDMLStmt *dml_stmt, - ObRawExprFactory &expr_factory, +int ObRawExprUtils::build_rowid_expr(ObRawExprFactory &expr_factory, ObIAllocator &alloc, const ObSQLSessionInfo &session_info, const ObTableSchema &table_schema, - const uint64_t logical_table_id, const ObIArray &rowkey_exprs, + ObRawExpr *part_expr, + ObRawExpr *subpart_expr, ObSysFunRawExpr *&rowid_expr) { int ret = OB_SUCCESS; @@ -9216,17 +9216,32 @@ int ObRawExprUtils::build_rowid_expr(const ObDMLStmt *dml_stmt, OX(calc_urowid_expr->set_func_name(ObString::make_string(N_CALC_UROWID))); OZ(calc_urowid_expr->add_param_expr(version_expr)); if (OB_SUCC(ret) && table_schema.is_external_table()) { - OZ(add_calc_partition_id_on_calc_rowid_expr(dml_stmt, expr_factory, session_info, - table_schema, logical_table_id, - calc_urowid_expr)); + ObRawExpr *calc_part_id_expr = nullptr; + OZ(build_calc_part_id_expr(expr_factory, + session_info, + table_schema.get_table_id(), + table_schema.get_part_level(), + part_expr, + subpart_expr, + calc_part_id_expr)); + CK(OB_NOT_NULL(calc_part_id_expr)); + OZ(calc_urowid_expr->add_param_expr(calc_part_id_expr)); } for (int64_t i = 0; OB_SUCC(ret) && i < rowkey_exprs.count(); ++i) { OZ(calc_urowid_expr->add_param_expr(rowkey_exprs.at(i))); } - if (OB_SUCC(ret) && !table_schema.is_external_table()) { + if (OB_SUCC(ret) && !table_schema.is_external_table() && table_schema.is_heap_table()) { //set calc tablet id for heap table calc_urowid expr - OZ(add_calc_tablet_id_on_calc_rowid_expr(dml_stmt, expr_factory, session_info, - table_schema, logical_table_id, calc_urowid_expr)); + ObRawExpr *calc_tablet_id_expr = nullptr; + OZ(build_calc_tablet_id_expr(expr_factory, + session_info, + table_schema.get_table_id(), + table_schema.get_part_level(), + part_expr, + subpart_expr, + calc_tablet_id_expr)); + CK(OB_NOT_NULL(calc_tablet_id_expr)); + OZ(calc_urowid_expr->add_param_expr(calc_tablet_id_expr)); } OZ(calc_urowid_expr->formalize(&session_info)); OX(rowid_expr = calc_urowid_expr); @@ -9587,104 +9602,6 @@ int ObRawExprUtils::is_contain_params(const common::ObIArray &exprs, return ret; } -int ObRawExprUtils::add_calc_tablet_id_on_calc_rowid_expr(const ObDMLStmt *dml_stmt, - ObRawExprFactory &expr_factory, - const ObSQLSessionInfo &session_info, - const ObTableSchema &table_schema, - const uint64_t logical_table_id, - ObSysFunRawExpr *&calc_rowid_expr) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(dml_stmt) || OB_ISNULL(calc_rowid_expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret), K(dml_stmt),K(calc_rowid_expr)); - } else if (table_schema.is_heap_table()) { - // add calc_tablet_id param such that calc_urowid(version, xxx) becomes - // calc_urowid(version, xxx, calc_tablet_id) since we need part id to generate - // physical rowid for heap organized table. - ObRawExprCopier copier(expr_factory); - ObSEArray column_exprs; - const ObRawExpr *part_expr = dml_stmt->get_part_expr(logical_table_id, table_schema.get_table_id()); - const ObRawExpr *subpart_expr = dml_stmt->get_subpart_expr(logical_table_id, table_schema.get_table_id()); - ObRawExpr *calc_part_id_expr = nullptr; - schema::ObPartitionLevel part_level = table_schema.get_part_level(); - ObRawExpr *new_part_expr = NULL; - ObRawExpr *new_subpart_expr = NULL; - //why we deep copy part/subpart expr ? - //because rowid in trgger will modify relation param expr, if we don't deep copy, this will - //influence origin part/subpart expr and introduce other problems. - if (OB_FAIL(dml_stmt->get_column_exprs(logical_table_id, column_exprs))) { - LOG_WARN("failed to get column exprs", K(ret)); - } else if (OB_FAIL(copier.add_skipped_expr(column_exprs))) { - LOG_WARN("failed to add skipped expr", K(ret)); - } else if (OB_FAIL(copier.copy(part_expr, new_part_expr))) { - LOG_WARN("fail to copy part expr", K(ret)); - } else if (OB_FAIL(copier.copy(subpart_expr, new_subpart_expr))) { - LOG_WARN("fail to copy subpart expr", K(ret)); - } else if (OB_FAIL(build_calc_tablet_id_expr(expr_factory, - session_info, - table_schema.get_table_id(), - part_level, - new_part_expr, - new_subpart_expr, - calc_part_id_expr))) { - LOG_WARN("fail to build table location expr", K(ret)); - } else if (OB_ISNULL(calc_part_id_expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected null expr", K(ret)); - } else if (OB_FAIL(calc_rowid_expr->add_param_expr(calc_part_id_expr))) { - LOG_WARN("failed to add param expr", K(ret)); - } else {/*do nothing*/} - } - return ret; -} - -int ObRawExprUtils::add_calc_partition_id_on_calc_rowid_expr(const ObDMLStmt *dml_stmt, - ObRawExprFactory &expr_factory, - const ObSQLSessionInfo &session_info, - const ObTableSchema &table_schema, - const uint64_t logical_table_id, - ObSysFunRawExpr *&calc_rowid_expr) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(dml_stmt) || OB_ISNULL(calc_rowid_expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret), K(dml_stmt),K(calc_rowid_expr)); - } else if (table_schema.is_external_table()) { - ObRawExprCopier copier(expr_factory); - ObSEArray column_exprs; - const ObRawExpr *part_expr = dml_stmt->get_part_expr(logical_table_id, table_schema.get_table_id()); - const ObRawExpr *subpart_expr = dml_stmt->get_subpart_expr(logical_table_id, table_schema.get_table_id()); - ObRawExpr *calc_part_id_expr = nullptr; - schema::ObPartitionLevel part_level = table_schema.get_part_level(); - ObRawExpr *new_part_expr = NULL; - ObRawExpr *new_subpart_expr = NULL; - if (OB_FAIL(dml_stmt->get_column_exprs(logical_table_id, column_exprs))) { - LOG_WARN("failed to get column exprs", K(ret)); - } else if (OB_FAIL(copier.add_skipped_expr(column_exprs))) { - LOG_WARN("failed to add skipped expr", K(ret)); - } else if (OB_FAIL(copier.copy(part_expr, new_part_expr))) { - LOG_WARN("fail to copy part expr", K(ret)); - } else if (OB_FAIL(copier.copy(subpart_expr, new_subpart_expr))) { - LOG_WARN("fail to copy subpart expr", K(ret)); - } else if (OB_FAIL(build_calc_part_id_expr(expr_factory, - session_info, - table_schema.get_table_id(), - part_level, - new_part_expr, - new_subpart_expr, - calc_part_id_expr))) { - LOG_WARN("fail to build table location expr", K(ret)); - } else if (OB_ISNULL(calc_part_id_expr)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexpected null expr", K(ret)); - } else if (OB_FAIL(calc_rowid_expr->add_param_expr(calc_part_id_expr))) { - LOG_WARN("failed to add param expr", K(ret)); - } - } - return ret; -} - int ObRawExprUtils::build_shadow_pk_expr(uint64_t table_id, uint64_t column_id, const ObDMLStmt &dml_stmt, diff --git a/src/sql/resolver/expr/ob_raw_expr_util.h b/src/sql/resolver/expr/ob_raw_expr_util.h index 41ec2719fb..fa604c6c95 100644 --- a/src/sql/resolver/expr/ob_raw_expr_util.h +++ b/src/sql/resolver/expr/ob_raw_expr_util.h @@ -1110,13 +1110,13 @@ public: static int build_rownum_expr(ObRawExprFactory &expr_factory, ObRawExpr* &rownum_expr); - static int build_rowid_expr(const ObDMLStmt *dml_stmt, - ObRawExprFactory &expr_factory, + static int build_rowid_expr(ObRawExprFactory &expr_factory, ObIAllocator &alloc, const ObSQLSessionInfo &session_info, const share::schema::ObTableSchema &table_schema, - const uint64_t logical_table_id, const ObIArray &rowkey_exprs, + ObRawExpr *part_expr, + ObRawExpr *subpart_expr, ObSysFunRawExpr *&rowid_expr); static int build_empty_rowid_expr(ObRawExprFactory &expr_factory, uint64_t table_id, @@ -1213,19 +1213,6 @@ public: common::ObIArray ¶ms); static int is_contain_params(const common::ObIArray &exprs, bool &is_contain); static int is_contain_params(const ObRawExpr *expr, bool &is_contain); - - static int add_calc_tablet_id_on_calc_rowid_expr(const ObDMLStmt *dml_stmt, - ObRawExprFactory &expr_factory, - const ObSQLSessionInfo &session_info, - const share::schema::ObTableSchema &table_schema, - const uint64_t logical_table_id, - ObSysFunRawExpr *&calc_rowid_expr); - static int add_calc_partition_id_on_calc_rowid_expr(const ObDMLStmt *dml_stmt, - ObRawExprFactory &expr_factory, - const ObSQLSessionInfo &session_info, - const share::schema::ObTableSchema &table_schema, - const uint64_t logical_table_id, - ObSysFunRawExpr *&calc_rowid_expr); static int get_col_ref_expr_recursively(ObRawExpr *expr, ObColumnRefRawExpr *&column_expr); diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index c8af6c518c..f3a1cf727f 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -7980,6 +7980,8 @@ int ObTransformPreProcess::build_rowid_expr(ObSelectStmt *select_stmt, ObSEArray index_keys; uint64_t tid = table_item->ref_id_; ObRawExpr *same_rowid_expr = NULL; + ObRawExpr *part_expr = select_stmt->get_part_expr(table_item->table_id_, table_item->ref_id_); + ObRawExpr *subpart_expr = select_stmt->get_subpart_expr(table_item->table_id_, table_item->ref_id_); if (OB_FAIL(ctx_->schema_checker_->get_table_schema(ctx_->session_info_->get_effective_tenant_id(), tid, table_schema, table_item->is_link_table()))) { LOG_WARN("fail to get table schema", K(ret), K(tid)); } else if (OB_ISNULL(table_schema)) { @@ -8003,13 +8005,13 @@ int ObTransformPreProcess::build_rowid_expr(ObSelectStmt *select_stmt, } if (OB_FAIL(ret)) { - } else if (OB_FAIL(ObRawExprUtils::build_rowid_expr(select_stmt, - *(ctx_->expr_factory_), + } else if (OB_FAIL(ObRawExprUtils::build_rowid_expr(*(ctx_->expr_factory_), *(ctx_->allocator_), *(ctx_->session_info_), *table_schema, - table_item->table_id_, index_keys, + part_expr, + subpart_expr, rowid_expr))) { LOG_WARN("build rowid col_expr failed", K(ret)); } else if (OB_FAIL(select_stmt->check_and_get_same_rowid_expr(rowid_expr, same_rowid_expr))) {