Changeset: 4e1afbcb87cf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4e1afbcb87cf
Branch: default
Log Message:

Merged alloc-less-str branch into default


diffs (truncated from 7806 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -6462,6 +6462,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:int]):bat[:int] ",        "STRbatstrLocate2;",    ""    
  ]
 [ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], X_2:str, 
X_3:int):bat[:int] ",    "STRbatstrLocate2cst;", ""      ]
 [ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",       "STRbatstrLocate;",     ""      ]
+[ "batstr",    "locate",       "command batstr.locate(X_1:str, 
X_2:bat[:str]):bat[:int] ",     "STRbatstrLocate_strcst;",      ""      ]
 [ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:str):bat[:int] ",     "STRbatstrLocatecst;",  ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:bat[:int], 
X_3:bat[:str]):bat[:str] ",  "STRbatLpad2_bat_bat;", ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:bat[:int], 
X_3:str):bat[:str] ",        "STRbatLpad2_bat_const;",       ""      ]
@@ -6476,6 +6477,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",     "STRbatRstrSearch;",    ""      ]
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:str):bat[:int] ",   "STRbatRstrSearchcst;", ""      ]
 [ "batstr",    "repeat",       "command batstr.repeat(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",       "STRbatrepeat;",        ""      ]
+[ "batstr",    "repeat",       "command batstr.repeat(X_1:str, 
X_2:bat[:int]):bat[:str] ",     "STRbatrepeat_strcst;", ""      ]
 [ "batstr",    "repeat",       "command batstr.repeat(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatrepeatcst;",     ""      ]
 [ "batstr",    "replace",      "command batstr.replace(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:str]):bat[:str] ",       "STRbatReplace;",       ""     
 ]
 [ "batstr",    "replace",      "command batstr.replace(X_1:bat[:str], X_2:str, 
X_3:str):bat[:str] ",   "STRbatReplacecst;",    ""      ]
@@ -6492,21 +6494,29 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "search",       "command batstr.search(X_1:bat[:str], 
X_2:str):bat[:int] ",     "STRbatstrSearchcst;",  ""      ]
 [ "batstr",    "space",        "command batstr.space(X_1:bat[:int]):bat[:str] 
",       "STRbatSpace;", ""      ]
 [ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:int]):bat[:str] ",     "STRbatsplitpart;",     ""      ]
