to issue<38555062>:fix nested sql bug when using execute immediate stmt to exexute anonymous block
This commit is contained in:
@ -4281,10 +4281,29 @@ bool ObSQLUtils::is_pl_nested_sql(ObExecContext *cur_ctx)
|
||||
ObExecContext *parent_ctx = cur_ctx->get_parent_ctx();
|
||||
//parent_sql = is_dml_stmt means this sql is triggered by a sql, not pl procedure
|
||||
if (OB_NOT_NULL(parent_ctx->get_sql_ctx())
|
||||
&& ObStmt::is_dml_stmt(parent_ctx->get_sql_ctx()->stmt_type_)
|
||||
&& parent_ctx->get_pl_stack_ctx() != nullptr
|
||||
&& !parent_ctx->get_pl_stack_ctx()->in_autonomous()) {
|
||||
if (ObStmt::is_dml_stmt(parent_ctx->get_sql_ctx()->stmt_type_)) {
|
||||
bret = true;
|
||||
} else if (stmt::T_ANONYMOUS_BLOCK == parent_ctx->get_sql_ctx()->stmt_type_) {
|
||||
/* anonymous block in a store procedure will be send to sql engine as sql, which will make new obexeccontext.
|
||||
consider follow scene:
|
||||
dml1(exec_ctx1)->udf/trigger->procedure->anonymous block(exec_ctx2)->dml2
|
||||
outer dml1 and inner dml2 form a nested scene. bug current code logic cannot identify this scene.
|
||||
so it need to skip anonymous block obexeccontext */
|
||||
do {
|
||||
parent_ctx = parent_ctx->get_parent_ctx();
|
||||
} while (OB_NOT_NULL(parent_ctx) && OB_NOT_NULL(parent_ctx->get_sql_ctx()) &&
|
||||
(stmt::T_ANONYMOUS_BLOCK == parent_ctx->get_sql_ctx()->stmt_type_));
|
||||
|
||||
if (OB_NOT_NULL(parent_ctx) &&
|
||||
OB_NOT_NULL(parent_ctx->get_sql_ctx()) &&
|
||||
OB_NOT_NULL(parent_ctx->get_pl_stack_ctx()) &&
|
||||
ObStmt::is_dml_stmt(parent_ctx->get_sql_ctx()->stmt_type_) &&
|
||||
!parent_ctx->get_pl_stack_ctx()->in_autonomous()) {
|
||||
bret = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return bret;
|
||||
|
||||
Reference in New Issue
Block a user