Changeset: dc5794b8caf6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dc5794b8caf6
Modified Files:
        sql/backends/monet5/sql_subquery.c
Branch: default
Log Message:

Inlined loop


diffs (129 lines):

diff --git a/sql/backends/monet5/sql_subquery.c 
b/sql/backends/monet5/sql_subquery.c
--- a/sql/backends/monet5/sql_subquery.c
+++ b/sql/backends/monet5/sql_subquery.c
@@ -116,12 +116,30 @@ SQLsubzero_or_one(bat *ret, const bat *b
        return MAL_SUCCEED;
 }
 
+#define SQLall_imp(TPE) \
+       do {            \
+               TPE *restrict bp = (TPE*)Tloc(b, 0), val;       \
+               for (; q < c; q++) { /* find first non nil */ \
+                       val = bp[q]; \
+                       if (!is_##TPE##_nil(val)) \
+                               break; \
+               } \
+               for (; q < c; q++) { \
+                       TPE pp = bp[q]; \
+                       if (val != pp && !is_##TPE##_nil(pp)) { /* values != 
and not nil */ \
+                               val = TPE##_nil; \
+                               break; \
+                       } \
+               } \
+               p = &val; \
+       } while (0)
+
 str
 SQLall(ptr ret, const bat *bid)
 {
        BAT *b;
-       BUN c, _s;
-       const void *p;
+       BUN c, q = 0, _s;
+       const void *p = NULL;
 
        if ((b = BATdescriptor(*bid)) == NULL) {
                throw(SQL, "sql.all", SQLSTATE(HY005) "Cannot access column 
descriptor");
@@ -130,31 +148,56 @@ SQLall(ptr ret, const bat *bid)
        if (c == 0) {
                p = ATOMnilptr(b->ttype);
        } else if (c == 1 || (b->tsorted && b->trevsorted)) {
-               BATiter bi = bat_iterator(b);
-               p = BUNtail(bi, 0);
+               p = BUNtail(bat_iterator(b), 0);
        } else if (b->ttype == TYPE_void && is_oid_nil(b->tseqbase)) {
                p = ATOMnilptr(b->ttype);
        } else {
-               BUN q, r;
-               int (*ocmp) (const void *, const void *);
-               const void *n = ATOMnilptr(b->ttype);
-               BATiter bi = bat_iterator(b);
-               r = BUNlast(b);
-               ocmp = ATOMcompare(b->ttype);
-               for (q = 0; q < r; q++) { /* find first non nil */
-                       p = BUNtail(bi, q);
-                       if (ocmp(n, p) != 0) 
-                               break;
-               }
-               for (; q < r; q++) {
-                       const void *c = BUNtail(bi, q);
-                       if (ocmp(p, c) != 0) { /* values != */
-                               if (ocmp(n, c) != 0) { /* and not nil */ 
+               switch (b->ttype) {
+               case TYPE_bit:
+                       SQLall_imp(bit);
+                       break;
+               case TYPE_bte:
+                       SQLall_imp(bte);
+                       break;
+               case TYPE_sht:
+                       SQLall_imp(sht);
+                       break;
+               case TYPE_int:
+                       SQLall_imp(int);
+                       break;
+               case TYPE_lng:
+                       SQLall_imp(lng);
+                       break;
+#ifdef HAVE_HGE
+               case TYPE_hge:
+                       SQLall_imp(hge);
+                       break;
+#endif
+               case TYPE_flt:
+                       SQLall_imp(flt);
+                       break;
+               case TYPE_dbl:
+                       SQLall_imp(dbl);
+                       break;
+               default: {
+                       int (*ocmp) (const void *, const void *) = 
ATOMcompare(b->ttype);
+                       const void *restrict n = ATOMnilptr(b->ttype);
+                       BATiter bi = bat_iterator(b);
+
+                       for (; q < c; q++) { /* find first non nil */
+                               p = BUNtail(bi, q);
+                               if (ocmp(n, p) != 0)
+                                       break;
+                       }
+                       for (; q < c; q++) {
+                               const void *pp = BUNtail(bi, q);
+                               if (ocmp(p, pp) != 0 && ocmp(n, pp) != 0) { /*  
values != and not nil */ 
                                        p = n;
                                        break;
                                }
                        }
                }
+               }
        }
        _s = ATOMsize(ATOMtype(b->ttype));
        if (b->ttype == TYPE_void)
@@ -391,7 +434,6 @@ SQLnil_grp(Client cntxt, MalBlkPtr mb, M
        BUN i, ngrp, ncand;
        struct canditer ci;
        str msg = MAL_SUCCEED;
-       bit hasnil = 0;
 
        (void)cntxt;
        (void)mb;
@@ -491,8 +533,8 @@ SQLnil_grp(Client cntxt, MalBlkPtr mb, M
                res->tkey = BATcount(res) <= 1;
                res->tsorted = BATcount(res) <= 1;
                res->trevsorted = BATcount(res) <= 1;
-               res->tnil = hasnil != 0;
-               res->tnonil = hasnil == 0;
+               res->tnil = false;
+               res->tnonil = true;
        }
 
 bailout:
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to