Changeset: 29ddbacc07cb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=29ddbacc07cb
Modified Files:
sql/backends/monet5/sql_cast.c
Branch: alloc-less-str
Log Message:
Eliminate branch when casting between strings
diffs (65 lines):
diff --git a/sql/backends/monet5/sql_cast.c b/sql/backends/monet5/sql_cast.c
--- a/sql/backends/monet5/sql_cast.c
+++ b/sql/backends/monet5/sql_cast.c
@@ -151,7 +151,7 @@ SQLstr_cast_str(str *r, size_t *rlen, st
{
size_t intput_strlen;
- if (!strNil(v) && len > 0 && str_utf8_length(v) > len)
+ if (len > 0 && str_utf8_length(v) > len)
throw(SQL, "str_cast", SQLSTATE(22001) "value too long for type
(var)char(%d)", len);
intput_strlen = strlen(v) + 1;
@@ -254,22 +254,39 @@ SQLbatstr_cast(Client cntxt, MalBlkPtr m
goto bailout;
}
- for (BUN i = 0; i < q; i++) {
- BUN p = (BUN) (canditer_next(&ci) - off);
- ptr v = BUNtail(bi, p);
+ if (from_str) { /* string to string */
+ for (BUN i = 0; i < q; i++) {
+ BUN p = (BUN) (canditer_next(&ci) - off);
+ str v = (str) BUNtail(bi, p);
- if (from_str)
- msg = SQLstr_cast_str(&r, &rlen, (str) v, digits);
- else
- msg = SQLstr_cast_any_type(&r, &rlen, m, eclass, d1,
s1, has_tz, v, tpe, digits);
+ if (strNil(v)) {
+ if (tfastins_nocheckVAR(dst, i, str_nil,
Tsize(dst)) != GDK_SUCCEED) {
+ msg = createException(MAL,
"batcalc.str_cast", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ nils = true;
+ } else {
+ if ((msg = SQLstr_cast_str(&r, &rlen, v,
digits)) != MAL_SUCCEED)
+ goto bailout;
+ if (tfastins_nocheckVAR(dst, i, r, Tsize(dst))
!= GDK_SUCCEED) {
+ msg = createException(SQL,
"batcalc.str_cast", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ }
+ }
+ } else { /* any other type to string */
+ for (BUN i = 0; i < q; i++) {
+ BUN p = (BUN) (canditer_next(&ci) - off);
+ ptr v = BUNtail(bi, p);
- if (msg)
- goto bailout;
- if (tfastins_nocheckVAR(dst, i, r, Tsize(dst)) != GDK_SUCCEED) {
- msg = createException(SQL, "batcalc.str_cast",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
- goto bailout;
+ if ((msg = SQLstr_cast_any_type(&r, &rlen, m, eclass,
d1, s1, has_tz, v, tpe, digits)) != MAL_SUCCEED)
+ goto bailout;
+ if (tfastins_nocheckVAR(dst, i, r, Tsize(dst)) !=
GDK_SUCCEED) {
+ msg = createException(SQL, "batcalc.str_cast",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ nils |= strNil(r);
}
- nils |= strNil(r);
}
bailout:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list