From fff327e69c313dc5b1cbae63e912c95b45ca94a8 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 31 Mar 2025 13:00:07 -0700 Subject: [PATCH 1/7] fix double negatives --- enginetest/queries/script_queries.go | 34 ++++++++++++++++++++++++++++ sql/analyzer/optimization_rules.go | 4 +++- sql/types/typecheck.go | 5 ++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index afabb2c3d8..1d1df0b5a6 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7799,6 +7799,40 @@ where }, }, }, + { + Name: "not expression optimization", + Dialect: "mysql", + SetUpScript: []string{ + "create table t (i int);", + "insert into t values (123);", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "select * from t where 1 = (not(not(i)))", + Expected: []sql.Row{ + {123}, + }, + }, + { + Query: "select * from t where true = (not(not(i)))", + Expected: []sql.Row{ + {123}, + }, + }, + { + Query: "select * from t where true = (not(not(i = 123)))", + Expected: []sql.Row{ + {123}, + }, + }, + { + Query: "select * from t where false = (not(not(i != 123)))", + Expected: []sql.Row{ + {123}, + }, + }, + }, + }, } var SpatialScriptTests = []ScriptTest{ diff --git a/sql/analyzer/optimization_rules.go b/sql/analyzer/optimization_rules.go index 71c4c5e520..329b83af1a 100644 --- a/sql/analyzer/optimization_rules.go +++ b/sql/analyzer/optimization_rules.go @@ -431,7 +431,9 @@ func pushNotFiltersHelper(e sql.Expression) (sql.Expression, error) { // NOT(NOT(c))=>c if not, _ := e.(*expression.Not); not != nil { if f, _ := not.Child.(*expression.Not); f != nil { - return pushNotFiltersHelper(f.Child) + if types.IsBoolean(f.Child.Type()) { + return pushNotFiltersHelper(f.Child) + } } } diff --git a/sql/types/typecheck.go b/sql/types/typecheck.go index b2cb7f818d..5c090d72af 100644 --- a/sql/types/typecheck.go +++ b/sql/types/typecheck.go @@ -20,6 +20,11 @@ import ( "github.com/dolthub/go-mysql-server/sql" ) +// IsBoolean checks if t is a boolean type. +func IsBoolean(t sql.Type) bool { + return t == Boolean +} + // IsBlobType checks if t is BLOB func IsBlobType(t sql.Type) bool { if t == nil { From 9bfbcaf4712018877ce34587a67954c29ce333e5 Mon Sep 17 00:00:00 2001 From: jycor Date: Mon, 31 Mar 2025 20:03:56 +0000 Subject: [PATCH 2/7] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/script_queries.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 1d1df0b5a6..122a7f75a2 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7808,25 +7808,25 @@ where }, Assertions: []ScriptTestAssertion{ { - Query: "select * from t where 1 = (not(not(i)))", + Query: "select * from t where 1 = (not(not(i)))", Expected: []sql.Row{ {123}, }, }, { - Query: "select * from t where true = (not(not(i)))", + Query: "select * from t where true = (not(not(i)))", Expected: []sql.Row{ {123}, }, }, { - Query: "select * from t where true = (not(not(i = 123)))", + Query: "select * from t where true = (not(not(i = 123)))", Expected: []sql.Row{ {123}, }, }, { - Query: "select * from t where false = (not(not(i != 123)))", + Query: "select * from t where false = (not(not(i != 123)))", Expected: []sql.Row{ {123}, }, From 9fdd50dca1d971b8f6ce39ca6a2f2ed3d71aaf00 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 31 Mar 2025 13:39:15 -0700 Subject: [PATCH 3/7] fix test --- enginetest/queries/script_queries.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 122a7f75a2..2237701910 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -5165,9 +5165,9 @@ CREATE TABLE tab3 ( }, }, { - Query: "select unix_timestamp(d), unix_timestamp(tt) from t;", + Query: "select unix_timestamp(d), substring(cast(unix_timestamp(tt) as char(128)), -6) from t;", Expected: []sql.Row{ - {"1577898000", "1743140096.123456"}, + {"1577898000", "123456"}, }, }, }, From 15fd62d0bf68065f2d1f215b192b4c9b5ff503b4 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 31 Mar 2025 14:03:33 -0700 Subject: [PATCH 4/7] int limits --- enginetest/queries/script_queries.go | 20 ++++++++++++++++++++ sql/expression/arithmetic.go | 15 ++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index afabb2c3d8..1895423da0 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7799,6 +7799,26 @@ where }, }, }, + { + Name: "negative int limits", + Dialect: "mysql", + SetUpScript: []string{ + "CREATE TABLE t(i8 tinyint, i16 smallint, i24 mediumint, i32 int, i64 bigint);", + "INSERT INTO t VALUES(-128, -32768, -8388608, -2147483648, -9223372036854775808);", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "SELECT -i8, -i16, -i24, -i32 from t;", + Expected: []sql.Row{ + {128, 32768, 8388608, 2147483648}, + }, + }, + { + Query: "SELECT -i64 from t;", + ExpectedErrStr: "BIGINT out of range for -9223372036854775808", + }, + }, + }, } var SpatialScriptTests = []ScriptTest{ diff --git a/sql/expression/arithmetic.go b/sql/expression/arithmetic.go index 4fa8e45330..da7d23b3b1 100644 --- a/sql/expression/arithmetic.go +++ b/sql/expression/arithmetic.go @@ -16,7 +16,8 @@ package expression import ( "fmt" - "reflect" + "math" +"reflect" "regexp" "strconv" "strings" @@ -704,12 +705,24 @@ func (e *UnaryMinus) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { case int: return -n, nil case int8: + if n == math.MinInt8 { + return -int16(n), nil + } return -n, nil case int16: + if n == math.MinInt16 { + return -int32(n), nil + } return -n, nil case int32: + if n == math.MinInt32 { + return -int64(n), nil + } return -n, nil case int64: + if n == math.MinInt64 { + return nil, sql.ErrValueOutOfRange.New("BIGINT", fmt.Sprintf("%d", n)) + } return -n, nil case uint: return -int(n), nil From 584a2fd26d078d3ea32724d19d1b9421451a2735 Mon Sep 17 00:00:00 2001 From: jycor Date: Mon, 31 Mar 2025 21:06:37 +0000 Subject: [PATCH 5/7] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/script_queries.go | 4 ++-- sql/expression/arithmetic.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 83938f30dd..49b742d175 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7834,7 +7834,7 @@ where }, }, { - Name: "negative int limits", + Name: "negative int limits", Dialect: "mysql", SetUpScript: []string{ "CREATE TABLE t(i8 tinyint, i16 smallint, i24 mediumint, i32 int, i64 bigint);", @@ -7842,7 +7842,7 @@ where }, Assertions: []ScriptTestAssertion{ { - Query: "SELECT -i8, -i16, -i24, -i32 from t;", + Query: "SELECT -i8, -i16, -i24, -i32 from t;", Expected: []sql.Row{ {128, 32768, 8388608, 2147483648}, }, diff --git a/sql/expression/arithmetic.go b/sql/expression/arithmetic.go index da7d23b3b1..559459a0f2 100644 --- a/sql/expression/arithmetic.go +++ b/sql/expression/arithmetic.go @@ -17,7 +17,7 @@ package expression import ( "fmt" "math" -"reflect" + "reflect" "regexp" "strconv" "strings" From 325518108c9e33142bbd7e3b24767ec4aa210b11 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 31 Mar 2025 16:33:14 -0700 Subject: [PATCH 6/7] skip --- enginetest/queries/script_queries.go | 1 + 1 file changed, 1 insertion(+) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 49b742d175..2d18c7f956 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7842,6 +7842,7 @@ where }, Assertions: []ScriptTestAssertion{ { + SkipResultCheckOnServerEngine: true, Query: "SELECT -i8, -i16, -i24, -i32 from t;", Expected: []sql.Row{ {128, 32768, 8388608, 2147483648}, From adf5746f50dfeff6d466611a3a01583f013447e3 Mon Sep 17 00:00:00 2001 From: jycor Date: Mon, 31 Mar 2025 23:34:30 +0000 Subject: [PATCH 7/7] [ga-format-pr] Run ./format_repo.sh to fix formatting --- enginetest/queries/script_queries.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 2d18c7f956..cd77a1af72 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7843,7 +7843,7 @@ where Assertions: []ScriptTestAssertion{ { SkipResultCheckOnServerEngine: true, - Query: "SELECT -i8, -i16, -i24, -i32 from t;", + Query: "SELECT -i8, -i16, -i24, -i32 from t;", Expected: []sql.Row{ {128, 32768, 8388608, 2147483648}, },