Skip to content

Commit 889d1a2

Browse files
authored
expression: fix WEEK NULL mode handling (#68440)
close #59444
1 parent 1aa1a3c commit 889d1a2

5 files changed

Lines changed: 23 additions & 4 deletions

File tree

pkg/expression/builtin_time.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1463,9 +1463,13 @@ func (b *builtinWeekWithModeSig) evalInt(ctx EvalContext, row chunk.Row) (int64,
14631463
}
14641464

14651465
mode, isNull, err := b.args[1].EvalInt(ctx, row)
1466-
if isNull || err != nil {
1466+
if err != nil {
14671467
return 0, isNull, err
14681468
}
1469+
if isNull {
1470+
// MySQL treats a NULL week mode as mode 0 for WEEK(date, mode).
1471+
mode = 0
1472+
}
14691473

14701474
week := date.Week(int(mode))
14711475
return int64(week), false, nil

pkg/expression/builtin_time_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2054,6 +2054,16 @@ func TestWeek(t *testing.T) {
20542054
require.NoError(t, err)
20552055
require.Equal(t, test.expect, result.GetInt64())
20562056
}
2057+
2058+
f, err := fc.getFunction(ctx, datumsToConstants([]types.Datum{
2059+
types.NewStringDatum("2023-01-01"),
2060+
types.NewDatum(nil),
2061+
}))
2062+
require.NoError(t, err)
2063+
result, err := evalBuiltinFunc(f, ctx, chunk.Row{})
2064+
require.NoError(t, err)
2065+
require.False(t, result.IsNull())
2066+
require.Equal(t, int64(1), result.GetInt64())
20572067
}
20582068

20592069
func TestWeekWithoutModeSig(t *testing.T) {

pkg/expression/builtin_time_vec.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,11 +1027,11 @@ func (b *builtinWeekWithModeSig) vecEvalInt(ctx EvalContext, input *chunk.Chunk,
10271027
result.SetNull(i, true)
10281028
continue
10291029
}
1030+
mode := int(ms[i])
10301031
if buf2.IsNull(i) {
1031-
result.SetNull(i, true)
1032-
continue
1032+
// MySQL treats a NULL week mode as mode 0 for WEEK(date, mode).
1033+
mode = 0
10331034
}
1034-
mode := int(ms[i])
10351035
week := date.Week(mode)
10361036
i64s[i] = int64(week)
10371037
}

pkg/expression/builtin_time_vec_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,8 @@ var vecBuiltinTimeCases = map[string][]vecExprBenchCase{
392392
ast.Week: {
393393
{retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDatetime}},
394394
{retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDatetime, types.ETInt}},
395+
{retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDatetime, types.ETInt},
396+
constants: []*Constant{nil, {Value: types.NewDatum(nil), RetType: types.NewFieldType(mysql.TypeLonglong)}}},
395397
},
396398
ast.Month: {
397399
{retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDatetime}},

pkg/expression/integration_test/integration_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2934,6 +2934,9 @@ func TestTimeBuiltin(t *testing.T) {
29342934
result.Check(testkit.Rows("7 7 8 7 8 8"))
29352935
result = tk.MustQuery(`select week("2008-02-20", 5), week("2008-02-20", 6), week("2009-02-20", 7), week("2008-02-20", 8), week("2008-02-20", 9);`)
29362936
result.Check(testkit.Rows("7 8 7 7 8"))
2937+
result = tk.MustQuery(`select week("2023-01-01", null);`)
2938+
result.Check(testkit.Rows("1"))
2939+
tk.MustQuery("show warnings").Check(testkit.Rows())
29372940
result = tk.MustQuery(`select week("aa", 1), week(null, 2), week(11, 2), week(12.99, 2);`)
29382941
result.Check(testkit.Rows("<nil> <nil> <nil> <nil>"))
29392942
result = tk.MustQuery(`select week("aa"), week(null), week(11), week(12.99);`)

0 commit comments

Comments
 (0)