+[ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:bat[:str], X_3:int):bat[:str] ",   "STRbatsplitpart_fieldcst;",    ""      ]
+[ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:str, X_3:bat[:int]):bat[:str] ",   "STRbatsplitpart_needlecst;",   ""      ]
 [ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:str, X_3:int):bat[:str] ", "STRbatsplitpartcst;",  ""      ]
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:bat[:str]):bat[:bit] ",   "STRbatPrefix;",        ""      ]
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:str):bat[:bit] ", "STRbatPrefixcst;",     ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",       "STRbatTail;",  ""      ]
+[ "batstr",    "string",       "command batstr.string(X_1:str, 
X_2:bat[:int]):bat[:str] ",     "STRbatTail_strcst;",   ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatTailcst;",       ""      ]
 [ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",   "STRbatprefix;",        ""      ]
+[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:str, 
X_2:bat[:int]):bat[:str] ", "STRbatprefix_strcst;", ""      ]
 [ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefixcst;",     ""      ]
 [ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",  "STRbatsuffix;",        ""      ]
+[ "batstr",    "stringright",  "command batstr.stringright(X_1:str, 
X_2:bat[:int]):bat[:str] ",        "STRbatsuffix_strcst;", ""      ]
 [ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffixcst;",     ""      ]
 [ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:str], X_4:bat[:bit]):bat[:str] ",     
"STRbatSubstitute;",    ""      ]
 [ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:str, X_3:str, X_4:bit):bat[:str] ",       "STRbatSubstitutecst;", ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int], X_3:bat[:int]):bat[:str] ",     "STRbatsubstring;",     ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",    "STRbatsubstringTail;", ""      ]
+[ "batstr",    "substring",    "command batstr.substring(X_1:str, 
X_2:bat[:int]):bat[:str] ",  "STRbatsubstringTail_strcst;",  ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int):bat[:str] ",  "STRbatsubstringTailcst;",      ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int, X_3:int):bat[:str] ", "STRbatsubstringcst;",  ""      ]
+[ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int], X_3:int):bat[:str] ",   "STRbatsubstringcst_indexcst;", ""      ]
+[ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int, X_3:bat[:int]):bat[:str] ",   "STRbatsubstringcst_startcst;", ""      ]
 [ "batstr",    "toLower",      "command 
batstr.toLower(X_1:bat[:str]):bat[:str] ",     "STRbatLower;", ""      ]
 [ "batstr",    "toUpper",      "command 
batstr.toUpper(X_1:bat[:str]):bat[:str] ",     "STRbatUpper;", ""      ]
 [ "batstr",    "trim", "command batstr.trim(X_1:bat[:str], 
X_2:bat[:str]):bat[:str] ", "STRbatStrip2_bat;",    ""      ]
@@ -6519,6 +6529,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batudf",    "fuse", "command batudf.fuse(X_1:bat[:int], 
X_2:bat[:int]):bat[:lng] ", "UDFBATfuse;",  ""      ]
 [ "batudf",    "fuse", "command batudf.fuse(X_1:bat[:sht], 
X_2:bat[:sht]):bat[:int] ", "UDFBATfuse;",  ""      ]
 [ "batudf",    "reverse",      "command 
batudf.reverse(X_1:bat[:str]):bat[:str] ",     "UDFBATreverse;",       ""      ]
+[ "batuuid",   "isaUUID",      "command 
batuuid.isaUUID(X_1:bat[:str]):bat[:bit] ",    "UUIDisaUUID_bulk;",    ""      ]
 [ "batxml",    "attribute",    "command batxml.attribute(X_1:str, 
X_2:bat[:str]):bat[:xml] ",  "BATXMLattribute;",     ""      ]
 [ "batxml",    "comment",      "command 
batxml.comment(X_1:bat[:str]):bat[:xml] ",     "BATXMLcomment;",       ""      ]
 [ "batxml",    "concat",       "command batxml.concat(X_1:bat[:xml], 
X_2:bat[:xml]):bat[:xml] ",       "BATXMLconcat;",        ""      ]
@@ -8234,8 +8245,6 @@ stdout of test 'MAL-signatures` in direc
 [ "calc",      "sub_noerror",  "pattern calc.sub_noerror(X_1:sht, X_2:int):int 
",      "CMDvarSUB;",   ""      ]
 [ "calc",      "sub_noerror",  "pattern calc.sub_noerror(X_1:sht, X_2:lng):lng 
",      "CMDvarSUB;",   ""      ]
 [ "calc",      "sub_noerror",  "pattern calc.sub_noerror(X_1:sht, X_2:sht):sht 
",      "CMDvarSUB;",   ""      ]
-[ "calc",      "substring",    "command calc.substring(X_1:str, X_2:int, 
X_3:int):str ",       "STRsubstring;",        ""      ]
-[ "calc",      "substring",    "command calc.substring(X_1:str, X_2:int):str 
",        "STRsubstringTail;",    ""      ]
 [ "calc",      "timestamp",    "command calc.timestamp(X_1:date):timestamp ",  
"MTIMEtimestamp_fromdate;",     ""      ]
 [ "calc",      "timestamp",    "command calc.timestamp(X_1:lng):timestamp ",   
"MTIMEtimestamp_frommsec;",     ""      ]
 [ "calc",      "timestamp",    "command calc.timestamp(X_1:int):timestamp ",   
"MTIMEtimestamp_fromsecond;",   ""      ]
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
@@ -9062,6 +9062,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:int]):bat[:int] ",        "STRbatstrLocate2;",    ""    
  ]
 [ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], X_2:str, 
X_3:int):bat[:int] ",    "STRbatstrLocate2cst;", ""      ]
 [ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",       "STRbatstrLocate;",     ""      ]
+[ "batstr",    "locate",       "command batstr.locate(X_1:str, 
X_2:bat[:str]):bat[:int] ",     "STRbatstrLocate_strcst;",      ""      ]
 [ "batstr",    "locate",       "command batstr.locate(X_1:bat[:str], 
X_2:str):bat[:int] ",     "STRbatstrLocatecst;",  ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:bat[:int], 
X_3:bat[:str]):bat[:str] ",  "STRbatLpad2_bat_bat;", ""      ]
 [ "batstr",    "lpad", "command batstr.lpad(X_1:bat[:str], X_2:bat[:int], 
X_3:str):bat[:str] ",        "STRbatLpad2_bat_const;",       ""      ]
@@ -9076,6 +9077,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:bat[:str]):bat[:int] ",     "STRbatRstrSearch;",    ""      ]
 [ "batstr",    "r_search",     "command batstr.r_search(X_1:bat[:str], 
X_2:str):bat[:int] ",   "STRbatRstrSearchcst;", ""      ]
 [ "batstr",    "repeat",       "command batstr.repeat(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",       "STRbatrepeat;",        ""      ]
+[ "batstr",    "repeat",       "command batstr.repeat(X_1:str, 
X_2:bat[:int]):bat[:str] ",     "STRbatrepeat_strcst;", ""      ]
 [ "batstr",    "repeat",       "command batstr.repeat(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatrepeatcst;",     ""      ]
 [ "batstr",    "replace",      "command batstr.replace(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:str]):bat[:str] ",       "STRbatReplace;",       ""     
 ]
 [ "batstr",    "replace",      "command batstr.replace(X_1:bat[:str], X_2:str, 
X_3:str):bat[:str] ",   "STRbatReplacecst;",    ""      ]
@@ -9092,21 +9094,29 @@ stdout of test 'MAL-signatures` in direc
 [ "batstr",    "search",       "command batstr.search(X_1:bat[:str], 
X_2:str):bat[:int] ",     "STRbatstrSearchcst;",  ""      ]
 [ "batstr",    "space",        "command batstr.space(X_1:bat[:int]):bat[:str] 
",       "STRbatSpace;", ""      ]
 [ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:int]):bat[:str] ",     "STRbatsplitpart;",     ""      ]
+[ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:bat[:str], X_3:int):bat[:str] ",   "STRbatsplitpart_fieldcst;",    ""      ]
+[ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:str, X_3:bat[:int]):bat[:str] ",   "STRbatsplitpart_needlecst;",   ""      ]
 [ "batstr",    "splitpart",    "command batstr.splitpart(X_1:bat[:str], 
X_2:str, X_3:int):bat[:str] ", "STRbatsplitpartcst;",  ""      ]
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:bat[:str]):bat[:bit] ",   "STRbatPrefix;",        ""      ]
 [ "batstr",    "startsWith",   "command batstr.startsWith(X_1:bat[:str], 
X_2:str):bat[:bit] ", "STRbatPrefixcst;",     ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",       "STRbatTail;",  ""      ]
+[ "batstr",    "string",       "command batstr.string(X_1:str, 
X_2:bat[:int]):bat[:str] ",     "STRbatTail_strcst;",   ""      ]
 [ "batstr",    "string",       "command batstr.string(X_1:bat[:str], 
X_2:int):bat[:str] ",     "STRbatTailcst;",       ""      ]
 [ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",   "STRbatprefix;",        ""      ]
+[ "batstr",    "stringleft",   "command batstr.stringleft(X_1:str, 
X_2:bat[:int]):bat[:str] ", "STRbatprefix_strcst;", ""      ]
 [ "batstr",    "stringleft",   "command batstr.stringleft(X_1:bat[:str], 
X_2:int):bat[:str] ", "STRbatprefixcst;",     ""      ]
 [ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",  "STRbatsuffix;",        ""      ]
+[ "batstr",    "stringright",  "command batstr.stringright(X_1:str, 
X_2:bat[:int]):bat[:str] ",        "STRbatsuffix_strcst;", ""      ]
 [ "batstr",    "stringright",  "command batstr.stringright(X_1:bat[:str], 
X_2:int):bat[:str] ",        "STRbatsuffixcst;",     ""      ]
 [ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:bat[:str], X_3:bat[:str], X_4:bat[:bit]):bat[:str] ",     
"STRbatSubstitute;",    ""      ]
 [ "batstr",    "substitute",   "command batstr.substitute(X_1:bat[:str], 
X_2:str, X_3:str, X_4:bit):bat[:str] ",       "STRbatSubstitutecst;", ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int], X_3:bat[:int]):bat[:str] ",     "STRbatsubstring;",     ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int]):bat[:str] ",    "STRbatsubstringTail;", ""      ]
+[ "batstr",    "substring",    "command batstr.substring(X_1:str, 
X_2:bat[:int]):bat[:str] ",  "STRbatsubstringTail_strcst;",  ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int):bat[:str] ",  "STRbatsubstringTailcst;",      ""      ]
 [ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int, X_3:int):bat[:str] ", "STRbatsubstringcst;",  ""      ]
