Changeset: 5b074e98355a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5b074e98355a
Modified Files:
        gdk/gdk_analytic_func.c
Branch: Nov2019
Log Message:

Better fix for 32 vs 64 bit ntile.
Make sure the variables used for ntile calculation are the same type, ie the 
highest in the architecture: lng vs BUN.
I compiled myself this code on a 32-bit Windows on the cmake-fun branch with no 
errors this time.


diffs (104 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
@@ -133,17 +133,17 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
        return GDK_SUCCEED;
 }
 
-#define NTILE_CALC(TPE, CAST2, CAST3)          \
+#define NTILE_CALC(TPE, UPCAST)                \
        do {                    \
-               if ((CAST2) nval >= (CAST3) ncnt) {     \
+               if (nval >= ncnt) {     \
                        for (i = 1; rb < rp; i++, rb++) \
                                *rb = i;                \
                } else { \
-                       BUN bsize = ncnt / nval; \
-                       BUN top = ncnt - nval * bsize; \
-                       BUN small = top * (bsize + 1); \
+                       UPCAST bsize = ncnt / nval; \
+                       UPCAST top = ncnt - nval * bsize; \
+                       UPCAST small = top * (bsize + 1); \
                        for (i = 0; rb < rp; i++, rb++) {       \
-                               if ((CAST2) i < (CAST3) small) \
+                               if ((UPCAST) i < small) \
                                        *rb = (TPE)(1 + i / (bsize + 1)); \
                                else \
                                        *rb = (TPE)(1 + top + (i - small) / 
bsize); \
@@ -151,9 +151,10 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                } \
        } while (0)
 
-#define ANALYTICAL_NTILE_IMP(TPE, CAST1, CAST2, CAST3)         \
+#define ANALYTICAL_NTILE_IMP(TPE, LNG_HGE, UPCAST)             \
        do {                                                    \
-               TPE i, *rp, *rb, val = *(TPE*) ntile, nval = CAST1;     \
+               TPE i, *rp, *rb, val = *(TPE*) ntile;   \
+               UPCAST ncnt, nval = LNG_HGE; \
                rb = rp = (TPE*)Tloc(r, 0);                     \
                if (is_##TPE##_nil(val)) {                      \
                        TPE *end = rp + cnt;                    \
@@ -167,23 +168,24 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                                if (*np) {                      \
                                        ncnt = np - pnp;        \
                                        rp += ncnt;             \
-                                       NTILE_CALC(TPE, CAST2, CAST3);          
\
+                                       NTILE_CALC(TPE, UPCAST);                
\
                                        pnp = np;               \
                                }                               \
                        }                                       \
                        ncnt = np - pnp;                        \
                        rp += ncnt;                             \
-                       NTILE_CALC(TPE, CAST2, CAST3);          \
+                       NTILE_CALC(TPE, UPCAST);                \
                } else {                                        \
+                       ncnt = (UPCAST) cnt; \
                        rp += cnt;                              \
-                       NTILE_CALC(TPE, CAST2, CAST3);          \
+                       NTILE_CALC(TPE, UPCAST);                \
                }                                               \
        } while (0)
 
 gdk_return
 GDKanalyticalntile(BAT *r, BAT *b, BAT *p, int tpe, const void *restrict ntile)
 {
-       BUN cnt = BATcount(b), ncnt = cnt;
+       BUN cnt = BATcount(b);
        bit *np, *pnp, *end;
        bool has_nils = false;
 
@@ -191,27 +193,27 @@ GDKanalyticalntile(BAT *r, BAT *b, BAT *
 
        switch (tpe) {
        case TYPE_bte:
-               ANALYTICAL_NTILE_IMP(bte, val, BUN, BUN);
+               ANALYTICAL_NTILE_IMP(bte, val, BUN);
                break;
        case TYPE_sht:
-               ANALYTICAL_NTILE_IMP(sht, val, BUN, BUN);
+               ANALYTICAL_NTILE_IMP(sht, val, BUN);
                break;
        case TYPE_int:
-               ANALYTICAL_NTILE_IMP(int, val, BUN, BUN);
+               ANALYTICAL_NTILE_IMP(int, val, BUN);
                break;
        case TYPE_lng:
 #if SIZEOF_OID == SIZEOF_INT
-               ANALYTICAL_NTILE_IMP(lng, val, lng, lng);
+               ANALYTICAL_NTILE_IMP(lng, val, lng);
 #else
-               ANALYTICAL_NTILE_IMP(lng, val, BUN, BUN);
+               ANALYTICAL_NTILE_IMP(lng, val, BUN);
 #endif
                break;
 #ifdef HAVE_HGE
        case TYPE_hge:
 #if SIZEOF_OID == SIZEOF_INT
-               ANALYTICAL_NTILE_IMP(hge, (val > (hge) GDK_lng_max) ? 
GDK_lng_max : (lng) val, lng, lng);
+               ANALYTICAL_NTILE_IMP(hge, (val > (hge) GDK_lng_max) ? 
GDK_lng_max : (lng) val, lng);
 #else
-               ANALYTICAL_NTILE_IMP(hge, (val > (hge) GDK_lng_max) ? 
GDK_lng_max : (lng) val, BUN, BUN);
+               ANALYTICAL_NTILE_IMP(hge, (val > (hge) GDK_lng_max) ? 
GDK_lng_max : (lng) val, BUN);
 #endif
                break;
 #endif
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to