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

Reply via email to