matrixorigin / matrixorigin/matrixone

[Compatibility]: CONVERT_TZ accepts and normalizes invalid time-zone offsets

Open
#28,565 0 comments 0 reactions 1 assignee Claimed by @jiangxinmeng1 View on GitHub
area/compatibility kind/bug needs-triage
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.