Changeset: 95202ccdb40e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=95202ccdb40e
Modified Files:
gdk/gdk_calc.c
Branch: Dec2016
Log Message:
Improvements to type conversions.
- Converting a str to a str should not introduce quotes.
- Added some error checking.
diffs (136 lines):
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -13605,7 +13605,8 @@ convert_any_str(BAT *b, BAT *bn, BUN cnt
for (i = 0; i < start; i++)
tfastins_nocheck(bn, i, str_nil, bn->twidth);
- if (b->tvarsized) {
+ if (atomtostr == BATatoms[TYPE_str].atomToStr) {
+ /* compatible with str, we just copy the value */
BATiter bi = bat_iterator(b);
assert(b->ttype != TYPE_void);
@@ -13621,6 +13622,26 @@ convert_any_str(BAT *b, BAT *bn, BUN cnt
end = i + 1;
}
src = BUNtvar(bi, i);
+ if ((*atomcmp)(src, str_nil) == 0)
+ nils++;
+ 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++;
@@ -13651,12 +13672,10 @@ convert_any_str(BAT *b, BAT *bn, BUN cnt
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;
}
@@ -14307,8 +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 && tp != TYPE_str &&
- 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);
}
@@ -14376,14 +14397,18 @@ VARconvert(ValPtr ret, const ValRecord *
(*ATOMcompare(v->vtype))(VALptr(v),
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) {
@@ -14398,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,
- abort_on_error);
+ if (VALinit(ret, ret->vtype, ATOMnilptr(ret->vtype)) ==
NULL)
+ nils = BUN_NONE;
} else {
int len;
- p = VALget(ret);
- ret->len = ATOMsize(ret->vtype);
+
+ if (ATOMextern(ret->vtype)) {
+ /* let atomFromStr allocate memory
+ * which we later give away to ret */
+ p = NULL;
+ ret->len = 0;
+ } else {
+ /* use the space provided by ret */
+ p = VALget(ret);
+ ret->len = ATOMsize(ret->vtype);
+ }
if ((len = (*BATatoms[ret->vtype].atomFromStr)(
v->val.sval, &ret->len, &p)) <= 0 ||
len < (int) strlen(v->val.sval)) {
@@ -14413,8 +14445,13 @@ VARconvert(ValPtr ret, const ValRecord *
"'%s' to type %s failed.\n",
v->val.sval, ATOMname(ret->vtype));
nils = BUN_NONE;
- }
- assert(p == VALget(ret));
+ } else {
+ /* now give value obtained to ret */
+ assert(ATOMextern(ret->vtype) ||
+ p == VALget(ret));
+ if (ATOMextern(ret->vtype))
+ VALset(ret, ret->vtype, p);
+ }
}
} else {
nils = convert_typeswitchloop(VALptr(v), v->vtype,
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list