OPT_PARAM Hint saves the day…

一个工程师使用嵌套子查询执行删除操作,抛出ORA-00600错误。在MOS查阅工具上显示这个错误是由此Bug引起的:

 

Bug 16347248  ORA-600 [kkqjpdGetContext:1] parsing SQL with subquery

 

这个Bug提供的解决办法是执行ALTER SESSION命令。

 

alter session set "_optimizer_unnest_disjunctive_subq"= FALSE;


 

相比改变全局会话,我们使用OPT_PARAMHint,编写像下述的子查询:

 

(SELECT /*+ OPT_PARAM('_optimizer_unnest_disjunctive_subq' 'FALSE') */ ... FROM ...)


 

发表评论提醒我们在11.2.0.4或者12c上删除Hint,工作愉快。

 

加油。

 

One of the developers was performing a delete using a nested subquery, which was throwing outORA-00600 errors. The ORA-00600 LookupTool on MOS suggested it was caused by this bug:
Bug 14347248 ORA-600 [kkqjpdGetContext:1] parsing SQL with subquery
The workaround in the bug suggested running this ALTER SESSION command.
alter session set "_optimizer_unnest_disjunctive_subq"= FALSE;
Rather than alter the whole session, we used the OPT_PARAM hint, making the subquery look something like this.(SELECT /*+ OPT_PARAM('_optimizer_unnest_disjunctive_subq' 'FALSE') */ ... FROM ...)
Slap in a comment reminding us to remove the hint when we move to 11.2.0.4 or 12c and job’s a good’un!
Cheers
Tim…

OPT_PARAM Hint saves the day…

 

 

katoonSina   优快云
@Wentasy 博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。原创博文如需转载请注明出处,谢谢 :) [优快云博客]
<think>好的,我现在需要分析用户提供的C函数`bool ib_modify_qp_is_ok(...)`,并解释其功能。首先,我得仔细阅读代码,理解每个部分的作用。这个函数似乎与InfiniBand中的队列对(QP)状态转换有关。用户希望了解它的工作原理和逻辑。 首先,函数的参数是当前的QP状态`cur_state`,目标状态`next_state`,QP类型`type`,以及属性掩码`mask`。返回布尔值表示是否允许修改QP。函数内部定义了两个掩码变量`req_param`和`opt_param`,分别表示必需和可选的参数。 接下来,第一个条件判断检查`mask`是否包含`IB_QP_CUR_STATE`,并且`cur_state`是否处于允许的状态(RTR、RTS、SQD、SQE)。如果不满足,返回false。这里可能是在验证当前状态的合法性,或者在特定条件下必须提供当前状态。 然后,检查`qp_state_table`中的当前状态到目标状态的转换是否有效。如果转换无效,直接返回false。这说明存在一个状态转换表,用来预先定义哪些状态转换是允许的。 接下来,根据当前状态、目标状态和QP类型,从状态表中获取必须的参数`req_param`和可选参数`opt_param`。这一步是关键,因为不同的状态转换可能需要不同的参数。 然后,检查传入的`mask`是否包含所有必需的参数。如果缺少任何一个必需参数,返回false。这确保了修改QP时必须提供必要的属性。 之后,检查`mask`是否包含除了必需、可选和状态之外的其他参数。如果有非法参数,返回false。这防止了传入不支持的参数。 最后,所有条件都满足时返回true,允许修改。 可能的疑问点包括:`qp_state_table`的结构,不同的QP类型如何影响必需和可选参数,各个状态转换的具体规则。需要确认这些信息是否在代码的其他部分定义,或者是否属于InfiniBand协议规范的一部分。 总结来说,这个函数通过多个条件检查,确保QP状态转换的合法性,参数的正确性,以及符合协议规定的转换规则。</think>该函数`ib_modify_qp_is_ok()`用于验证InfiniBand队列对(QP)状态修改的合法性。以下是逐步分析: ### 1. 参数说明 - **`cur_state`**:当前QP状态 - **`next_state`**:目标QP状态 - **`type`**:QP类型(如RC/UC/UD等) - **`mask`**:要修改的属性掩码(按位组合) ### 2. 验证逻辑分步说明 #### 步骤1:检查当前状态合法性 ```c if (mask & IB_QP_CUR_STATE && cur_state != IB_QPS_RTR && cur_state != IB_QPS_RTS && cur_state != IB_QPS_SQD && cur_state != IB_QPS_SQE) ``` - **条件**:若调用方要求验证当前状态(`IB_QP_CUR_STATE`在掩码中) - **要求**:当前状态必须是`RTR`/`RTS`/`SQD`/`SQE`之一 - **失败**:返回`false`(非法修改) #### 步骤2:检查状态转换有效性 ```c if (!qp_state_table[cur_state][next_state].valid) ``` - **依赖**:预定义状态转换表`qp_state_table` - **作用**:检查从`cur_state`到`next_state`是否允许转换 - **失败**:返回`false` #### 步骤3:获取必需/可选参数 ```c req_param = qp_state_table[...].req_param[type]; opt_param = qp_state_table[...].opt_param[type]; ``` - **动态查询**:根据QP类型和状态转换方向,获取该转换必需的参数(`req_param`)和可选参数(`opt_param`) #### 步骤4:验证必需参数 ```c if ((mask & req_param) != req_param) ``` - **要求**:输入掩码`mask`必须包含所有必需参数 - **失败**:缺少必要参数,返回`false` #### 步骤5:排除非法参数 ```c if (mask & ~(req_param | opt_param | IB_QP_STATE)) ``` - **作用**:检查是否存在既不是必需参数、可选参数,也不是状态修改标志(`IB_QP_STATE`)的参数 - **失败**:存在非法参数,返回`false` ### 3. 返回值 - 所有检查通过 → 返回`true`(允许修改) - 任意检查失败 → 返回`false` ### 4. 状态转换表说明 函数依赖的`qp_state_table`是一个二维数组,其结构大致如下: ```c struct { bool valid; // 是否允许转换 enum ib_qp_attr_mask req_param[XX]; // 必需参数(按QP类型) enum ib_qp_attr_mask opt_param[XX]; // 可选参数(按QP类型) } qp_state_table[IB_QPS_MAX][IB_QPS_MAX]; ``` ### 5. 典型应用场景 当用户调用`ib_modify_qp()`修改QP属性前,需先通过此函数验证: - 状态转换是否符合规范 - 参数掩码是否满足目标状态的要求 - 避免传递非法参数 ### 附:关键概念速查表 | 术语 | 说明 | |------|------| | QP | InfiniBand通信的基本端点,类似TCP连接 | | QP状态 | RESET/INIT/RTR/RTS/SQD/SQE等状态机 | | 属性掩码 | 按位标识要修改的属性(如QP状态、端口号等)|
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值