Changeset: 30504820f792 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=30504820f792 Modified Files: clients/Tests/MAL-signatures.stable.out.int128 clients/Tests/SQL-dump.stable.out clients/Tests/SQL-dump.stable.out.int128 clients/Tests/exports.stable.out gdk/ChangeLog.Dec2016 gdk/gdk_atoms.c gdk/gdk_atoms.h gdk/gdk_calc.c monetdb5/modules/mal/00_batcalc_hge.mal monetdb5/modules/mal/00_batcalc_hge.mal.sh monetdb5/modules/mal/00_calc_hge.mal monetdb5/modules/mal/00_calc_hge.mal.sh monetdb5/modules/mal/01_batcalc.mal monetdb5/modules/mal/01_batcalc.mal.sh monetdb5/modules/mal/01_calc.mal monetdb5/modules/mal/01_calc.mal.sh sql/backends/monet5/UDF/pyapi/pyapi.c sql/test/emptydb-upgrade-chain-hge/Tests/check.stable.out.int128 sql/test/emptydb-upgrade-chain/Tests/check.stable.out sql/test/emptydb-upgrade-chain/Tests/check.stable.out.32bit sql/test/emptydb-upgrade-chain/Tests/check.stable.out.int128 sql/test/emptydb-upgrade-hge/Tests/check.stable.out.int128 sql/test/emptydb-upgrade/Tests/check.stable.out sql/test/emptydb-upgrade/Tests/check.stable.out.32bit sql/test/emptydb-upgrade/Tests/check.stable.out.int128 sql/test/emptydb/Tests/check.stable.out sql/test/emptydb/Tests/check.stable.out.32bit sql/test/emptydb/Tests/check.stable.out.int128 sql/test/emptydb/Tests/load.stable.out sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.32bit sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.out.32bit sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128 Branch: default Log Message:
Merge with Dec2016 branch. diffs (truncated from 1416 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -7543,47 +7543,11 @@ Ready. [ "batcalc", "sign", "pattern batcalc.sign(b:bat[:sht]):bat[:bte] ", "CMDbatSIGN;", "Unary sign (-1,0,1) over the tail of the bat" ] [ "batcalc", "sign", "pattern batcalc.sign(b:bat[:sht],s:bat[:oid]):bat[:bte] ", "CMDbatSIGN;", "Unary sign (-1,0,1) over the tail of the bat with candidates list" ] [ "batcalc", "sqlblob", "command batcalc.sqlblob(v:bat[:str]):bat[:sqlblob] ", "batstr_2_sqlblob;", "cast to sqlblob" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:bit]):bat[:str] ", "CMDconvertsignal_str;", "cast from bit to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:bit],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from bit to str with candidates list, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:bte]):bat[:str] ", "CMDconvertsignal_str;", "cast from bte to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:bte],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from bte to str with candidates list, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:dbl]):bat[:str] ", "CMDconvertsignal_str;", "cast from dbl to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:dbl],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from dbl to str with candidates list, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:flt]):bat[:str] ", "CMDconvertsignal_str;", "cast from flt to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:flt],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from flt to str with candidates list, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:hge]):bat[:str] ", "CMDconvertsignal_str;", "cast from hge to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:hge],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from hge to str with candidates list, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:int]):bat[:str] ", "CMDconvertsignal_str;", "cast from int to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:int],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from int to str with candidates list, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:lng]):bat[:str] ", "CMDconvertsignal_str;", "cast from lng to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:lng],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from lng to str with candidates list, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from oid to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:oid],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from oid to str with candidates list, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:sht]):bat[:str] ", "CMDconvertsignal_str;", "cast from sht to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:sht],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from sht to str with candidates list, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:str]):bat[:str] ", "CMDconvertsignal_str;", "cast from str to str, signal error on overflow" ] -[ "batcalc", "str", "pattern batcalc.str(b:bat[:str],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from str to str with candidates list, signal error on overflow" ] +[ "batcalc", "str", "pattern batcalc.str(b:bat[:any]):bat[:str] ", "CMDconvertsignal_str;", "cast from any to str, signal error on overflow" ] +[ "batcalc", "str", "pattern batcalc.str(b:bat[:any],s:bat[:oid]):bat[:str] ", "CMDconvertsignal_str;", "cast from any to str with candidates list, signal error on overflow" ] [ "batcalc", "str", "pattern batcalc.str(eclass:int,d1:int,s1:int,has_tz:int,v:bat[:any_1],digits:int):bat[:str] ", "SQLbatstr_cast;", "cast to string and check for overflow" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:bit]):bat[:str] ", "CMDconvert_str;", "cast from bit to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:bit],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from bit to str with candidates list" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:bte]):bat[:str] ", "CMDconvert_str;", "cast from bte to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:bte],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from bte to str with candidates list" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:dbl]):bat[:str] ", "CMDconvert_str;", "cast from dbl to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:dbl],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from dbl to str with candidates list" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:flt]):bat[:str] ", "CMDconvert_str;", "cast from flt to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:flt],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from flt to str with candidates list" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:hge]):bat[:str] ", "CMDconvert_str;", "cast from hge to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:hge],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from hge to str with candidates list" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:int]):bat[:str] ", "CMDconvert_str;", "cast from int to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:int],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from int to str with candidates list" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:lng]):bat[:str] ", "CMDconvert_str;", "cast from lng to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:lng],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from lng to str with candidates list" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from oid to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:oid],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from oid to str with candidates list" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:sht]):bat[:str] ", "CMDconvert_str;", "cast from sht to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:sht],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from sht to str with candidates list" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:str]):bat[:str] ", "CMDconvert_str;", "cast from str to str" ] -[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:str],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from str to str with candidates list" ] +[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:any]):bat[:str] ", "CMDconvert_str;", "cast from any to str" ] +[ "batcalc", "str_noerror", "pattern batcalc.str_noerror(b:bat[:any],s:bat[:oid]):bat[:str] ", "CMDconvert_str;", "cast from any to str with candidates list" ] [ "batcalc", "strings", "command batcalc.strings(v:bat[:str]):bat[:str] ", "BATSTRstrings;", "Return the strings" ] [ "batcalc", "sub_noerror", "pattern batcalc.sub_noerror(b1:bat[:bte],b2:bat[:bte]):bat[:bte] ", "CMDbatSUB;", "Return B1 - B2, overflow causes NIL value" ] [ "batcalc", "sub_noerror", "pattern batcalc.sub_noerror(b1:bat[:bte],b2:bat[:bte],s:bat[:oid]):bat[:bte] ", "CMDbatSUB;", "Return B1 - B2 with candidates list, overflow causes NIL value" ] @@ -9664,17 +9628,7 @@ Ready. [ "calc", "sqlblob", "command calc.sqlblob(b:sqlblob):sqlblob ", "BLOBblob_blob;", "" ] [ "calc", "sqlblob", "command calc.sqlblob(s:str):sqlblob ", "BLOBsqlblob_fromstr;", "" ] [ "calc", "sqlblob", "command calc.sqlblob(v:str):sqlblob ", "str_2_sqlblob;", "cast to sqlblob" ] -[ "calc", "str", "pattern calc.str(v:bit):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:bte):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:dbl):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:flt):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:hge):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:int):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:lng):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:oid):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:sht):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:str):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] -[ "calc", "str", "pattern calc.str(v:void):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] +[ "calc", "str", "pattern calc.str(v:any):str ", "CMDvarCONVERT;", "Cast VALUE to str" ] [ "calc", "str", "command calc.str(v:date):str ", "SQLdate_2_str;", "cast date to str" ] [ "calc", "str", "command calc.str(v:sqlblob):str ", "SQLsqlblob_2_str;", "cast sqlblob to str" ] [ "calc", "str", "pattern calc.str(eclass:int,d1:int,s1:int,has_tz:int,v:any_1,digits:int):str ", "SQLstr_cast;", "cast to string and check for overflow" ] 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 @@ -484,7 +484,6 @@ int strFromStr(const char *src, int *len BUN strHash(const char *s); int strLen(const char *s); int strNil(const char *s); -int strToStr(str *dst, int *len, const char *src); const char str_nil[2]; gdk_return void_inplace(BAT *b, oid id, const void *val, bit force); BUN void_replace_bat(BAT *b, BAT *p, BAT *u, bit force); diff --git a/gdk/ChangeLog.Dec2016 b/gdk/ChangeLog.Dec2016 --- a/gdk/ChangeLog.Dec2016 +++ b/gdk/ChangeLog.Dec2016 @@ -1,6 +1,10 @@ # ChangeLog file for MonetDB # This file is updated with Maddlog +* Wed Oct 26 2016 Sjoerd Mullender <sjo...@acm.org> +- Implemented conversion to str from any type (not just the internal + types). + * Wed Sep 14 2016 Sjoerd Mullender <sjo...@acm.org> - VALcopy and VALinit both return their first argument on success or (and that's new) NULL on (allocation) failure. diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -1706,7 +1706,7 @@ escapedStr(char *dst, const char *src, i return l; } -int +static int strToStr(char **dst, int *len, const char *src) { int l = 0; diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h --- a/gdk/gdk_atoms.h +++ b/gdk/gdk_atoms.h @@ -92,7 +92,6 @@ gdk_export int dblFromStr(const char *sr gdk_export int dblToStr(str *dst, int *len, const dbl *src); gdk_export ssize_t GDKstrFromStr(unsigned char *dst, const unsigned char *src, ssize_t len); gdk_export int strFromStr(const char *src, int *len, str *dst); -gdk_export int strToStr(str *dst, int *len, const char *src); gdk_export BUN strHash(const char *s); gdk_export int strLen(const char *s); gdk_export int strNil(const char *s); diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c --- a/gdk/gdk_calc.c +++ b/gdk/gdk_calc.c @@ -13589,46 +13589,93 @@ convert2bit_impl(flt) convert2bit_impl(dbl) static BUN -convert_any_str(int tp, const void *src, BAT *bn, BUN cnt, - BUN start, BUN end, const oid *restrict cand, - const oid *candend, oid candoff) -{ +convert_any_str(BAT *b, BAT *bn, BUN cnt, BUN start, BUN end, + const oid *restrict cand, const oid *candend) +{ + int tp = b->ttype; + oid candoff = b->hseqbase; str dst = 0; int len = 0; BUN nils = 0; BUN i; const void *nil = ATOMnilptr(tp); + const void *restrict src; int (*atomtostr)(str *, int *, const void *) = BATatoms[tp].atomToStr; - int size = ATOMsize(tp); + int (*atomcmp)(const void *, const void *) = ATOMcompare(tp); for (i = 0; i < start; i++) tfastins_nocheck(bn, i, str_nil, bn->twidth); - for (i = start; i < end; i++) { - if (cand) { - if (i < *cand - candoff) { + if (atomtostr == BATatoms[TYPE_str].atomToStr) { + /* compatible with str, we just copy the value */ + BATiter bi = bat_iterator(b); + + assert(b->ttype != TYPE_void); + for (i = start; i < end; i++) { + if (cand) { + if (i < *cand - candoff) { + nils++; + tfastins_nocheck(bn, i, str_nil, bn->twidth); + continue; + } + assert(i == *cand - candoff); + if (++cand == candend) + end = i + 1; + } + src = BUNtvar(bi, i); + if ((*atomcmp)(src, str_nil) == 0) nils++; - tfastins_nocheck(bn, i, str_nil, bn->twidth); - continue; - } - assert(i == *cand - candoff); - if (++cand == candend) - end = i + 1; - } - (*atomtostr)(&dst, &len, src); - if (ATOMcmp(tp, src, nil) == 0) - nils++; - tfastins_nocheck(bn, i, dst, bn->twidth); - src = (const void *) ((const char *) src + size); + tfastins_nocheck(bn, i, src, bn->twidth); + } + } else if (b->tvarsized) { + BATiter bi = bat_iterator(b); + + assert(b->ttype != TYPE_void); + for (i = start; i < end; i++) { + if (cand) { + if (i < *cand - candoff) { + nils++; + tfastins_nocheck(bn, i, str_nil, bn->twidth); + continue; + } + assert(i == *cand - candoff); + if (++cand == candend) + end = i + 1; + } + src = BUNtvar(bi, i); + (*atomtostr)(&dst, &len, src); + if ((*atomcmp)(src, nil) == 0) + nils++; + tfastins_nocheck(bn, i, dst, bn->twidth); + } + } else { + int size = ATOMsize(tp); + + src = Tloc(b, 0); + for (i = start; i < end; i++) { + if (cand) { + if (i < *cand - candoff) { + nils++; + tfastins_nocheck(bn, i, str_nil, bn->twidth); + continue; + } + assert(i == *cand - candoff); + if (++cand == candend) + end = i + 1; + } + (*atomtostr)(&dst, &len, src); + if ((*atomcmp)(src, nil) == 0) + nils++; + tfastins_nocheck(bn, i, dst, bn->twidth); + src = (const void *) ((const char *) src + size); + } } for (i = end; i < cnt; i++) tfastins_nocheck(bn, i, str_nil, bn->twidth); BATsetcount(bn, cnt); - if (dst) - GDKfree(dst); + GDKfree(dst); return nils; bunins_failed: - if (dst) - GDKfree(dst); + GDKfree(dst); return BUN_NONE + 2; } @@ -14279,7 +14326,10 @@ BATconvert(BAT *b, BAT *s, int tp, int a CANDINIT(b, s, start, end, cnt, cand, candend); - if (s == NULL && tp != TYPE_bit && ATOMbasetype(b->ttype) == ATOMbasetype(tp)){ + if (s == NULL && tp != TYPE_bit && + ATOMbasetype(b->ttype) == ATOMbasetype(tp) && + (tp != TYPE_str || + BATatoms[b->ttype].atomToStr == BATatoms[TYPE_str].atomToStr)) { return COLcopy(b, tp, 0, TRANSIENT); } @@ -14292,9 +14342,7 @@ BATconvert(BAT *b, BAT *s, int tp, int a start, end, cand, candend, b->hseqbase, abort_on_error); else if (tp == TYPE_str) - nils = convert_any_str(b->ttype, Tloc(b, 0), bn, - cnt, start, end, cand, candend, - b->hseqbase); + nils = convert_any_str(b, bn, cnt, start, end, cand, candend); else if (b->ttype == TYPE_str) nils = convert_str_any(b, tp, Tloc(bn, 0), start, end, cand, candend, b->hseqbase, @@ -14347,16 +14395,20 @@ VARconvert(ValPtr ret, const ValRecord * if (ret->vtype == TYPE_str) { if (v->vtype == TYPE_void || (*ATOMcompare(v->vtype))(VALptr(v), - ATOMnilptr(v->vtype)) == 0) { + ATOMnilptr(v->vtype)) == 0) { ret->val.sval = GDKstrdup(str_nil); - } else if (v->vtype == TYPE_str) { + } else if (BATatoms[v->vtype].atomToStr == BATatoms[TYPE_str].atomToStr) { ret->val.sval = GDKstrdup(v->val.sval); } else { ret->val.sval = NULL; - (*BATatoms[v->vtype].atomToStr)(&ret->val.sval, - &ret->len, - VALptr(v)); - } + ret->len = 0; + if ((*BATatoms[v->vtype].atomToStr)(&ret->val.sval, + &ret->len, + VALptr(v)) < 0) + nils = BUN_NONE; + } + if (ret->val.sval == NULL) + nils = BUN_NONE; } else if (ret->vtype == TYPE_void) { if (abort_on_error && ATOMcmp(v->vtype, VALptr(v), ATOMnilptr(v->vtype)) != 0) { @@ -14371,14 +14423,21 @@ VARconvert(ValPtr ret, const ValRecord * abort_on_error); } else if (v->vtype == TYPE_str) { if (v->val.sval == NULL || strcmp(v->val.sval, str_nil) == 0) { - nils = convert_typeswitchloop(&bte_nil, TYPE_bte, - VALget(ret), ret->vtype, - 1, 0, 1, NULL, NULL, 0, _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list