Procházet zdrojové kódy

fix(ac15): OpDivideQuotaClamp 的 returnsResultSet 定为 true —— 消费结果集,不是为了读它

## 为什么改

上一版我按"这句 SELECT 不是 success/msg 契约"先定成 `false`、想留到 DV-7 实测。**这个谨慎用错了地方**:
失败形态会误导人 —— 实测确实有结果集而我们走 `Exec` 时,MySQL 驱动会在连接上留下**未消费的结果集**,
下一次同连接查询报

```
Error 2014: Commands out of sync; you can't run this command now
```

而且**报在下一条语句上** ⇒ 会被当成"DV-7 的快照读坏了"或"分账链 dispatch 有问题"。
dual-run 每个 case 只开 5 个句柄(`MaxOpenConns=1`),**一个未消费结果集就能把整个 case 的后半段打死**。

⇒ 判据不是"它需要这个结果集",而是"**它确实产出一个结果集,我们必须消费掉**"。
多读几行空结果成本近乎零;连接被污染的成本是一轮排查。

## 同时写进注释的两条

1. 那句 `SELECT userid FROM …` **不是 `success/msg` 契约**(它是祖先链,用户不存在时恒空)
   ⇒ **不按 `success=0` 判它**,**不把行数当断言依据**,只用来 `drain`。
2. 这个枚举仍**没有 dispatch**(`grep -c OpDivideQuotaClamp target.go` = 0)⇒ 没人能用它跑 case。

## 报数(粘贴;两个门禁分两行)

```
分母:DefaultCases=55 | 应跑 55 | 实跑 55
总览:55 个 case,55 PASS,0 FAIL
Skipped 98 | 业务 346 | 基建 118 | 未分类 0
代价 SQL 3350 次 / 19.324s / 60.9 次 per case / 351ms per case
grep "本块比对了" = 7

go build OK | go vet OK | go test OK
```

**55 条仍 55 PASS,无新增覆盖**(这一步只改了"怎么调这支 SP",没有 case 用它)。
未 push。
Q před 11 hodinami
rodič
revize
50e11f7505
1 změnil soubory, kde provedl 13 přidání a 6 odebrání
  1. 13 6
      internal/academic/dualrun/stage2/legacy.go

+ 13 - 6
internal/academic/dualrun/stage2/legacy.go

@@ -109,12 +109,19 @@ func returnsResultSet(op Op) bool {
 	// 不读结果集的话:`Exec` 会留下未消费的结果集,且 `success=0`(LEAVE 分支)看不出来。
 	case OpUseActivityRecommend:
 		return true
-		// `sp_user_divide_into_update_quota` **不在此列**(= 不读结果集)。
-		// 它的正文末尾确实有一句 `SELECT userid FROM t_user_divide_into WHERE …`,
-		// 但**不是 `success/msg` 契约**,且用户在不存在时那句的 `WHERE left_val>=NULL` 恒 NULL ⇒ 空集。
-		// 按"正文末尾有没有 SELECT"这条判据(见本函数抬头)它**该算有** ——
-		// 所以这里把差异显式写出来:本枚举落地时先按 `false` 调,**等 DV-7 实测 CALL 行为后再定**。
-		// ⚠ 若实测发现 `Exec` 会留下未消费结果集,就把本枚举挪到上面的 `return true` 组里。
+	// SP 分账调额:正文末尾 `SELECT userid FROM t_user_divide_into WHERE …` **确实产出一个结果集**。
+	//
+	// 判据不是"它需要这个结果集",而是"**它确实产出一个结果集,我们必须消费掉**"。
+	// 走 `Exec` 的后果(比"多读几行"贵得多):
+	//   连接上留下**未消费的结果集** ⇒ 同连接下一次查询报
+	//   `Error 2014: Commands out of sync; you can't run this command now`,
+	//   而且**报在下一条语句上** —— 看起来像"DV-7 的快照读坏了"。
+	//   dual-run 每个 case 只开 5 个句柄(`MaxOpenConns=1`),一个未消费结果集能把后半段打死。
+	//
+	// ⚠ 那句 `SELECT` **不是 `success/msg` 契约**(它是祖先链,用户不存在时恒空):
+	// 只用来 **drain** —— 不要按 `success=0` 判它,也不要把它的行数当断言依据。
+	case OpDivideQuotaClamp:
+		return true
 	}
 	return false
 }