Changeset: 85fb96cfaa03 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/85fb96cfaa03
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_select.c
        sql/test/BugTracker-2026/Tests/All
Branch: Dec2025
Log Message:

fixes for issue #7923, ie properly set the result type of the sum window 
function, similar like its done with aggr.sum.


diffs (75 lines):

diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -3599,7 +3599,7 @@ exps_inout(sql_subfunc *f, list *exps)
 void
 exps_largest_int(sql_subfunc *f, list *exps, lng cnt)
 {
-       if (!f->func->res || cnt == 0)
+       if (!f->func->res || (cnt == 0 && f->func->type == F_AGGR))
                return;
        sql_subtype *res = f->res->h->data;
        if (res->type->eclass != EC_DEC && res->type->eclass != EC_NUM)
@@ -3624,6 +3624,8 @@ exps_largest_int(sql_subfunc *f, list *e
                break;
        }
        digits += mdigits;
+       if (f->func->type == F_ANALYTIC)
+               largesttype = res->type;
        if (largesttype && digits <= largesttype->digits)
                sql_init_subtype(res, largesttype, digits, scale);
        else if (is_decimal)
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -540,7 +540,7 @@ rel_get_count(sql_rel *rel)
        return 0;
 }
 
-#define is_sum_aggr(f) (f->type == F_AGGR && strcmp(f->base.name, "sum") == 0)
+#define is_sum_aggr(f) ((f->type == F_AGGR || f->type == F_ANALYTIC) && 
strcmp(f->base.name, "sum") == 0)
 
 list *
 check_arguments_and_find_largest_any_type(mvc *sql, sql_rel *rel, list *exps, 
sql_subfunc *sf, int maybe_zero_or_one, bool internal)
@@ -621,7 +621,9 @@ check_arguments_and_find_largest_any_typ
        /* handle any extra arguments for rel_dump/analytic funcs */
        for ( ; n; n = n->next)
                append(nexps, n->data);
-       if (sf->func->fix_scale == SCALE_FIX || IS_ANALYTIC(sf->func)) {
+       if (is_sum_aggr(sf->func)) {
+               exps_largest_int(sf, nexps, rel_get_count(rel));
+       } else if (sf->func->fix_scale == SCALE_FIX || IS_ANALYTIC(sf->func)) {
                exps_scale_fix(sf, nexps, atp);
        } else if (sf->func->fix_scale == MAX_BITS) {
                exps_max_bits(sf, nexps);
@@ -634,8 +636,7 @@ check_arguments_and_find_largest_any_typ
                exps_digits_add(sf, nexps);
        } else if (sf->func->fix_scale == INOUT) {
                exps_inout(sf, nexps);
-       } else if (is_sum_aggr(sf->func))
-               exps_largest_int(sf, nexps, rel_get_count(rel));
+       }
 
        /* dirty hack */
        if (sf->func->type != F_PROC && sf->func->type != F_UNION && 
sf->func->type != F_LOADER && res) {
@@ -5262,7 +5263,7 @@ rel_rankop(sql_query *query, sql_rel **r
 
        types = exp_types(sql->sa, fargs);
        wf = bind_func_(sql, sname, aname, types, F_ANALYTIC, false, &found, 
false);
-       if (wf && !list_empty(fargs) && !(fargs = 
check_arguments_and_find_largest_any_type(sql, NULL, fargs, wf, 0, false)))
+       if (wf && !list_empty(fargs) && !(fargs = 
check_arguments_and_find_largest_any_type(sql, p, fargs, wf, 0, false)))
                wf = NULL;
        if (!wf) {
                allocator_state ta_state = ma_open(ta);
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
@@ -116,7 +116,7 @@ KNOWNFAIL?7774-insert-into-renamed-table
 7920-correlated-top-1-subquery-bug
 7921-correlated-floor-ratio-bug
 KNOWNFAIL?7922-sum-overflow-error-bug
-KNOWNFAIL?7923-sum-decimal-conversion-overflow-bug
+7923-sum-decimal-conversion-overflow-bug
 KNOWNFAIL?7924-sum-double-overflow-bug
 KNOWNFAIL?7925-inconsistent-compare-varchar-to-bte-bug
 KNOWNFAIL?7926-lag-null-changes-error-issue
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to