From f470c3bee1f815f24d1f8604d29995f92c27a4b3 Mon Sep 17 00:00:00 2001 From: James Cor Date: Tue, 9 Jan 2024 16:47:49 -0800 Subject: [PATCH 1/5] fix decimal out of bounds in case statement --- enginetest/queries/queries.go | 6 ++++++ sql/expression/case.go | 12 ++++++++---- sql/expression/div.go | 9 +++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/enginetest/queries/queries.go b/enginetest/queries/queries.go index 39b6bbb215..09c36f70d9 100644 --- a/enginetest/queries/queries.go +++ b/enginetest/queries/queries.go @@ -8737,6 +8737,12 @@ from typestable`, {3, "third row"}, }, }, + { + Query: "select case when 1 then 59 + 81 / 1 end;", + Expected: []sql.Row{ + {"140.0000"}, + }, + }, } var KeylessQueries = []QueryTest{ diff --git a/sql/expression/case.go b/sql/expression/case.go index 1e5f69db00..06987185bf 100644 --- a/sql/expression/case.go +++ b/sql/expression/case.go @@ -180,8 +180,10 @@ func (c *Case) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return nil, err } - ret, _, err := t.Convert(bval) - return ret, err + if ret, _, err := t.Convert(bval); err == nil { + return ret, nil + } + return bval, nil } } @@ -190,8 +192,10 @@ func (c *Case) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return nil, err } - ret, _, err := t.Convert(val) - return ret, err + if ret, _, err := t.Convert(val); err == nil { + return ret, nil + } + return val, nil } diff --git a/sql/expression/div.go b/sql/expression/div.go index 3a6d698667..eedf7d35f3 100644 --- a/sql/expression/div.go +++ b/sql/expression/div.go @@ -388,6 +388,9 @@ func getFloatOrMaxDecimalType(e sql.Expression, treatIntsAsFloats bool) sql.Type if s > maxFrac { maxFrac = s } + if maxWhole == 2 { + print() + } } case *Convert: if c.cachedDecimalType != nil { @@ -398,6 +401,9 @@ func getFloatOrMaxDecimalType(e sql.Expression, treatIntsAsFloats bool) sql.Type if s > maxFrac { maxFrac = s } + if maxWhole == 2 { + print() + } } case *Literal: if types.IsNumber(c.Type()) { @@ -412,6 +418,9 @@ func getFloatOrMaxDecimalType(e sql.Expression, treatIntsAsFloats bool) sql.Type } } } + if maxWhole == 2 { + print() + } } return true }) From 60bac9449f70611d7472aab68a8620e132d7b199 Mon Sep 17 00:00:00 2001 From: James Cor Date: Tue, 9 Jan 2024 16:49:30 -0800 Subject: [PATCH 2/5] remove debug code --- sql/expression/div.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/sql/expression/div.go b/sql/expression/div.go index eedf7d35f3..3a6d698667 100644 --- a/sql/expression/div.go +++ b/sql/expression/div.go @@ -388,9 +388,6 @@ func getFloatOrMaxDecimalType(e sql.Expression, treatIntsAsFloats bool) sql.Type if s > maxFrac { maxFrac = s } - if maxWhole == 2 { - print() - } } case *Convert: if c.cachedDecimalType != nil { @@ -401,9 +398,6 @@ func getFloatOrMaxDecimalType(e sql.Expression, treatIntsAsFloats bool) sql.Type if s > maxFrac { maxFrac = s } - if maxWhole == 2 { - print() - } } case *Literal: if types.IsNumber(c.Type()) { @@ -418,9 +412,6 @@ func getFloatOrMaxDecimalType(e sql.Expression, treatIntsAsFloats bool) sql.Type } } } - if maxWhole == 2 { - print() - } } return true }) From 8cc12d97a510c928b729d76ec3e26cf2347e9140 Mon Sep 17 00:00:00 2001 From: James Cor Date: Wed, 10 Jan 2024 11:09:09 -0800 Subject: [PATCH 3/5] adding comment --- sql/expression/case.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sql/expression/case.go b/sql/expression/case.go index 06987185bf..ea43a6f647 100644 --- a/sql/expression/case.go +++ b/sql/expression/case.go @@ -180,6 +180,8 @@ func (c *Case) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return nil, err } + // When unable to convert to the type of the case, return the original value + // A common error here is "Out of bounds value for decimal type" if ret, _, err := t.Convert(bval); err == nil { return ret, nil } @@ -192,6 +194,8 @@ func (c *Case) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if err != nil { return nil, err } + // When unable to convert to the type of the case, return the original value + // A common error here is "Out of bounds value for decimal type" if ret, _, err := t.Convert(val); err == nil { return ret, nil } From 64b6bad70bc6d5e70241b91be6b5b06575b8a630 Mon Sep 17 00:00:00 2001 From: James Cor Date: Wed, 10 Jan 2024 11:23:57 -0800 Subject: [PATCH 4/5] some tests --- enginetest/queries/queries.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/enginetest/queries/queries.go b/enginetest/queries/queries.go index 09c36f70d9..496d36f8ee 100644 --- a/enginetest/queries/queries.go +++ b/enginetest/queries/queries.go @@ -8743,6 +8743,19 @@ from typestable`, {"140.0000"}, }, }, + { + Query: "select case 1 when 2 then null else (6 * 2) / 1 end;", + Expected: []sql.Row{ + {"12.0000"}, + }, + }, + { + Query: "select case 1 when 1 then (6 * 2) / 1 when 2 then null else null end;", + Expected: []sql.Row{ + {"12.0000"}, + }, + }, + } var KeylessQueries = []QueryTest{ From aa54bb386b30f51fc18fd01fa41083cdbb96024b Mon Sep 17 00:00:00 2001 From: jycor Date: Wed, 10 Jan 2024 19:25:20 +0000 Subject: [PATCH 5/5] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/queries.go | 1 - 1 file changed, 1 deletion(-) diff --git a/enginetest/queries/queries.go b/enginetest/queries/queries.go index 496d36f8ee..e4e8d2e605 100644 --- a/enginetest/queries/queries.go +++ b/enginetest/queries/queries.go @@ -8755,7 +8755,6 @@ from typestable`, {"12.0000"}, }, }, - } var KeylessQueries = []QueryTest{