From f79aac228932bb9b4e72e8500871552c53d28929 Mon Sep 17 00:00:00 2001 From: Yaksh Bariya Date: Wed, 21 May 2025 11:39:39 +0530 Subject: [PATCH 1/2] fix builds for platforms with 32-bit integer size --- sql/expression/function/extract.go | 18 +++++++++--------- sql/rowexec/proc.go | 4 ++-- sql/types/geometry.go | 2 +- sql/types/number.go | 28 ++++++++++++++-------------- sql/types/strings.go | 3 ++- 5 files changed, 28 insertions(+), 27 deletions(-) diff --git a/sql/expression/function/extract.go b/sql/expression/function/extract.go index 24c6d65d31..951fdc301a 100644 --- a/sql/expression/function/extract.go +++ b/sql/expression/function/extract.go @@ -169,11 +169,11 @@ func (td *Extract) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { ss := dateTime.Second() return dd + hh + mm + ss, nil case "DAY_MICROSECOND": - dd := dateTime.Day() * 1_00_00_00_000000 - hh := dateTime.Hour() * 1_00_00_000000 - mm := dateTime.Minute() * 1_00_000000 - ss := dateTime.Second() * 1_000000 - mmmmmm := dateTime.Nanosecond() / 1000 + dd := uint64(dateTime.Day()) * 1_00_00_00_000000 + hh := uint64(dateTime.Hour()) * 1_00_00_000000 + mm := uint64(dateTime.Minute()) * 1_00_000000 + ss := uint64(dateTime.Second()) * 1_000000 + mmmmmm := uint64(dateTime.Nanosecond()) / 1000 return dd + hh + mm + ss + mmmmmm, nil case "HOUR_MINUTE": hh := dateTime.Hour() * 1_00 @@ -185,10 +185,10 @@ func (td *Extract) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { ss := dateTime.Second() return hh + mm + ss, nil case "HOUR_MICROSECOND": - hh := dateTime.Hour() * 1_00_00_000000 - mm := dateTime.Minute() * 1_00_000000 - ss := dateTime.Second() * 1_000000 - mmmmmm := dateTime.Nanosecond() / 1000 + hh := uint64(dateTime.Hour()) * 1_00_00_000000 + mm := uint64(dateTime.Minute()) * 1_00_000000 + ss := uint64(dateTime.Second()) * 1_000000 + mmmmmm := uint64(dateTime.Nanosecond()) / 1000 return hh + mm + ss + mmmmmm, nil case "MINUTE_SECOND": mm := dateTime.Minute() * 1_00 diff --git a/sql/rowexec/proc.go b/sql/rowexec/proc.go index 35af6c65e8..b78953d739 100644 --- a/sql/rowexec/proc.go +++ b/sql/rowexec/proc.go @@ -304,9 +304,9 @@ func (b *BaseBuilder) buildLoop(ctx *sql.Context, n *plan.Loop, row sql.Row) (sq selectSeen := false // It's technically valid to make an infinite loop, but we don't want to actually allow that - const maxIterationCount = 10_000_000_000 + const maxIterationCount uint64 = 10_000_000_000 - for loopIteration := 0; loopIteration <= maxIterationCount; loopIteration++ { + for loopIteration := uint64(0); loopIteration <= maxIterationCount; loopIteration++ { if loopIteration >= maxIterationCount { return nil, fmt.Errorf("infinite LOOP detected") } diff --git a/sql/types/geometry.go b/sql/types/geometry.go index 8a429ce480..7c750a506c 100644 --- a/sql/types/geometry.go +++ b/sql/types/geometry.go @@ -546,7 +546,7 @@ func (t GeometryType) MatchSRID(v interface{}) error { } func ValidateSRID(srid int, funcName string) error { - if srid < 0 || srid > math.MaxUint32 { + if srid < 0 || int64(srid) > int64(math.MaxUint32) { return sql.ErrInvalidSRID.New(funcName) } if _, ok := SupportedSRIDs[uint32(srid)]; !ok { diff --git a/sql/types/number.go b/sql/types/number.go index c346efbfc9..bffaf2f759 100644 --- a/sql/types/number.go +++ b/sql/types/number.go @@ -1114,27 +1114,27 @@ func convertToUint64(t NumberTypeImpl_, v interface{}) (uint64, sql.ConvertInRan return uint64(v.UTC().Unix()), sql.InRange, nil case int: if v < 0 { - return uint64(math.MaxUint64 - uint(-v-1)), sql.OutOfRange, nil + return uint64(math.MaxUint64 - uint64(-v-1)), sql.OutOfRange, nil } return uint64(v), sql.InRange, nil case int8: if v < 0 { - return uint64(math.MaxUint64 - uint(-v-1)), sql.OutOfRange, nil + return uint64(math.MaxUint64 - uint64(-v-1)), sql.OutOfRange, nil } return uint64(v), sql.InRange, nil case int16: if v < 0 { - return uint64(math.MaxUint64 - uint(-v-1)), sql.OutOfRange, nil + return uint64(math.MaxUint64 - uint64(-v-1)), sql.OutOfRange, nil } return uint64(v), sql.InRange, nil case int32: if v < 0 { - return uint64(math.MaxUint64 - uint(-v-1)), sql.OutOfRange, nil + return uint64(math.MaxUint64 - uint64(-v-1)), sql.OutOfRange, nil } return uint64(v), sql.InRange, nil case int64: if v < 0 { - return uint64(math.MaxUint64 - uint(-v-1)), sql.OutOfRange, nil + return uint64(math.MaxUint64 - uint64(-v-1)), sql.OutOfRange, nil } return uint64(v), sql.InRange, nil case uint: @@ -1204,35 +1204,35 @@ func convertToUint32(t NumberTypeImpl_, v interface{}) (uint32, sql.ConvertInRan switch v := v.(type) { case int: if v < 0 { - return uint32(math.MaxUint32 - uint(-v-1)), sql.OutOfRange, nil - } else if v > math.MaxUint32 { + return uint32(math.MaxUint32 - uint64(-v-1)), sql.OutOfRange, nil + } else if int64(v) > int64(math.MaxUint32) { return uint32(math.MaxUint32), sql.OutOfRange, nil } return uint32(v), sql.InRange, nil case int8: if v < 0 { - return uint32(math.MaxUint32 - uint(-v-1)), sql.OutOfRange, nil - } else if int(v) > math.MaxUint32 { + return uint32(math.MaxUint32 - uint64(-v-1)), sql.OutOfRange, nil + } else if int64(v) > int64(math.MaxUint32) { return uint32(math.MaxUint32), sql.OutOfRange, nil } return uint32(v), sql.InRange, nil case int16: if v < 0 { - return uint32(math.MaxUint32 - uint(-v-1)), sql.OutOfRange, nil - } else if int(v) > math.MaxUint32 { + return uint32(math.MaxUint32 - uint64(-v-1)), sql.OutOfRange, nil + } else if int64(v) > int64(math.MaxUint32) { return uint32(math.MaxUint32), sql.OutOfRange, nil } return uint32(v), sql.InRange, nil case int32: if v < 0 { - return uint32(math.MaxUint32 - uint(-v-1)), sql.OutOfRange, nil - } else if int(v) > math.MaxUint32 { + return uint32(math.MaxUint32 - uint64(-v-1)), sql.OutOfRange, nil + } else if int64(v) > int64(math.MaxUint32) { return uint32(math.MaxUint32), sql.OutOfRange, nil } return uint32(v), sql.InRange, nil case int64: if v < 0 { - return uint32(math.MaxUint32 - uint(-v-1)), sql.OutOfRange, nil + return uint32(math.MaxUint32 - uint64(-v-1)), sql.OutOfRange, nil } else if v > math.MaxUint32 { return uint32(math.MaxUint32), sql.OutOfRange, nil } diff --git a/sql/types/strings.go b/sql/types/strings.go index be4119680a..f45ea98734 100644 --- a/sql/types/strings.go +++ b/sql/types/strings.go @@ -18,6 +18,7 @@ import ( "bytes" "context" "fmt" + "math" "reflect" "strconv" strings2 "strings" @@ -41,7 +42,7 @@ const ( TinyTextBlobMax = charBinaryMax TextBlobMax = varcharVarbinaryMax MediumTextBlobMax = 16_777_215 - LongTextBlobMax = int64(4_294_967_295) + LongTextBlobMax = int64(math.MaxInt32) ) var ( From 6742fe139344c55c3fb3390a6e734036281c60ea Mon Sep 17 00:00:00 2001 From: Yaksh Bariya Date: Wed, 21 May 2025 11:54:40 +0530 Subject: [PATCH 2/2] fix tests as well --- sql/expression/function/extract_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/expression/function/extract_test.go b/sql/expression/function/extract_test.go index d0a6b5c6d4..88dfa52bd8 100644 --- a/sql/expression/function/extract_test.go +++ b/sql/expression/function/extract_test.go @@ -132,7 +132,7 @@ func TestExtract(t *testing.T) { name: "get day_microsecond", unit: "DAY_MICROSECOND", dateTime: "2023-11-12 11:22:33.445566", - expected: 12112233445566, + expected: uint64(12112233445566), }, { name: "get hour_minute", @@ -150,7 +150,7 @@ func TestExtract(t *testing.T) { name: "get hour_microsecond", unit: "HOUR_MICROSECOND", dateTime: "2023-11-12 11:22:33.445566", - expected: 112233445566, + expected: uint64(112233445566), }, { name: "get minute_second",