Changeset: 38ad37fc5f94 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=38ad37fc5f94
Modified Files:
        monetdb5/modules/atoms/str.h
        monetdb5/modules/kernel/batstr.c
        monetdb5/optimizer/opt_remap.c
        sql/backends/monet5/rel_bin.c
Branch: clean-candidates
Log Message:

Added candidate list signatures, but now the backend calls get interlaced if 
the same MAL function exists with multiple arguments. We keep a blacklist of 
str functions without candidate lists, because there are too many combinations 
to implement


diffs (237 lines):

diff --git a/monetdb5/modules/atoms/str.h b/monetdb5/modules/atoms/str.h
--- a/monetdb5/modules/atoms/str.h
+++ b/monetdb5/modules/atoms/str.h
@@ -34,6 +34,8 @@
 
 mal_export int str_utf8_length(str s); /* this function looks for NULL values 
of s, returning int_nil on those */
 
+mal_export bool batstr_func_has_candidates(char *func, int args);
+
 /* For str returning functions, the result is passed as the input parameter 
buf. The returned str indicates
    if the function succeeded (ie malloc failure or invalid unicode character). 
str_wchr_at function also
    follows this pattern. */
diff --git a/monetdb5/modules/kernel/batstr.c b/monetdb5/modules/kernel/batstr.c
--- a/monetdb5/modules/kernel/batstr.c
+++ b/monetdb5/modules/kernel/batstr.c
@@ -25,6 +25,33 @@
 #include "mal_exception.h"
 #include "str.h"
 
