From ccb20070358119ed73e8d8fc9c04760ed56578b5 Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Wed, 3 Dec 2025 15:39:03 -0800 Subject: [PATCH 1/3] update or add IsNullable implementation for log and math functions --- sql/expression/function/logarithm.go | 4 ++-- sql/expression/function/math.go | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/sql/expression/function/logarithm.go b/sql/expression/function/logarithm.go index 9877a748c0..3943898ed8 100644 --- a/sql/expression/function/logarithm.go +++ b/sql/expression/function/logarithm.go @@ -112,7 +112,7 @@ func (*LogBase) CollationCoercibility(ctx *sql.Context) (collation sql.Collation // IsNullable implements the sql.Expression interface. func (l *LogBase) IsNullable() bool { - return l.base == float64(1) || l.base <= float64(0) || l.Child.IsNullable() + return true } // Eval implements the Expression interface. @@ -196,7 +196,7 @@ func (*Log) CollationCoercibility(ctx *sql.Context) (collation sql.CollationID, // IsNullable implements the Expression interface. func (l *Log) IsNullable() bool { - return l.LeftChild.IsNullable() || l.RightChild.IsNullable() + return true } // Eval implements the Expression interface. diff --git a/sql/expression/function/math.go b/sql/expression/function/math.go index 7bc92e0b44..e8c554f4dd 100644 --- a/sql/expression/function/math.go +++ b/sql/expression/function/math.go @@ -268,6 +268,11 @@ func (*Tan) CollationCoercibility(ctx *sql.Context) (collation sql.CollationID, return sql.Collation_binary, 5 } +// IsNullable implements sql.Expression +func (t *Tan) IsNullable() bool { + return true +} + // Eval implements sql.Expression func (t *Tan) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { val, err := t.EvalChild(ctx, row) @@ -325,6 +330,11 @@ func (*Asin) CollationCoercibility(ctx *sql.Context) (collation sql.CollationID, return sql.Collation_binary, 5 } +// IsNullable implements sql.Expression +func (a *Asin) IsNullable() bool { + return true +} + // Eval implements sql.Expression func (a *Asin) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { val, err := a.EvalChild(ctx, row) @@ -382,6 +392,11 @@ func (*Acos) CollationCoercibility(ctx *sql.Context) (collation sql.CollationID, return sql.Collation_binary, 5 } +// IsNullable implements sql.Expression +func (a *Acos) IsNullable() bool { + return true +} + // Eval implements sql.Expression func (a *Acos) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { val, err := a.EvalChild(ctx, row) @@ -559,6 +574,11 @@ func (*Cot) CollationCoercibility(ctx *sql.Context) (collation sql.CollationID, return sql.Collation_binary, 5 } +// IsNullable implements sql.Expression +func (c *Cot) IsNullable() bool { + return true +} + // Eval implements sql.Expression func (c *Cot) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { val, err := c.EvalChild(ctx, row) @@ -991,6 +1011,11 @@ func (e *Exp) CollationCoercibility(ctx *sql.Context) (collation sql.CollationID return sql.Collation_binary, 5 } +// IsNullable implements sql.Expression +func (e *Exp) IsNullable() bool { + return true +} + // Eval implements the Expression interface. func (e *Exp) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) { if e.Child == nil { From 997bd66892486f39a3c7b5065e5e81dd850b3cbb Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Wed, 3 Dec 2025 16:21:06 -0800 Subject: [PATCH 2/3] add tests --- enginetest/queries/script_queries.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 886da7a9c6..21212eedb9 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -13472,24 +13472,38 @@ select * from t1 except ( }, }, { - // https://github.com/dolthub/dolt/issues/10070 - // https://github.com/dolthub/dolt/issues/10092 Name: "NOT EXISTS with nullable filter", SetUpScript: []string{ "CREATE TABLE t0(c0 INT , c1 INT);", "INSERT INTO t0(c0, c1) VALUES (1, -2);", "create table t1(c0 int, primary key(c0))", "insert into t1 values (1)", + "create table t2(c0 varchar(500), primary key(c0))", + "insert into t2 values ('9')", + "create table t3(c0 boolean, primary key(c0))", + "insert into t3 values(false)", }, Assertions: []ScriptTestAssertion{ { + // https://github.com/dolthub/dolt/issues/10070 Query: `SELECT * FROM t0 WHERE NOT EXISTS (SELECT 1 FROM (SELECT 1) alias0 WHERE (CASE -1 WHEN t0.c1 THEN false END));`, Expected: []sql.Row{{1, -2}}, }, { + // https://github.com/dolthub/dolt/issues/10092 Query: "select * from t1 where not exists (select 1 from (select 1) as subquery where weekday(t1.c0))", Expected: []sql.Row{{1}}, }, + { + // https://github.com/dolthub/dolt/issues/10102 + Query: "SELECT * FROM t2 WHERE NOT EXISTS (SELECT 1 FROM (SELECT 1) AS sub0 WHERE ASIN(t2.c0));", + Expected: []sql.Row{{"9"}}, + }, + { + // https://github.com/dolthub/dolt/issues/10157 + Query: "SELECT * FROM t3 WHERE NOT EXISTS (SELECT 1 FROM (SELECT 1) AS sub0 WHERE LOG2(t3.c0));", + Expected: []sql.Row{{0}}, + }, }, }, } From 94bb13665b33b00a32b0bea896b009eb59177453 Mon Sep 17 00:00:00 2001 From: angelamayxie Date: Wed, 3 Dec 2025 16:55:18 -0800 Subject: [PATCH 3/3] add dialect tag --- enginetest/queries/script_queries.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/enginetest/queries/script_queries.go b/enginetest/queries/script_queries.go index 21212eedb9..4a93c86bb9 100644 --- a/enginetest/queries/script_queries.go +++ b/enginetest/queries/script_queries.go @@ -13498,6 +13498,8 @@ select * from t1 except ( // https://github.com/dolthub/dolt/issues/10102 Query: "SELECT * FROM t2 WHERE NOT EXISTS (SELECT 1 FROM (SELECT 1) AS sub0 WHERE ASIN(t2.c0));", Expected: []sql.Row{{"9"}}, + // Postgres does not allow varchar types as inputs for ASIN + Dialect: "mysql", }, { // https://github.com/dolthub/dolt/issues/10157