diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index f189c2efc1..2bc0279795 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -15197,6 +15197,7 @@ int ObDMLResolver::resolve_with_clause_subquery(const ParseNode &parse_tree, Tab cycle_pseudo_column_name) ); cur_select_resolver->set_current_recursive_cte_table_item(NULL); cur_select_resolver->set_current_cte_involed_stmt(NULL); + OZ ( schema_checker_->remove_tmp_cte_schemas(select_resolver.cte_ctx_.get_current_cte_table_name()) ); } return ret; } diff --git a/src/sql/resolver/dml/ob_dml_resolver.h b/src/sql/resolver/dml/ob_dml_resolver.h index 3d6396a442..29865c1d5b 100644 --- a/src/sql/resolver/dml/ob_dml_resolver.h +++ b/src/sql/resolver/dml/ob_dml_resolver.h @@ -109,6 +109,7 @@ class ObDMLResolver : public ObStmtResolver } inline void set_is_with_resolver(bool is_with_resolver) { is_with_clause_resolver_ = is_with_resolver; } inline void set_current_cte_table_name(const ObString& table_name) { current_cte_table_name_ = table_name; } + inline ObString& get_current_cte_table_name() { return current_cte_table_name_; } inline bool is_with_resolver() const { return is_with_clause_resolver_; } inline void set_recursive(bool recursive) { is_recursive_cte_ = recursive; } inline void set_in_subquery() { is_cte_subquery_ = true; } diff --git a/src/sql/resolver/ob_schema_checker.cpp b/src/sql/resolver/ob_schema_checker.cpp index 220e3cafef..808e52db63 100644 --- a/src/sql/resolver/ob_schema_checker.cpp +++ b/src/sql/resolver/ob_schema_checker.cpp @@ -2973,5 +2973,20 @@ bool ObSchemaChecker::is_ora_priv_check() return false; } +int ObSchemaChecker::remove_tmp_cte_schemas(const ObString& cte_table_name) +{ + int ret = OB_SUCCESS; + for (int64_t i = 0; OB_SUCC(ret) && i < tmp_cte_schemas_.count(); i++) { + if (cte_table_name == tmp_cte_schemas_.at(i)->get_table_name()) { + if(OB_FAIL(tmp_cte_schemas_.remove(i))) { + LOG_WARN("remove from tmp_cte_schemas_ failed.", K(ret)); + } else { + break; + } + } + } + return ret; +} + }//end of namespace sql }//end of namespace oceanbase diff --git a/src/sql/resolver/ob_schema_checker.h b/src/sql/resolver/ob_schema_checker.h index 1d98188aa8..4592fc98a1 100644 --- a/src/sql/resolver/ob_schema_checker.h +++ b/src/sql/resolver/ob_schema_checker.h @@ -519,6 +519,8 @@ public: int get_directory_id(const uint64_t tenant_id, const common::ObString &directory_name, uint64_t &directory_id); + + int remove_tmp_cte_schemas(const ObString& cte_table_name); private: int get_link_table_schema_inner(uint64_t table_id, const share::schema::ObTableSchema *&table_schema) const;