diff --git a/src/sql/engine/expr/ob_expr_uuid.cpp b/src/sql/engine/expr/ob_expr_uuid.cpp index 3296b4e341..4194fd4d5c 100644 --- a/src/sql/engine/expr/ob_expr_uuid.cpp +++ b/src/sql/engine/expr/ob_expr_uuid.cpp @@ -390,15 +390,31 @@ int ObExprSysGuid::eval_sys_guid(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &ex int ObExprUuid::gen_server_uuid(char *server_uuid, const int64_t uuid_len) { int ret = OB_SUCCESS; - ObArenaAllocator calc_buf(ObModIds::OB_SQL_EXPR); + ObArenaAllocator calc_buf("ServerUuid"); unsigned char scratch[UuidCommon::LENGTH_UUID] = {0}; - if (OB_ISNULL(server_uuid) || OB_UNLIKELY(uuid_len != UuidCommon::LENGTH_UUID)) { + bool need_reset = false; + if (OB_ISNULL(uuid_node)) { + need_reset = true; + if (OB_ISNULL(uuid_node = static_cast(calc_buf.alloc(sizeof(ObUUIDNode))))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("allocate memory failed", K(ret)); + } else if (OB_FAIL(uuid_node->init())) { + LOG_WARN("failed to init", K(ret)); + } + } + if (OB_FAIL(ret)) { + //do nothing + } else if (OB_ISNULL(server_uuid) || OB_UNLIKELY(uuid_len != UuidCommon::LENGTH_UUID)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected error", K(ret), K(server_uuid), K(uuid_len)); } else if (OB_FAIL(calc(scratch))) { LOG_WARN("failed to calc", K(ret)); } else if (OB_FAIL(UuidCommon::bin2uuid(server_uuid, scratch))) { LOG_WARN("fail to convert strach to server_uuid", K(ret), K(server_uuid), K(scratch)); + } else {/*do nothing*/} + + if (need_reset) { + uuid_node = NULL; } return ret; }