Changeset: d9dc5dcff9da for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d9dc5dcff9da
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
monetdb5/modules/mal/pcre.c
monetdb5/modules/mal/pcre.mal
Branch: Jul2017
Log Message:
Some more fixes to the pcre module.
Bulk version of pcre.replace is now batpcre.replace.
diffs (255 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
@@ -6076,6 +6076,7 @@ Ready.
[ "batmtime", "seconds", "command
batmtime.seconds(d:bat[:daytime]):bat[:int] ",
"MTIMEdaytime_extract_seconds_bulk;", "" ]
[ "batmtime", "sql_seconds", "command
batmtime.sql_seconds(d:bat[:daytime]):bat[:int] ",
"MTIMEdaytime_extract_sql_seconds_bulk;", "" ]
[ "batmtime", "year", "command batmtime.year(d:bat[:date]):bat[:int] ",
"MTIMEdate_extract_year_bulk;", "" ]
+[ "batpcre", "replace", "command batpcre.replace(orig:bat[:str],
pat:str, repl:str, flag:str):bat[:str] ", "PCREreplace_bat_wrap;",
"" ]
[ "batpyapi", "eval", "unsafe pattern batpyapi.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI2PyAPIevalStd;", "Execute a simple Python script
value" ]
[ "batpyapi", "eval_aggr", "unsafe pattern batpyapi.eval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI2PyAPIevalAggr;", "grouped aggregates
through Python" ]
[ "batpyapi", "eval_loader", "unsafe pattern batpyapi.eval_loader(fptr:ptr,
expr:str):any... ", "PYAPI2PyAPIevalLoader;", "loader functions
through Python" ]
@@ -8195,7 +8196,6 @@ Ready.
[ "pcre", "patindex", "command pcre.patindex(pat:str, s:str):int ",
"PCREpatindex;", "Location of the first POSIX pattern matching against a
string" ]
[ "pcre", "pcre_quote", "command pcre.pcre_quote(s:str):str ",
"PCREquote;", "Return a PCRE pattern string that matches the argument
exactly." ]
[ "pcre", "prelude", "command pcre.prelude():void ", "pcre_init;",
"Initialize pcre" ]
-[ "pcre", "replace", "command pcre.replace(orig:bat[:str], pat:str,
repl:str, flag:str):bat[:str] ", "PCREreplace_bat_wrap;", "" ]
[ "pcre", "replace", "command pcre.replace(origin:str, pat:str,
repl:str, flags:str):str ", "PCREreplace_wrap;", "Replace _all_ matches of
\"pattern\" in \"origin_str\" with \"replacement\".\n\t Parameter \"flags\"
accept these flags: 'i', 'm', 's', and 'x'.\n\t 'e': if present, an empty
string is considered to be a valid match\n\t 'i': if present, the match
operates in case-insensitive mode.\n\t\tOtherwise, in case-sensitive mode.\n\t
'm': if present, the match operates in multi-line mode.\n\t 's': if present,
the match operates in \"dot-all\"\n\t The specifications of the flags can be
found in \"man pcreapi\"\n\t The flag letters may be repeated.\n\t No other
letters than 'e', 'i', 'm', 's' and 'x' are allowed in \"flags\".\n\t Returns
the replaced string, or if no matches found, the original string." ]
[ "pcre", "sql2pcre", "command pcre.sql2pcre(pat:str, esc:str):str ",
"PCREsql2pcre;", "Convert a SQL like pattern with the given escape
character into a PCRE pattern." ]
[ "profiler", "cleanup", "command profiler.cleanup():void ",
"CMDcleanupTraces;", "Remove the temporary tables for profiling" ]
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
@@ -8042,6 +8042,7 @@ Ready.
[ "batmtime", "seconds", "command
batmtime.seconds(d:bat[:daytime]):bat[:int] ",
"MTIMEdaytime_extract_seconds_bulk;", "" ]
[ "batmtime", "sql_seconds", "command
batmtime.sql_seconds(d:bat[:daytime]):bat[:int] ",
"MTIMEdaytime_extract_sql_seconds_bulk;", "" ]
[ "batmtime", "year", "command batmtime.year(d:bat[:date]):bat[:int] ",
"MTIMEdate_extract_year_bulk;", "" ]
+[ "batpcre", "replace", "command batpcre.replace(orig:bat[:str],
pat:str, repl:str, flag:str):bat[:str] ", "PCREreplace_bat_wrap;",
"" ]
[ "batpyapi", "eval", "unsafe pattern batpyapi.eval(fptr:ptr, expr:str,
arg:any...):any... ", "PYAPI2PyAPIevalStd;", "Execute a simple Python script
value" ]
[ "batpyapi", "eval_aggr", "unsafe pattern batpyapi.eval_aggr(fptr:ptr,
expr:str, arg:any...):any... ", "PYAPI2PyAPIevalAggr;", "grouped aggregates
through Python" ]
[ "batpyapi", "eval_loader", "unsafe pattern batpyapi.eval_loader(fptr:ptr,
expr:str):any... ", "PYAPI2PyAPIevalLoader;", "loader functions
through Python" ]
@@ -10557,7 +10558,6 @@ Ready.
[ "pcre", "patindex", "command pcre.patindex(pat:str, s:str):int ",
"PCREpatindex;", "Location of the first POSIX pattern matching against a
string" ]
[ "pcre", "pcre_quote", "command pcre.pcre_quote(s:str):str ",
"PCREquote;", "Return a PCRE pattern string that matches the argument
exactly." ]
[ "pcre", "prelude", "command pcre.prelude():void ", "pcre_init;",
"Initialize pcre" ]
-[ "pcre", "replace", "command pcre.replace(orig:bat[:str], pat:str,
repl:str, flag:str):bat[:str] ", "PCREreplace_bat_wrap;", "" ]
[ "pcre", "replace", "command pcre.replace(origin:str, pat:str,
repl:str, flags:str):str ", "PCREreplace_wrap;", "Replace _all_ matches of
\"pattern\" in \"origin_str\" with \"replacement\".\n\t Parameter \"flags\"
accept these flags: 'i', 'm', 's', and 'x'.\n\t 'e': if present, an empty
string is considered to be a valid match\n\t 'i': if present, the match
operates in case-insensitive mode.\n\t\tOtherwise, in case-sensitive mode.\n\t
'm': if present, the match operates in multi-line mode.\n\t 's': if present,
the match operates in \"dot-all\"\n\t The specifications of the flags can be
found in \"man pcreapi\"\n\t The flag letters may be repeated.\n\t No other
letters than 'e', 'i', 'm', 's' and 'x' are allowed in \"flags\".\n\t Returns
the replaced string, or if no matches found, the original string." ]
[ "pcre", "sql2pcre", "command pcre.sql2pcre(pat:str, esc:str):str ",
"PCREsql2pcre;", "Convert a SQL like pattern with the given escape
character into a PCRE pattern." ]
[ "profiler", "cleanup", "command profiler.cleanup():void ",
"CMDcleanupTraces;", "Remove the temporary tables for profiling" ]
diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c
--- a/monetdb5/modules/mal/pcre.c
+++ b/monetdb5/modules/mal/pcre.c
@@ -336,8 +336,8 @@ pcre_likeselect(BAT **bnp, BAT *b, BAT *
bn = COLnew(0, TYPE_oid, s ? BATcount(s) : BATcount(b), TRANSIENT);
if (bn == NULL) {
#ifdef HAVE_LIBPCRE
+ pcre_free_study(pe);
pcre_free(re);
- pcre_free_study(pe);
#else
regfree(&re);
#endif
@@ -386,8 +386,8 @@ pcre_likeselect(BAT **bnp, BAT *b, BAT *
scanloop(v && *v != '\200' && BODY);
}
#ifdef HAVE_LIBPCRE
+ pcre_free_study(pe);
pcre_free(re);
- pcre_free_study(pe);
#else
regfree(&re);
#endif
@@ -404,8 +404,8 @@ pcre_likeselect(BAT **bnp, BAT *b, BAT *
bunins_failed:
BBPreclaim(bn);
#ifdef HAVE_LIBPCRE
+ pcre_free_study(pe);
pcre_free(re);
- pcre_free_study(pe);
#else
regfree(&re);
#endif
@@ -584,13 +584,13 @@ pcre_replace(str *res, const char *origi
compile_options |= PCRE_EXTENDED;
break;
default:
- throw(MAL, "pcre_replace", ILLEGAL_ARGUMENT ":
unsupported flag character '%c'\n", *flags);
+ throw(MAL, "pcre.replace", ILLEGAL_ARGUMENT ":
unsupported flag character '%c'\n", *flags);
}
flags++;
}
if ((pcre_code = pcre_compile(pattern, compile_options, &err_p,
&errpos, NULL)) == NULL) {
- throw(MAL, "pcre_replace", OPERATION_FAILED ": pcre compile of
pattern (%s) failed at %d with\n'%s'.\n", pattern, errpos, err_p);
+ throw(MAL, "pcre.replace", OPERATION_FAILED ": pcre compile of
pattern (%s) failed at %d with\n'%s'.\n", pattern, errpos, err_p);
}
/* Since the compiled pattern is going to be used several times, it is
@@ -600,14 +600,14 @@ pcre_replace(str *res, const char *origi
extra = pcre_study(pcre_code, 0, &err_p);
if (err_p != NULL) {
pcre_free(pcre_code);
- throw(MAL, "pcre_replace", OPERATION_FAILED ": pcre study of
pattern (%s) failed with '%s'.\n", pattern, err_p);
+ throw(MAL, "pcre.replace", OPERATION_FAILED ": pcre study of
pattern (%s) failed with '%s'.\n", pattern, err_p);
}
pcre_fullinfo(pcre_code, extra, PCRE_INFO_CAPTURECOUNT, &i);
ovecsize = (i + 1) * 3;
if ((ovector = (int *) GDKmalloc(sizeof(int) * ovecsize)) == NULL) {
+ pcre_free_study(extra);
pcre_free(pcre_code);
- pcre_free_study(extra);
- throw(MAL, "pcre_replace", MAL_MALLOC_FAIL);
+ throw(MAL, "pcre.replace", MAL_MALLOC_FAIL);
}
i = 0;
@@ -663,7 +663,7 @@ pcre_replace(str *res, const char *origi
pcre_free(pcre_code);
GDKfree(ovector);
if (tmpres == NULL)
- throw(MAL, "pcre_replace", MAL_MALLOC_FAIL);
+ throw(MAL, "pcre.replace", MAL_MALLOC_FAIL);
*res = tmpres;
return MAL_SUCCEED;
#else
@@ -712,13 +712,13 @@ pcre_replace_bat(BAT **res, BAT *origin_
compile_options |= PCRE_EXTENDED;
break;
default:
- throw(MAL, "pcre_replace_bat", ILLEGAL_ARGUMENT ":
unsupported flag character '%c'\n", *flags);
+ throw(MAL, "batpcre.replace", ILLEGAL_ARGUMENT ":
unsupported flag character '%c'\n", *flags);
}
flags++;
}
if ((pcre_code = pcre_compile(pattern, compile_options, &err_p,
&errpos, NULL)) == NULL) {
- throw(MAL, "pcre_replace_bat", OPERATION_FAILED
+ throw(MAL, "batpcre.replace", OPERATION_FAILED
": pcre compile of pattern (%s) failed at %d
with\n'%s'.\n",
pattern, errpos, err_p);
}
@@ -730,20 +730,22 @@ pcre_replace_bat(BAT **res, BAT *origin_
extra = pcre_study(pcre_code, 0, &err_p);
if (err_p != NULL) {
pcre_free(pcre_code);
- throw(MAL, "pcre_replace_bat", OPERATION_FAILED);
+ throw(MAL, "batpcre.replace", OPERATION_FAILED);
}
pcre_fullinfo(pcre_code, extra, PCRE_INFO_CAPTURECOUNT, &i);
ovecsize = (i + 1) * 3;
if ((ovector = (int *) GDKzalloc(sizeof(int) * ovecsize)) == NULL) {
+ pcre_free_study(extra);
pcre_free(pcre_code);
- throw(MAL, "pcre_replace_bat", MAL_MALLOC_FAIL);
+ throw(MAL, "batpcre.replace", MAL_MALLOC_FAIL);
}
tmpbat = COLnew(origin_strs->hseqbase, TYPE_str, BATcount(origin_strs),
TRANSIENT);
if (tmpbat == NULL) {
+ pcre_free_study(extra);
pcre_free(pcre_code);
GDKfree(ovector);
- throw(MAL, "pcre.replace", MAL_MALLOC_FAIL);
+ throw(MAL, "batpcre.replace", MAL_MALLOC_FAIL);
}
BATloop(origin_strs, p, q) {
origin_str = BUNtail(origin_strsi, p);
@@ -765,11 +767,11 @@ pcre_replace_bat(BAT **res, BAT *origin_
if (ncaptures > 0) {
replaced_str = GDKmalloc(len_origin_str - len_del +
(len_replacement * ncaptures) + 1);
if (replaced_str == NULL) {
+ pcre_free_study(extra);
pcre_free(pcre_code);
- pcre_free_study(extra);
GDKfree(ovector);
BBPreclaim(tmpbat);
- throw(MAL, "pcre_replace_bat", MAL_MALLOC_FAIL);
+ throw(MAL, "batpcre.replace", MAL_MALLOC_FAIL);
}
j = k = 0;
@@ -799,21 +801,22 @@ pcre_replace_bat(BAT **res, BAT *origin_
k += len;
replaced_str[k] = '\0';
if (BUNappend(tmpbat, replaced_str, FALSE) !=
GDK_SUCCEED) {
+ pcre_free_study(extra);
pcre_free(pcre_code);
- pcre_free_study(extra);
GDKfree(ovector);
GDKfree(replaced_str);
BBPreclaim(tmpbat);
- throw(MAL, "pcre_replace_bat", MAL_MALLOC_FAIL);
+ throw(MAL, "batpcre.replace", MAL_MALLOC_FAIL);
}
GDKfree(replaced_str);
- } else { /* no captured substrings, copy the original string
into new bat */
+ } else {
+ /* no captured substrings, copy the original string
into new bat */
if (BUNappend(tmpbat, origin_str, FALSE) !=
GDK_SUCCEED) {
+ pcre_free_study(extra);
pcre_free(pcre_code);
- pcre_free_study(extra);
GDKfree(ovector);
BBPreclaim(tmpbat);
- throw(MAL, "pcre_replace_bat", MAL_MALLOC_FAIL);
+ throw(MAL, "batpcre.replace", MAL_MALLOC_FAIL);
}
}
}
@@ -829,7 +832,7 @@ pcre_replace_bat(BAT **res, BAT *origin_
(void) pattern;
(void) replacement;
(void) flags;
- throw(MAL, "pcre.replace_bat", "Database was compiled without PCRE
support.");
+ throw(MAL, "batpcre.replace", "Database was compiled without PCRE
support.");
#endif
}
@@ -1788,8 +1791,8 @@ pcrejoin(BAT *r1, BAT *r2, BAT *l, BAT *
}
if (pcrere) {
#ifdef HAVE_LIBPCRE
+ pcre_free_study(pcreex);
pcre_free(pcrere);
- pcre_free_study(pcreex);
pcrere = NULL;
pcreex = NULL;
#else
@@ -1833,10 +1836,10 @@ pcrejoin(BAT *r1, BAT *r2, BAT *l, BAT *
if (pcrepat)
GDKfree(pcrepat);
#ifdef HAVE_LIBPCRE
+ if (pcreex)
+ pcre_free_study(pcreex);
if (pcrere)
pcre_free(pcrere);
- if (pcreex)
- pcre_free_study(pcreex);
#else
if (pcrere)
regfree(®ex);
diff --git a/monetdb5/modules/mal/pcre.mal b/monetdb5/modules/mal/pcre.mal
--- a/monetdb5/modules/mal/pcre.mal
+++ b/monetdb5/modules/mal/pcre.mal
@@ -35,9 +35,6 @@ comment "Replace _all_ matches of \"patt
No other letters than 'e', 'i', 'm', 's' and 'x' are allowed in
\"flags\".
Returns the replaced string, or if no matches found, the original
string.";
-command replace(orig:bat[:str],pat:str,repl:str,flag:str):bat[:str]
-address PCREreplace_bat_wrap;
-
command pcre_quote(s:str):str
address PCREquote
comment "Return a PCRE pattern string that matches the argument exactly.";
@@ -64,6 +61,11 @@ command algebra.ilike(s:str, pat:str):bi
command algebra.not_ilike(s:str, pat:str, esc:str):bit address PCREnotilike3;
command algebra.not_ilike(s:str, pat:str):bit address PCREnotilike2;
+module batpcre;
+
+command batpcre.replace(orig:bat[:str],pat:str,repl:str,flag:str):bat[:str]
+address PCREreplace_bat_wrap;
+
module batalgebra;
command batalgebra.like(s:bat[:str], pat:str, esc:str):bat[:bit] address
BATPCRElike;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list