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]

Reply via email to