diff --git a/expression/builtin_control_vec_generated.go b/expression/builtin_control_vec_generated.go index 22addcc9f19b3..0076a1e4b8de2 100644 --- a/expression/builtin_control_vec_generated.go +++ b/expression/builtin_control_vec_generated.go @@ -801,6 +801,7 @@ func (b *builtinCaseWhenJSONSig) vectorized() bool { func (b *builtinIfNullIntSig) fallbackEvalInt(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeInt64(n, false) x := result.Int64s() for i := 0; i < n; i++ { res, isNull, err := b.evalInt(input.GetRow(i)) @@ -855,6 +856,7 @@ func (b *builtinIfNullIntSig) vectorized() bool { func (b *builtinIfNullRealSig) fallbackEvalReal(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeFloat64(n, false) x := result.Float64s() for i := 0; i < n; i++ { res, isNull, err := b.evalReal(input.GetRow(i)) @@ -909,6 +911,7 @@ func (b *builtinIfNullRealSig) vectorized() bool { func (b *builtinIfNullDecimalSig) fallbackEvalDecimal(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeDecimal(n, false) x := result.Decimals() for i := 0; i < n; i++ { res, isNull, err := b.evalDecimal(input.GetRow(i)) @@ -1023,6 +1026,7 @@ func (b *builtinIfNullStringSig) vectorized() bool { func (b *builtinIfNullTimeSig) fallbackEvalTime(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeTime(n, false) x := result.Times() for i := 0; i < n; i++ { res, isNull, err := b.evalTime(input.GetRow(i)) @@ -1077,6 +1081,7 @@ func (b *builtinIfNullTimeSig) vectorized() bool { func (b *builtinIfNullDurationSig) fallbackEvalDuration(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeGoDuration(n, false) x := result.GoDurations() for i := 0; i < n; i++ { res, isNull, err := b.evalDuration(input.GetRow(i)) @@ -1191,6 +1196,7 @@ func (b *builtinIfNullJSONSig) vectorized() bool { func (b *builtinIfIntSig) fallbackEvalInt(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeInt64(n, false) x := result.Int64s() for i := 0; i < n; i++ { res, isNull, err := b.evalInt(input.GetRow(i)) @@ -1269,6 +1275,7 @@ func (b *builtinIfIntSig) vectorized() bool { func (b *builtinIfRealSig) fallbackEvalReal(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeFloat64(n, false) x := result.Float64s() for i := 0; i < n; i++ { res, isNull, err := b.evalReal(input.GetRow(i)) @@ -1347,6 +1354,7 @@ func (b *builtinIfRealSig) vectorized() bool { func (b *builtinIfDecimalSig) fallbackEvalDecimal(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeDecimal(n, false) x := result.Decimals() for i := 0; i < n; i++ { res, isNull, err := b.evalDecimal(input.GetRow(i)) @@ -1509,6 +1517,7 @@ func (b *builtinIfStringSig) vectorized() bool { func (b *builtinIfTimeSig) fallbackEvalTime(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeTime(n, false) x := result.Times() for i := 0; i < n; i++ { res, isNull, err := b.evalTime(input.GetRow(i)) @@ -1587,6 +1596,7 @@ func (b *builtinIfTimeSig) vectorized() bool { func (b *builtinIfDurationSig) fallbackEvalDuration(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() + result.ResizeGoDuration(n, false) x := result.GoDurations() for i := 0; i < n; i++ { res, isNull, err := b.evalDuration(input.GetRow(i)) diff --git a/expression/generator/control_vec.go b/expression/generator/control_vec.go index 99e77fd4052b8..fe78bd38a9b5c 100644 --- a/expression/generator/control_vec.go +++ b/expression/generator/control_vec.go @@ -227,6 +227,7 @@ var builtinIfNullVec = template.Must(template.New("builtinIfNullVec").Parse(` func (b *builtinIfNull{{ .TypeName }}Sig) fallbackEval{{ .TypeName }}(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() {{- if .Fixed }} + result.Resize{{ .TypeNameInColumn }}(n, false) x := result.{{ .TypeNameInColumn }}s() for i := 0; i < n; i++ { res, isNull, err := b.eval{{ .TypeName }}(input.GetRow(i)) @@ -342,6 +343,7 @@ var builtinIfVec = template.Must(template.New("builtinIfVec").Parse(` func (b *builtinIf{{ .TypeName }}Sig) fallbackEval{{ .TypeName }}(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() {{- if .Fixed }} + result.Resize{{ .TypeNameInColumn }}(n, false) x := result.{{ .TypeNameInColumn }}s() for i := 0; i < n; i++ { res, isNull, err := b.eval{{ .TypeName }}(input.GetRow(i)) diff --git a/expression/integration_test.go b/expression/integration_test.go index 0e00f7ced43ec..31ea992f37e25 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -9681,6 +9681,19 @@ func (s *testIntegrationSuite) TestRedundantColumnResolve(c *C) { tk.MustQuery("select t1.a, t2.a from t1 natural join t2").Check(testkit.Rows("1 1")) } +func (s *testIntegrationSuite) TestIssue37414(c *C) { + defer s.cleanEnv(c) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists foo") + tk.MustExec("drop table if exists bar") + tk.MustExec("create table foo(a decimal(65,0));") + tk.MustExec("create table bar(a decimal(65,0), b decimal(65,0));") + tk.MustExec("insert into bar values(0,0),(1,1),(2,2);") + tk.MustExec("insert into foo select if(b>0, if(a/b>1, 1, 2), null) from bar;") +} + func (s *testIntegrationSuite) TestControlFunctionWithEnumOrSet(c *C) { defer s.cleanEnv(c)