diff --git a/src/observer/mysql/obmp_stmt_execute.cpp b/src/observer/mysql/obmp_stmt_execute.cpp index b12a92859..c050944e6 100644 --- a/src/observer/mysql/obmp_stmt_execute.cpp +++ b/src/observer/mysql/obmp_stmt_execute.cpp @@ -281,9 +281,7 @@ int ObMPStmtExecute::init_for_arraybinding(ObIAllocator &alloc) return ret; } -int ObMPStmtExecute::check_param_type_for_arraybinding( - ObSQLSessionInfo *session_info, - ParamTypeInfoArray ¶m_type_infos) +int ObMPStmtExecute::check_precondition_for_arraybinding(const ObSQLSessionInfo &session_info) { int ret = OB_SUCCESS; if (!ObStmt::is_dml_write_stmt(stmt_type_) @@ -292,11 +290,18 @@ int ObMPStmtExecute::check_param_type_for_arraybinding( ret = OB_NOT_SUPPORTED; LOG_WARN("arraybinding only support write dml", K(ret), K(stmt_type_)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "arraybinding got no write dml"); - } else if (session_info->get_local_autocommit()) { + } else if (session_info.get_local_autocommit()) { // read system variable after session info synchronized ret = OB_NOT_SUPPORTED; LOG_WARN("arraybinding must in autocommit off", K(ret)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "arraybinding has autocommit = on"); - } else if (OB_UNLIKELY(param_type_infos.count() <= 0)) { + } + return ret; +} + +int ObMPStmtExecute::check_param_type_for_arraybinding(ParamTypeInfoArray ¶m_type_infos) +{ + int ret = OB_SUCCESS; + if (OB_UNLIKELY(param_type_infos.count() <= 0)) { ret = OB_NOT_SUPPORTED; LOG_WARN("arraybinding must has parameters", K(ret)); LOG_USER_ERROR(OB_NOT_SUPPORTED, "arraybinding has no parameter"); @@ -306,8 +311,7 @@ int ObMPStmtExecute::check_param_type_for_arraybinding( if (type_info.is_basic_type_ || !type_info.is_elem_type_) { ret = OB_NOT_SUPPORTED; LOG_WARN("arraybinding parameter must be anonymous array", K(ret)); - LOG_USER_ERROR(OB_NOT_SUPPORTED, - "arraybinding parameter is not anonymous array"); + LOG_USER_ERROR(OB_NOT_SUPPORTED, "arraybinding parameter is not anonymous array"); } } } @@ -1000,7 +1004,7 @@ int ObMPStmtExecute::request_params(ObSQLSessionInfo *session, } if (OB_SUCC(ret) && is_arraybinding_) { - OZ (check_param_type_for_arraybinding(session, param_type_infos)); + OZ (check_param_type_for_arraybinding(param_type_infos)); } if (OB_SUCC(ret) && (stmt::T_CALL_PROCEDURE == ps_session_info->get_stmt_type() @@ -1964,6 +1968,8 @@ int ObMPStmtExecute::process() LOG_WARN("failed to init flt extra info", K(ret)); } else if (OB_FAIL(session.gen_configs_in_pc_str())) { LOG_WARN("fail to generate configuration string that can influence execution plan", K(ret)); + } else if (is_arraybinding_ && OB_FAIL(check_precondition_for_arraybinding(session))) { + LOG_WARN("precondition for arraybinding is not satisfied", K(ret)); } else { FLTSpanGuard(ps_execute); FLT_SET_TAG(log_trace_id, ObCurTraceId::get_trace_id_str(), diff --git a/src/observer/mysql/obmp_stmt_execute.h b/src/observer/mysql/obmp_stmt_execute.h index 5931a6b6a..1ebe12c54 100644 --- a/src/observer/mysql/obmp_stmt_execute.h +++ b/src/observer/mysql/obmp_stmt_execute.h @@ -264,8 +264,8 @@ private: int init_arraybinding_field(int64_t column_field_cnt, const ColumnsFieldIArray *column_fields); int init_row_for_arraybinding(ObIAllocator &alloc, int64_t array_binding_row_num); - int check_param_type_for_arraybinding( - sql::ObSQLSessionInfo *session_info, sql::ParamTypeInfoArray ¶m_type_infos); + int check_precondition_for_arraybinding(const ObSQLSessionInfo &session_info); + int check_param_type_for_arraybinding(sql::ParamTypeInfoArray ¶m_type_infos); int check_param_value_for_arraybinding(ObObjParam ¶m); int construct_execute_param_for_arraybinding(int64_t pos); void reset_complex_param_memory(ParamStore *params, sql::ObSQLSessionInfo *session_info = nullptr);