Changeset: 3c3aad627120 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3c3aad627120
Modified Files:
gdk/gdk_analytic_func.c
gdk/gdk_analytic_statistics.c
Branch: Dec2025
Log Message:
make sure the segment tree implementation of the window functions starts a 0
(fixes issue # 7815)
diffs (146 lines):
diff --git a/gdk/gdk_analytic_func.c b/gdk/gdk_analytic_func.c
--- a/gdk/gdk_analytic_func.c
+++ b/gdk/gdk_analytic_func.c
@@ -1027,7 +1027,8 @@ GDKanalyticallead(BAT *b, BAT *p, BUN le
goto cleanup; \
populate_segment_tree(TPE, ncount,
INIT_AGGREGATE_MIN_MAX_FIXED, COMPUTE_LEVEL0_MIN_MAX_FIXED,
COMPUTE_LEVELN_MIN_MAX_FIXED, TPE, MIN_MAX, NOTHING); \
for (; k < i; k++) \
- compute_on_segment_tree(TPE, start[k] - j, end[k] - j,
INIT_AGGREGATE_MIN_MAX_FIXED, COMPUTE_LEVELN_MIN_MAX_FIXED,
FINALIZE_AGGREGATE_MIN_MAX_FIXED, TPE, MIN_MAX, NOTHING); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(TPE, start[k] - j,
end[k] - j, INIT_AGGREGATE_MIN_MAX_FIXED, COMPUTE_LEVELN_MIN_MAX_FIXED,
FINALIZE_AGGREGATE_MIN_MAX_FIXED, TPE, MIN_MAX, NOTHING); \
j = k; \
} while (0)
@@ -1215,7 +1216,8 @@ GDKanalyticallead(BAT *b, BAT *p, BUN le
goto cleanup; \
populate_segment_tree(void*, ncount,
INIT_AGGREGATE_MIN_MAX_OTHERS, COMPUTE_LEVEL0_MIN_MAX_OTHERS,
COMPUTE_LEVELN_MIN_MAX_OTHERS, GT_LT, NOTHING, NOTHING); \
for (; k < i; k++) \
- compute_on_segment_tree(void*, start[k] - j, end[k] -
j, INIT_AGGREGATE_MIN_MAX_OTHERS, COMPUTE_LEVELN_MIN_MAX_OTHERS,
FINALIZE_AGGREGATE_MIN_MAX_OTHERS, GT_LT, NOTHING, NOTHING); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(void*, start[k] - j,
end[k] - j, INIT_AGGREGATE_MIN_MAX_OTHERS, COMPUTE_LEVELN_MIN_MAX_OTHERS,
FINALIZE_AGGREGATE_MIN_MAX_OTHERS, GT_LT, NOTHING, NOTHING); \
j = k; \
} while (0)
@@ -1476,7 +1478,8 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
goto cleanup; \
populate_segment_tree(lng, ncount,
INIT_AGGREGATE_COUNT, COMPUTE_LEVEL0_COUNT_FIXED, COMPUTE_LEVELN_COUNT, TPE,
NOTHING, NOTHING); \
for (; k < i; k++) \
- compute_on_segment_tree(lng, start[k] - j,
end[k] - j, INIT_AGGREGATE_COUNT, COMPUTE_LEVELN_COUNT,
FINALIZE_AGGREGATE_COUNT, TPE, NOTHING, NOTHING); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(lng, start[k] -
j, end[k] - j, INIT_AGGREGATE_COUNT, COMPUTE_LEVELN_COUNT,
FINALIZE_AGGREGATE_COUNT, TPE, NOTHING, NOTHING); \
j = k; \
} \
} while (0)
@@ -1583,7 +1586,8 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
goto cleanup; \
populate_segment_tree(lng, ncount,
INIT_AGGREGATE_COUNT, COMPUTE_LEVEL0_COUNT_OTHERS, COMPUTE_LEVELN_COUNT,
NOTHING, NOTHING, NOTHING); \
for (; k < i; k++) \
- compute_on_segment_tree(lng, start[k] - j,
end[k] - j, INIT_AGGREGATE_COUNT, COMPUTE_LEVELN_COUNT,
FINALIZE_AGGREGATE_COUNT, NOTHING, NOTHING, NOTHING); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(lng, start[k] -
j, end[k] - j, INIT_AGGREGATE_COUNT, COMPUTE_LEVELN_COUNT,
FINALIZE_AGGREGATE_COUNT, NOTHING, NOTHING, NOTHING); \
j = k; \
} \
} while (0)
@@ -1832,7 +1836,8 @@ cleanup:
goto cleanup; \
populate_segment_tree(TPE2, ncount, INIT_AGGREGATE_SUM,
COMPUTE_LEVEL0_SUM, COMPUTE_LEVELN_SUM_NUM, TPE1, TPE2, NOTHING); \
for (; k < i; k++) \
- compute_on_segment_tree(TPE2, start[k] - j, end[k] - j,
INIT_AGGREGATE_SUM, COMPUTE_LEVELN_SUM_NUM, FINALIZE_AGGREGATE_SUM, TPE1, TPE2,
NOTHING); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(TPE2, start[k] - j,
end[k] - j, INIT_AGGREGATE_SUM, COMPUTE_LEVELN_SUM_NUM, FINALIZE_AGGREGATE_SUM,
TPE1, TPE2, NOTHING); \
j = k; \
} while (0)
@@ -2175,7 +2180,8 @@ nosupport:
goto cleanup; \
populate_segment_tree(TPE2, ncount, INIT_AGGREGATE_PROD,
COMPUTE_LEVEL0_PROD, COMPUTE_LEVELN_PROD_NUM, TPE1, TPE2, TPE3); \
for (; k < i; k++) \
- compute_on_segment_tree(TPE2, start[k] - j, end[k] - j,
INIT_AGGREGATE_PROD, COMPUTE_LEVELN_PROD_NUM, FINALIZE_AGGREGATE_PROD, TPE1,
TPE2, TPE3); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(TPE2, start[k] - j,
end[k] - j, INIT_AGGREGATE_PROD, COMPUTE_LEVELN_PROD_NUM,
FINALIZE_AGGREGATE_PROD, TPE1, TPE2, TPE3); \
j = k; \
} while (0)
@@ -2267,7 +2273,8 @@ nosupport:
goto cleanup; \
populate_segment_tree(TPE2, ncount, INIT_AGGREGATE_PROD,
COMPUTE_LEVEL0_PROD, COMPUTE_LEVELN_PROD_NUM_LIMIT, TPE1, TPE2, REAL_IMP); \
for (; k < i; k++) \
- compute_on_segment_tree(TPE2, start[k] - j, end[k] - j,
INIT_AGGREGATE_PROD, COMPUTE_LEVELN_PROD_NUM_LIMIT, FINALIZE_AGGREGATE_PROD,
TPE1, TPE2, REAL_IMP); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(TPE2, start[k] - j,
end[k] - j, INIT_AGGREGATE_PROD, COMPUTE_LEVELN_PROD_NUM_LIMIT,
FINALIZE_AGGREGATE_PROD, TPE1, TPE2, REAL_IMP); \
j = k; \
} while (0)
@@ -2365,7 +2372,8 @@ nosupport:
goto cleanup; \
populate_segment_tree(TPE2, ncount, INIT_AGGREGATE_PROD,
COMPUTE_LEVEL0_PROD, COMPUTE_LEVELN_PROD_FP, TPE1, TPE2, ARG3); \
for (; k < i; k++) \
- compute_on_segment_tree(TPE2, start[k] - j, end[k] - j,
INIT_AGGREGATE_PROD, COMPUTE_LEVELN_PROD_FP, FINALIZE_AGGREGATE_PROD, TPE1,
TPE2, ARG3); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(TPE2, start[k] - j,
end[k] - j, INIT_AGGREGATE_PROD, COMPUTE_LEVELN_PROD_FP,
FINALIZE_AGGREGATE_PROD, TPE1, TPE2, ARG3); \
j = k; \
} while (0)
diff --git a/gdk/gdk_analytic_statistics.c b/gdk/gdk_analytic_statistics.c
--- a/gdk/gdk_analytic_statistics.c
+++ b/gdk/gdk_analytic_statistics.c
@@ -193,7 +193,8 @@ avg_num_deltas(lng)
goto cleanup; \
populate_segment_tree(avg_num_deltas##TPE, ncount,
INIT_AGGREGATE_AVG_NUM, COMPUTE_LEVEL0_AVG_NUM, COMPUTE_LEVELN_AVG_NUM, TPE,
NOTHING, NOTHING); \
for (; k < i; k++) \
- compute_on_segment_tree(avg_num_deltas##TPE, start[k] -
j, end[k] - j, INIT_AGGREGATE_AVG_NUM, COMPUTE_LEVELN_AVG_NUM,
FINALIZE_AGGREGATE_AVG_NUM, TPE, NOTHING, NOTHING); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(avg_num_deltas##TPE,
start[k] - j, end[k] - j, INIT_AGGREGATE_AVG_NUM, COMPUTE_LEVELN_AVG_NUM,
FINALIZE_AGGREGATE_AVG_NUM, TPE, NOTHING, NOTHING); \
j = k; \
} while (0)
@@ -297,7 +298,8 @@ avg_fp_deltas(dbl)
goto cleanup; \
populate_segment_tree(avg_fp_deltas_##TPE, ncount,
INIT_AGGREGATE_AVG_FP, COMPUTE_LEVEL0_AVG_FP, COMPUTE_LEVELN_AVG_FP, TPE,
NOTHING, NOTHING); \
for (; k < i; k++) \
- compute_on_segment_tree(avg_fp_deltas_##TPE, start[k] -
j, end[k] - j, INIT_AGGREGATE_AVG_FP, COMPUTE_LEVELN_AVG_FP,
FINALIZE_AGGREGATE_AVG_FP, TPE, NOTHING, NOTHING); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(avg_fp_deltas_##TPE,
start[k] - j, end[k] - j, INIT_AGGREGATE_AVG_FP, COMPUTE_LEVELN_AVG_FP,
FINALIZE_AGGREGATE_AVG_FP, TPE, NOTHING, NOTHING); \
j = k; \
} while (0)
@@ -577,7 +579,8 @@ avg_int_deltas(lng)
goto cleanup; \
populate_segment_tree(avg_int_deltas_##TPE, ncount,
INIT_AGGREGATE_AVG_INT, COMPUTE_LEVEL0_AVG_INT, COMPUTE_LEVELN_AVG_INT, TPE,
NOTHING, NOTHING); \
for (; k < i; k++) \
- compute_on_segment_tree(avg_int_deltas_##TPE, start[k]
- j, end[k] - j, INIT_AGGREGATE_AVG_INT, COMPUTE_LEVELN_AVG_INT,
FINALIZE_AGGREGATE_AVG_INT, TPE, NOTHING, NOTHING); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(avg_int_deltas_##TPE,
start[k] - j, end[k] - j, INIT_AGGREGATE_AVG_INT, COMPUTE_LEVELN_AVG_INT,
FINALIZE_AGGREGATE_AVG_INT, TPE, NOTHING, NOTHING); \
j = k; \
} while (0)
@@ -847,7 +850,8 @@ typedef struct stdev_var_deltas {
goto cleanup; \
populate_segment_tree(stdev_var_deltas, ncount,
INIT_AGGREGATE_STDEV_VARIANCE, COMPUTE_LEVEL0_STDEV_VARIANCE,
COMPUTE_LEVELN_STDEV_VARIANCE, TPE, SAMPLE, OP); \
for (; k < i; k++) \
- compute_on_segment_tree(stdev_var_deltas, start[k] - j,
end[k] - j, INIT_AGGREGATE_STDEV_VARIANCE, COMPUTE_LEVELN_STDEV_VARIANCE,
FINALIZE_AGGREGATE_STDEV_VARIANCE, TPE, SAMPLE, OP); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(stdev_var_deltas,
start[k] - j, end[k] - j, INIT_AGGREGATE_STDEV_VARIANCE,
COMPUTE_LEVELN_STDEV_VARIANCE, FINALIZE_AGGREGATE_STDEV_VARIANCE, TPE, SAMPLE,
OP); \
j = k; \
} while (0)
@@ -1132,7 +1136,8 @@ typedef struct covariance_deltas {
goto cleanup; \
populate_segment_tree(covariance_deltas, ncount,
INIT_AGGREGATE_COVARIANCE, COMPUTE_LEVEL0_COVARIANCE,
COMPUTE_LEVELN_COVARIANCE, TPE, SAMPLE, OP); \
for (; k < i; k++) \
- compute_on_segment_tree(covariance_deltas, start[k] -
j, end[k] - j, INIT_AGGREGATE_COVARIANCE, COMPUTE_LEVELN_COVARIANCE,
FINALIZE_AGGREGATE_COVARIANCE, TPE, SAMPLE, OP); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(covariance_deltas,
start[k] - j, end[k] - j, INIT_AGGREGATE_COVARIANCE, COMPUTE_LEVELN_COVARIANCE,
FINALIZE_AGGREGATE_COVARIANCE, TPE, SAMPLE, OP); \
j = k; \
} while (0)
@@ -1397,7 +1402,8 @@ typedef struct correlation_deltas {
goto cleanup; \
populate_segment_tree(correlation_deltas, ncount,
INIT_AGGREGATE_CORRELATION, COMPUTE_LEVEL0_CORRELATION,
COMPUTE_LEVELN_CORRELATION, TPE, SAMPLE, OP); \
for (; k < i; k++) \
- compute_on_segment_tree(correlation_deltas, start[k] -
j, end[k] - j, INIT_AGGREGATE_CORRELATION, COMPUTE_LEVELN_CORRELATION,
FINALIZE_AGGREGATE_CORRELATION, TPE, SAMPLE, OP); \
+ if ((lng)(start[k]-j) >= 0)
\
+ compute_on_segment_tree(correlation_deltas,
start[k] - j, end[k] - j, INIT_AGGREGATE_CORRELATION,
COMPUTE_LEVELN_CORRELATION, FINALIZE_AGGREGATE_CORRELATION, TPE, SAMPLE, OP); \
j = k; \
} while (0)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]