Changeset: ab48214902b5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ab48214902b5
Modified Files:
        gdk/gdk_calc.c
        gdk/gdk_subquery.c
        sql/test/miscellaneous/Tests/simple_selects.test
Branch: default
Log Message:

Improving for fixed size types


diffs (truncated from 688 to 300 lines):

diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -1268,35 +1268,71 @@ BATcalcmin(BAT *b1, BAT *b2, BAT *s1, BA
                BATiter b1i = bat_iterator(b1), b2i = bat_iterator(b2);
                int (*cmp)(const void *, const void *) = ATOMcompare(b1->ttype);
 
-               if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) {
-                       for (BUN i = 0; i < ncand; i++) {
-                               oid x1 = canditer_next_dense(&ci1) - b1hseqbase;
-                               oid x2 = canditer_next_dense(&ci2) - b2hseqbase;
-                               const void *p1 = BUNtail(b1i, x1);
-                               const void *p2 = BUNtail(b2i, x2);
-                               if (cmp(p1, nil) == 0 || cmp(p2, nil) == 0) {
-                                       nils = true;
-                                       p1 = nil;
-                               } else {
-                                       p1 = cmp(p1, p2) < 0 ? p1 : p2;
+               if (ATOMvarsized(b1->ttype)) {
+                       if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x1 = canditer_next_dense(&ci1) - 
b1hseqbase;
+                                       oid x2 = canditer_next_dense(&ci2) - 
b2hseqbase;
+                                       const void *p1 = BUNtail(b1i, x1);
+                                       const void *p2 = BUNtail(b2i, x2);
+                                       if (cmp(p1, nil) == 0 || cmp(p2, nil) 
== 0) {
+                                               nils = true;
+                                               p1 = nil;
+                                       } else {
+                                               p1 = cmp(p1, p2) < 0 ? p1 : p2;
+                                       }
+                                       if (tfastins_nocheckVAR(bn, i, p1, 
Tsize(bn)) != GDK_SUCCEED)
+                                               goto bunins_failed;
                                }
-                               if (tfastins_nocheckVAR(bn, i, p1, Tsize(bn)) 
!= GDK_SUCCEED)
-                                       goto bunins_failed;
+                       } else {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x1 = canditer_next(&ci1) - 
b1hseqbase;
+                                       oid x2 = canditer_next(&ci2) - 
b2hseqbase;
+                                       const void *p1 = BUNtail(b1i, x1);
+                                       const void *p2 = BUNtail(b2i, x2);
+                                       if (cmp(p1, nil) == 0 || cmp(p2, nil) 
== 0) {
+                                               nils = true;
+                                               p1 = nil;
+                                       } else {
+                                               p1 = cmp(p1, p2) < 0 ? p1 : p2;
+                                       }
+                                       if (tfastins_nocheckVAR(bn, i, p1, 
Tsize(bn)) != GDK_SUCCEED)
+                                               goto bunins_failed;
+                               }
                        }
                } else {
-                       for (BUN i = 0; i < ncand; i++) {
-                               oid x1 = canditer_next(&ci1) - b1hseqbase;
-                               oid x2 = canditer_next(&ci2) - b2hseqbase;
-                               const void *p1 = BUNtail(b1i, x1);
-                               const void *p2 = BUNtail(b2i, x2);
-                               if (cmp(p1, nil) == 0 || cmp(p2, nil) == 0) {
-                                       nils = true;
-                                       p1 = nil;
-                               } else {
-                                       p1 = cmp(p1, p2) < 0 ? p1 : p2;
+                       uint8_t *restrict bcast = (uint8_t *) Tloc(bn, 0);
+                       uint16_t width = bn->twidth;
+                       if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x1 = canditer_next_dense(&ci1) - 
b1hseqbase;
+                                       oid x2 = canditer_next_dense(&ci2) - 
b2hseqbase;
+                                       const void *p1 = BUNtail(b1i, x1);
+                                       const void *p2 = BUNtail(b2i, x2);
+                                       if (cmp(p1, nil) == 0 || cmp(p2, nil) 
== 0) {
+                                               nils = true;
+                                               p1 = nil;
+                                       } else {
+                                               p1 = cmp(p1, p2) < 0 ? p1 : p2;
+                                       }
+                                       memcpy(bcast, p1, width);
+                                       bcast += width;
                                }
-                               if (tfastins_nocheckVAR(bn, i, p1, Tsize(bn)) 
!= GDK_SUCCEED)
-                                       goto bunins_failed;
+                       } else {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x1 = canditer_next(&ci1) - 
b1hseqbase;
+                                       oid x2 = canditer_next(&ci2) - 
b2hseqbase;
+                                       const void *p1 = BUNtail(b1i, x1);
+                                       const void *p2 = BUNtail(b2i, x2);
+                                       if (cmp(p1, nil) == 0 || cmp(p2, nil) 
== 0) {
+                                               nils = true;
+                                               p1 = nil;
+                                       } else {
+                                               p1 = cmp(p1, p2) < 0 ? p1 : p2;
+                                       }
+                                       memcpy(bcast, p1, width);
+                                       bcast += width;
+                               }
                        }
                }
        }
