问题
云数据库 MySQL 在处理窗口函数(Window Function)查询时,当 ORDER BY 子句中使用 CASE 表达式,且 CASE 表达式的不同分支返回具有不同 collation(字符集排序规则)的字段时,collation 聚合失败会触发空指针解引用,导致数据库实例 Crash。
问题触发场景
典型触发条件
1. 使用窗口函数:查询中包含
ROW_NUMBER()、RANK()、DENSE_RANK() 等窗口函数。2. ORDER BY 包含 CASE 表达式:窗口函数的 ORDER BY 子句使用 CASE WHEN...END 表达式。
3. Collation 冲突:CASE 表达式的不同分支返回具有不同 collation 的字符串类型字段。
最小复现 SQL
CREATE TABLE t1 (id INT PRIMARY KEY,col_ci VARCHAR(100) COLLATE utf8mb4_general_ci,col_cs VARCHAR(100) COLLATE utf8mb4_unicode_ci);SELECT id, ROW_NUMBER() OVER (ORDER BY CASE WHEN id = 1 THEN col_ci ELSE col_cs END) AS rn FROM t1;
涉及问题的内核版本
MySQL 8.0 20260430之前的版本。
修复的内核版本
MySQL 8.0 20260430及以上版本。
修复方法
升级到已修复版本