Changeset: 38a8ed3bd243 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=38a8ed3bd243
Modified Files:
        gdk/gdk_analytic_func.c
Branch: window-tunning
Log Message:

Need extra check for NULL values on floating-points in order to match


diffs (288 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
@@ -11,6 +11,10 @@
 #include "gdk_analytic.h"
 #include "gdk_calc_private.h"
 
+/* needed for some operators on floating-points */
+#define NAN_CHECK(TPE, i) || (is_##TPE##_nil(v) && is_##TPE##_nil(bp[i]))
+#define NO_NAN_CHECK(TPE, i)
+
 #define NTILE_CALC(TPE, NEXT_VALUE, LNG_HGE, UPCAST)   \
        do {                                    \
                for (TPE i = 0; rb < rp; i++, rb++) {   \
@@ -1056,15 +1060,15 @@ ANALYTICAL_MIN_MAX(min, MIN, >)
 ANALYTICAL_MIN_MAX(max, MAX, <)
 
 /* Counting no nils for fixed sizes */
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_UNBOUNDED_TILL_CURRENT_ROW(TPE) \
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_UNBOUNDED_TILL_CURRENT_ROW(TPE, 
NAN_CHECK) \
        do { \
                curval = 0; \
                if (count_all) { \
                        for (; k < i;) { \
-                               TPE v = bpf[k]; \
+                               TPE v = bp[k]; \
                                j = k++; \
                                curval++; \
-                               while (k < i && bpf[k] == v) { \
+                               while (k < i && (bp[k] == v NAN_CHECK(TPE, k))) 
{ \
                                        k++; \
                                        curval++; \
                                } \
@@ -1073,12 +1077,12 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                        } \
                } else { \
                        for (; k < i;) { \
-                               TPE v = bpf[k]; \
+                               TPE v = bp[k]; \
                                j = k++; \
-                               curval += !is_##TPE##_nil(bpf[k]); \
-                               while (k < i && bpf[k] == v) { \
+                               curval += !is_##TPE##_nil(bp[k]); \
+                               while (k < i && (bp[k] == v NAN_CHECK(TPE, k))) 
{ \
                                        k++; \
-                                       curval += !is_##TPE##_nil(bpf[k]); \
+                                       curval += !is_##TPE##_nil(bp[k]); \
                                } \
                                for (; j < k; j++) \
                                        rb[j] = curval; \
@@ -1086,15 +1090,15 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                }       \
        } while (0)
 
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE) \
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_CURRENT_ROW_TILL_UNBOUNDED(TPE, 
NAN_CHECK) \
        do { \
                curval = 0; \
                if (count_all) { \
                        for (j = i - 1; j >= k; ) { \
-                               TPE v = bpf[j]; \
+                               TPE v = bp[j]; \
                                l = j--; \
                                curval++; \
-                               while (j >= k && bpf[j] == v) { \
+                               while (j >= k && (bp[j] == v NAN_CHECK(TPE, 
j))) { \
                                        j--; \
                                        curval++; \
                                } \
@@ -1104,12 +1108,12 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                        }       \
                } else { \
                        for (j = i - 1; j >= k; ) { \
-                               TPE v = bpf[j]; \
+                               TPE v = bp[j]; \
                                l = j--; \
-                               curval += !is_##TPE##_nil(bpf[j]); \
-                               while (j >= k && bpf[j] == v) { \
+                               curval += !is_##TPE##_nil(bp[j]); \
+                               while (j >= k && (bp[j] == v NAN_CHECK(TPE, 
j))) { \
                                        j--; \
-                                       curval += !is_##TPE##_nil(bpf[j]); \
+                                       curval += !is_##TPE##_nil(bp[j]); \
                                } \
                                m = MAX(k, j); \
                                for (; l >= m; l--) \
@@ -1119,7 +1123,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                k = i; \
        } while (0)
 
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_ALL_ROWS(TPE)    \
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_ALL_ROWS(TPE, NAN_CHECK) \
        do { \
                if (count_all) { \
                        curval = i - k; \
@@ -1128,24 +1132,24 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                } else {        \
                        curval = 0; \
                        for (; j < i; j++) \
-                               curval += !is_##TPE##_nil(bpf[j]); \
+                               curval += !is_##TPE##_nil(bp[j]); \
                        for (; k < i; k++) \
                                rb[k] = curval; \
                }       \
        } while (0)
 
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_CURRENT_ROW(TPE) \
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_CURRENT_ROW(TPE, NAN_CHECK) \
        do { \
                if (count_all) { \
                        for (; k < i; k++) \
                                rb[k] = 1; \
                } else { \
                        for (; k < i; k++) \
-                               rb[k] = !is_##TPE##_nil(bpf[k]); \
+                               rb[k] = !is_##TPE##_nil(bp[k]); \
                } \
        } while (0)
 
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_OTHERS(TPE)      \
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_OTHERS(TPE, NAN_CHECK) \
        do { \
                if (count_all) { \
                        for (; k < i; k++) \
@@ -1153,8 +1157,8 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                } else {        \
                        curval = 0; \
                        for (; k < i; k++) {                    \
-                               TPE *bs = bpf + start[k];               \
-                               TPE *be = bpf + end[k];         \
+                               TPE *bs = bp + start[k];                \
+                               TPE *be = bp + end[k];          \
                                for (; bs < be; bs++)                   \
                                        curval += !is_##TPE##_nil(*bs); \
                                rb[k] = curval;         \
@@ -1170,10 +1174,10 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                if (count_all) { \
                        if (isvarsized) { \
                                for (; k < i; ) { \
-                                       const void *v = base + ((const var_t *) 
bp)[k]; \
+                                       const void *v = base + ((const var_t *) 
bheap)[k]; \
                                        j = k++; \
                                        curval++; \
-                                       while (k < i && cmp(base + ((const 
var_t *) bp)[k], v) == 0) { \
+                                       while (k < i && cmp(base + ((const 
var_t *) bheap)[k], v) == 0) { \
                                                k++; \
                                                curval++; \
                                        } \
@@ -1196,12 +1200,12 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                } else { \
                        if (isvarsized) { \
                                for (; k < i; ) { \
-                                       const void *v = base + ((const var_t *) 
bp)[k]; \
+                                       const void *v = base + ((const var_t *) 
bheap)[k]; \
                                        j = k++; \
                                        curval += cmp(v, nil) != 0; \
-                                       while (k < i && cmp(base + ((const 
var_t *) bp)[k], v) == 0) { \
+                                       while (k < i && cmp(base + ((const 
var_t *) bheap)[k], v) == 0) { \
                                                k++; \
-                                               curval += cmp(base + ((const 
var_t *) bp)[k], nil) != 0; \
+                                               curval += cmp(base + ((const 
var_t *) bheap)[k], nil) != 0; \
                                        } \
                                        for (; j < k; j++) \
                                                rb[j] = curval; \
@@ -1228,10 +1232,10 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                if (count_all) { \
                        if (isvarsized) { \
                                for (j = i - 1; j >= k; ) { \
-                                       const void *v = base + ((const var_t *) 
bp)[j]; \
+                                       const void *v = base + ((const var_t *) 
bheap)[j]; \
                                        l = j--; \
                                        curval++; \
-                                       while (j >= k && cmp(base + ((const 
var_t *) bp)[j], v) == 0) { \
+                                       while (j >= k && cmp(base + ((const 
var_t *) bheap)[j], v) == 0) { \
                                                j--; \
                                                curval++; \
                                        } \
@@ -1256,12 +1260,12 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                } else { \
                        if (isvarsized) { \
                                for (j = i - 1; j >= k; ) { \
-                                       const void *v = base + ((const var_t *) 
bp)[j]; \
+                                       const void *v = base + ((const var_t *) 
bheap)[j]; \
                                        l = j--; \
                                        curval += cmp(v, nil) != 0; \
-                                       while (j >= k && cmp(base + ((const 
var_t *) bp)[j], v) == 0) { \
+                                       while (j >= k && cmp(base + ((const 
var_t *) bheap)[j], v) == 0) { \
                                                j--; \
-                                               curval += cmp(base + ((const 
var_t *) bp)[j], nil) != 0; \
+                                               curval += cmp(base + ((const 
var_t *) bheap)[j], nil) != 0; \
                                        } \
                                        m = MAX(k, j); \
                                        for (; l >= m; l--) \
@@ -1293,7 +1297,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                } else {        \
                        if (isvarsized) { \
                                for (; j < i; j++) \
-                                       curval += cmp(nil, base + ((const var_t 
*) bp)[j]) != 0; \
+                                       curval += cmp(nil, base + ((const var_t 
*) bheap)[j]) != 0; \
                        } else { \
                                for (; j < i; j++) \
                                        curval += cmp(Tloc(b, j), nil) != 0; \
@@ -1311,7 +1315,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                } else { \
                        if (isvarsized) { \
                                for (; k < i; k++) \
-                                       rb[k] = cmp(nil, base + ((const var_t 
*) bp)[k]) != 0; \
+                                       rb[k] = cmp(nil, base + ((const var_t 
*) bheap)[k]) != 0; \
                        } else { \
                                for (; k < i; k++) \
                                        rb[k] = cmp(Tloc(b, k), nil) != 0; \
@@ -1331,7 +1335,7 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
                                        j = start[k]; \
                                        l = end[k]; \
                                        for (; j < l; j++) \
-                                               curval += cmp(nil, base + 
((const var_t *) bp)[j]) != 0; \
+                                               curval += cmp(nil, base + 
((const var_t *) bheap)[j]) != 0; \
                                        rb[k] = curval; \
                                        curval = 0; \
                                } \
@@ -1349,23 +1353,23 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
        } while (0)
 
 /* Now do the count analytic function branches */
-#define ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(TPE, IMP)             \
+#define ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(TPE, NAN_CHECK, IMP)          
\
        do {                                    \
-               TPE *bpf = (TPE*)bp; \
+               TPE *bp = (TPE*) bheap; \
                if (p) {                                        \
                        for (; i < cnt; i++) {          \
                                if (np[i])                      \
-                                       
ANALYTICAL_COUNT_NO_NIL_FIXED_##IMP(TPE); \
+                                       
ANALYTICAL_COUNT_NO_NIL_FIXED_##IMP(TPE, NAN_CHECK); \
                        }                                               \
                }       \
                i = cnt;                        \
-               ANALYTICAL_COUNT_NO_NIL_FIXED_##IMP(TPE);       \
+               ANALYTICAL_COUNT_NO_NIL_FIXED_##IMP(TPE, NAN_CHECK);    \
        } while (0)
 
 #ifdef HAVE_HGE
 #define ANALYTICAL_COUNT_NO_NIL_LIMIT(IMP)                     \
        case TYPE_hge:                                  \
-               ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(hge, IMP);     \
+               ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(hge, NO_NAN_CHECK, 
IMP);       \
        break;
 #else
 #define ANALYTICAL_COUNT_NO_NIL_LIMIT(IMP)
@@ -1375,23 +1379,23 @@ ANALYTICAL_MIN_MAX(max, MAX, <)
        do { \
                switch (ATOMbasetype(tpe)) {            \
                case TYPE_bte:                                  \
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(bte, IMP);     
        \
+                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(bte, 
NO_NAN_CHECK, IMP);               \
                        break;                                                  
\
                case TYPE_sht:                                                  
\
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(sht, IMP);     
        \
+                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(sht, 
NO_NAN_CHECK, IMP);               \
                        break;                                                  
\
                case TYPE_int:                                                  
\
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(int, IMP);     
        \
+                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(int, 
NO_NAN_CHECK, IMP);               \
                        break;                                                  
\
                case TYPE_lng:                                                  
\
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(lng, IMP);     
        \
+                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(lng, 
NO_NAN_CHECK, IMP);               \
                        break;                                                  
\
                        ANALYTICAL_COUNT_NO_NIL_LIMIT(IMP)                      
\
                case TYPE_flt:                                                  
\
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(flt, IMP);     
        \
+                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(flt, 
NAN_CHECK, IMP);          \
                        break;                                                  
\
                case TYPE_dbl:                                                  
\
-                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(dbl, IMP);     
        \
+                       ANALYTICAL_COUNT_NO_NIL_FIXED_PARTITIONS(dbl, 
NAN_CHECK, IMP);          \
                        break;                                                  
\
                default: {                                                      
\
                        if (p) {                                                
\
@@ -1415,7 +1419,7 @@ GDKanalyticalcount(BAT *r, BAT *p, BAT *
        const void *restrict nil = ATOMnilptr(tpe);
        int (*cmp) (const void *, const void *) = ATOMcompare(tpe);
        const char *restrict base = b->tvheap ? b->tvheap->base: NULL;
-       const void *restrict bp = Tloc(b, 0);
+       const void *restrict bheap = Tloc(b, 0);
        bool isvarsized = b->tvarsized, count_all = !ignore_nils || b->tnonil;
 
        switch (frame_type) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to