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]