Changeset: 1982862ae69b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1982862ae69b
Modified Files:
        sql/server/rel_statistics.c
        sql/test/BugTracker-2026/Tests/8001-select-count-where-having-bug.test
        sql/test/BugTracker-2026/Tests/All
        sql/test/rel-optimizers/Tests/const-aggr-elim.test
Branch: default
Log Message:

removed over eager optimization, even if aggregates skip nils and input has no 
nil, expected count is > 0, aggregate could still return NULL (on empty inputs)
Solves issue # 8001


diffs (79 lines):

diff --git a/sql/server/rel_statistics.c b/sql/server/rel_statistics.c
--- a/sql/server/rel_statistics.c
+++ b/sql/server/rel_statistics.c
@@ -465,7 +465,6 @@ rel_propagate_statistics(visitor *v, sql
        }
        case e_aggr:
        case e_func: {
-               BUN lv;
                sql_subfunc *f = e->f;
 
                if (!f->func->s) {
@@ -482,10 +481,6 @@ rel_propagate_statistics(visitor *v, sql
                        if (look)
                                look(sql, e);
                }
-               /* for global aggregates with no semantics, if the left 
relation has values, then the output won't be NULL */
-               if (!is_semantics(e) && e->l && !have_nil(e->l) &&
-                       (e->type != e_aggr || (is_groupby(rel->op) && 
list_length(rel->r)) || ((lv = get_rel_count(rel->l)) != BUN_NONE && lv > 0)))
-                       set_has_no_nil(e);
                /* set properties for global aggregates */
                if (e->type == e_aggr && is_groupby(rel->op) && 
list_empty(rel->r)) {
                        if (!find_prop(e->p, PROP_NUNIQUES)) {
diff --git 
a/sql/test/BugTracker-2026/Tests/8001-select-count-where-having-bug.test 
b/sql/test/BugTracker-2026/Tests/8001-select-count-where-having-bug.test
--- a/sql/test/BugTracker-2026/Tests/8001-select-count-where-having-bug.test
+++ b/sql/test/BugTracker-2026/Tests/8001-select-count-where-having-bug.test
@@ -9,17 +9,16 @@ INSERT INTO t4 VALUES
   (10, NULL),
   (20, NULL)
 
--- Direct query over the empty filtered input.
+-- Direct query over the empty filtered input, avg(c1)==NULL and NULL <> 0.03 
=> NULL.
 query I nosort
 SELECT COUNT(*) AS cnt
 FROM t4
 WHERE c10 IS NOT NULL
 HAVING AVG(c1) <> 0.03
 ----
-0
 
 -- CTAS form.
-statement ok rowcount 0
+statement ok
 CREATE TABLE tt AS
 SELECT *
 FROM t4
@@ -30,7 +29,6 @@ SELECT COUNT(*) AS cnt
 FROM tt
 HAVING AVG(c1) <> 0.03
 ----
-0
 
 statement ok
 DROP TABLE IF EXISTS tt
diff --git a/sql/test/BugTracker-2026/Tests/All 
b/sql/test/BugTracker-2026/Tests/All
--- a/sql/test/BugTracker-2026/Tests/All
+++ b/sql/test/BugTracker-2026/Tests/All
@@ -183,7 +183,7 @@ KNOWNFAIL?7997-recursive-cte-number-over
 KNOWNFAIL?7998-scalar-subquery-error-msg-improvement
 7999-not-not-expr-bug
 KNOWNFAIL?8000-select-count-distinct-assert-failure
-KNOWNFAIL?8001-select-count-where-having-bug
+8001-select-count-where-having-bug
 KNOWNFAIL?8002-schema-renaming-makes-seq-invalid-bug
 KNOWNFAIL?8003-windowed-group_concat-ignores-orderby-bug
 KNOWNFAIL?8004-nth_value-windowfunction-bug
diff --git a/sql/test/rel-optimizers/Tests/const-aggr-elim.test 
b/sql/test/rel-optimizers/Tests/const-aggr-elim.test
--- a/sql/test/rel-optimizers/Tests/const-aggr-elim.test
+++ b/sql/test/rel-optimizers/Tests/const-aggr-elim.test
@@ -24,8 +24,8 @@ project (
 | group by (
 | | table ("sys"."generate_series"(int(31) "0", int(4) "10", int(1) "1"), 
 | | ) [ "%1"."value" ]
-| ) [  ] [ "sys"."avg" no nil (tinyint(2) "3") NOT NULL UNIQUE as "%2"."%2" ]
-) [ "%2"."%2" NOT NULL UNIQUE ]
+| ) [  ] [ "sys"."avg" no nil (tinyint(2) "3") UNIQUE as "%2"."%2" ]
+) [ "%2"."%2" UNIQUE ]
 
 query R rowsort
 SELECT avg(3) FROM baz GROUP BY b
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to