# 慢查询内部 SQL 过滤修复方案

## 摘要

- 修复 shared/serverless 慢查询列表在 `show_internal=false` 时仍返回 `is_internal=1` 的问题。
- 保持兼容语义：`show_internal=true` 表示“包含内部 SQL”，不是“只返回内部 SQL”。
- 内部 SQL 判断以 slowlog 解析出的 `SlowLog.IsInternal` 为准，同时保留现有 `User` 为空和 shared tier `cloud_admin` 的兜底判断。

## 实现方案

- 在 `pkg/ngm/slowquery/slowquery.go` 新增统一 helper：`isInternalSlowLog(sl *SlowLog, sharedTier bool) bool`。
- 内部 SQL 判断规则：
  - `sl.IsInternal == true` 时视为内部 SQL。
  - `sl.User == ""` 时继续视为内部 SQL。
  - `sharedTier && sl.User == "cloud_admin"` 时继续视为内部 SQL。
- 将本地 list 的三个过滤分支统一改为使用该 helper：
  - timestamp 升序列表。
  - timestamp 降序列表。
  - `orderBy=query_time/memory_max/total_keys/process_keys` 的排序列表。
- 同步修复 `pkg/ngm/slowquery/slowquery_v2.go` 中只依赖 `User` 判断内部 SQL 的逻辑，避免 V2 路径行为不一致。
- 让 detail 查询也尊重同一 helper：当命中记录为内部 SQL 且 `show_internal=false` 时返回 not found，防止通过已知 digest/conn_id/timestamp 绕过列表过滤。
- 不改变 response body、字段名、请求参数名，也不改变 O11Y proxy 转发路径。

## 测试计划

- 新增/更新 slowquery list 测试：
  - `Is_internal: true` 且存在 `User@Host` 的记录，在 `show_internal=false` 时被过滤。
  - 同一记录在 `show_internal=true` 时可返回。
  - 普通外部 SQL 在 `show_internal=false` 时仍正常返回。
- 覆盖 timestamp desc 和至少一个非 timestamp 排序路径，确保不同 list 分支一致。
- 新增 V2 list 测试，覆盖 `IsInternal=true` 且 user 非空的记录。
- 新增 detail 测试：
  - 内部记录在 `show_internal=false` 时不可取。
  - 内部记录在 `show_internal=true` 时可取。
- 运行 `go test ./pkg/ngm/slowquery`。

## 假设

- 本次修复的目标 bug 是 `show_internal=false` 泄露 `is_internal=1` 记录。
- `show_internal=true` 继续表示“显示时包含内部 SQL”，保持现有接口兼容。
- 如果未来需要“只看内部 SQL”，另增 `internal_only=true` 或 `is_internal=true` 参数，不复用 `show_internal` 改语义。
