兼容性判定
公开资料依据 · 建议 PoC 复核支持度unknown
严重度critical
置信度low
依据规则my.subquery.join_on_correlated
怎么改
先记录子查询在 ON 布尔树中的原位置。只有已证明为顶层合取筛选项,且 join 类型/相关侧不会改变外行保留(通常为内连接)的 EXISTS/IN/NOT EXISTS,才可分别按相关键去重后改半连接/反连接;位于 OR/NOT/CASE 或其他布尔组合时,按相关键物化 true/false/unknown 真值标记并在原布尔位置替换,禁止先过滤外行。外连接顶层合取也必须在 ON 内用真值标记/派生关系承接,不得预过滤保留侧,且不得移到 WHERE;NOT IN 用 NULL-aware 结果承接外值/内集 NULL;ANY/ALL 统计 true/false/unknown 并保留空集与三值逻辑。已有聚合 scalar 要按标量基数分支:无 GROUP BY 的纯聚合仅在未被 HAVING/LIMIT/OFFSET/集合操作继续消除时才恰好返回一行,此时 COUNT 空集=0、其他多数聚合=NULL;按相关键预计算后用左连接/真值标记保留外行并补回该默认值。标量基数必须在全部查询块算子之后判定 0/1/多行:零行=>NULL,多行=>报错;带 GROUP BY/HAVING 以及 LIMIT/OFFSET/集合操作的形态均不得用普通内连接丢行,也不得用 DISTINCT/LIMIT 1 偷压多行。非聚合 scalar 仅在唯一约束证明至多一行时改写,并保留零行 NULL 与多行报错;嵌套层逐层暴露并传递相关键后改 CTE/派生关系或受控临时结果,禁止仅删除子查询或静默去重
判定说明
该目标库能力矩阵尚未建立此特征条目,支持情况待评估,建议 PoC 复核
库侧 / 应用侧路径
库侧改造
可行:逐层暴露相关键,用 CTE/派生关系或临时表预计算键与聚合结果,再以显式 JOIN 接回并固定一对一/一对多基数
应用侧改造
可行:查询构建层拆为参数化的预查询与主查询;需要同一快照时保持单事务并限制中间结果规模
推荐路线:db_side。验证建议:覆盖相关键 NULL、无匹配、重复内行、scalar 零/一/多行、内连接顶层合取及 OR/NOT/CASE 中的 EXISTS 真值与 UNKNOWN;另测外连接顶层合取不得预过滤保留侧及空扩展,覆盖嵌套层、影响行数与计划,并用目标精确版本复核 ERROR 1105
规则样例
SELECT a.id FROM t_join_exists a JOIN t_join_exists b ON EXISTS (SELECT 1 FROM t_join_exists c WHERE c.id = a.id)
SELECT a.id FROM t_join_scalar a JOIN t_join_scalar b ON b.v = (SELECT MAX(c.v) FROM t_join_scalar c WHERE c.id >= a.id)
SELECT a.id FROM t_join_exists a JOIN t_join_exists b ON EXISTS (SELECT 1 FROM t_join_exists c WHERE c.id = 1)
参考来源
- https://docs.pingcap.com/tidb/stable/mysql-compatibility/
- https://github.com/pingcap/tidb/blob/v8.5.7/pkg/planner/core/logical_plan_builder.go#L921-L932
- https://github.com/pingcap/tidb/issues/69539
- https://github.com/pingcap/tidb/issues/69540
- https://github.com/pingcap/tidb/issues/11414
- https://dev.mysql.com/doc/refman/8.4/en/logical-operators.html
- https://dev.mysql.com/doc/refman/8.4/en/select.html
相关改造点
- MYSQL → opengauss 6.0 B 模式 全部改造点
- opengauss 6.0 B 模式 兼容性总览
- MYSQL 迁移国产库总览
- MYSQL GET_LOCK / RELEASE_LOCK 咨询锁函数 迁移 opengauss 6.0 B 模式 怎么改
- MYSQL ALTER TABLE ALGORITHM= / LOCK= 在线 DDL 子句 迁移 opengauss 6.0 B 模式 怎么改
- MYSQL ALTER TABLE 增删主键限制 迁移 opengauss 6.0 B 模式 怎么改
- MYSQL AUTO_INCREMENT 自增列 迁移 opengauss 6.0 B 模式 怎么改
- MYSQL 表/列级 CHARSET 与 COLLATE 子句 迁移 opengauss 6.0 B 模式 怎么改
- MYSQL CHECK 约束执行与静默忽略差异 迁移 opengauss 6.0 B 模式 怎么改