matrixorigin / matrixorigin/matrixone

[Bug]: WEEK and YEARWEEK reuse the first row mode for the entire batch

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

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.