matrixorigin / matrixorigin/matrixone
[Compatibility]: CONVERT_TZ accepts and normalizes invalid time-zone offsets
- Dominant language
- Go
- Stars
- 1.9k
- Forks
- 311
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 768
Description
## 现象
MatrixOne `main`(`ac660ae56ecd37bab3dd8c61193617a323377029`)接受超出 MySQL 时区位移范围或分钟字段非法的 `CONVERT_TZ()` 时区参数,并按归一化后的位移返回时间:
```sql
SELECT CONVERT_TZ('2024-01-01 00:00:00.123456', '+00:00', '+14:01');
SELECT CONVERT_TZ('2024-01-01 00:00:00.123456', '+00:00', '+14:59');
SELECT CONVERT_TZ('2024-01-01 00:00:00.123456', '+00:00', '+00:60');
SELECT CONVERT_TZ('2024-01-01 00:00:00.123456', '+00:00', '+01:99');
```
MatrixOne 分别返回:
```text
2024-01-01 14:01:00
2024-01-01 14:59:00
2024-01-01 01:00:00
2024-01-01 02:39:00
```
MySQL 8.0.46 对以上四个非法偏移都返回 `NULL`。控制值 `+05:30`、`+14:00`、`-13:59` 在两端均可转换;`-14:00` 和 `+15:00` 在两端均返回 `NULL`。PreparedStatement 参数路径同样接受 `+14:01`。
## 期望
时区位移应限制在 `-13:59` 到 `+14:00`,分钟字段应在 `00..59`;非法位移应返回 `NULL`,不能被 `time.Duration` 自动归一化后继续计算。
## 代码定位
`pkg/sql/plan/function/func_binary.go` 的 `convertTimezone` 仅检查小时在 `[-13, 14]`,没有检查分钟范围,也没有要求 `+14` 的分钟必须为 `00`。随后直接构造 `time.Duration(hours)*time.Hour + time.Duration(minutes)*time.Minute`,因此 `+00:60`、`+01:99` 等输入被归一化为另一个合法位移。
## 复现信息
- MatrixOne main:`ac660ae56ecd37bab3dd8c61193617a323377029`
- MySQL:8.0.46
- `time_zone = '+00:00'`
- 标量、表列和 PreparedStatement 场景重复执行 3 次,结果一致
Contributor guide
Assessment
This issue has not been assessed yet.