+/* In order to make avaialble a bulk version of a string function with 
candidates, all possible combinations of scalar/vector 
+       version of each argument must be avaiable for the function. Obviously 
this won't scale for functions with a large number of
+       arguments, so we keep a blacklist for functions without candidate 
versions.  */
+static struct functions_with_no_cands {
+       char *name;
+       int nargs; /*here nargs represent the total number of arguments */
+} functions_list[8] = {
+       { "lpad", 4 },
+       { "rpad", 4 },
+       { "splitpart", 4 },
+       { "substitute", 5 },
+       { "locate", 4 },
+       { "insert", 5 },
+       { "replace", 4 },
+       { NULL, 0 }
+};
+
+bool batstr_func_has_candidates(char *func, int args)
+{
+       size_t number_valid_types = sizeof(functions_list) / 
sizeof(functions_list[0]);
+
+       for (size_t i = 0 ; i < number_valid_types ; i++)
+               if (functions_list[i].name && strcmp(functions_list[i].name, 
func) == 0 && functions_list[i].nargs == args)
+                       return false;
+       return true;
+}
+
 static void
 finalize_ouput(bat *res, BAT *bn, str msg, bool nils, BUN q)
 {
@@ -4758,27 +4785,49 @@ bailout:
 #include "mel.h"
 mel_func batstr_init_funcs[] = {
  pattern("batstr", "length", STRbatLength, false, "Return the length of a 
string.", args(1,2, batarg("",int),batarg("s",str))),
+ pattern("batstr", "length", STRbatLength, false, "Return the length of a 
string.", args(1,3, batarg("",int),batarg("s",str),batarg("s",oid))),
  pattern("batstr", "nbytes", STRbatBytes, false, "Return the string length in 
bytes.", args(1,2, batarg("",int),batarg("s",str))),
+ pattern("batstr", "nbytes", STRbatBytes, false, "Return the string length in 
bytes.", args(1,3, batarg("",int),batarg("s",str),batarg("s",oid))),
  pattern("batstr", "toLower", STRbatLower, false, "Convert a string to lower 
case.", args(1,2, batarg("",str),batarg("s",str))),
+ pattern("batstr", "toLower", STRbatLower, false, "Convert a string to lower 
case.", args(1,3, batarg("",str),batarg("s",str),batarg("s",oid))),
  pattern("batstr", "toUpper", STRbatUpper, false, "Convert a string to upper 
case.", args(1,2, batarg("",str),batarg("s",str))),
+ pattern("batstr", "toUpper", STRbatUpper, false, "Convert a string to upper 
case.", args(1,3, batarg("",str),batarg("s",str),batarg("s",oid))),
  pattern("batstr", "trim", STRbatStrip, false, "Strip whitespaces around a 
string.", args(1,2, batarg("",str),batarg("s",str))),
+ pattern("batstr", "trim", STRbatStrip, false, "Strip whitespaces around a 
string.", args(1,3, batarg("",str),batarg("s",str),batarg("s",oid))),
  pattern("batstr", "ltrim", STRbatLtrim, false, "Strip whitespaces from start 
of a string.", args(1,2, batarg("",str),batarg("s",str))),
+ pattern("batstr", "ltrim", STRbatLtrim, false, "Strip whitespaces from start 
of a string.", args(1,3, batarg("",str),batarg("s",str),batarg("s",oid))),
  pattern("batstr", "rtrim", STRbatRtrim, false, "Strip whitespaces from end of 
a string.", args(1,2, batarg("",str),batarg("s",str))),
+ pattern("batstr", "rtrim", STRbatRtrim, false, "Strip whitespaces from end of 
a string.", args(1,3, batarg("",str),batarg("s",str),batarg("s",oid))),
  pattern("batstr", "trim", STRbatStrip2_const, false, "Strip characters in the 
second string around the first strings.", args(1,3, 
batarg("",str),batarg("s",str),arg("s2",str))),
+ pattern("batstr", "trim", STRbatStrip2_const, false, "Strip characters in the 
second string around the first strings.", args(1,4, 
batarg("",str),batarg("s",str),arg("s2",str),batarg("s",oid))),
  pattern("batstr", "trim", STRbatStrip2_1st_const, false, "Strip characters in 
the second string around the first strings.", args(1,3, 
batarg("",str),arg("s",str),batarg("s2",str))),
+ pattern("batstr", "trim", STRbatStrip2_1st_const, false, "Strip characters in 
the second string around the first strings.", args(1,4, 
batarg("",str),arg("s",str),batarg("s2",str),batarg("s",oid))),
  pattern("batstr", "ltrim", STRbatLtrim2_const, false, "Strip characters in 
the second string from start of the first strings.", args(1,3, 
batarg("",str),batarg("s",str),arg("s2",str))),
+ pattern("batstr", "ltrim", STRbatLtrim2_const, false, "Strip characters in 
the second string from start of the first strings.", args(1,4, 
batarg("",str),batarg("s",str),arg("s2",str),batarg("s",oid))),
  pattern("batstr", "ltrim", STRbatLtrim2_1st_const, false, "Strip characters 
in the second string from start of the first strings.", args(1,3, 
batarg("",str),arg("s",str),batarg("s2",str))),
+ pattern("batstr", "ltrim", STRbatLtrim2_1st_const, false, "Strip characters 
in the second string from start of the first strings.", args(1,4, 
batarg("",str),arg("s",str),batarg("s2",str),batarg("s",oid))),
  pattern("batstr", "rtrim", STRbatRtrim2_const, false, "Strip characters in 
the second string from end of the first strings.", args(1,3, 
batarg("",str),batarg("s",str),arg("s2",str))),
+ pattern("batstr", "rtrim", STRbatRtrim2_const, false, "Strip characters in 
the second string from end of the first strings.", args(1,4, 
batarg("",str),batarg("s",str),arg("s2",str),batarg("s",oid))),
  pattern("batstr", "rtrim", STRbatRtrim2_1st_const, false, "Strip characters 
in the second string from end of the first strings.", args(1,3, 
batarg("",str),arg("s",str),batarg("s2",str))),
+ pattern("batstr", "rtrim", STRbatRtrim2_1st_const, false, "Strip characters 
in the second string from end of the first strings.", args(1,4, 
batarg("",str),arg("s",str),batarg("s2",str),batarg("s",oid))),
  pattern("batstr", "trim", STRbatStrip2_bat, false, "Strip characters in the 
second strings around the first strings.", args(1,3, 
batarg("",str),batarg("s",str),batarg("s2",str))),
+ pattern("batstr", "trim", STRbatStrip2_bat, false, "Strip characters in the 
second strings around the first strings.", args(1,5, 
batarg("",str),batarg("s",str),batarg("s2",str),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "ltrim", STRbatLtrim2_bat, false, "Strip characters in the 
second strings from start of the first strings.", args(1,3, 
batarg("",str),batarg("s",str),batarg("s2",str))),
+ pattern("batstr", "ltrim", STRbatLtrim2_bat, false, "Strip characters in the 
second strings from start of the first strings.", args(1,5, 
batarg("",str),batarg("s",str),batarg("s2",str),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "rtrim", STRbatRtrim2_bat, false, "Strip characters in the 
second strings from end of the first strings.", args(1,3, 
batarg("",str),batarg("s",str),batarg("s2",str))),
+ pattern("batstr", "rtrim", STRbatRtrim2_bat, false, "Strip characters in the 
second strings from end of the first strings.", args(1,5, 
batarg("",str),batarg("s",str),batarg("s2",str),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "lpad", STRbatLpad_const, false, "Prepend whitespaces to 
the strings to reach the given length. Truncate the strings on the right if 
their lengths is larger than the given length.", args(1,3, 
batarg("",str),batarg("s",str),arg("n",int))),
+ pattern("batstr", "lpad", STRbatLpad_const, false, "Prepend whitespaces to 
the strings to reach the given length. Truncate the strings on the right if 
their lengths is larger than the given length.", args(1,4, 
batarg("",str),batarg("s",str),arg("n",int),batarg("s",oid))),
  pattern("batstr", "rpad", STRbatRpad_const, false, "Append whitespaces to the 
strings to reach the given length. Truncate the strings on the right if their 
lengths is larger than the given length.", args(1,3, 
batarg("",str),batarg("s",str),arg("n",int))),
+ pattern("batstr", "rpad", STRbatRpad_const, false, "Append whitespaces to the 
strings to reach the given length. Truncate the strings on the right if their 
lengths is larger than the given length.", args(1,4, 
batarg("",str),batarg("s",str),arg("n",int),batarg("s",oid))),
  pattern("batstr", "lpad", STRbatLpad_1st_const, false, "Prepend whitespaces 
to the strings to reach the given lengths. Truncate the strings on the right if 
their lengths is larger than the given lengths.", args(1,3, 
batarg("",str),arg("s",str),batarg("n",int))),
+ pattern("batstr", "lpad", STRbatLpad_1st_const, false, "Prepend whitespaces 
to the strings to reach the given lengths. Truncate the strings on the right if 
their lengths is larger than the given lengths.", args(1,4, 
batarg("",str),arg("s",str),batarg("n",int),batarg("s",oid))),
  pattern("batstr", "rpad", STRbatRpad_1st_const, false, "Append whitespaces to 
the strings to reach the given lengths. Truncate the strings on the right if 
their lengths is larger than the given lengths.", args(1,3, 
batarg("",str),arg("s",str),batarg("n",int))),
+ pattern("batstr", "rpad", STRbatRpad_1st_const, false, "Append whitespaces to 
the strings to reach the given lengths. Truncate the strings on the right if 
their lengths is larger than the given lengths.", args(1,4, 
batarg("",str),arg("s",str),batarg("n",int),batarg("s",oid))),
  pattern("batstr", "lpad", STRbatLpad_bat, false, "Prepend whitespaces to the 
strings to reach the given lengths. Truncate the strings on the right if their 
lengths is larger than the given lengths.", args(1,3, 
batarg("",str),batarg("s",str),batarg("n",int))),
+ pattern("batstr", "lpad", STRbatLpad_bat, false, "Prepend whitespaces to the 
strings to reach the given lengths. Truncate the strings on the right if their 
lengths is larger than the given lengths.", args(1,5, 
batarg("",str),batarg("s",str),batarg("n",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "rpad", STRbatRpad_bat, false, "Append whitespaces to the 
strings to reach the given lengths. Truncate the strings on the right if their 
lengths is larger than the given lengths.", args(1,3, 
batarg("",str),batarg("s",str),batarg("n",int))),
+ pattern("batstr", "rpad", STRbatRpad_bat, false, "Append whitespaces to the 
strings to reach the given lengths. Truncate the strings on the right if their 
lengths is larger than the given lengths.", args(1,5, 
batarg("",str),batarg("s",str),batarg("n",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "lpad", STRbatLpad2_const_const, false, "Prepend the second 
string to the first strings to reach the given length. Truncate the first 
strings on the right if their lengths is larger than the given length.", 
args(1,4, batarg("",str),batarg("s",str),arg("n",int),arg("s2",str))),
  pattern("batstr", "rpad", STRbatRpad2_const_const, false, "Append the second 
string to the first strings to reach the given length. Truncate the first 
strings on the right if their lengths is larger than the given length.", 
args(1,4, batarg("",str),batarg("s",str),arg("n",int),arg("s2",str))),
  pattern("batstr", "lpad", STRbatLpad2_bat_const, false, "Prepend the second 
string to the first strings to reach the given lengths. Truncate the first 
strings on the right if their lengths is larger than the given lengths.", 
args(1,4, batarg("",str),batarg("s",str),batarg("n",int),arg("s2",str))),
@@ -4788,50 +4837,89 @@ mel_func batstr_init_funcs[] = {
  pattern("batstr", "lpad", STRbatLpad2_bat_bat, false, "Prepend the second 
strings to the first strings to reach the given lengths. Truncate the first 
strings on the right if their lengths is larger than the given lengths.", 
args(1,4, batarg("",str),batarg("s",str),batarg("n",int),batarg("s2",str))),
  pattern("batstr", "rpad", STRbatRpad2_bat_bat, false, "Append the second 
strings to the first strings to reach the given lengths. Truncate the first 
strings on the right if their lengths is larger than the given lengths.", 
args(1,4, batarg("",str),batarg("s",str),batarg("n",int),batarg("s2",str))),
  pattern("batstr", "startsWith", STRbatPrefix, false, "Prefix check.", 
args(1,3, batarg("",bit),batarg("s",str),batarg("prefix",str))),
+ pattern("batstr", "startsWith", STRbatPrefix, false, "Prefix check.", 
args(1,5, 
batarg("",bit),batarg("s",str),batarg("prefix",str),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "startsWith", STRbatPrefixcst, false, "Prefix check.", 
args(1,3, batarg("",bit),batarg("s",str),arg("prefix",str))),
+ pattern("batstr", "startsWith", STRbatPrefixcst, false, "Prefix check.", 
args(1,4, batarg("",bit),batarg("s",str),arg("prefix",str),batarg("s",oid))),
  pattern("batstr", "startsWith", STRbatPrefix_strcst, false, "Prefix check.", 
args(1,3, batarg("",bit),arg("s",str),batarg("prefix",str))),
+ pattern("batstr", "startsWith", STRbatPrefix_strcst, false, "Prefix check.", 
args(1,4, batarg("",bit),arg("s",str),batarg("prefix",str),batarg("s",oid))),
  pattern("batstr", "endsWith", STRbatSuffix, false, "Suffix check.", args(1,3, 
batarg("",bit),batarg("s",str),batarg("suffix",str))),
+ pattern("batstr", "endsWith", STRbatSuffix, false, "Suffix check.", args(1,5, 
batarg("",bit),batarg("s",str),batarg("suffix",str),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "endsWith", STRbatSuffixcst, false, "Suffix check.", 
args(1,3, batarg("",bit),batarg("s",str),arg("suffix",str))),
+ pattern("batstr", "endsWith", STRbatSuffixcst, false, "Suffix check.", 
args(1,4, batarg("",bit),batarg("s",str),arg("suffix",str),batarg("s",oid))),
  pattern("batstr", "endsWith", STRbatSuffix_strcst, false, "Suffix check.", 
args(1,3, batarg("",bit),arg("s",str),batarg("suffix",str))),
+ pattern("batstr", "endsWith", STRbatSuffix_strcst, false, "Suffix check.", 
args(1,4, batarg("",bit),arg("s",str),batarg("suffix",str),batarg("s",oid))),
  pattern("batstr", "splitpart", STRbatsplitpart, false, "Split string on 
delimiter. Returns\ngiven field (counting from one.)", args(1,4, 
batarg("",str),batarg("s",str),batarg("needle",str),batarg("field",int))),
  pattern("batstr", "splitpart", STRbatsplitpartcst, false, "Split string on 
delimiter. Returns\ngiven field (counting from one.)", args(1,4, 
batarg("",str),batarg("s",str),arg("needle",str),arg("field",int))),
  pattern("batstr", "splitpart", STRbatsplitpart_needlecst, false, "Split 
string on delimiter. Returns\ngiven field (counting from one.)", args(1,4, 
batarg("",str),batarg("s",str),arg("needle",str),batarg("field",int))),
  pattern("batstr", "splitpart", STRbatsplitpart_fieldcst, false, "Split string 
on delimiter. Returns\ngiven field (counting from one.)", args(1,4, 
batarg("",str),batarg("s",str),batarg("needle",str),arg("field",int))),
  pattern("batstr", "search", STRbatstrSearch, false, "Search for a substring. 
Returns position, -1 if not found.", args(1,3, 
batarg("",int),batarg("s",str),batarg("c",str))),
+ pattern("batstr", "search", STRbatstrSearch, false, "Search for a substring. 
Returns position, -1 if not found.", args(1,5, 
batarg("",int),batarg("s",str),batarg("c",str),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "search", STRbatstrSearchcst, false, "Search for a 
substring. Returns position, -1 if not found.", args(1,3, 
batarg("",int),batarg("s",str),arg("c",str))),
+ pattern("batstr", "search", STRbatstrSearchcst, false, "Search for a 
substring. Returns position, -1 if not found.", args(1,4, 
batarg("",int),batarg("s",str),arg("c",str),batarg("s",oid))),
  pattern("batstr", "search", STRbatstrSearch_strcst, false, "Search for a 
substring. Returns position, -1 if not found.", args(1,3, 
batarg("",int),arg("s",str),batarg("c",str))),
+ pattern("batstr", "search", STRbatstrSearch_strcst, false, "Search for a 
substring. Returns position, -1 if not found.", args(1,4, 
batarg("",int),arg("s",str),batarg("c",str),batarg("s",oid))),
  pattern("batstr", "r_search", STRbatRstrSearch, false, "Reverse search for a 
substring. Returns position, -1 if not found.", args(1,3, 
batarg("",int),batarg("s",str),batarg("c",str))),
+ pattern("batstr", "r_search", STRbatRstrSearch, false, "Reverse search for a 
substring. Returns position, -1 if not found.", args(1,5, 
batarg("",int),batarg("s",str),batarg("c",str),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "r_search", STRbatRstrSearchcst, false, "Reverse search for 
a substring. Returns position, -1 if not found.", args(1,3, 
batarg("",int),batarg("s",str),arg("c",str))),
+ pattern("batstr", "r_search", STRbatRstrSearchcst, false, "Reverse search for 
a substring. Returns position, -1 if not found.", args(1,4, 
batarg("",int),batarg("s",str),arg("c",str),batarg("s",oid))),
  pattern("batstr", "r_search", STRbatRstrSearch_strcst, false, "Reverse search 
for a substring. Returns position, -1 if not found.", args(1,3, 
batarg("",int),arg("s",str),batarg("c",str))),
+ pattern("batstr", "r_search", STRbatRstrSearch_strcst, false, "Reverse search 
for a substring. Returns position, -1 if not found.", args(1,4, 
batarg("",int),arg("s",str),batarg("c",str),batarg("s",oid))),
  pattern("batstr", "string", STRbatTail, false, "Return the tail s[offset..n] 
of a string s[0..n].", args(1,3, 
batarg("",str),batarg("b",str),batarg("offset",int))),
+ pattern("batstr", "string", STRbatTail, false, "Return the tail s[offset..n] 
of a string s[0..n].", args(1,5, 
batarg("",str),batarg("b",str),batarg("offset",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "string", STRbatTailcst, false, "Return the tail 
s[offset..n] of a string s[0..n].", args(1,3, 
batarg("",str),batarg("b",str),arg("offset",int))),
+ pattern("batstr", "string", STRbatTailcst, false, "Return the tail 
s[offset..n] of a string s[0..n].", args(1,4, 
batarg("",str),batarg("b",str),arg("offset",int),batarg("s",oid))),
  pattern("batstr", "string", STRbatTail_strcst, false, "Return the tail 
s[offset..n] of a string s[0..n].", args(1,3, 
batarg("",str),arg("b",str),batarg("offset",int))),
+ pattern("batstr", "string", STRbatTail_strcst, false, "Return the tail 
s[offset..n] of a string s[0..n].", args(1,4, 
batarg("",str),arg("b",str),batarg("offset",int),batarg("s",oid))),
  pattern("batstr", "ascii", STRbatAscii, false, "Return unicode of head of 
string", args(1,2, batarg("",int),batarg("s",str))),
+ pattern("batstr", "ascii", STRbatAscii, false, "Return unicode of head of 
string", args(1,3, batarg("",int),batarg("s",str),batarg("s",oid))),
  pattern("batstr", "substring", STRbatsubstringTail, false, "Extract the tail 
of a string", args(1,3, batarg("",str),batarg("s",str),batarg("start",int))),
+ pattern("batstr", "substring", STRbatsubstringTail, false, "Extract the tail 
of a string", args(1,5, 
batarg("",str),batarg("s",str),batarg("start",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "substring", STRbatsubstringTailcst, false, "Extract the 
tail of a string", args(1,3, batarg("",str),batarg("s",str),arg("start",int))),
+ pattern("batstr", "substring", STRbatsubstringTailcst, false, "Extract the 
tail of a string", args(1,4, 
batarg("",str),batarg("s",str),arg("start",int),batarg("s",oid))),
  pattern("batstr", "substring", STRbatsubstringTail_strcst, false, "Extract 
the tail of a string", args(1,3, 
batarg("",str),arg("s",str),batarg("start",int))),
+ pattern("batstr", "substring", STRbatsubstringTail_strcst, false, "Extract 
the tail of a string", args(1,4, 
batarg("",str),arg("s",str),batarg("start",int),batarg("s",oid))),
  pattern("batstr", "substring", STRbatsubstring, false, "Substring extraction 
using [start,start+length]", args(1,4, 
batarg("",str),batarg("s",str),batarg("start",int),batarg("index",int))),
+ pattern("batstr", "substring", STRbatsubstring, false, "Substring extraction 
using [start,start+length]", args(1,7, 
batarg("",str),batarg("s",str),batarg("start",int),batarg("index",int),batarg("s1",oid),batarg("s2",oid),batarg("s3",oid))),
  pattern("batstr", "substring", STRbatsubstring_2nd_3rd_cst, false, "Substring 
extraction using [start,start+length]", args(1,4, 
batarg("",str),batarg("s",str),arg("start",int),arg("index",int))),
+ pattern("batstr", "substring", STRbatsubstring_2nd_3rd_cst, false, "Substring 
extraction using [start,start+length]", args(1,5, 
batarg("",str),batarg("s",str),arg("start",int),arg("index",int),batarg("s",oid))),
  pattern("batstr", "substring", STRbatsubstring_2nd_cst, false, "Substring 
extraction using [start,start+length]", args(1,4, 
batarg("",str),batarg("s",str),arg("start",int),batarg("index",int))),
+ pattern("batstr", "substring", STRbatsubstring_2nd_cst, false, "Substring 
extraction using [start,start+length]", args(1,6, 
batarg("",str),batarg("s",str),arg("start",int),batarg("index",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "substring", STRbatsubstring_3rd_cst, false, "Substring 
extraction using [start,start+length]", args(1,4, 
batarg("",str),batarg("s",str),batarg("start",int),arg("index",int))),
+ pattern("batstr", "substring", STRbatsubstring_3rd_cst, false, "Substring 
extraction using [start,start+length]", args(1,6, 
batarg("",str),batarg("s",str),batarg("start",int),arg("index",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "substring", STRbatsubstring_1st_2nd_cst, false, "Substring 
extraction using [start,start+length]", args(1,4, 
batarg("",str),arg("s",str),arg("start",int),batarg("index",int))),
+ pattern("batstr", "substring", STRbatsubstring_1st_2nd_cst, false, "Substring 
extraction using [start,start+length]", args(1,5, 
batarg("",str),arg("s",str),arg("start",int),batarg("index",int),batarg("s",oid))),
  pattern("batstr", "substring", STRbatsubstring_1st_3rd_cst, false, "Substring 
extraction using [start,start+length]", args(1,4, 
batarg("",str),arg("s",str),batarg("start",int),arg("index",int))),
+ pattern("batstr", "substring", STRbatsubstring_1st_3rd_cst, false, "Substring 
extraction using [start,start+length]", args(1,5, 
batarg("",str),arg("s",str),batarg("start",int),arg("index",int),batarg("s",oid))),
  pattern("batstr", "substring", STRbatsubstring_1st_cst, false, "Substring 
extraction using [start,start+length]", args(1,4, 
batarg("",str),arg("s",str),batarg("start",int),batarg("index",int))),
+ pattern("batstr", "substring", STRbatsubstring_1st_cst, false, "Substring 
extraction using [start,start+length]", args(1,6, 
batarg("",str),arg("s",str),batarg("start",int),batarg("index",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "unicode", STRbatFromWChr, false, "convert a unicode to a 
character.", args(1,2, batarg("",str),batarg("wchar",int))),
+ pattern("batstr", "unicode", STRbatFromWChr, false, "convert a unicode to a 
character.", args(1,3, batarg("",str),batarg("wchar",int),batarg("s",oid))),
  pattern("batstr", "unicodeAt", STRbatWChrAt, false, "get a unicode character 
(as an int) from a string position.", args(1,3, 
batarg("",int),batarg("s",str),batarg("index",int))),
+ pattern("batstr", "unicodeAt", STRbatWChrAt, false, "get a unicode character 
(as an int) from a string position.", args(1,5, 
batarg("",int),batarg("s",str),batarg("index",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "unicodeAt", STRbatWChrAtcst, false, "get a unicode 
character (as an int) from a string position.", args(1,3, 
batarg("",int),batarg("s",str),arg("index",int))),
+ pattern("batstr", "unicodeAt", STRbatWChrAtcst, false, "get a unicode 
character (as an int) from a string position.", args(1,4, 
batarg("",int),batarg("s",str),arg("index",int),batarg("s",oid))),
  pattern("batstr", "unicodeAt", STRbatWChrAt_strcst, false, "get a unicode 
character (as an int) from a string position.", args(1,3, 
batarg("",int),arg("s",str),batarg("index",int))),
+ pattern("batstr", "unicodeAt", STRbatWChrAt_strcst, false, "get a unicode 
character (as an int) from a string position.", args(1,4, 
batarg("",int),arg("s",str),batarg("index",int),batarg("s",oid))),
  pattern("batstr", "substitute", STRbatSubstitute, false, "Substitute first 
occurrence of 'src' by\n'dst'. Iff repeated = true this is\nrepeated while 
'src' can be found in the\nresult string. In order to prevent\nrecursion and 
result strings of unlimited\nsize, repeating is only done iff src is\nnot a 
substring of dst.", args(1,5, 
batarg("",str),batarg("s",str),batarg("src",str),batarg("dst",str),batarg("rep",bit))),
  pattern("batstr", "substitute", STRbatSubstitutecst, false, "Substitute first 
occurrence of 'src' by\n'dst'. Iff repeated = true this is\nrepeated while 
'src' can be found in the\nresult string. In order to prevent\nrecursion and 
result strings of unlimited\nsize, repeating is only done iff src is\nnot a 
substring of dst.", args(1,5, 
batarg("",str),batarg("s",str),arg("src",str),arg("dst",str),arg("rep",bit))),
  pattern("batstr", "stringleft", STRbatprefix, false, "", args(1,3, 
batarg("",str),batarg("s",str),batarg("l",int))),
+ pattern("batstr", "stringleft", STRbatprefix, false, "", args(1,5, 
batarg("",str),batarg("s",str),batarg("l",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "stringleft", STRbatprefixcst, false, "", args(1,3, 
batarg("",str),batarg("s",str),arg("l",int))),
+ pattern("batstr", "stringleft", STRbatprefixcst, false, "", args(1,4, 
batarg("",str),batarg("s",str),arg("l",int),batarg("s",oid))),
  pattern("batstr", "stringleft", STRbatprefix_strcst, false, "", args(1,3, 
batarg("",str),arg("s",str),batarg("l",int))),
+ pattern("batstr", "stringleft", STRbatprefix_strcst, false, "", args(1,4, 
batarg("",str),arg("s",str),batarg("l",int),batarg("s",oid))),
  pattern("batstr", "stringright", STRbatsuffix, false, "", args(1,3, 
batarg("",str),batarg("s",str),batarg("l",int))),
+ pattern("batstr", "stringright", STRbatsuffix, false, "", args(1,5, 
batarg("",str),batarg("s",str),batarg("l",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "stringright", STRbatsuffixcst, false, "", args(1,3, 
batarg("",str),batarg("s",str),arg("l",int))),
+ pattern("batstr", "stringright", STRbatsuffixcst, false, "", args(1,4, 
batarg("",str),batarg("s",str),arg("l",int),batarg("s",oid))),
  pattern("batstr", "stringright", STRbatsuffix_strcst, false, "", args(1,3, 
batarg("",str),arg("s",str),batarg("l",int))),
+ pattern("batstr", "stringright", STRbatsuffix_strcst, false, "", args(1,4, 
batarg("",str),arg("s",str),batarg("l",int),batarg("s",oid))),
  pattern("batstr", "locate", STRbatstrLocate, false, "Locate the start 
position of a string", args(1,3, 
batarg("",int),batarg("s1",str),batarg("s2",str))),
+ pattern("batstr", "locate", STRbatstrLocate, false, "Locate the start 
position of a string", args(1,5, 
batarg("",int),batarg("s1",str),batarg("s2",str),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "locate", STRbatstrLocatecst, false, "Locate the start 
position of a string", args(1,3, 
batarg("",int),batarg("s1",str),arg("s2",str))),
+ pattern("batstr", "locate", STRbatstrLocatecst, false, "Locate the start 
position of a string", args(1,4, 
batarg("",int),batarg("s1",str),arg("s2",str),batarg("s",oid))),
  pattern("batstr", "locate", STRbatstrLocate_strcst, false, "Locate the start 
position of a string", args(1,3, 
batarg("",int),arg("s1",str),batarg("s2",str))),
+ pattern("batstr", "locate", STRbatstrLocate_strcst, false, "Locate the start 
position of a string", args(1,4, 
batarg("",int),arg("s1",str),batarg("s2",str),batarg("s",oid))),
  pattern("batstr", "locate", STRbatstrLocate2, false, "Locate the start 
position of a string", args(1,4, 
batarg("",int),batarg("s1",str),batarg("s2",str),batarg("start",int))),
  pattern("batstr", "locate", STRbatstrLocate2cst, false, "Locate the start 
position of a string", args(1,4, 
batarg("",int),batarg("s1",str),arg("s2",str),arg("start",int))),
  pattern("batstr", "insert", STRbatInsert, false, "Insert a string into 
another", args(1,5, 
batarg("",str),batarg("s",str),batarg("start",int),batarg("l",int),batarg("s2",str))),
@@ -4839,9 +4927,13 @@ mel_func batstr_init_funcs[] = {
  pattern("batstr", "replace", STRbatReplace, false, "Insert a string into 
another", args(1,4, 
batarg("",str),batarg("s",str),batarg("pat",str),batarg("s2",str))),
  pattern("batstr", "replace", STRbatReplacecst, false, "Insert a string into 
another", args(1,4, 
batarg("",str),batarg("s",str),arg("pat",str),arg("s2",str))),
  pattern("batstr", "repeat", STRbatrepeat, false, "", args(1,3, 
batarg("",str),batarg("s",str),batarg("c",int))),
+ pattern("batstr", "repeat", STRbatrepeat, false, "", args(1,5, 
batarg("",str),batarg("s",str),batarg("c",int),batarg("s1",oid),batarg("s2",oid))),
  pattern("batstr", "repeat", STRbatrepeatcst, false, "", args(1,3, 
batarg("",str),batarg("s",str),arg("c",int))),
+ pattern("batstr", "repeat", STRbatrepeatcst, false, "", args(1,4, 
batarg("",str),batarg("s",str),arg("c",int),batarg("s",oid))),
  pattern("batstr", "repeat", STRbatrepeat_strcst, false, "", args(1,3, 
batarg("",str),arg("s",str),batarg("c",int))),
+ pattern("batstr", "repeat", STRbatrepeat_strcst, false, "", args(1,4, 
batarg("",str),arg("s",str),batarg("c",int),batarg("s",oid))),
  pattern("batstr", "space", STRbatSpace, false, "", args(1,2, 
batarg("",str),batarg("l",int))),
+ pattern("batstr", "space", STRbatSpace, false, "", args(1,3, 
batarg("",str),batarg("l",int),batarg("s",oid))),
  { .imp=NULL }
 };
 #include "mal_import.h"
