diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 7cb8945ebd..83fb585946 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -14636,6 +14636,27 @@ select * from t1 except ( }, }, }, + { + // https://github.com/dolthub/dolt/issues/10243 + Dialect: "mysql", + Name: "OR filters are simplified to correct type", + SetUpScript: []string{ + "create table t0(c1 boolean)", + "insert into t0 values (true)", + "create table t1(c1 int)", + "insert into t1 values (2)", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "select 1 from t0 where (19 or 's') != (7 != t0.c1);", + Expected: []sql.Row{}, + }, + { + Query: "SELECT * FROM t1 WHERE NOT EXISTS (SELECT 1 FROM t0 WHERE ((((19)OR('s')))!=(((7)!=(t0.c1)))));", + Expected: []sql.Row{{2}}, + }, + }, + }, } var SpatialScriptTests = []ScriptTest{ diff --git a/sql/analyzer/optimization_rules.go b/sql/analyzer/optimization_rules.go index 11e509e591..aa26cd6aa0 100644 --- a/sql/analyzer/optimization_rules.go +++ b/sql/analyzer/optimization_rules.go @@ -238,11 +238,11 @@ func simplifyFilters(ctx *sql.Context, a *Analyzer, node sql.Node, scope *plan.S ), transform.NewTree, nil case *expression.Or: if isTrue(ctx, e.LeftChild) { - return e.LeftChild, transform.NewTree, nil + return expression.NewLiteral(true, types.Boolean), transform.NewTree, nil } if isTrue(ctx, e.RightChild) { - return e.RightChild, transform.NewTree, nil + return expression.NewLiteral(true, types.Boolean), transform.NewTree, nil } if isFalse(ctx, e.LeftChild) && types.IsBoolean(e.RightChild.Type()) { @@ -256,11 +256,11 @@ func simplifyFilters(ctx *sql.Context, a *Analyzer, node sql.Node, scope *plan.S return e, transform.SameTree, nil case *expression.And: if isFalse(ctx, e.LeftChild) { - return e.LeftChild, transform.NewTree, nil + return expression.NewLiteral(false, types.Boolean), transform.NewTree, nil } if isFalse(ctx, e.RightChild) { - return e.RightChild, transform.NewTree, nil + return expression.NewLiteral(false, types.Boolean), transform.NewTree, nil } if isTrue(ctx, e.LeftChild) && types.IsBoolean(e.RightChild.Type()) {