diff --git a/src/sql/optimizer/ob_optimizer.cpp b/src/sql/optimizer/ob_optimizer.cpp index b2bc62f65d..15cfa3212e 100644 --- a/src/sql/optimizer/ob_optimizer.cpp +++ b/src/sql/optimizer/ob_optimizer.cpp @@ -338,6 +338,7 @@ int ObOptimizer::check_pdml_enabled(const ObDMLStmt &stmt, !static_cast< const ObInsertStmt &>(stmt).value_from_select()) { can_use_pdml = false; } else if ((stmt.is_update_stmt() || stmt.is_delete_stmt()) + && static_cast(stmt).dml_source_from_join() && static_cast(stmt).is_dml_table_from_join()) { can_use_pdml = false; } else if (OB_FAIL(check_pdml_supported_feature(static_cast(stmt), diff --git a/src/sql/resolver/dml/ob_del_upd_stmt.cpp b/src/sql/resolver/dml/ob_del_upd_stmt.cpp index 33a101ecb4..0a6e27aec0 100644 --- a/src/sql/resolver/dml/ob_del_upd_stmt.cpp +++ b/src/sql/resolver/dml/ob_del_upd_stmt.cpp @@ -737,3 +737,17 @@ int ObDelUpdStmt::extract_need_filter_null_table(const JoinedTable *cur_table, } return ret; } + +int ObDelUpdStmt::check_dml_source_from_join() +{ + int ret = OB_SUCCESS; + TableItem *dml_table = nullptr; + if (get_from_item_size() == 1 && + nullptr != (dml_table = get_table_item(get_from_item(0))) && + dml_table->is_basic_table()) { + // do nothing + } else { + set_dml_source_from_join(true); + } + return ret; +} \ No newline at end of file diff --git a/src/sql/resolver/dml/ob_del_upd_stmt.h b/src/sql/resolver/dml/ob_del_upd_stmt.h index de7e671e43..fd073526a4 100644 --- a/src/sql/resolver/dml/ob_del_upd_stmt.h +++ b/src/sql/resolver/dml/ob_del_upd_stmt.h @@ -401,7 +401,8 @@ public: has_global_index_(false), error_log_info_(), has_instead_of_trigger_(false), - ab_stmt_id_expr_(nullptr) + ab_stmt_id_expr_(nullptr), + dml_source_from_join_(false) { } virtual ~ObDelUpdStmt() { } int deep_copy_stmt_struct(ObIAllocator &allocator, @@ -465,6 +466,9 @@ public: int has_dml_table_info(const uint64_t table_id, bool &has) const; int check_dml_need_filter_null(); int extract_need_filter_null_table(const JoinedTable *cur_table, ObIArray &table_ids); + void set_dml_source_from_join(bool from_join) { dml_source_from_join_ = from_join; } + inline bool dml_source_from_join() const { return dml_source_from_join_; } + int check_dml_source_from_join(); protected: common::ObSEArray returning_exprs_; common::ObSEArray returning_into_exprs_; @@ -477,6 +481,7 @@ protected: // for insert and merge stmt common::ObSEArray sharding_conditions_; ObRawExpr *ab_stmt_id_expr_; //for array binding batch execution to mark the stmt id + bool dml_source_from_join_; }; } } diff --git a/src/sql/resolver/dml/ob_delete_resolver.cpp b/src/sql/resolver/dml/ob_delete_resolver.cpp index 75fdc332fb..646d7dd3b9 100644 --- a/src/sql/resolver/dml/ob_delete_resolver.cpp +++ b/src/sql/resolver/dml/ob_delete_resolver.cpp @@ -128,6 +128,8 @@ int ObDeleteResolver::resolve(const ParseNode &parse_tree) LOG_WARN("failed to check view deletable", K(ret)); } else if (OB_FAIL(delete_stmt->check_dml_need_filter_null())) { LOG_WARN("failed to check dml need filter null", K(ret)); + } else if (OB_FAIL(delete_stmt->check_dml_source_from_join())) { + LOG_WARN("failed to check dml source from join"); } else if (OB_FAIL(check_safe_update_mode(delete_stmt, is_multi_table_delete))) { LOG_WARN("failed to check safe update mode", K(ret)); } else { /*do nothing */ } diff --git a/src/sql/resolver/dml/ob_update_resolver.cpp b/src/sql/resolver/dml/ob_update_resolver.cpp index a71ee12dcf..5c0acdc9f4 100644 --- a/src/sql/resolver/dml/ob_update_resolver.cpp +++ b/src/sql/resolver/dml/ob_update_resolver.cpp @@ -183,6 +183,8 @@ int ObUpdateResolver::resolve(const ParseNode &parse_tree) LOG_TRACE("view not updatable", K(ret)); } else if (OB_FAIL(update_stmt->check_dml_need_filter_null())) { LOG_WARN("failed to check dml need filter null", K(ret)); + } else if (OB_FAIL(update_stmt->check_dml_source_from_join())) { + LOG_WARN("failed to check dml source from join", K(ret)); } else if (lib::is_mysql_mode() && OB_FAIL(check_safe_update_mode(update_stmt))) { LOG_WARN("failed to check fulfill safe update mode", K(ret)); } else { /*do nothing*/ }