Changeset: 74d7b5b44c43 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=74d7b5b44c43
Modified Files:
        sql/test/BugTracker-2020/Tests/All
Branch: mtest
Log Message:

Merge with default branch.


diffs (truncated from 627 to 300 lines):

diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -183,4 +183,5 @@ if(CMAKE_SUMMARY)
   monetdb_cmake_summary()
 endif()
 
+
 # vim: set ts=2:sw=2:et
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -301,7 +301,7 @@ int GDKnr_threads;
 void GDKprepareExit(void);
 void GDKqsort(void *restrict h, void *restrict t, const void *restrict base, 
size_t n, int hs, int ts, int tpe, bool reverse, bool nilslast);
 void *GDKrealloc(void *pold, size_t size) __attribute__((__alloc_size__(2))) 
__attribute__((__warn_unused_result__));
-gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, void 
**segment_tree, oid *tree_capacity, oid **levels_offset, oid *levels_capacity, 
oid *nlevels);
+gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, void 
**segment_tree, oid *tree_capacity, oid **levels_offset, oid *nlevels);
 gdk_return GDKreleasemmap(void *ptr, size_t size, size_t id);
 gdk_return GDKreleasesem(int sem_id);
 void GDKreset(int status);
diff --git a/gdk/gdk_analytic.h b/gdk/gdk_analytic.h
--- a/gdk/gdk_analytic.h
+++ b/gdk/gdk_analytic.h
@@ -50,7 +50,7 @@ gdk_export gdk_return GDKanalytical_corr
 
 /* segment_tree is the tree as an array, levels_offset contains the offsets in 
the tree where which level does start,
    and nlevels contains the number of levels on the current segment tree */
-gdk_export gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, void 
**segment_tree, oid *tree_capacity, oid **levels_offset, oid *levels_capacity, 
oid *nlevels);
+gdk_export gdk_return GDKrebuild_segment_tree(oid ncount, oid data_size, void 
**segment_tree, oid *tree_capacity, oid **levels_offset, oid *nlevels);
 
 /* segment_tree, levels_offset and nlevels must be already defined. ARG1, ARG2 
and ARG3 are to be used by the aggregate */
 #define populate_segment_tree(CAST, COUNT, INIT_AGGREGATE, COMPUTE_LEVEL0, 
COMPUTE_LEVELN, ARG1, ARG2, ARG3) \
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
@@ -12,9 +12,9 @@
 #include "gdk_calc_private.h"
 
 gdk_return
-GDKrebuild_segment_tree(oid ncount, oid data_size, void **segment_tree, oid 
*tree_capacity, oid **levels_offset, oid *levels_capacity, oid *nlevels)
+GDKrebuild_segment_tree(oid ncount, oid data_size, void **segment_tree, oid 
*tree_capacity, oid **levels_offset, oid *nlevels)
 {
-       oid next_tree_size = ncount, counter = ncount, *new_levels_offset, 
next_levels = 1; /* there will be at least one level */
+       oid total_size, next_tree_size = ncount, counter = ncount, next_levels 
= 1; /* there will be at least one level */
        void *new_segment_tree;
 
        assert(ncount > 0);
@@ -24,23 +24,20 @@ GDKrebuild_segment_tree(oid ncount, oid 
                next_levels++;
        } while (counter > 1);
 
+       *nlevels = next_levels; /* set the logical size of levels before the 
physical one */
        next_tree_size *= data_size;
-       if (next_tree_size > *tree_capacity) {
-               *tree_capacity = (((next_tree_size) + 1023) & ~1023); /* align 
to a multiple of 1024 bytes */
-               if (!(new_segment_tree = GDKmalloc(*tree_capacity)))
+       total_size = next_tree_size + next_levels * sizeof(oid);
+
+       if (total_size > *tree_capacity) {
+               total_size = (((total_size) + 1023) & ~1023); /* align to a 
multiple of 1024 bytes */
+               if (!(new_segment_tree = GDKmalloc(total_size)))
                        return GDK_FAIL;
                GDKfree(*segment_tree);
+               *tree_capacity = total_size;
                *segment_tree = new_segment_tree;
-       }
-
-       *nlevels = next_levels; /* set the logical size of levels before the 
physical one */
-       next_levels *= sizeof(oid);
-       if (next_levels > *levels_capacity) {
-               *levels_capacity = (((next_levels) + 1023) & ~1023); /* align 
to a multiple of 1024 bytes */
-               if (!(new_levels_offset = GDKmalloc(*levels_capacity)))
-                       return GDK_FAIL;
-               GDKfree(*levels_offset);
-               *levels_offset = new_levels_offset;
+               *levels_offset = (oid*)((uint8_t*)new_segment_tree + 
next_tree_size); /* levels offset will be next to the segment tree */
+       } else {
+               *levels_offset = (oid*)(*(uint8_t**)segment_tree + 
next_tree_size); /* no reallocation, just update location of levels offset */
        }
        return GDK_SUCCEED;
 }
@@ -816,7 +813,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
 #define ANALYTICAL_MIN_MAX_CALC_FIXED_OTHERS(TPE, MIN_MAX)     \
        do { \
                oid ncount = i - k; \
-               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
+               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE), 
&segment_tree, &tree_capacity, &levels_offset, &nlevels)) != GDK_SUCCEED) \
                        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++) \