+[ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:bat[:int], X_3:int):bat[:str] ",   "STRbatsubstringcst_indexcst;", ""      ]
+[ "batstr",    "substring",    "command batstr.substring(X_1:bat[:str], 
X_2:int, X_3:bat[:int]):bat[:str] ",   "STRbatsubstringcst_startcst;", ""      ]
 [ "batstr",    "toLower",      "command 
batstr.toLower(X_1:bat[:str]):bat[:str] ",     "STRbatLower;", ""      ]
 [ "batstr",    "toUpper",      "command 
batstr.toUpper(X_1:bat[:str]):bat[:str] ",     "STRbatUpper;", ""      ]
 [ "batstr",    "trim", "command batstr.trim(X_1:bat[:str], 
X_2:bat[:str]):bat[:str] ", "STRbatStrip2_bat;",    ""      ]
@@ -9120,6 +9130,7 @@ stdout of test 'MAL-signatures` in direc
 [ "batudf",    "fuse", "command batudf.fuse(X_1:bat[:lng], 
X_2:bat[:lng]):bat[:hge] ", "UDFBATfuse;",  ""      ]
 [ "batudf",    "fuse", "command batudf.fuse(X_1:bat[:sht], 
X_2:bat[:sht]):bat[:int] ", "UDFBATfuse;",  ""      ]
 [ "batudf",    "reverse",      "command 
batudf.reverse(X_1:bat[:str]):bat[:str] ",     "UDFBATreverse;",       ""      ]
+[ "batuuid",   "isaUUID",      "command 
batuuid.isaUUID(X_1:bat[:str]):bat[:bit] ",    "UUIDisaUUID_bulk;",    ""      ]
 [ "batxml",    "attribute",    "command batxml.attribute(X_1:str, 
X_2:bat[:str]):bat[:xml] ",  "BATXMLattribute;",     ""      ]
 [ "batxml",    "comment",      "command 
batxml.comment(X_1:bat[:str]):bat[:xml] ",     "BATXMLcomment;",       ""      ]
 [ "batxml",    "concat",       "command batxml.concat(X_1:bat[:xml], 
X_2:bat[:xml]):bat[:xml] ",       "BATXMLconcat;",        ""      ]
@@ -11557,8 +11568,6 @@ stdout of test 'MAL-signatures` in direc
 [ "calc",      "sub_noerror",  "pattern calc.sub_noerror(X_1:sht, X_2:int):int 
",      "CMDvarSUB;",   ""      ]
 [ "calc",      "sub_noerror",  "pattern calc.sub_noerror(X_1:sht, X_2:lng):lng 
",      "CMDvarSUB;",   ""      ]
 [ "calc",      "sub_noerror",  "pattern calc.sub_noerror(X_1:sht, X_2:sht):sht 
",      "CMDvarSUB;",   ""      ]
-[ "calc",      "substring",    "command calc.substring(X_1:str, X_2:int, 
X_3:int):str ",       "STRsubstring;",        ""      ]
-[ "calc",      "substring",    "command calc.substring(X_1:str, X_2:int):str 
",        "STRsubstringTail;",    ""      ]
 [ "calc",      "timestamp",    "command calc.timestamp(X_1:date):timestamp ",  
"MTIMEtimestamp_fromdate;",     ""      ]
 [ "calc",      "timestamp",    "command calc.timestamp(X_1:lng):timestamp ",   
"MTIMEtimestamp_frommsec;",     ""      ]
 [ "calc",      "timestamp",    "command calc.timestamp(X_1:int):timestamp ",   
"MTIMEtimestamp_fromsecond;",   ""      ]
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
@@ -1000,44 +1000,6 @@ str SERVERstop(void *ret);
 str SERVERsuspend(void *ret);
 str SERVERtrace(void *ret, int *mid, int *flag);
 BUN SQLload_file(Client cntxt, Tablet *as, bstream *b, stream *out, const char 
*csep, const char *rsep, char quote, lng skip, lng maxrow, int best, bool 
from_stdin, const char *tabnam, bool escape);
-str STRBytes(int *res, const str *arg1);
-str STRFromWChr(str *res, const int *at);
-str STRLength(int *res, const str *arg1);
-str STRLower(str *res, const str *arg1);
-str STRLpad(str *res, const str *arg1, const int *len);
-str STRLpad2(str *res, const str *arg1, const int *len, const str *arg2);
-str STRLtrim(str *res, const str *arg1);
-str STRLtrim2(str *res, const str *arg1, const str *arg2);
-str STRPrefix(bit *res, const str *arg1, const str *arg2);
-str STRReverseStrSearch(int *res, const str *arg1, const str *arg2);
-str STRRpad(str *res, const str *arg1, const int *len);
-str STRRpad2(str *res, const str *arg1, const int *len, const str *arg2);
-str STRRtrim(str *res, const str *arg1);
-str STRRtrim2(str *res, const str *arg1, const str *arg2);
-str STRStrip(str *res, const str *arg1);
-str STRStrip2(str *res, const str *arg1, const str *arg2);
-str STRSubString(str *res, const str *arg1, const int *offset, const int 
*length);
-str STRSubstitute(str *res, const str *arg1, const str *arg2, const str *arg3, 
const bit *g);
-str STRSuffix(bit *res, const str *arg1, const str *arg2);
-str STRTail(str *res, const str *arg1, const int *offset);
-str STRUpper(str *res, const str *arg1);
-str STRWChrAt(int *res, const str *arg1, const int *at);
-str STRascii(int *ret, const str *s);
-str STRinsert(str *ret, const str *s, const int *start, const int *l, const 
str *s2);
-str STRlikewrap(bit *ret, const str *s, const str *pat, const str *esc);
-str STRlikewrap2(bit *ret, const str *s, const str *pat);
-str STRlocate(int *ret, const str *s1, const str *s2);
-str STRlocate2(int *ret, const str *s1, const str *s2, const int *start);
-str STRprefix(str *ret, const str *s, const int *l);
-str STRrepeat(str *ret, const str *s, const int *c);
-str STRreplace(str *ret, const str *s1, const str *s2, const str *s3);
-str STRspace(str *ret, const int *l);
-str STRsplitpart(str *res, str *haystack, str *needle, int *field);
-str STRstrSearch(int *res, const str *arg1, const str *arg2);
-str STRsubstring(str *ret, const str *s, const int *start, const int *l);
-str STRsubstringTail(str *ret, const str *s, const int *start);
-str STRsuffix(str *ret, const str *s, const int *l);
-str STRtostr(str *res, const str *src);
 str SYScpuStatistics(bat *ret, bat *ret2);
 str SYSgdkEnv(bat *ret, bat *ret2);
 str SYSgdkThread(bat *ret, bat *ret2);
@@ -1690,6 +1652,7 @@ str stoptraceRef;
 void strAfterCall(ValPtr v, ValPtr bak);
 void strBeforeCall(ValPtr v, ValPtr bak);
 str strRef;
+int str_utf8_length(str s);
 str streamsRef;
 str subavgRef;
 str subcountRef;
diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -63,6 +63,8 @@ MTIMEcurrent_timestamp(timestamp *ret)
 
 #define is_str_nil strNil
 
+#define MTIME_STR_BUFFER_LENGTH MAX(strlen(str_nil) + 1, 512)
+
 
 #define DEC_VAR_R(TYPE, VAR) TYPE *restrict VAR
 
@@ -70,6 +72,14 @@ MTIMEcurrent_timestamp(timestamp *ret)
 
 #define DEC_ITER(TYPE, VAR) BATiter VAR
 
+#define DEC_BUFFER(OUTTYPE, RES, MALFUNC) \
+       OUTTYPE RES = GDKmalloc(MTIME_STR_BUFFER_LENGTH); \
+       if (!res) {     \
+               msg = createException(MAL, "batmtime." MALFUNC, SQLSTATE(HY013) 
MAL_MALLOC_FAIL); \
+               goto bailout; \
+       } \
+
+#define DEC_INT(OUTTYPE, RES, MALFUNC) OUTTYPE RES = (OUTTYPE){0};
 
 #define INIT_VAR(VAR, VAR_BAT) VAR = Tloc(VAR_BAT, 0)
 
@@ -83,11 +93,9 @@ MTIMEcurrent_timestamp(timestamp *ret)
 
 #define APPEND_STR(MALFUNC) \
        if (tfastins_nocheckVAR(bn, i, res, Tsize(bn)) != GDK_SUCCEED) { \
-               GDKfree(res); \
                msg = createException(SQL, "batmtime." MALFUNC, SQLSTATE(HY013) 
MAL_MALLOC_FAIL); \
                break; \
        } \
-       GDKfree(res); \
 
 #define GET_NEXT_ITER(VAR) BUNtvar(VAR, i)
 
@@ -95,6 +103,21 @@ MTIMEcurrent_timestamp(timestamp *ret)
 
 #define DEC_NOTHING(A, B) ;
 
+#define FINISH_BUFFER_SINGLE(MALFUNC) \
+bailout: \
+       *ret = NULL; \
+       if (!msg && res && !(*ret = GDKstrdup(res))) \
+               msg = createException(MAL, "batmtime." MALFUNC, SQLSTATE(HY013) 
MAL_MALLOC_FAIL); \
+       GDKfree(res); \
+
+#define FINISH_INT_SINGLE(MALFUNC) \
+       *ret = res;
+
+#define FINISH_BUFFER_MULTI(RES) GDKfree(RES);
+
+#define CLEAR_NOTHING(RES) ;
+
+
 #define COPYFLAGS      do { bn->tsorted = b1->tsorted; bn->trevsorted = 
b1->trevsorted; } while (0)
 #define SETFLAGS       do { bn->tsorted = bn->trevsorted = n < 2; } while (0)
 #define func1(NAME, NAMEBULK, MALFUNC, INTYPE, OUTTYPE, FUNC, SETFLAGS, 
FUNC_CALL, DEC_SRC, DEC_OUTPUT, \
@@ -152,11 +175,11 @@ bailout:                                                  
                                                                        \
 static str                                                                     
                                                        \
 NAMEBULK##_cand(bat *ret, const bat *bid, const bat *sid)                      
        \
 {                                                                              
                                                                \
+       str msg = MAL_SUCCEED;                                                  
                                        \
        BAT *b1 = NULL, *s = NULL, *bn = NULL;                                  
                        \
        BUN n;                                                                  
                                                        \
        DEC_SRC(INTYPE, src1);                                                  
                                        \
        DEC_OUTPUT(OUTTYPE, dst);                                               
                                        \
-       str msg = MAL_SUCCEED;                                                  
                                        \
        struct canditer ci;                                                     
                                                \
        oid off;                                                                
                                                        \
        bool nils = false;                                                      
                                                \
@@ -205,26 +228,30 @@ bailout:                                                  
                                                                        \
 #define func1_noexcept(FUNC, RET, PARAM) RET = FUNC(PARAM)
 #define func1_except(FUNC, RET, PARAM) msg = FUNC(&RET, PARAM); if (msg) break;
 
-#define func2(NAME, NAMEBULK, MALFUNC, INTYPE1, INTYPE2, OUTTYPE, FUNC, 
FUNC_CALL, DEC_INPUT1, DEC_INPUT2, DEC_SRC1, DEC_SRC2, DEC_OUTPUT, \
-                        INIT_SRC1, INIT_SRC2, INIT_OUTPUT, GET_NEXT_SRC1, 
GET_NEXT_SRC2, APPEND_NEXT)  \
+#define func2(NAME, NAMEBULK, MALFUNC, INTYPE1, INTYPE2, OUTTYPE, FUNC, 
FUNC_CALL, DEC_INPUT1, DEC_INPUT2, DEC_SRC1, DEC_SRC2, DEC_OUTPUT, DEC_EXTRA, \
+                        INIT_SRC1, INIT_SRC2, INIT_OUTPUT, GET_NEXT_SRC1, 
GET_NEXT_SRC2, APPEND_NEXT, CLEAR_EXTRA_SINGLE, CLEAR_EXTRA_MULTI)   \
 static str                                                                     
                                                        \
 NAME(OUTTYPE *ret, const INTYPE1 *v1, const INTYPE2 *v2)                       
        \
 {                                                                              
                                                                \
        str msg = MAL_SUCCEED;                                                  
                                        \
+       DEC_EXTRA(OUTTYPE, res, MALFUNC);                                       
                                \
+                                                                               
                                                                \
        do {                                                                    
                                                        \
-               FUNC_CALL(FUNC, (*ret), *v1, *v2);                              
                                \
+               FUNC_CALL(FUNC, res, *v1, *v2);                                 
                                \
        } while (0);                                                            
                                                \
+       CLEAR_EXTRA_SINGLE(MALFUNC);                                            
                                \
        return msg;                                                             
                                                        \
 }                                                                              
                                                                \
 static str                                                                     
                                                        \
 NAMEBULK(bat *ret, const bat *bid1, const bat *bid2)                           
        \
 {                                                                              
                                                                \
+       str msg = MAL_SUCCEED;                                                  
                                        \
        BAT *b1 = NULL, *b2 = NULL, *bn = NULL;                                 
                        \
        BUN n;                                                                  
                                                        \
        DEC_SRC1(INTYPE1, src1);                                                
                                        \
        DEC_SRC2(INTYPE2, src2);                                                
                                        \
        DEC_OUTPUT(OUTTYPE, dst);                                               
                                        \
-       str msg = MAL_SUCCEED;                                                  
                                        \
+       DEC_EXTRA(OUTTYPE, res, MALFUNC);                                       
                                \
                                                                                
                                                                \
        b1 = BATdescriptor(*bid1);                                              
                                        \
        b2 = BATdescriptor(*bid2);                                              
                                        \
@@ -248,7 +275,6 @@ NAMEBULK(bat *ret, const bat *bid1, cons
        INIT_SRC2(src2, b2);                                                    
                                        \
        INIT_OUTPUT(dst, bn);                                                   
                                        \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to