diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 2163bbd9c9eb6e2e951f90a642f3c85a0e0917db..783d29967dd09355ef58c4f2fedcd1e77928c7fe 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -1231,6 +1231,8 @@ int ObLogPlan::pre_process_quals(const ObIArray &table_items, } else { ret = add_subquery_filter(qual); } + } else if (qual->is_const_expr()) { + ret = add_startup_filter(qual); } else if (qual->has_flag(CNT_RAND_FUNC) || qual->has_flag(CNT_USER_VARIABLE) || qual->has_flag(CNT_PL_UDF) || @@ -1238,8 +1240,6 @@ int ObLogPlan::pre_process_quals(const ObIArray &table_items, ret = add_special_expr(qual); } else if (ObOptimizerUtil::has_hierarchical_expr(*qual)) { ret = normal_quals.push_back(qual); - } else if (0 == qual->get_relation_ids().num_members()) { - ret = add_startup_filter(qual); } else { ret = normal_quals.push_back(qual); } diff --git a/src/sql/resolver/dml/ob_dml_stmt.cpp b/src/sql/resolver/dml/ob_dml_stmt.cpp index 62bbb4ab894a15620af930342d2f25d2c6fd4a8d..97f75aa8ef9ca32daf657cfadea13ef28b21377b 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.cpp +++ b/src/sql/resolver/dml/ob_dml_stmt.cpp @@ -2253,6 +2253,22 @@ int ObDMLStmt::get_from_subquery_stmts(ObIArray &child_stmts) con return ret; } +int ObDMLStmt::get_subquery_stmts(common::ObIArray &child_stmts) const +{ + int ret = OB_SUCCESS; + for (int64_t j = 0; OB_SUCC(ret) && j < get_subquery_expr_size(); ++j) { + ObQueryRefRawExpr *subquery_ref = subquery_exprs_.at(j); + if (OB_ISNULL(subquery_ref) || + OB_ISNULL(subquery_ref->get_ref_stmt())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("subquery reference is null", K(subquery_ref)); + } else if (OB_FAIL(child_stmts.push_back(subquery_ref->get_ref_stmt()))) { + LOG_WARN("stored subquery reference stmt failed", K(ret)); + } + } + return ret; +} + int ObDMLStmt::get_table_item(const ObSQLSessionInfo *session_info, const ObString &database_name, const ObString &object_name, diff --git a/src/sql/resolver/dml/ob_dml_stmt.h b/src/sql/resolver/dml/ob_dml_stmt.h index 860dce443807b9dc9c9fab76051ab5307cd1d996..1bdec71f5085af4909a8842c6ed18daf985b465d 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.h +++ b/src/sql/resolver/dml/ob_dml_stmt.h @@ -739,6 +739,7 @@ public: virtual int remove_useless_sharable_expr(); virtual int clear_sharable_expr_reference(); virtual int get_from_subquery_stmts(common::ObIArray &child_stmts) const; + virtual int get_subquery_stmts(common::ObIArray &child_stmts) const; int is_referred_by_partitioning_expr(const ObRawExpr *expr, bool &is_referred); int64_t get_table_size() const { return table_items_.count(); } diff --git a/src/sql/resolver/dml/ob_select_stmt.cpp b/src/sql/resolver/dml/ob_select_stmt.cpp index f082047792c92da9527e803c052e8507bb708bae..dbca442f61e49c104404fc5018f772fba929e378 100644 --- a/src/sql/resolver/dml/ob_select_stmt.cpp +++ b/src/sql/resolver/dml/ob_select_stmt.cpp @@ -869,10 +869,13 @@ int ObSelectStmt::adjust_view_parent_namespace_stmt(ObDMLStmt *new_parent) int ret = OB_SUCCESS; int32_t subquery_level = (new_parent != NULL ? new_parent->get_current_level() + 1 : 0); ObArray view_stmts; + ObArray subquery_stmts; set_parent_namespace_stmt(new_parent); set_current_level(subquery_level); if (OB_FAIL(get_from_subquery_stmts(view_stmts))) { LOG_WARN("get from subquery stmts failed", K(ret)); + } else if (OB_FAIL(get_subquery_stmts(subquery_stmts))) { + LOG_WARN("get subquery stmts failed", K(ret)); } for (int64_t i = 0; OB_SUCC(ret) && i < view_stmts.count(); ++i) { ObSelectStmt *view_stmt = view_stmts.at(i); @@ -883,6 +886,15 @@ int ObSelectStmt::adjust_view_parent_namespace_stmt(ObDMLStmt *new_parent) LOG_WARN("adjust view parent namespace stmt failed", K(ret)); } } + for (int64_t i = 0; OB_SUCC(ret) && i < subquery_stmts.count(); ++i) { + ObSelectStmt *subquery = subquery_stmts.at(i); + if (OB_ISNULL(subquery)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table_item is null", K(i)); + } else if (OB_FAIL(subquery->adjust_view_parent_namespace_stmt(this))) { + LOG_WARN("adjust subquery parent namespace stmt failed", K(ret)); + } + } return ret; }