diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index 24a418e4fb..6964cae9e4 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -4464,18 +4464,24 @@ int ObSql::after_get_plan(ObPlanCacheCtx &pc_ctx, } } if (OB_SUCC(ret) && NULL != phy_plan && !session.get_is_deserialized() && !session.is_inner()) { - if (phy_plan->is_contain_oracle_session_level_temporary_table() - || phy_plan->is_contain_oracle_trx_level_temporary_table() - || phy_plan->contains_temp_table()) { - bool is_already_set = false; - if (OB_FAIL(session.get_session_temp_table_used(is_already_set))) { - LOG_WARN("fail to get session temp table used", K(ret)); - } else if (is_already_set) { - //do nothing - } else if (OB_FAIL(session.set_session_temp_table_used(true))) { - LOG_WARN("fail to set session temp table used", K(ret)); + bool has_session_tmp_table = phy_plan->is_contain_oracle_session_level_temporary_table() + || phy_plan->contains_temp_table(); + bool has_txn_tmp_table = phy_plan->is_contain_oracle_trx_level_temporary_table(); + if (has_session_tmp_table || has_txn_tmp_table) { + if (session.is_txn_free_route_temp()) { + ret = OB_TRANS_FREE_ROUTE_NOT_SUPPORTED; + LOG_WARN("access temp table is supported to be executed on txn temporary node", KR(ret), K(session.get_txn_free_route_ctx())); + } else { + bool is_already_set = false; + if (OB_FAIL(session.get_session_temp_table_used(is_already_set))) { + LOG_WARN("fail to get session temp table used", K(ret)); + } else if (is_already_set) { + //do nothing + } else if (OB_FAIL(session.set_session_temp_table_used(true))) { + LOG_WARN("fail to set session temp table used", K(ret)); + } + LOG_DEBUG("plan contain oracle session level temporary table detected", K(is_already_set)); } - LOG_DEBUG("plan contain oracle session level temporary table detected", K(is_already_set)); } if (OB_SUCC(ret)) { if (OB_FAIL(append_array_no_dup(session.get_gtt_session_scope_ids(), diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 4c84b04459..e652d97c77 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -3615,13 +3615,7 @@ int ObDMLResolver::resolve_table_drop_oracle_temp_table(TableItem *&table_item) ret = OB_TABLE_NOT_EXIST; LOG_WARN("get table schema failed", K_(table_item->table_name), K(ret)); } else if (OB_NOT_NULL(table_schema) && table_schema->is_oracle_tmp_table()) { - if (OB_FAIL(session_info_->drop_reused_oracle_temp_tables())) { - LOG_WARN("fail to drop reused oracle temporary tables", K(ret)); - } else { - session_info_->set_has_temp_table_flag(); - LOG_DEBUG("succeed to drop oracle temporary table in case of session id reused", - K(session_info_->get_sessid_for_table())); - } + session_info_->set_has_temp_table_flag(); } } return ret; diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index 172eff5844..0b0619a817 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -749,7 +749,6 @@ int ObRawExpr::is_const_inherit_expr(bool &is_const_inherit, || (T_FUN_SYS_LAST_INSERT_ID == type_ && get_param_count() > 0) || T_FUN_SYS_TO_BLOB == type_ || (T_FUN_SYS_SYSDATE == type_ && lib::is_mysql_mode()) - || T_FUN_GET_TEMP_TABLE_SESSID == type_ || (param_need_replace ? is_not_calculable_expr() : cnt_not_calculable_expr()) || (T_FUN_UDF == type_ && !static_cast(this)->is_deterministic())) { @@ -793,6 +792,7 @@ int ObRawExpr::is_non_pure_sys_func_expr(bool &is_non_pure) const || T_FUN_SYS_CUR_DATE == type_ || T_FUN_SYS_USERENV == type_ || T_FUN_SYS_REGEXP_REPLACE == type_ + || T_FUN_GET_TEMP_TABLE_SESSID == type_ || T_FUN_SYS_USER_CAN_ACCESS_OBJ == type_) { is_non_pure = true; } else if (T_FUN_SYS_TO_DATE == type_ || T_FUN_SYS_TO_TIMESTAMP == type_ || diff --git a/src/sql/session/ob_sql_session_info.cpp b/src/sql/session/ob_sql_session_info.cpp index ae6d9f1733..3af77e4b06 100644 --- a/src/sql/session/ob_sql_session_info.cpp +++ b/src/sql/session/ob_sql_session_info.cpp @@ -681,6 +681,11 @@ int ObSQLSessionInfo::delete_from_oracle_temp_tables(const obrpc::ObDropTableArg if (TMP_TABLE_ORA_TRX == table_type && !get_is_deserialized()) { gtt_trans_scope_ids_.reuse(); gen_gtt_trans_scope_unique_id(); + if (gtt_session_scope_ids_.count() == 0) { + if (OB_FAIL(set_session_temp_table_used(false))) { + LOG_WARN("fail to set session temp table unused", K(ret)); + } + } } } return ret;