@@ -928,7 +925,7 @@ GDKanalyticallead(BAT *r, BAT *b, BAT *p
 #define ANALYTICAL_MIN_MAX_CALC_VARSIZED_OTHERS(GT_LT) \
        do { \
                oid ncount = i - k; \
-               if ((res = GDKrebuild_segment_tree(ncount, sizeof(void*), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
+               if ((res = GDKrebuild_segment_tree(ncount, sizeof(void*), 
&segment_tree, &tree_capacity, &levels_offset, &nlevels)) != GDK_SUCCEED) \
                        goto cleanup; \
                populate_segment_tree(void*, ncount, 
INIT_AGGREGATE_MIN_MAX_VARSIZED, COMPUTE_LEVEL0_MIN_MAX_VARSIZED, 
COMPUTE_LEVELN_MIN_MAX_VARSIZED, GT_LT, NOTHING, NOTHING); \
                for (; k < i; k++) \
@@ -1009,7 +1006,7 @@ GDKanalytical##OP(BAT *r, BAT *p, BAT *o
 {                                                                      \
        bool has_nils = false;                                          \
        oid i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b), *restrict start = s 
? (oid*)Tloc(s, 0) : NULL, *restrict end = e ? (oid*)Tloc(e, 0) : NULL, \
-               *levels_offset = NULL, tree_capacity = 0, nlevels = 0, 
levels_capacity = 0;     \
+               *levels_offset = NULL, tree_capacity = 0, nlevels = 0;  \
        bit *np = p ? Tloc(p, 0) : NULL, *op = o ? Tloc(o, 0) : NULL;   \
        BATiter bpi = bat_iterator(b);                          \
        const void *nil = ATOMnilptr(tpe);                      \
@@ -1043,7 +1040,6 @@ GDKanalytical##OP(BAT *r, BAT *p, BAT *o
        r->tnil = has_nils;             \
 cleanup: \
        GDKfree(segment_tree); \
-       GDKfree(levels_offset); \
        return res; \
 }
 
@@ -1162,7 +1158,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                                rb[k] = (end[k] > start[k]) ? (lng)(end[k] - 
start[k]) : 0; \
                } else {        \
                        oid ncount = i - k; \
-                       if ((res = GDKrebuild_segment_tree(ncount, sizeof(lng), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
+                       if ((res = GDKrebuild_segment_tree(ncount, sizeof(lng), 
&segment_tree, &tree_capacity, &levels_offset, &nlevels)) != GDK_SUCCEED) \
                                goto cleanup; \
                        populate_segment_tree(lng, ncount, 
INIT_AGGREGATE_COUNT, COMPUTE_LEVEL0_COUNT_FIXED, COMPUTE_LEVELN_COUNT, TPE, 
NOTHING, NOTHING); \
                        for (; k < i; k++) \
@@ -1269,7 +1265,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                                rb[k] = (end[k] > start[k]) ? (lng)(end[k] - 
start[k]) : 0; \
                } else {        \
                        oid ncount = i - k; \
-                       if ((res = GDKrebuild_segment_tree(ncount, sizeof(lng), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
+                       if ((res = GDKrebuild_segment_tree(ncount, sizeof(lng), 
&segment_tree, &tree_capacity, &levels_offset, &nlevels)) != GDK_SUCCEED) \
                                goto cleanup; \
                        populate_segment_tree(lng, ncount, 
INIT_AGGREGATE_COUNT, COMPUTE_LEVEL0_COUNT_OTHERS, COMPUTE_LEVELN_COUNT, 
NOTHING, NOTHING, NOTHING); \
                        for (; k < i; k++) \
@@ -1350,7 +1346,7 @@ gdk_return
 GDKanalyticalcount(BAT *r, BAT *p, BAT *o, BAT *b, BAT *s, BAT *e, bit 
ignore_nils, int tpe, int frame_type)
 {
        oid i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b), *restrict start = s 
? (oid*)Tloc(s, 0) : NULL, *restrict end = e ? (oid*)Tloc(e, 0) : NULL,
-               *levels_offset = NULL, tree_capacity = 0, nlevels = 0, 
levels_capacity = 0;
+               *levels_offset = NULL, tree_capacity = 0, nlevels = 0;
        lng curval = 0, *restrict rb = (lng *) Tloc(r, 0);
        bit *np = p ? Tloc(p, 0) : NULL, *op = o ? Tloc(o, 0) : NULL;
        const void *restrict nil = ATOMnilptr(tpe);
@@ -1387,7 +1383,6 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
        r->tnil = false;
 cleanup:
        GDKfree(segment_tree);
-       GDKfree(levels_offset);
        return res;
 }
 
@@ -1494,7 +1489,7 @@ cleanup:
 #define ANALYTICAL_SUM_IMP_NUM_OTHERS(TPE1, TPE2)      \
        do { \
                oid ncount = i - k; \
-               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE2), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
+               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE2), 
&segment_tree, &tree_capacity, &levels_offset, &nlevels)) != GDK_SUCCEED) \
                        goto cleanup; \
                populate_segment_tree(TPE2, ncount, INIT_AGGREGATE_SUM, 
COMPUTE_LEVEL0_SUM, COMPUTE_LEVELN_SUM_NUM, TPE1, TPE2, NOTHING); \
                for (; k < i; k++) \
@@ -1668,7 +1663,7 @@ static gdk_return /* This is a workaroun
 GDKanalyticalsumothers(BAT *r, BAT *p, bit *np, BAT *b, oid *restrict start, 
oid *restrict end, int tp1, int tp2)
 {
        bool has_nils = false;
-       oid i = 0, j = 0, k = 0, cnt = BATcount(b), *levels_offset = NULL, 
tree_capacity = 0, nlevels = 0, levels_capacity = 0;
+       oid i = 0, j = 0, k = 0, cnt = BATcount(b), *levels_offset = NULL, 
tree_capacity = 0, nlevels = 0;
        int abort_on_error = 1;
        BUN nils = 0;
        void *segment_tree = NULL;
@@ -1686,7 +1681,6 @@ calc_overflow:
        res = GDK_FAIL;
 cleanup:
        GDKfree(segment_tree);
-       GDKfree(levels_offset);
        return res;
 nosupport:
        GDKerror("42000!type combination (sum(%s)->%s) not supported.\n", 
ATOMname(tp1), ATOMname(tp2));
@@ -1836,7 +1830,7 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *o,
 #define ANALYTICAL_PROD_CALC_NUM_OTHERS(TPE1, TPE2, TPE3)      \
        do { \
                oid ncount = i - k; \
-               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE2), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
+               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE2), 
&segment_tree, &tree_capacity, &levels_offset, &nlevels)) != GDK_SUCCEED) \
                        goto cleanup; \
                populate_segment_tree(TPE2, ncount, INIT_AGGREGATE_PROD, 
COMPUTE_LEVEL0_PROD, COMPUTE_LEVELN_PROD_NUM, TPE1, TPE2, TPE3); \
                for (; k < i; k++) \
@@ -1928,7 +1922,7 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *o,
 #define ANALYTICAL_PROD_CALC_NUM_LIMIT_OTHERS(TPE1, TPE2, REAL_IMP)    \
        do { \
                oid ncount = i - k; \
-               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE2), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
+               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE2), 
&segment_tree, &tree_capacity, &levels_offset, &nlevels)) != GDK_SUCCEED) \
                        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++) \
@@ -2032,7 +2026,7 @@ GDKanalyticalsum(BAT *r, BAT *p, BAT *o,
 #define ANALYTICAL_PROD_CALC_FP_OTHERS(TPE1, TPE2, ARG3) /* ARG3 is ignored 
here */ \
        do { \
                oid ncount = i - k; \
-               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE2), 
&segment_tree, &tree_capacity, &levels_offset, &levels_capacity, &nlevels)) != 
GDK_SUCCEED) \
+               if ((res = GDKrebuild_segment_tree(ncount, sizeof(TPE2), 
&segment_tree, &tree_capacity, &levels_offset, &nlevels)) != GDK_SUCCEED) \
                        goto cleanup; \
                populate_segment_tree(TPE2, ncount, INIT_AGGREGATE_PROD, 
COMPUTE_LEVEL0_PROD, COMPUTE_LEVELN_PROD_FP, TPE1, TPE2, ARG3); \
                for (; k < i; k++) \
@@ -2201,7 +2195,7 @@ GDKanalyticalprod(BAT *r, BAT *p, BAT *o
 {
        bool has_nils = false;
        oid i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b), *restrict start = s 
? (oid*)Tloc(s, 0) : NULL, *restrict end = e ? (oid*)Tloc(e, 0) : NULL,
-               *levels_offset = NULL, tree_capacity = 0, nlevels = 0, 
levels_capacity = 0;
+               *levels_offset = NULL, tree_capacity = 0, nlevels = 0;
        bit *np = p ? Tloc(p, 0) : NULL, *op = o ? Tloc(o, 0) : NULL;
        int abort_on_error = 1;
        BUN nils = 0;
@@ -2238,7 +2232,6 @@ calc_overflow:
        res = GDK_FAIL;
 cleanup:
        GDKfree(segment_tree);
-       GDKfree(levels_offset);
        return res;
 nosupport:
        GDKerror("42000!type combination (prod(%s)->%s) not supported.\n", 
ATOMname(tp1), ATOMname(tp2));
@@ -2402,7 +2395,7 @@ avg_num_deltas(lng)
        } while (0)
 #define COMPUTE_LEVELN_AVG_NUM(VAL, TPE, NOTHING1, NOTHING2) \
        do { \
-               if (VAL.n > 0) \
+               if (VAL.n) \
                        AVERAGE_ITER(TPE, VAL.a, computed.a, computed.rr, 
computed.n);  \
        } while (0)
 #define FINALIZE_AGGREGATE_AVG_NUM(TPE, NOTHING1, NOTHING2) \
@@ -2417,7 +2410,7 @@ avg_num_deltas(lng)
 #define ANALYTICAL_AVG_IMP_NUM_OTHERS(TPE, IMP)        \
        do { \
                oid ncount = i - k; \
-               if ((res = GDKrebuild_segment_tree(ncount, 
sizeof(avg_num_deltas##TPE), &segment_tree, &tree_capacity, &levels_offset, 
&levels_capacity, &nlevels)) != GDK_SUCCEED) \
+               if ((res = GDKrebuild_segment_tree(ncount, 
sizeof(avg_num_deltas##TPE), &segment_tree, &tree_capacity, &levels_offset, 
&nlevels)) != GDK_SUCCEED) \
                        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++) \
@@ -2506,7 +2499,7 @@ avg_fp_deltas(dbl)
        } while (0)
 #define COMPUTE_LEVELN_AVG_FP(VAL, TPE, NOTHING1, NOTHING2) \
        do { \
-               if (VAL.n > 0) \
+               if (VAL.n) \
                        AVERAGE_ITER_FLOAT(TPE, VAL.a, computed.a, computed.n); 
\
        } while (0)
 #define FINALIZE_AGGREGATE_AVG_FP(TPE, NOTHING1, NOTHING2) \
@@ -2521,7 +2514,7 @@ avg_fp_deltas(dbl)
 #define ANALYTICAL_AVG_IMP_FP_OTHERS(TPE, IMP) \
        do { \
                oid ncount = i - k; \
-               if ((res = GDKrebuild_segment_tree(ncount, 
sizeof(avg_fp_deltas_##TPE), &segment_tree, &tree_capacity, &levels_offset, 
&levels_capacity, &nlevels)) != GDK_SUCCEED) \
+               if ((res = GDKrebuild_segment_tree(ncount, 
sizeof(avg_fp_deltas_##TPE), &segment_tree, &tree_capacity, &levels_offset, 
&nlevels)) != GDK_SUCCEED) \
                        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++) \
@@ -2589,7 +2582,7 @@ GDKanalyticalavg(BAT *r, BAT *p, BAT *o,
 {
        bool has_nils = false;
        oid i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b), *restrict start = s 
? (oid*)Tloc(s, 0) : NULL, *restrict end = e ? (oid*)Tloc(e, 0) : NULL,
-               *levels_offset = NULL, tree_capacity = 0, nlevels = 0, 
levels_capacity = 0;
+               *levels_offset = NULL, tree_capacity = 0, nlevels = 0;
        lng n = 0, rr = 0;
        dbl *restrict rb = (dbl *) Tloc(r, 0), curval = dbl_nil;
        bit *np = p ? Tloc(p, 0) : NULL, *op = o ? Tloc(o, 0) : NULL;
@@ -2629,7 +2622,6 @@ GDKanalyticalavg(BAT *r, BAT *p, BAT *o,
        r->tnil = has_nils;
 cleanup:
        GDKfree(segment_tree);
-       GDKfree(levels_offset);
        return res;
 nosupport:
        GDKerror("42000!average of type %s to dbl unsupported.\n", 
ATOMname(tpe));
@@ -2763,7 +2755,7 @@ avg_int_deltas(lng)
        } while (0)
 #define COMPUTE_LEVELN_AVG_INT(VAL, TPE, NOTHING1, NOTHING2) \
        do { \
-               if (VAL.ncnt > 0)       \
+               if (VAL.ncnt)   \
                        AVERAGE_ITER(TPE, VAL.avg, computed.avg, computed.rem, 
computed.ncnt); \
        } while (0)
 #define FINALIZE_AGGREGATE_AVG_INT(TPE, NOTHING1, NOTHING2) \
@@ -2779,7 +2771,7 @@ avg_int_deltas(lng)
 #define ANALYTICAL_AVG_INT_OTHERS(TPE) \
        do { \
                oid ncount = i - k; \
-               if ((res = GDKrebuild_segment_tree(ncount, 
sizeof(avg_int_deltas_##TPE), &segment_tree, &tree_capacity, &levels_offset, 
&levels_capacity, &nlevels)) != GDK_SUCCEED) \
+               if ((res = GDKrebuild_segment_tree(ncount, 
sizeof(avg_int_deltas_##TPE), &segment_tree, &tree_capacity, &levels_offset, 
&nlevels)) != GDK_SUCCEED) \
                        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++) \
@@ -2841,7 +2833,7 @@ GDKanalyticalavginteger(BAT *r, BAT *p, 
 {
        bool has_nils = false;
        oid i = 0, j = 0, k = 0, l = 0, cnt = BATcount(b), *restrict start = s 
? (oid*)Tloc(s, 0) : NULL, *restrict end = e ? (oid*)Tloc(e, 0) : NULL,
-               *levels_offset = NULL, tree_capacity = 0, nlevels = 0, 
levels_capacity = 0;
+               *levels_offset = NULL, tree_capacity = 0, nlevels = 0;
        lng rem = 0, ncnt = 0;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to