Changeset: b51e0d4dae3f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b51e0d4dae3f
Removed Files:
        monetdb5/modules/kernel/batcast.mx
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk_calc.c
        monetdb5/mal/Tests/tst913.mal
        monetdb5/mal/Tests/tst913.stable.out
        monetdb5/modules/kernel/Makefile.ag
        monetdb5/modules/kernel/batcalc.c
        monetdb5/modules/kernel/batcalc.mal
        monetdb5/modules/kernel/batcalc.mal.sh
        monetdb5/optimizer/Tests/GCexample.stable.out
        monetdb5/optimizer/Tests/tst4800.stable.out
        monetdb5/optimizer/Tests/tst4900.stable.out
Branch: default
Log Message:

Use gdk_calc code for type coercion in MAL.
This should fix bug 2999.


diffs (truncated from 2218 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1330,94 +1330,8 @@ str CMDclearTrace(int *res);
 str CMDcloseProfilerStream(int *res);
 str CMDclrFilterProfiler(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 str CMDclrFilterVariable(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pc);
-str CMDconvert_bit(int *ret, int *bid);
-str CMDconvert_bit_bte(int *ret, int *bid);
-str CMDconvert_bit_int(int *ret, int *bid);
-str CMDconvert_bit_lng(int *ret, int *bid);
-str CMDconvert_bit_sht(int *ret, int *bid);
-str CMDconvert_bit_str(int *ret, int *bid);
-str CMDconvert_bit_wrd(int *ret, int *bid);
-str CMDconvert_bte(int *ret, int *bid);
-str CMDconvert_bte_bit(int *ret, int *bid);
-str CMDconvert_bte_dbl(int *ret, int *bid);
-str CMDconvert_bte_flt(int *ret, int *bid);
-str CMDconvert_bte_int(int *ret, int *bid);
-str CMDconvert_bte_lng(int *ret, int *bid);
-str CMDconvert_bte_oid(int *ret, int *bid);
-str CMDconvert_bte_sht(int *ret, int *bid);
-str CMDconvert_bte_str(int *ret, int *bid);
-str CMDconvert_bte_wrd(int *ret, int *bid);
-str CMDconvert_dbl(int *ret, int *bid);
-str CMDconvert_dbl_bte(int *ret, int *bid);
-str CMDconvert_dbl_flt(int *ret, int *bid);
-str CMDconvert_dbl_int(int *ret, int *bid);
-str CMDconvert_dbl_lng(int *ret, int *bid);
-str CMDconvert_dbl_sht(int *ret, int *bid);
-str CMDconvert_dbl_str(int *ret, int *bid);
-str CMDconvert_dbl_wrd(int *ret, int *bid);
-str CMDconvert_flt(int *ret, int *bid);
-str CMDconvert_flt_bte(int *ret, int *bid);
-str CMDconvert_flt_dbl(int *ret, int *bid);
-str CMDconvert_flt_int(int *ret, int *bid);
-str CMDconvert_flt_lng(int *ret, int *bid);
-str CMDconvert_flt_sht(int *ret, int *bid);
-str CMDconvert_flt_str(int *ret, int *bid);
-str CMDconvert_flt_wrd(int *ret, int *bid);
-str CMDconvert_int(int *ret, int *bid);
-str CMDconvert_int_bit(int *ret, int *bid);
-str CMDconvert_int_bte(int *ret, int *bid);
-str CMDconvert_int_dbl(int *ret, int *bid);
-str CMDconvert_int_flt(int *ret, int *bid);
-str CMDconvert_int_lng(int *ret, int *bid);
-str CMDconvert_int_oid(int *ret, int *bid);
-str CMDconvert_int_sht(int *ret, int *bid);
-str CMDconvert_int_str(int *ret, int *bid);
-str CMDconvert_int_wrd(int *ret, int *bid);
-str CMDconvert_lng(int *ret, int *bid);
-str CMDconvert_lng_bit(int *ret, int *bid);
-str CMDconvert_lng_bte(int *ret, int *bid);
-str CMDconvert_lng_dbl(int *ret, int *bid);
-str CMDconvert_lng_flt(int *ret, int *bid);
-str CMDconvert_lng_int(int *ret, int *bid);
-str CMDconvert_lng_oid(int *ret, int *bid);
-str CMDconvert_lng_sht(int *ret, int *bid);
-str CMDconvert_lng_str(int *ret, int *bid);
-str CMDconvert_lng_wrd(int *ret, int *bid);
-str CMDconvert_oid(int *ret, int *bid);
-str CMDconvert_oid_bte(int *ret, int *bid);
-str CMDconvert_oid_dbl(int *ret, int *bid);
-str CMDconvert_oid_flt(int *ret, int *bid);
-str CMDconvert_oid_int(int *ret, int *bid);
-str CMDconvert_oid_lng(int *ret, int *bid);
-str CMDconvert_oid_sht(int *ret, int *bid);
-str CMDconvert_oid_wrd(int *ret, int *bid);
-str CMDconvert_sht(int *ret, int *bid);
-str CMDconvert_sht_bit(int *ret, int *bid);
-str CMDconvert_sht_bte(int *ret, int *bid);
-str CMDconvert_sht_dbl(int *ret, int *bid);
-str CMDconvert_sht_flt(int *ret, int *bid);
-str CMDconvert_sht_int(int *ret, int *bid);
-str CMDconvert_sht_lng(int *ret, int *bid);
-str CMDconvert_sht_oid(int *ret, int *bid);
-str CMDconvert_sht_str(int *ret, int *bid);
-str CMDconvert_sht_wrd(int *ret, int *bid);
-str CMDconvert_str(int *ret, int *bid);
-str CMDconvert_str_bit(int *ret, int *bid);
-str CMDconvert_str_bte(int *ret, int *bid);
-str CMDconvert_str_dbl(int *ret, int *bid);
-str CMDconvert_str_flt(int *ret, int *bid);
-str CMDconvert_str_int(int *ret, int *bid);
-str CMDconvert_str_lng(int *ret, int *bid);
-str CMDconvert_str_sht(int *ret, int *bid);
-str CMDconvert_wrd(int *ret, int *bid);
-str CMDconvert_wrd_bit(int *ret, int *bid);
-str CMDconvert_wrd_bte(int *ret, int *bid);
-str CMDconvert_wrd_dbl(int *ret, int *bid);
-str CMDconvert_wrd_flt(int *ret, int *bid);
-str CMDconvert_wrd_int(int *ret, int *bid);
-str CMDconvert_wrd_lng(int *ret, int *bid);
-str CMDconvert_wrd_oid(int *ret, int *bid);
-str CMDconvert_wrd_sht(int *ret, int *bid);
+str CMDconvert(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
+str CMDconvertsignal(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
 str CMDdeactivateProfiler(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 str CMDdebug(int *ret, int *flg);
 str CMDdumpTrace(int *res);
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -12371,12 +12371,14 @@ convert_any_str(int tp, const void *src,
        BUN i;
        void *nil = ATOMnilptr(tp);
        int (*atomtostr)(str *, int *, const void *) = BATatoms[tp].atomToStr;
+       int size = ATOMsize(tp);
 
        for (i = 0; i < cnt; i++) {
                (*atomtostr)(&dst, &len, src);
                if (ATOMcmp(tp, src, nil) == 0)
                        nils++;
                tfastins_nocheck(bn, i, dst, bn->T->width);
+               src = (const void *) ((const char *) src + size);
        }
        BATsetcount(bn, cnt);
        if (dst)
@@ -12417,6 +12419,120 @@ convert_str_any(BAT *b, int tp, void *ds
 }
 
 static BUN
+convert_void_any(oid seq, BUN cnt, BAT *bn, int abort_on_error)
+{
+       BUN cnt1 = 0;
+       BUN i = 0;
+       int tp = bn->T->type;
+       void *dst = Tloc(bn, bn->U->first);
+       int (*atomtostr)(str *, int *, const void *) = 
BATatoms[TYPE_oid].atomToStr;
+       str s = 0;
+       int len = 0;
+
+       if (seq != oid_nil) {
+               if (ATOMsize(tp) < ATOMsize(TYPE_oid) &&
+                   seq + cnt >= (oid) 1 << (8 * ATOMsize(tp) - 1)) {
+                       /* overflow */
+                       if (abort_on_error)
+                               return BUN_NONE;
+                       cnt1 = ((oid) 1 << (8 * ATOMsize(tp) - 1)) - seq;
+               } else {
+                       cnt1 = cnt;
+               }
+               switch (ATOMstorage(tp)) {
+               case TYPE_bte:
+                       if (tp == TYPE_bit) {
+                               for (i = 0; i < cnt1; i++)
+                                       ((bte *) dst)[i] = 1;
+                               /* only the first one could be 0 */
+                               if (cnt1 > 0 && seq == 0)
+                                       ((bte *) dst)[0] = 0;
+                       } else {
+                               for (i = 0; i < cnt1; i++)
+                                       ((bte *) dst)[i] = (bte) seq++;
+                               for (; i < cnt; i++)
+                                       ((bte *) dst)[i] = bte_nil;
+                       }
+                       break;
+               case TYPE_sht:
+                       for (i = 0; i < cnt1; i++)
+                               ((sht *) dst)[i] = (sht) seq++;
+                       break;
+               case TYPE_int:
+                       for (i = 0; i < cnt1; i++)
+                               ((int *) dst)[i] = (int) seq++;
+                       break;
+               case TYPE_lng:
+                       for (i = 0; i < cnt1; i++)
+                               ((lng *) dst)[i] = (lng) seq++;
+                       break;
+               case TYPE_flt:
+                       for (i = 0; i < cnt1; i++)
+                               ((flt *) dst)[i] = (flt) seq++;
+                       break;
+               case TYPE_dbl:
+                       for (i = 0; i < cnt1; i++)
+                               ((dbl *) dst)[i] = (dbl) seq++;
+                       break;
+               case TYPE_str:
+                       for (i = 0; i < cnt1; i++) {
+                               (*atomtostr)(&s, &len, &seq);
+                               tfastins_nocheck(bn, i, dst, bn->T->width);
+                               seq++;
+                       }
+                       break;
+               default:
+                       /* dealt with below */
+                       break;
+               }
+       }
+       switch (ATOMstorage(tp)) {
+       case TYPE_bte:
+               for (; i < cnt; i++)
+                       ((bte *) dst)[i] = bte_nil;
+               break;
+       case TYPE_sht:
+               for (; i < cnt; i++)
+                       ((sht *) dst)[i] = sht_nil;
+               break;
+       case TYPE_int:
+               for (; i < cnt; i++)
+                       ((int *) dst)[i] = int_nil;
+               break;
+       case TYPE_lng:
+               for (; i < cnt; i++)
+                       ((lng *) dst)[i] = lng_nil;
+               break;
+       case TYPE_flt:
+               for (; i < cnt; i++)
+                       ((flt *) dst)[i] = flt_nil;
+               break;
+       case TYPE_dbl:
+               for (; i < cnt; i++)
+                       ((dbl *) dst)[i] = dbl_nil;
+               break;
+       case TYPE_str:
+               seq = oid_nil;
+               for (; i < cnt; i++) {
+                       (*atomtostr)(&s, &len, &seq);
+                       tfastins_nocheck(bn, i, dst, bn->T->width);
+                       seq++;
+               }
+               if (s)
+                       GDKfree(s);
+               break;
+       default:
+               return BUN_NONE + 1;
+       }
+       return cnt - cnt1;
+
+  bunins_failed:
+       if (s)
+               GDKfree(s);
+       return BUN_NONE;
+}
+
+static BUN
 convert_typeswitchloop(const void *src, int stp, void *dst, int dtp,
                       BUN cnt, int abort_on_error)
 {
@@ -12626,11 +12742,14 @@ BATconvert(BAT *b, int tp, int abort_on_
        if (bn == NULL)
                return NULL;
 
-       if (tp == TYPE_str)
+       if (b->T->type == TYPE_void)
+               nils = convert_void_any(b->T->seq, b->U->count, bn,
+                                       abort_on_error);
+       else if (tp == TYPE_str)
                nils = convert_any_str(b->T->type, Tloc(b, b->U->first),
                                       bn, b->U->count);
        else if (b->T->type == TYPE_str)
-               nils = convert_str_any(b, b->T->type, Tloc(bn, bn->U->first),
+               nils = convert_str_any(b, tp, Tloc(bn, bn->U->first),
                                       abort_on_error);
        else
                nils = convert_typeswitchloop(Tloc(b, b->U->first), b->T->type,
diff --git a/monetdb5/mal/Tests/tst913.mal b/monetdb5/mal/Tests/tst913.mal
--- a/monetdb5/mal/Tests/tst913.mal
+++ b/monetdb5/mal/Tests/tst913.mal
@@ -10,5 +10,5 @@ bat.insert(b,5,"");
 bat.insert(b,6,nil:str);
 io.print(b);
 
-bc:= batcalc.bit(b);
+bc:= batcalc.bit_noerror(b);
 io.print(bc);
diff --git a/monetdb5/mal/Tests/tst913.stable.out 
b/monetdb5/mal/Tests/tst913.stable.out
--- a/monetdb5/mal/Tests/tst913.stable.out
+++ b/monetdb5/mal/Tests/tst913.stable.out
@@ -38,7 +38,7 @@ function user.main():void;
     bat.insert(b,5,"");
     bat.insert(b,6,nil:str);
     io.print(b);
-    bc := batcalc.bit(b);
+    bc := batcalc.bit_noerror(b);
     io.print(bc);
 end main;
 #-------------------------#
diff --git a/monetdb5/modules/kernel/Makefile.ag 
b/monetdb5/modules/kernel/Makefile.ag
--- a/monetdb5/modules/kernel/Makefile.ag
+++ b/monetdb5/modules/kernel/Makefile.ag
@@ -43,7 +43,6 @@ lib_kernel = {
                array.mx \
                bat5.mx \
                batcalc.c \
-               batcast.mx \
                batcolor.mx \
                batifthen.mx \
                batmmath.mx \
@@ -66,7 +65,7 @@ headers_mal = {
        DIR = libdir/monetdb5
        SOURCES = calc.mal bat5.mx algebra.mx status.mx unix.mal \
                mmath.mx lock.mal sema.mal alarm.mal batstr.mx batmtime.mx \
-               batcolor.mx batifthen.mx batcast.mx batcalc.mal batmmath.mx \
+               batcolor.mx batifthen.mx batcalc.mal batmmath.mx \
                group.mx aggr.mx array.mx \
                counters.mal logger.mal microbenchmark.mal
 }
diff --git a/monetdb5/modules/kernel/batcalc.c 
b/monetdb5/modules/kernel/batcalc.c
--- a/monetdb5/modules/kernel/batcalc.c
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to