@@ -1427,43 +1463,87 @@ BATcalcmin_no_nil(BAT *b1, BAT *b2, BAT 
                BATiter b1i = bat_iterator(b1), b2i = bat_iterator(b2);
                int (*cmp)(const void *, const void *) = ATOMcompare(b1->ttype);
 
-               if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) {
-                       for (BUN i = 0; i < ncand; i++) {
-                               oid x1 = canditer_next_dense(&ci1) - b1hseqbase;
-                               oid x2 = canditer_next_dense(&ci2) - b2hseqbase;
-                               const void *p1 = BUNtail(b1i, x1);
-                               const void *p2 = BUNtail(b2i, x2);
-                               if (cmp(p1, nil) == 0) {
-                                       if (cmp(p2, nil) == 0) {
-                                               /* both values are nil */
-                                               nils = true;
+               if (ATOMvarsized(b1->ttype)) {
+                       if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x1 = canditer_next_dense(&ci1) - 
b1hseqbase;
+                                       oid x2 = canditer_next_dense(&ci2) - 
b2hseqbase;
+                                       const void *p1 = BUNtail(b1i, x1);
+                                       const void *p2 = BUNtail(b2i, x2);
+                                       if (cmp(p1, nil) == 0) {
+                                               if (cmp(p2, nil) == 0) {
+                                                       /* both values are nil 
*/
+                                                       nils = true;
+                                               } else {
+                                                       p1 = p2;
+                                               }
                                        } else {
-                                               p1 = p2;
+                                               p1 = cmp(p2, nil) != 0 && 
cmp(p2, p1) < 0 ? p2 : p1;
                                        }
-                               } else {
-                                       p1 = cmp(p2, nil) != 0 && cmp(p2, p1) < 
0 ? p2 : p1;
+                                       if (tfastins_nocheckVAR(bn, i, p1, 
Tsize(bn)) != GDK_SUCCEED)
+                                               goto bunins_failed;
                                }
-                               if (tfastins_nocheckVAR(bn, i, p1, Tsize(bn)) 
!= GDK_SUCCEED)
-                                       goto bunins_failed;
+                       } else {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x1 = canditer_next(&ci1) - 
b1hseqbase;
+                                       oid x2 = canditer_next(&ci2) - 
b2hseqbase;
+                                       const void *p1 = BUNtail(b1i, x1);
+                                       const void *p2 = BUNtail(b2i, x2);
+                                       if (cmp(p1, nil) == 0) {
+                                               if (cmp(p2, nil) == 0) {
+                                                       /* both values are nil 
*/
+                                                       nils = true;
+                                               } else {
+                                                       p1 = p2;
+                                               }
+                                       } else {
+                                               p1 = cmp(p2, nil) != 0 && 
cmp(p2, p1) < 0 ? p2 : p1;
+                                       }
+                                       if (tfastins_nocheckVAR(bn, i, p1, 
Tsize(bn)) != GDK_SUCCEED)
+                                               goto bunins_failed;
+                               }
                        }
                } else {
-                       for (BUN i = 0; i < ncand; i++) {
-                               oid x1 = canditer_next(&ci1) - b1hseqbase;
-                               oid x2 = canditer_next(&ci2) - b2hseqbase;
-                               const void *p1 = BUNtail(b1i, x1);
-                               const void *p2 = BUNtail(b2i, x2);
-                               if (cmp(p1, nil) == 0) {
-                                       if (cmp(p2, nil) == 0) {
-                                               /* both values are nil */
-                                               nils = true;
+                       uint8_t *restrict bcast = (uint8_t *) Tloc(bn, 0);
+                       uint16_t width = bn->twidth;
+                       if (ci1.tpe == cand_dense && ci2.tpe == cand_dense) {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x1 = canditer_next_dense(&ci1) - 
b1hseqbase;
+                                       oid x2 = canditer_next_dense(&ci2) - 
b2hseqbase;
+                                       const void *p1 = BUNtail(b1i, x1);
+                                       const void *p2 = BUNtail(b2i, x2);
+                                       if (cmp(p1, nil) == 0) {
+                                               if (cmp(p2, nil) == 0) {
+                                                       /* both values are nil 
*/
+                                                       nils = true;
+                                               } else {
+                                                       p1 = p2;
+                                               }
                                        } else {
-                                               p1 = p2;
+                                               p1 = cmp(p2, nil) != 0 && 
cmp(p2, p1) < 0 ? p2 : p1;
                                        }
-                               } else {
-                                       p1 = cmp(p2, nil) != 0 && cmp(p2, p1) < 
0 ? p2 : p1;
+                                       memcpy(bcast, p1, width);
+                                       bcast += width;
                                }
-                               if (tfastins_nocheckVAR(bn, i, p1, Tsize(bn)) 
!= GDK_SUCCEED)
-                                       goto bunins_failed;
+                       } else {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x1 = canditer_next(&ci1) - 
b1hseqbase;
+                                       oid x2 = canditer_next(&ci2) - 
b2hseqbase;
+                                       const void *p1 = BUNtail(b1i, x1);
+                                       const void *p2 = BUNtail(b2i, x2);
+                                       if (cmp(p1, nil) == 0) {
+                                               if (cmp(p2, nil) == 0) {
+                                                       /* both values are nil 
*/
+                                                       nils = true;
+                                               } else {
+                                                       p1 = p2;
+                                               }
+                                       } else {
+                                               p1 = cmp(p2, nil) != 0 && 
cmp(p2, p1) < 0 ? p2 : p1;
+                                       }
+                                       memcpy(bcast, p1, width);
+                                       bcast += width;
+                               }
                        }
                }
        }
@@ -1571,17 +1651,34 @@ BATcalcmincst(BAT *b, const ValRecord *v
        default: {
                BATiter bi = bat_iterator(b);
 
-               for (BUN i = 0; i < ncand; i++) {
-                       oid x = canditer_next(&ci) - bhseqbase;
-                       const void *p1 = BUNtail(bi, x);
-                       if (cmp(p1, nil) == 0) {
-                               nils = true;
-                               p1 = nil;
-                       } else {
-                               p1 = cmp(p1, p2) < 0 ? p1 : p2;
-                       }
-                       if (tfastins_nocheckVAR(bn, i, p1, Tsize(bn)) != 
GDK_SUCCEED)
-                               goto bunins_failed;
+               if (ATOMvarsized(b->ttype)) {
+                       for (BUN i = 0; i < ncand; i++) {
+                               oid x = canditer_next(&ci) - bhseqbase;
+                               const void *restrict p1 = BUNtail(bi, x);
+                               if (cmp(p1, nil) == 0) {
+                                       nils = true;
+                                       p1 = nil;
+                               } else {
+                                       p1 = cmp(p1, p2) < 0 ? p1 : p2;
+                               }
+                               if (tfastins_nocheckVAR(bn, i, p1, Tsize(bn)) 
!= GDK_SUCCEED)
+                                       goto bunins_failed;
+                       }
+               } else {
+                       uint8_t *restrict bcast = (uint8_t *) Tloc(bn, 0);
+                       uint16_t width = bn->twidth;
+                       for (BUN i = 0; i < ncand; i++) {
+                               oid x = canditer_next(&ci) - bhseqbase;
+                               const void *restrict p1 = BUNtail(bi, x);
+                               if (cmp(p1, nil) == 0) {
+                                       nils = true;
+                                       p1 = nil;
+                               } else {
+                                       p1 = cmp(p1, p2) < 0 ? p1 : p2;
+                               }
+                               memcpy(bcast, p1, width);
+                               bcast += width;
+                       }
                }
        }
        }
@@ -1703,21 +1800,43 @@ BATcalcmincst_no_nil(BAT *b, const ValRe
        default: {
                BATiter bi = bat_iterator(b);
 
-               if (cmp(p2, nil) == 0) {
-                       for (BUN i = 0; i < ncand; i++) {
-                               oid x = canditer_next(&ci) - bhseqbase;
-                               const void *p1 = BUNtail(bi, x);
-                               nils |= cmp(p1, nil) == 0;
-                               if (tfastins_nocheckVAR(bn, i, p1, Tsize(bn)) 
!= GDK_SUCCEED)
-                                       goto bunins_failed;
+               if (ATOMvarsized(b->ttype)) {
+                       if (cmp(p2, nil) == 0) {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x = canditer_next(&ci) - bhseqbase;
+                                       const void *restrict p1 = BUNtail(bi, 
x);
+                                       nils |= cmp(p1, nil) == 0;
+                                       if (tfastins_nocheckVAR(bn, i, p1, 
Tsize(bn)) != GDK_SUCCEED)
+                                               goto bunins_failed;
+                               }
+                       } else {
+                               for (BUN i = 0; i < ncand; i++) {
+                                       oid x = canditer_next(&ci) - bhseqbase;
+                                       const void *restrict p1 = BUNtail(bi, 
x);
+                                       p1 = cmp(p1, nil) == 0 || cmp(p2, p1) < 
0 ? p2 : p1;
+                                       if (tfastins_nocheckVAR(bn, i, p1, 
Tsize(bn)) != GDK_SUCCEED)
+                                               goto bunins_failed;
+                               }
                        }
                } else {
-                       for (BUN i = 0; i < ncand; i++) {
-                               oid x = canditer_next(&ci) - bhseqbase;
-                               const void *p1 = BUNtail(bi, x);
-                               p1 = cmp(p1, nil) == 0 || cmp(p2, p1) < 0 ? p2 
: p1;
-                               if (tfastins_nocheckVAR(bn, i, p1, Tsize(bn)) 
!= GDK_SUCCEED)
-                                       goto bunins_failed;
+                       uint8_t *restrict bcast = (uint8_t *) Tloc(bn, 0);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to