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

Cleaned ntile


diffs (282 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,74 +11,64 @@
 #include "gdk_analytic.h"
 #include "gdk_calc_private.h"
 
-#define NTILE_CALC(TPE, NEXT_VALUE, LNG_HGE, UPCAST)   \
+#define NTILE_CALC(TPE, NEXT_VALUE, LNG_HGE, UPCAST, VALIDATION)       \
        do {                                    \
-               for (TPE i = 0; rb < rp; i++, rb++) {   \
+               TPE j = 0; \
+               UPCAST ncnt = (UPCAST) (i - k); \
+               for (; k < i; k++, j++) {       \
                        TPE val = NEXT_VALUE; \
                        if (is_##TPE##_nil(val)) {      \
                                has_nils = true;        \
-                               *rb = TPE##_nil;        \
+                               rb[k] = TPE##_nil;      \
                        } else { \
                                UPCAST nval = (UPCAST) LNG_HGE; \
+                               VALIDATION /* validation must come after null 
check */  \
                                if (nval >= ncnt) { \
-                                       *rb = i + 1;  \
+                                       rb[k] = j + 1;  \
                                } else { \
                                        UPCAST bsize = ncnt / nval; \
                                        UPCAST top = ncnt - nval * bsize; \
                                        UPCAST small = top * (bsize + 1); \
-                                       if ((UPCAST) i < small) \
-                                               *rb = (TPE)(1 + i / (bsize + 
1)); \
+                                       if ((UPCAST) j < small) \
+                                               rb[k] = (TPE)(1 + j / (bsize + 
1)); \
                                        else \
-                                               *rb = (TPE)(1 + top + (i - 
small) / bsize); \
+                                               rb[k] = (TPE)(1 + top + (j - 
small) / bsize); \
                                } \
                        } \
                } \
        } while (0)
 
-#define ANALYTICAL_NTILE_IMP(TPE, NEXT_VALUE, LNG_HGE, UPCAST) \
+#define ANALYTICAL_NTILE_IMP(TPE, NEXT_VALUE, LNG_HGE, UPCAST, VALIDATION)     
\
        do {                                                    \
-               TPE *rp, *rb;   \
-               UPCAST ncnt; \
-               rb = rp = (TPE*)Tloc(r, 0);             \
-               if (p) {                                        \
-                       pnp = np = (bit*)Tloc(p, 0);    \
-                       end = np + cnt;                         \
-                       for (; np < end; np++) {        \
-                               if (*np) {                      \
-                                       ncnt = np - pnp;        \
-                                       rp += ncnt;             \
-                                       NTILE_CALC(TPE, NEXT_VALUE, LNG_HGE, 
UPCAST);\
-                                       pnp = np;       \
-                               }                               \
-                       }                                       \
-                       ncnt = np - pnp;                        \
-                       rp += ncnt;                             \
-                       NTILE_CALC(TPE, NEXT_VALUE, LNG_HGE, UPCAST);   \
-               } else {                                        \
-                       ncnt = (UPCAST) cnt; \
-                       rp += cnt;                              \
-                       NTILE_CALC(TPE, NEXT_VALUE, LNG_HGE, UPCAST);   \
-               }                                               \
+               TPE *restrict rb = (TPE*)Tloc(r, 0);            \
+               if (p) {                                                \
+                       for (; i < cnt; i++) {                  \
+                               if (np[i])                      \
+                                       NTILE_CALC(TPE, NEXT_VALUE, LNG_HGE, 
UPCAST, VALIDATION);\
+                       }                                               \
+               }                                       \
+               i = cnt;                                        \
+               NTILE_CALC(TPE, NEXT_VALUE, LNG_HGE, UPCAST, VALIDATION);       
\
        } while (0)
 
 #define ANALYTICAL_NTILE_SINGLE_IMP(TPE, LNG_HGE, UPCAST) \
        do {    \
                TPE ntl = *(TPE*) ntile; \
-               ANALYTICAL_NTILE_IMP(TPE, ntl, LNG_HGE, UPCAST); \
+               if (!is_##TPE##_nil(ntl) && ntl < 0) goto invalidntile; \
+               ANALYTICAL_NTILE_IMP(TPE, ntl, LNG_HGE, UPCAST, ;); \
        } while (0)
 
 #define ANALYTICAL_NTILE_MULTI_IMP(TPE, LNG_HGE, UPCAST) \
        do {    \
-               BUN k = 0; \
                TPE *restrict nn = (TPE*)Tloc(n, 0);    \
-               ANALYTICAL_NTILE_IMP(TPE, nn[k++], LNG_HGE, UPCAST); \
+               ANALYTICAL_NTILE_IMP(TPE, nn[k], LNG_HGE, UPCAST, if (val < 0) 
goto invalidntile;); \
        } while (0)
 
 gdk_return
 GDKanalyticalntile(BAT *r, BAT *b, BAT *p, BAT *n, int tpe, const void 
*restrict ntile)
 {
-       BUN cnt = BATcount(b);
-       bit *np, *pnp, *end;
+       lng i = 0, k = 0, cnt = (lng) BATcount(b);
+       bit *restrict np = p ? Tloc(p, 0) : NULL;
        bool has_nils = false;
 
        assert((n && !ntile) || (!n && ntile));
@@ -150,6 +140,9 @@ GDKanalyticalntile(BAT *r, BAT *b, BAT *
 nosupport:
        GDKerror("42000!type %s not supported for the ntile type.\n", 
ATOMname(tpe));
        return GDK_FAIL;
+invalidntile:
+       GDKerror("42000!ntile must be greater than zero.\n");
+       return GDK_FAIL;
 }
 
 #define ANALYTICAL_FIRST_FIXED(TPE)                            \
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -643,42 +643,13 @@ SQLcume_dist(Client cntxt, MalBlkPtr mb,
        return MAL_SUCCEED;
 }
 
-#define NTILE_IMP(TPE) \
-       do { \
-               TPE *ntile = NULL; \
-               if (is_a_bat) { \
-                       bool is_non_positive = false; \
-                       for (TPE *np = (TPE*)Tloc(n, 0), *nend = np + 
BATcount(n); np < nend && !is_non_positive; np++) \
-                               is_non_positive |= (!is_##TPE##_nil(*np) && *np 
< 1); \
-                       if (is_non_positive) { \
-                               BBPunfix(b->batCacheid); \
-                               BBPunfix(n->batCacheid); \
-                               throw(SQL, "sql.ntile", SQLSTATE(42000) "All 
ntile values must be greater than zero"); \
-                       } \
-               } else { \
-                       ntile = getArgReference_##TPE(stk, pci, 2); \
-                       if (!is_##TPE##_nil(*ntile) && *ntile < 1) { \
-                               BBPunfix(b->batCacheid); \
-                               throw(SQL, "sql.ntile", SQLSTATE(42000) "ntile 
must be greater than zero"); \
-                       } \
-               } \
-               voidresultBAT(r, TYPE_##TPE, BATcount(b), b, "sql.ntile"); \
-               if (isaBatType(getArgType(mb, pci, 3))) { \
-                       p = BATdescriptor(*getArgReference_bat(stk, pci, 3)); \
-                       if (!p) { \
-                               BBPunfix(b->batCacheid); \
-                               if (n) BBPunfix(n->batCacheid); \
-                               throw(SQL, "sql.ntile", SQLSTATE(HY005) "Cannot 
access column descriptor"); \
-                       } \
-               } \
-               gdk_code = GDKanalyticalntile(r, b, p, n, TYPE_##TPE, ntile); \
-       } while(0)
-
 #define NTILE_VALUE_SINGLE_IMP(TPE) \
        do { \
                TPE val = *(TPE*) VALget(ntile); \
-               if (!is_##TPE##_nil(val) && val < 1) \
-                       throw(SQL, "sql.ntile", SQLSTATE(42000) "ntile must be 
greater than zero"); \
+               if (!is_##TPE##_nil(val) && val < 1) { \
+                       msg = createException(SQL, "sql.ntile", SQLSTATE(42000) 
"ntile must be greater than zero"); \
+                       goto bailout;   \
+               }       \
                if (!is_##TPE##_nil(val)) \
                        val = 1; \
                VALset(res, tp2, &val); \
@@ -687,69 +658,50 @@ SQLcume_dist(Client cntxt, MalBlkPtr mb,
 str
 SQLntile(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       int tp1, tp2;
-       bool is_a_bat;
+       BAT *r = NULL, *b = NULL, *p = NULL, *n = NULL;
+       bat *res = NULL;
+       str msg = MAL_SUCCEED;
 
        (void)cntxt;
        if (pci->argc != 5 || (getArgType(mb, pci, 3) != TYPE_bit && 
getBatType(getArgType(mb, pci, 3)) != TYPE_bit) ||
                (getArgType(mb, pci, 4) != TYPE_bit && 
getBatType(getArgType(mb, pci, 4)) != TYPE_bit)) {
                throw(SQL, "sql.ntile", SQLSTATE(42000) 
"ntile(:any_1,:number,:bit,:bit)");
        }
-       tp1 = getArgType(mb, pci, 1), tp2 = getArgType(mb, pci, 2);
-       is_a_bat = isaBatType(tp2);
-       if (is_a_bat)
-               tp2 = getBatType(tp2);
+
+       if (isaBatType(getArgType(mb, pci, 1))) {
+               int tp2 = 0;
+               void *ntile = NULL;
+               res = getArgReference_bat(stk, pci, 0);
 
-       if (isaBatType(tp1)) {
-               bat *res = getArgReference_bat(stk, pci, 0);
-               BAT *b = BATdescriptor(*getArgReference_bat(stk, pci, 1)), *p = 
NULL, *r, *n = NULL;
-               gdk_return gdk_code;
-
-               if (!b)
-                       throw(SQL, "sql.ntile", SQLSTATE(HY005) "Cannot access 
column descriptor");
-
+               if (!(b = BATdescriptor(*getArgReference_bat(stk, pci, 1)))) {
+                       msg = createException(SQL, "sql.ntile", SQLSTATE(HY005) 
"Cannot access column descriptor");
+                       goto bailout;
+               }
                if (isaBatType(getArgType(mb, pci, 2))) {
+                       tp2 = getBatType(getArgType(mb, pci, 2));
                        if (!(n = BATdescriptor(*getArgReference_bat(stk, pci, 
2)))) {
-                               BBPunfix(b->batCacheid);
-                               throw(SQL, "sql.nth_value", SQLSTATE(HY005) 
"Cannot access column descriptor");
+                               msg = createException(SQL, "sql.ntile", 
SQLSTATE(HY005) "Cannot access column descriptor");
+                               goto bailout;
                        }
+               } else {
+                       tp2 = getArgType(mb, pci, 2);
+                       ntile = getArgReference(stk, pci, 2);
+               }
+               if (!(r = COLnew(b->hseqbase, tp2, BATcount(b), TRANSIENT))) {
+                       msg = createException(MAL, "sql.ntile", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       goto bailout;
+               }
+               if (isaBatType(getArgType(mb, pci, 3)) && !(p = 
BATdescriptor(*getArgReference_bat(stk, pci, 3)))) {
+                       msg = createException(SQL, "sql.ntile", SQLSTATE(HY005) 
"Cannot access column descriptor");
+                       goto bailout;
                }
 
-               switch (tp2) {
-                       case TYPE_bte:
-                               NTILE_IMP(bte);
-                               break;
-                       case TYPE_sht:
-                               NTILE_IMP(sht);
-                               break;
-                       case TYPE_int:
-                               NTILE_IMP(int);
-                               break;
-                       case TYPE_lng:
-                               NTILE_IMP(lng);
-                               break;
-#ifdef HAVE_HGE
-                       case TYPE_hge:
-                               NTILE_IMP(hge);
-                               break;
-#endif
-                       default: {
-                               BBPunfix(b->batCacheid);
-                               if (n) BBPunfix(n->batCacheid);
-                               throw(SQL, "sql.ntile", SQLSTATE(42000) "ntile 
not available for %s", ATOMname(tp2));
-                       }
-               }
-
-               BBPunfix(b->batCacheid);
-               if (p) BBPunfix(p->batCacheid);
-               if (n) BBPunfix(n->batCacheid);
-               if (gdk_code == GDK_SUCCEED)
-                       BBPkeepref(*res = r->batCacheid);
-               else
-                       throw(SQL, "sql.ntile", GDK_EXCEPTION);
+               if (GDKanalyticalntile(r, b, p, n, tp2, ntile) != GDK_SUCCEED)
+                       msg = createException(SQL, "sql.ntile", GDK_EXCEPTION);
        } else {
                ValRecord *res = &(stk)->stk[(pci)->argv[0]];
                ValRecord *ntile = &(stk)->stk[(pci)->argv[2]];
+               int tp2 = getArgType(mb, pci, 2);
 
                switch (tp2) {
                        case TYPE_bte:
@@ -770,9 +722,18 @@ SQLntile(Client cntxt, MalBlkPtr mb, Mal
                                break;
 #endif
                        default:
-                               throw(SQL, "sql.ntile", SQLSTATE(42000) "ntile 
not available for %s", ATOMname(tp2));
+                               msg = createException(SQL, "sql.ntile", 
SQLSTATE(42000) "ntile not available for %s", ATOMname(tp2));
                }
        }
+
+bailout:
+       unfix_inputs(3, b, p, n);
+       if (r && !msg) {
+               r->tsorted = BATcount(r) <= 1;
+               r->trevsorted = BATcount(r) <= 1;
+               BBPkeepref(*res = r->batCacheid);
+       } else if (r)
+               BBPreclaim(r);
        return MAL_SUCCEED;
 }
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to