From fff327e69c313dc5b1cbae63e912c95b45ca94a8 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 31 Mar 2025 13:00:07 -0700 Subject: [PATCH 1/3] 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/3] [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/3] 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"}, }, }, },