From fff327e69c313dc5b1cbae63e912c95b45ca94a8 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 31 Mar 2025 13:00:07 -0700 Subject: [PATCH 1/9] 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/9] [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/9] 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/9] 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/9] [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 8fbe44e8b92d4c25c695f491cca798be598e0675 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 31 Mar 2025 15:53:12 -0700 Subject: [PATCH 6/9] fixing not equals --- enginetest/queries/script_queries.go | 6 ++++++ sql/analyzer/optimization_rules.go | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 83938f30dd..227715d650 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7831,6 +7831,12 @@ where {123}, }, }, + { + Query: "select * from t where i != (false or i);", + Expected: []sql.Row{ + {123}, + }, + }, }, }, { diff --git a/sql/analyzer/optimization_rules.go b/sql/analyzer/optimization_rules.go index 329b83af1a..87472f3eae 100644 --- a/sql/analyzer/optimization_rules.go +++ b/sql/analyzer/optimization_rules.go @@ -246,11 +246,11 @@ func simplifyFilters(ctx *sql.Context, a *Analyzer, node sql.Node, scope *plan.S return e.RightChild, transform.NewTree, nil } - if isFalse(e.LeftChild) { + if isFalse(e.LeftChild) && types.IsBoolean(e.RightChild.Type()) { return e.RightChild, transform.NewTree, nil } - if isFalse(e.RightChild) { + if isFalse(e.RightChild) && types.IsBoolean(e.LeftChild.Type()) { return e.LeftChild, transform.NewTree, nil } From c4782c93c315edf93c466bb9d9f463de848fcd2a Mon Sep 17 00:00:00 2001 From: jycor Date: Mon, 31 Mar 2025 22:58:17 +0000 Subject: [PATCH 7/9] [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 931e2ad662..c597e3b9c3 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7832,7 +7832,7 @@ where }, }, { - Query: "select * from t where i != (false or i);", + Query: "select * from t where i != (false or i);", Expected: []sql.Row{ {123}, }, From 325518108c9e33142bbd7e3b24767ec4aa210b11 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 31 Mar 2025 16:33:14 -0700 Subject: [PATCH 8/9] 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 8999d04458fcee28d6d5fde37276271c6429660d Mon Sep 17 00:00:00 2001 From: jycor Date: Tue, 1 Apr 2025 18:19:33 +0000 Subject: [PATCH 9/9] [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 1d98ec196f..ce7b74f832 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -7849,7 +7849,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}, },