matrixorigin / matrixorigin/matrixone
[Bug]: WEEK and YEARWEEK reuse the first row mode for the entire batch
- Dominant language
- Go
- Stars
- 1.9k
- Forks
- 311
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 768
Description
## 现象
MatrixOne `main`(`ac660ae56ecd37bab3dd8c61193617a323377029`)的 `WEEK(date, mode)` 和 `YEARWEEK(date, mode)` 在 `mode` 来自列或行相关表达式时,只读取结果批次第一行的 mode,并将该 mode 用于所有行。
```sql
CREATE TABLE src(id INT PRIMARY KEY, d DATE, mode_value INT);
INSERT INTO src VALUES
(1,'2024-01-01',0),
(2,'2024-01-01',1),
(3,'2024-01-01',2),
(4,'2024-01-01',3),
(5,'2024-12-31',0),
(6,'2024-12-31',3);
SELECT id, mode_value, WEEK(d,mode_value), YEARWEEK(d,mode_value)
FROM src ORDER BY id;
```
MatrixOne:
```text
1 0 0 202353
2 1 0 202353
3 2 0 202353
4 3 0 202353
5 0 52 202452
6 3 52 202452
```
MySQL 8.0.46:
```text
1 0 0 202353
2 1 1 202401
3 2 53 202353
4 3 1 202401
5 0 52 202452
6 3 1 202501
```
将 mode 改成依赖 `id` 的 `CASE` 表达式也会复现;DATE 与 DATETIME 重载均受影响。分别使用常量 mode 0/3 的控制查询在两端一致。
## 期望
`mode` 是逐行表达式,应为每行读取和归一化对应值;不能将第一行的 mode 广播到整个结果批次。
## 代码定位
- `pkg/sql/plan/function/func_unary.go` 的 `DateToWeek` 和 `DatetimeToWeek` 在循环之前通过 `vector.MustFixedColWithTypeCheck[int64](ivecs[1])[0]` 读取一次 mode。
- `pkg/sql/plan/function/func_binary.go` 的 `YearWeekDate`、`YearWeekDatetime`、`YearWeekTimestamp`、`YearWeekString` 使用同样的 `[0]` 读取方式。
这些函数没有要求 mode 必须是常量,因此列向量会被静默当作标量处理。
## 复现信息
- MatrixOne main:`ac660ae56ecd37bab3dd8c61193617a323377029`
- MySQL:8.0.46
- 列、CASE、DATE、DATETIME 和常量控制组重复执行 3 次,结果一致
Contributor guide
Assessment
This issue has not been assessed yet.