Changeset: 918f0476a8b9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=918f0476a8b9
Modified Files:
        sql/backends/monet5/UDF/udf/udf.c
Branch: alloc-less-str
Log Message:

Update reverse udf to pair with str module


diffs (97 lines):

diff --git a/sql/backends/monet5/UDF/udf/udf.c 
b/sql/backends/monet5/UDF/udf/udf.c
--- a/sql/backends/monet5/UDF/udf/udf.c
+++ b/sql/backends/monet5/UDF/udf/udf.c
@@ -18,20 +18,12 @@
 static str
 UDFreverse_(str *buf, size_t *buflen, const char *src)
 {
-       size_t len = 0;
+       size_t len = strlen(src);
        char *dst = NULL;
 
        /* assert calling sanity */
        assert(buf);
-
-       /* handle NULL pointer and NULL value */
-       if (strNil(src)) {
-               strcpy(*buf, str_nil);
-               return MAL_SUCCEED;
-       }
-
        /* test if input buffer is large enough for result string, otherwise 
re-allocate it */
-       len = strlen(src);
        CHECK_STR_BUFFER_LENGTH(buf, buflen, (len + 1), "udf.reverse");
        dst = *buf;
 
@@ -83,18 +75,24 @@ UDFreverse_(str *buf, size_t *buflen, co
 str
 UDFreverse(str *res, const str *arg)
 {
-       str msg = MAL_SUCCEED;
-       size_t buflen;
+       str msg = MAL_SUCCEED, s;
 
        /* assert calling sanity */
        assert(res && arg);
+       s = *arg;
+       if (strNil(s)) {
+               if (!(*res = GDKstrdup(str_nil)))
+                       throw(MAL, "udf.reverse", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       } else {
+               size_t buflen = strlen(s) + 1;
 
-       buflen = strlen(*arg) + 1;
-       if (!(*res = GDKmalloc(buflen)))
-               throw(MAL, "udf.reverse", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       if ((msg = UDFreverse_(res, &buflen, *arg)) != MAL_SUCCEED) {
-               GDKfree(*res);
-               *res = NULL;
+               if (!(*res = GDKmalloc(buflen)))
+                       throw(MAL, "udf.reverse", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               if ((msg = UDFreverse_(res, &buflen, s)) != MAL_SUCCEED) {
+                       GDKfree(*res);
+                       *res = NULL;
+                       return msg;
+               }
        }
        return msg;
 }
@@ -143,19 +141,27 @@ UDFBATreverse_(BAT **ret, BAT *src)
        li = bat_iterator(src);
        /* the core of the algorithm */
        for (p = 0; p < q ; p++) {
-               const char *t = BUNtail(li, p);
+               str x = (str) BUNtail(li, p);
 
-               /* revert tail value */
-               if ((msg = UDFreverse_(&buf, &buflen, t)) != MAL_SUCCEED)
-                       goto bailout;
-               /* assert logical sanity */
-               assert(buf && t);
-               /* append to the output BAT. We are using a faster route, 
because we know what we are doing */
-               if (tfastins_nocheckVAR(bn, p, buf, Tsize(bn)) != GDK_SUCCEED) {
-                       msg = createException(MAL, "batudf.reverse", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                       goto bailout;
+               if (strNil(x)) {
+                       /* if the input string is null, then append directly */
+                       if (tfastins_nocheckVAR(bn, p, str_nil, Tsize(bn)) != 
GDK_SUCCEED) {
+                               msg = createException(MAL, "batudf.reverse", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               goto bailout;
+                       }
+                       nils = true;
+               } else {
+                       /* revert tail value */
+                       if ((msg = UDFreverse_(&buf, &buflen, x)) != 
MAL_SUCCEED)
+                               goto bailout;
+                       /* assert logical sanity */
+                       assert(buf && x);
+                       /* append to the output BAT. We are using a faster 
route, because we know what we are doing */
+                       if (tfastins_nocheckVAR(bn, p, buf, Tsize(bn)) != 
GDK_SUCCEED) {
+                               msg = createException(MAL, "batudf.reverse", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               goto bailout;
+                       }
                }
-               nils |= strNil(buf);
        }
 
 bailout:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to