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