diff --git a/src/sql/optimizer/ob_insert_all_log_plan.cpp b/src/sql/optimizer/ob_insert_all_log_plan.cpp index d027f7aca..8031869e1 100644 --- a/src/sql/optimizer/ob_insert_all_log_plan.cpp +++ b/src/sql/optimizer/ob_insert_all_log_plan.cpp @@ -61,13 +61,26 @@ int ObInsertAllLogPlan::generate_raw_plan() } else { /*do nothing*/ } } + // allocate subplan filter for "INSERT ALL when subquery then INTO xx VALUES((subquery1), ....)" + if (OB_SUCC(ret) && !insert_all_stmt->get_subquery_exprs().empty()) { + ObSEArray all_values_vector; + ObSEArray all_when_cond_exprs; + ObSEArray all_relation_subquery_exprs; + if (OB_FAIL(insert_all_stmt->get_all_values_vector(all_values_vector))) { + LOG_WARN("failed to get all values vector", K(ret)); + } else if (OB_FAIL(insert_all_stmt->get_all_when_cond_exprs(all_when_cond_exprs))) { + LOG_WARN("failed to get all when cond exprs", K(ret)); + } else if (OB_FAIL(append(all_relation_subquery_exprs, all_values_vector)) || + OB_FAIL(append(all_relation_subquery_exprs, all_when_cond_exprs))) { + LOG_WARN("failed to append exprs", K(ret)); + } else if (OB_FAIL(candi_allocate_subplan_filter(all_relation_subquery_exprs))) { + LOG_WARN("failed to allocate subplan", K(ret)); + } else { /*do nothing*/ } + } + if (OB_SUCC(ret)) { if (OB_FAIL(prepare_dml_infos())) { LOG_WARN("failed to prepare dml infos", K(ret)); - } else if (!insert_all_stmt->get_subquery_exprs().empty()) { - ret = OB_NOT_SUPPORTED; - LOG_WARN("not support subquery in insert all", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, "subquery in insert all"); } else if (OB_FAIL(candi_allocate_insert_all())) { LOG_WARN("failed to allocate insert all operator", K(ret)); } else { diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 9db907128..30d6a440a 100644 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -4226,6 +4226,9 @@ int ObDMLResolver::resolve_subquery_info(const ObIArray &subquer ret = OB_NOT_SUPPORTED; LOG_USER_ERROR(OB_NOT_SUPPORTED, "Too many levels of subquery"); } + //resolve subquery in insert all need reset the flag. + bool is_multi_table_insert = params_.is_multi_table_insert_; + params_.is_multi_table_insert_ = false; for (int64_t i = 0; OB_SUCC(ret) && i < subquery_info.count(); i++) { const ObSubQueryInfo &info = subquery_info.at(i); ObSelectResolver subquery_resolver(params_); @@ -4247,6 +4250,7 @@ int ObDMLResolver::resolve_subquery_info(const ObIArray &subquer } set_query_ref_expr(NULL); } + params_.is_multi_table_insert_ = is_multi_table_insert; return ret; } diff --git a/src/sql/resolver/dml/ob_insert_all_stmt.cpp b/src/sql/resolver/dml/ob_insert_all_stmt.cpp index a4b12b9fc..d0a877dea 100644 --- a/src/sql/resolver/dml/ob_insert_all_stmt.cpp +++ b/src/sql/resolver/dml/ob_insert_all_stmt.cpp @@ -158,6 +158,36 @@ int ObInsertAllStmt::get_view_check_exprs(ObIArray& view_check_exprs return ret; } +int ObInsertAllStmt::get_all_values_vector(ObIArray &all_values_vector) const +{ + int ret = OB_SUCCESS; + for (int64_t i = 0; OB_SUCC(ret) && i < table_info_.count(); ++i) { + ObInsertAllTableInfo* table_info = table_info_.at(i); + if (OB_ISNULL(table_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get null table info", K(ret)); + } else if (OB_FAIL(append(all_values_vector, table_info->values_vector_))) { + LOG_WARN("failed to append values vector", K(ret)); + } + } + return ret; +} + +int ObInsertAllStmt::get_all_when_cond_exprs(ObIArray &all_when_cond_exprs) const +{ + int ret = OB_SUCCESS; + for (int64_t i = 0; OB_SUCC(ret) && i < table_info_.count(); ++i) { + ObInsertAllTableInfo* table_info = table_info_.at(i); + if (OB_ISNULL(table_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get null table info", K(ret)); + } else if (OB_FAIL(append(all_when_cond_exprs, table_info->when_cond_exprs_))) { + LOG_WARN("failed to append when cond exprs", K(ret)); + } + } + return ret; +} + int64_t ObInsertAllStmt::to_string(char *buf, const int64_t buf_len) const { int64_t pos = 0; diff --git a/src/sql/resolver/dml/ob_insert_all_stmt.h b/src/sql/resolver/dml/ob_insert_all_stmt.h index dcd7353c6..0b6862f2a 100644 --- a/src/sql/resolver/dml/ob_insert_all_stmt.h +++ b/src/sql/resolver/dml/ob_insert_all_stmt.h @@ -62,6 +62,9 @@ public: virtual int get_dml_table_infos(ObIArray& dml_table_info) const override; virtual int get_view_check_exprs(ObIArray& view_check_exprs) const override; bool value_from_select() const { return !from_items_.empty(); } + int get_all_values_vector(ObIArray &all_values_vector) const; + int get_all_when_cond_exprs(ObIArray &all_when_cond_exprs) const; + DECLARE_VIRTUAL_TO_STRING; // TO_STRING_KV(N_STMT_TYPE, stmt_type_, // N_TABLE, table_items_,