diff --git a/monetdb5/optimizer/opt_remap.c b/monetdb5/optimizer/opt_remap.c
--- a/monetdb5/optimizer/opt_remap.c
+++ b/monetdb5/optimizer/opt_remap.c
@@ -52,7 +52,7 @@ OPTremapDirect(Client cntxt, MalBlkPtr m
                p= addArgument(mb,p,getArg(pci,i));
        if (p->retc == 1 &&
                ((bufName == batcalcRef &&
-               (fcnName == mulRef || fcnName == divRef || fcnName == plusRef 
|| fcnName == minusRef || fcnName == modRef)) || bufName == batmtimeRef)) {
+               (fcnName == mulRef || fcnName == divRef || fcnName == plusRef 
|| fcnName == minusRef || fcnName == modRef)) || bufName == batmtimeRef || 
bufName == batstrRef)) {
                if (p->argc == 3 &&
                        /* these two filter out unary batcalc.- with a 
candidate list */
                        getBatType(getArgType(mb, p, 1)) != TYPE_oid &&
@@ -235,7 +235,7 @@ OPTmultiplexInline(Client cntxt, MalBlkP
                                        q->typechk = TYPE_UNKNOWN;
                                        if (q->retc == 1 &&
                                                ((getModuleId(q) == batcalcRef 
&&
-                                               (getFunctionId(q) == mulRef || 
getFunctionId(q) == divRef || getFunctionId(q) == plusRef || getFunctionId(q) 
== minusRef || getFunctionId(q) == modRef)) || getModuleId(q) == batmtimeRef)) {
+                                               (getFunctionId(q) == mulRef || 
getFunctionId(q) == divRef || getFunctionId(q) == plusRef || getFunctionId(q) 
== minusRef || getFunctionId(q) == modRef)) || getModuleId(q) == batmtimeRef || 
getModuleId(q) == batstrRef)) {
                                                if (q->argc == 3 &&
                                                        /* these two filter out 
unary batcalc.- with a candidate list */
                                                        
getBatType(getArgType(mq, q, 1)) != TYPE_oid &&
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1015,7 +1015,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                else if (exps) {
                        unsigned nrcols = 0;
 
-                       if (sel && (strcmp(sql_func_mod(f->func), "calc") == 0 
|| strcmp(sql_func_mod(f->func), "mmath") == 0 || strcmp(sql_func_mod(f->func), 
"mtime") == 0))
+                       if (sel && (strcmp(sql_func_mod(f->func), "calc") == 0 
|| strcmp(sql_func_mod(f->func), "mmath") == 0 || strcmp(sql_func_mod(f->func), 
"mtime") == 0
+                                               || 
(strcmp(sql_func_mod(f->func), "str") == 0 && 
batstr_func_has_candidates(sql_func_imp(f->func), list_length(f->func->ops) + 
1))))
                                push_cands = 1;
                        if (strcmp(sql_func_mod(f->func), "calc") == 0 && 
strcmp(sql_func_imp(f->func), "ifthenelse") == 0)
                                return exp2bin_case(be, e, left, right, sel, 
depth);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to