to issue<50328041>:support kill stmt in pl

This commit is contained in:
hanr881
2023-06-13 10:47:53 +00:00
committed by ob-robot
parent 635b221288
commit cf733ea64f

View File

@ -2338,44 +2338,37 @@ int ObSPIService::prepare_dynamic(ObPLExecCtx *ctx,
} }
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
if (!ObStmt::is_dynamic_supported_stmt(stmt_type)) { int64_t exec_param_cnt = ObStmt::is_dml_stmt(stmt_type)
// Some stmt type is dangerous and not allowed in Oracle, so we must forbid it. ? pl_prepare_result.result_set_->get_external_params().count()
ret = OB_NOT_SUPPORTED; : pl_prepare_result.result_set_->get_param_fields()->count();
LOG_WARN("Statement type not allowed in dynamic sql", K(ret), K(stmt_type), K(sql_str)); if (pl_prepare_result.result_set_->is_returning() && 0 == into_cnt) {
LOG_USER_ERROR(OB_NOT_SUPPORTED, "Statement not allowed in dynamic sql,"); ret = OB_ERR_MISSING_INTO_KEYWORD;
LOG_WARN("ORA-00925: missing INTO keyword", K(ret),
K(pl_prepare_result.result_set_->is_returning()), K(into_cnt));
} else { } else {
int64_t exec_param_cnt = ObStmt::is_dml_stmt(stmt_type) /*!
? pl_prepare_result.result_set_->get_external_params().count() * 1、select语句的INTO子句在动态语句里直接丢掉,所以select语句参数个数按传进来的入参个数检查
: pl_prepare_result.result_set_->get_param_fields()->count(); * 2、dml语句如果有RETURNING INTO子句,需要去掉动态语句里RETURNING INTO的参数,
if (pl_prepare_result.result_set_->is_returning() && 0 == into_cnt) { * 但是如果EXECUTE IMMEDIATE本身有RETURNING子句的话就不用去了
ret = OB_ERR_MISSING_INTO_KEYWORD; */
LOG_WARN("ORA-00925: missing INTO keyword", K(ret), int64_t need_exec_param_cnt = exec_param_cnt;
K(pl_prepare_result.result_set_->is_returning()), K(into_cnt)); if (ObStmt::is_dml_write_stmt(stmt_type)) {
} else { need_exec_param_cnt = need_exec_param_cnt + (is_returning ? 0 : into_cnt);
/*! }
* 1、select语句的INTO子句在动态语句里直接丢掉,所以select语句参数个数按传进来的入参个数检查 if (param_cnt != need_exec_param_cnt) {
* 2、dml语句如果有RETURNING INTO子句,需要去掉动态语句里RETURNING INTO的参数, if (lib::is_mysql_mode()) {
* 但是如果EXECUTE IMMEDIATE本身有RETURNING子句的话就不用去了 ret = OB_ERR_WRONG_DYNAMIC_PARAM;
*/ LOG_USER_ERROR(OB_ERR_WRONG_DYNAMIC_PARAM, exec_param_cnt, param_cnt);
int64_t need_exec_param_cnt = exec_param_cnt; } else if (param_cnt < need_exec_param_cnt) {
if (ObStmt::is_dml_write_stmt(stmt_type)) { ret = OB_ERR_NOT_ALL_VARIABLE_BIND;
need_exec_param_cnt = need_exec_param_cnt + (is_returning ? 0 : into_cnt); LOG_WARN("ORA-01008: not all variables bound",
} K(ret), K(param_cnt),
if (param_cnt != need_exec_param_cnt) { K(need_exec_param_cnt), K(into_cnt), K(is_returning), K(stmt_type));
if (lib::is_mysql_mode()) { } else {
ret = OB_ERR_WRONG_DYNAMIC_PARAM; ret = OB_ERR_BIND_VARIABLE_NOT_EXIST;
LOG_USER_ERROR(OB_ERR_WRONG_DYNAMIC_PARAM, exec_param_cnt, param_cnt); LOG_WARN("ORA-01006: bind variable does not exist",
} else if (param_cnt < need_exec_param_cnt) { K(ret), K(param_cnt),
ret = OB_ERR_NOT_ALL_VARIABLE_BIND; K(need_exec_param_cnt), K(into_cnt), K(is_returning), K(stmt_type));
LOG_WARN("ORA-01008: not all variables bound",
K(ret), K(param_cnt),
K(need_exec_param_cnt), K(into_cnt), K(is_returning), K(stmt_type));
} else {
ret = OB_ERR_BIND_VARIABLE_NOT_EXIST;
LOG_WARN("ORA-01006: bind variable does not exist",
K(ret), K(param_cnt),
K(need_exec_param_cnt), K(into_cnt), K(is_returning), K(stmt_type));
}
} }
} }
} }