Changeset: bde2c3bb04f8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bde2c3bb04f8
Modified Files:
monetdb5/modules/atoms/str.c
monetdb5/modules/atoms/str.h
monetdb5/modules/kernel/batstr.c
Branch: alloc-less-str
Log Message:
Cleaned more str functions
diffs (truncated from 314 to 300 lines):
diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c
--- a/monetdb5/modules/atoms/str.c
+++ b/monetdb5/modules/atoms/str.c
@@ -3355,11 +3355,10 @@ STRtostr(str *res, const str *src)
return MAL_SUCCEED;
}
-static int
-str_length(const str *arg1)
+int
+str_length(const char *s)
{
size_t l;
- const char *s = *arg1;
if (strNil(s))
return int_nil;
@@ -3373,15 +3372,14 @@ str_length(const str *arg1)
str
STRLength(int *res, const str *arg1)
{
- *res = str_length(arg1);
+ *res = str_length(*arg1);
return MAL_SUCCEED;
}
-static int
-str_bytes(const str *arg1)
+int
+str_bytes(const char *s)
{
size_t l;
- const char *s = *arg1;
if (strNil(s))
return int_nil;
@@ -3393,7 +3391,7 @@ str_bytes(const str *arg1)
str
STRBytes(int *res, const str *arg1)
{
- *res = str_bytes(arg1);
+ *res = str_bytes(*arg1);
return MAL_SUCCEED;
}
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
@@ -15,6 +15,9 @@
#define INITIAL_STR_BUFFER_LENGTH MAX((int) strlen(str_nil) + 1, 1024)
+int str_length(const char *s);
+int str_bytes(const char *s);
+
str str_tail(str *buf, int *buflen, const char *s, int off);
str str_Sub_String(str *buf, int *buflen, const char *s, int off, int l);
str str_substring_tail(str *buf, int *buflen, const char *s, int start);
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
@@ -68,53 +68,68 @@
BBPkeepref(*(X));
\
BBPunfix(Z->batCacheid);
+static inline str
+str_prefix(str *buf, int *buflen, const char *s, int l)
+{
+ return str_Sub_String(buf, buflen, s, 0, l);
+}
+
+
static str
-do_batstr_int(bat *ret, const bat *l, const char *name, str (*func)(int *,
const str *))
+do_batstr_int(bat *res, const bat *l, const char *name, int (*func)(const char
*))
{
BATiter bi;
- BAT *bn, *b;
+ BAT *bn = NULL, *b = NULL;
BUN p, q;
- str x;
- int y;
- str msg = MAL_SUCCEED;
+ int *restrict vals, next;
+ str x, msg = MAL_SUCCEED;
+ bool nils = false;
- prepareOperand(b, l, name);
- prepareResult(bn, b, TYPE_int, name);
+ if ((b = BATdescriptor(*l)) == NULL) {
+ msg = createException(MAL, name, SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ q = BATcount(b);
+ if (!(bn = COLnew(b->hseqbase, TYPE_int, q, TRANSIENT))) {
+ msg = createException(MAL, name, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
bi = bat_iterator(b);
+ vals = Tloc(bn, 0);
+ for (p = 0; p < q ; p++) {
+ x = (str) BUNtail(bi, p);
+ next = func(x);
+ vals[p] = next;
+ nils |= is_int_nil(next);
+ }
- BATloop(b, p, q) {
- x = (str) BUNtvar(bi, p);
- if (strNil(x)) {
- y = int_nil;
- bn->tnonil = false;
- bn->tnil = true;
- } else if ((msg = (*func)(&y, &x)) != MAL_SUCCEED) {
- goto bunins_failed;
- }
- if (bunfastappTYPE(int, bn, &y) != GDK_SUCCEED)
- goto bunins_failed;
- }
- finalizeResult(ret, bn, b);
- return MAL_SUCCEED;
-bunins_failed:
- BBPunfix(b->batCacheid);
- BBPunfix(bn->batCacheid);
- if (msg != MAL_SUCCEED)
- return msg;
- throw(MAL, name, OPERATION_FAILED " During bulk operation");
+bailout:
+ if (b)
+ BBPunfix(b->batCacheid);
+ if (bn && !msg) {
+ BATsetcount(bn, q);
+ bn->tnil = nils;
+ bn->tnonil = !nils;
+ bn->tkey = BATcount(bn) <= 1;
+ bn->tsorted = BATcount(bn) <= 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ BBPkeepref(*res = bn->batCacheid);
+ } else if (bn)
+ BBPreclaim(bn);
+ return msg;
}
static str
STRbatLength(bat *ret, const bat *l)
{
- return do_batstr_int(ret, l, "batstr.Length", STRLength);
+ return do_batstr_int(ret, l, "batstr.length", str_length);
}
static str
STRbatBytes(bat *ret, const bat *l)
{
- return do_batstr_int(ret, l, "batstr.Bytes", STRBytes);
+ return do_batstr_int(ret, l, "batstr.bytes", str_bytes);
}
static str
@@ -1191,7 +1206,7 @@ do_batstr_str_int_cst(bat *res, const ba
msg = createException(MAL, name, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
goto bailout;
}
- if ((b = BATdescriptor(*l)) == NULL) {
+ if (!(b = BATdescriptor(*l))) {
msg = createException(MAL, name, SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
goto bailout;
}
@@ -1231,12 +1246,6 @@ bailout:
return msg;
}
-static inline str
-str_prefix(str *buf, int *buflen, const char *s, int l)
-{
- return str_Sub_String(buf, buflen, s, 0, l);
-}
-
static str
STRbatprefixcst(bat *ret, const bat *l, const int *cst)
{
@@ -1268,78 +1277,94 @@ STRbatsubstringTailcst(bat *ret, const b
}
static str
-do_batstr_str_int(bat *ret, const bat *l, const bat *r, const char *name, str
(*func)(str *, const str *, const int *))
+do_batstr_str_int(bat *res, const bat *l, const bat *r, const char *name, str
(*func)(str*, int*, const char*, int))
{
BATiter lefti;
- BAT *bn, *left, *right;
- BUN p,q;
- str v;
- str msg = MAL_SUCCEED;
- int *restrict right_vals;
+ BAT *bn = NULL, *left = NULL, *right = NULL;
+ BUN p, q;
+ int buflen = INITIAL_STR_BUFFER_LENGTH, *restrict righti;
+ str x, buf = GDKmalloc(buflen), msg = MAL_SUCCEED;
+ bool nils = false;
- prepareOperand2(left,l,right,r,name);
- if(BATcount(left) != BATcount(right)) {
- BBPunfix(left->batCacheid);
- BBPunfix(right->batCacheid);
- throw(MAL, name, ILLEGAL_ARGUMENT " Requires bats of identical
size");
+ if (!buf) {
+ msg = createException(MAL, name, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ if (!(left = BATdescriptor(*l)) || !(right = BATdescriptor(*r))) {
+ msg = createException(MAL, name, SQLSTATE(HY005)
RUNTIME_OBJECT_MISSING);
+ goto bailout;
}
- prepareResult2(bn,left,right,TYPE_str,name);
+ if (BATcount(left) != BATcount(right)) {
+ msg = createException(MAL, name, ILLEGAL_ARGUMENT " Requires
bats of identical size");
+ goto bailout;
+ }
+ q = BATcount(left);
+ if (!(bn = COLnew(left->hseqbase, TYPE_str, q, TRANSIENT))) {
+ msg = createException(MAL, name, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
lefti = bat_iterator(left);
- right_vals = Tloc(right, 0);
+ righti = Tloc(right, 0);
+ for (p = 0; p < q ; p++) {
+ x = (str) BUNtail(lefti, p);
- BATloop(left, p, q) {
- str tl = (str) BUNtvar(lefti,p);
- int tr = right_vals[p];
- if ((msg = func(&v, &tl, &tr)) != MAL_SUCCEED)
- goto bunins_failed;
- if (bunfastappVAR(bn, v) != GDK_SUCCEED)
- goto bunins_failed;
- GDKfree(v);
+ if ((msg = (*func)(&buf, &buflen, x, righti[p])) != MAL_SUCCEED)
+ goto bailout;
+ if (tfastins_nocheckVAR(bn, p, buf, Tsize(bn)) != GDK_SUCCEED) {
+ msg = createException(MAL, name, SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ nils |= strNil(buf);
}
- bn->tnonil = false;
- BBPunfix(right->batCacheid);
- finalizeResult(ret,bn,left);
- return MAL_SUCCEED;
-bunins_failed:
- BBPunfix(left->batCacheid);
- BBPunfix(right->batCacheid);
- BBPunfix(*ret);
- if (msg)
- return msg;
- GDKfree(v);
- throw(MAL, name, OPERATION_FAILED " During bulk operation");
+bailout:
+ GDKfree(buf);
+ if (left)
+ BBPunfix(left->batCacheid);
+ if (right)
+ BBPunfix(right->batCacheid);
+ if (bn && !msg) {
+ BATsetcount(bn, q);
+ bn->tnil = nils;
+ bn->tnonil = !nils;
+ bn->tkey = BATcount(bn) <= 1;
+ bn->tsorted = BATcount(bn) <= 1;
+ bn->trevsorted = BATcount(bn) <= 1;
+ BBPkeepref(*res = bn->batCacheid);
+ } else if (bn)
+ BBPreclaim(bn);
+ return msg;
}
static str
STRbatprefix(bat *ret, const bat *l, const bat *r)
{
- return do_batstr_str_int(ret, l, r, "batstr.prefix", STRprefix);
+ return do_batstr_str_int(ret, l, r, "batstr.prefix", str_prefix);
}
static str
STRbatsuffix(bat *ret, const bat *l, const bat *r)
{
- return do_batstr_str_int(ret, l, r, "batstr.suffix", STRsuffix);
+ return do_batstr_str_int(ret, l, r, "batstr.suffix", str_suffix);
}
static str
STRbatrepeat(bat *ret, const bat *l, const bat *r)
{
- return do_batstr_str_int(ret, l, r, "batstr.repeat", STRrepeat);
+ return do_batstr_str_int(ret, l, r, "batstr.repeat", str_repeat);
}
static str
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list