Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
clmforever
oceanbase
提交
e02930aa
O
oceanbase
项目概览
clmforever
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
oceanbase
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e02930aa
编写于
3月 02, 2023
作者:
C
chinaxing
提交者:
ob-robot
3月 02, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[master] fix tmp table reroute
上级
e5e8ee23
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
27 addition
and
15 deletion
+27
-15
src/sql/ob_sql.cpp
src/sql/ob_sql.cpp
+27
-15
未找到文件。
src/sql/ob_sql.cpp
浏览文件 @
e02930aa
...
...
@@ -143,19 +143,20 @@ void ObSql::stat()
{
sql
::
print_sql_stat
();
}
#define STMT_SUPPORT_BY_TXN_FREE_ROUTE(stmt_type, allow_ps) \
(ObStmt::is_dml_stmt(stmt_type) \
|| (stmt_type == stmt::StmtType::T_VARIABLE_SET) \
|| (stmt_type == stmt::StmtType::T_USE_DATABASE) \
|| (allow_ps && stmt_type == stmt::StmtType::T_PREPARE) \
|| (allow_ps && stmt_type == stmt::StmtType::T_EXECUTE) \
|| (allow_ps && stmt_type == stmt::StmtType::T_DEALLOCATE))
#define CHECK_STMT_SUPPORTED_BY_TXN_FREE_ROUTE(result, allow_ps) \
if (OB_SUCC(ret)) { \
auto stmt_type = result.get_stmt_type(); \
auto &session = result.get_session(); \
if (!session.is_inner() && session.is_txn_free_route_temp()) { \
if (ObStmt::is_dml_stmt(stmt_type) \
|| (stmt_type == stmt::StmtType::T_VARIABLE_SET) \
|| stmt_type == stmt::StmtType::T_USE_DATABASE \
|| (allow_ps && stmt_type == stmt::StmtType::T_PREPARE) \
|| (allow_ps && stmt_type == stmt::StmtType::T_EXECUTE) \
|| (allow_ps && stmt_type == stmt::StmtType::T_DEALLOCATE)) { \
} else { \
if (!STMT_SUPPORT_BY_TXN_FREE_ROUTE(stmt_type, allow_ps)) { \
ret = OB_TRANS_FREE_ROUTE_NOT_SUPPORTED; \
LOG_WARN("only DML stmt or SET command is supported to be executed on txn temporary node", \
KR(ret), K(stmt_type), K(session.get_txn_free_route_ctx()), K(session)); \
...
...
@@ -4919,17 +4920,28 @@ int ObSql::check_need_reroute(ObPlanCacheCtx &pc_ctx, ObSQLSessionInfo &session,
should_reroute
=
false
;
}
}
// the SQL use tmp table can not run on TXN_FREE_ROUTE temp node
if
(
should_reroute
&&
NULL
!=
plan
&&
!
session
.
get_is_deserialized
()
&&
!
session
.
is_inner
()
&&
session
.
is_in_transaction
())
{
bool
has_session_tmp_table
=
plan
->
is_contain_oracle_session_level_temporary_table
()
||
plan
->
contains_temp_table
();
bool
has_txn_tmp_table
=
plan
->
is_contain_oracle_trx_level_temporary_table
();
if
((
has_session_tmp_table
||
has_txn_tmp_table
)
// 1. TXN_FREE_ROUTE DISABLED, all query in one node -- orignal node
// 2. TXN_FREE_ROUTE ENABLED, must on orignal node
&&
!
session
.
is_txn_free_route_temp
())
{
// CHECK for `TXN_FREE_ROUTE`
if
(
should_reroute
&&
!
session
.
is_inner
()
&&
session
.
is_in_transaction
())
{
auto
stmt_type
=
plan
->
get_stmt_type
();
bool
fixed_route
=
true
;
if
(
pc_ctx
.
sql_ctx_
.
multi_stmt_item_
.
is_part_of_multi_stmt
())
{
// current is multi-stmt
}
else
if
(
!
STMT_SUPPORT_BY_TXN_FREE_ROUTE
(
stmt_type
,
false
))
{
// stmt is not DML
}
else
if
(
plan
->
is_contain_oracle_session_level_temporary_table
()
||
plan
->
contains_temp_table
()
||
plan
->
is_contain_oracle_trx_level_temporary_table
())
{
// access temp table
}
else
{
fixed_route
=
false
;
}
if
(
fixed_route
)
{
// multi-stmt or stmt disallow on other node, can not be rerouted
should_reroute
=
false
;
}
}
if
(
OB_ISNULL
(
pc_ctx
.
sql_ctx_
.
schema_guard_
))
{
ret
=
OB_INVALID_ARGUMENT
;
LOG_WARN
(
"invalid null schema guard"
,
K
(
ret
));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录