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

Reply via email to