Changeset: 39e13e835fd0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=39e13e835fd0
Modified Files:
        sql/backends/monet5/UDF/udf.c
Branch: default
Log Message:

Merge with Apr2012 branch.


diffs (280 lines):

diff --git a/sql/backends/monet5/UDF/udf.c b/sql/backends/monet5/UDF/udf.c
--- a/sql/backends/monet5/UDF/udf.c
+++ b/sql/backends/monet5/UDF/udf.c
@@ -21,17 +21,16 @@
 #include "udf.h"
 
 /* Reverse a string */
-str
-UDFreverse(str *ret, str *arg)
+
+/* actual implementation */
+static str
+UDFreverse_(str *ret, str src)
 {
        size_t len = 0;
-       str src = NULL, dst = NULL;
+       str dst = NULL;
 
        /* assert calling sanity */
-       assert(ret != NULL && arg != NULL);
-
-       /* mainly for convenience */
-       src = *arg;
+       assert(ret != NULL);
 
        /* handle NULL pointer and NULL value */
        if (src == NULL || strcmp(src, str_nil) == 0) {
@@ -58,29 +57,40 @@ UDFreverse(str *ret, str *arg)
        return MAL_SUCCEED;
 }
 
+/* MAL wrapper */
+str
+UDFreverse(str *ret, str *arg)
+{
+       /* assert calling sanity */
+       assert(ret != NULL && arg != NULL);
+
+       return UDFreverse_ ( ret, *arg );
+}
+
 
 /* Reverse a BAT of strings */
 /*
  * Generic "type-oblivious" version,
  * using generic "type-oblivious" BAT access interface.
  */
-str
-UDFBATreverse(bat *ret, bat *bid)
+
+/* actual implementation */
+static str
+UDFBATreverse_(BAT **ret, BAT *left)
 {
        BATiter li;
-       BAT *bn = NULL, *left = NULL;
+       BAT *bn = NULL;
        BUN p = 0, q = 0;
 
        /* assert calling sanity */
-       assert(ret != NULL && bid != NULL);
+       assert(ret != NULL);
 
-       /* bat-id -> BAT-descriptor */
-       if ((left = BATdescriptor(*bid)) == NULL)
+       /* handle NULL pointer */
+       if (left == NULL)
                throw(MAL, "batudf.reverse", RUNTIME_OBJECT_MISSING);
 
        /* check tail type */
        if (left->ttype != TYPE_str) {
-               BBPreleaseref(left->batCacheid);
                throw(MAL, "batudf.reverse",
                      "tail-type of input BAT must be TYPE_str");
        }
@@ -88,7 +98,6 @@ UDFBATreverse(bat *ret, bat *bid)
        /* allocate result BAT */
        bn = BATnew(left->htype, TYPE_str, BATcount(left));
        if (bn == NULL) {
-               BBPreleaseref(left->batCacheid);
                throw(MAL, "batudf.reverse", MAL_MALLOC_FAIL);
        }
        BATseqbase(bn, left->hseqbase);
@@ -108,13 +117,12 @@ UDFBATreverse(bat *ret, bat *bid)
                str t = (str) BUNtail(li, p);
 
                /* revert tail value */
-               err = UDFreverse(&tr, &t);
+               err = UDFreverse_(&tr, t);
                if (err != MAL_SUCCEED) {
                        /* error -> bail out */
                        BATaccessEnd(left, USE_HEAD | USE_TAIL,
                                     MMAP_SEQUENTIAL);
-                       BBPreleaseref(left->batCacheid);
-                       BBPreleaseref(*ret);
+                       BBPreleaseref(bn->batCacheid);
                        return err;
                }
 
@@ -125,19 +133,43 @@ UDFBATreverse(bat *ret, bat *bid)
                /* BUNins() takes care of all necessary administration */
                BUNins(bn, h, tr, FALSE);
 
-               /* free memory allocated in UDFreverse() */
+               /* free memory allocated in UDFreverse_() */
                GDKfree(tr);
        }
 
        BATaccessEnd(left, USE_HEAD | USE_TAIL, MMAP_SEQUENTIAL);
 
+       *ret = bn;
+
+       return MAL_SUCCEED;
+}
+
+/* MAL wrapper */           
+str
+UDFBATreverse(bat *ret, bat *bid)
+{
+       BAT *res = NULL, *left = NULL;
+       str msg = NULL;
+
+       /* assert calling sanity */
+       assert(ret != NULL && bid != NULL);
+
+       /* bat-id -> BAT-descriptor */
+       if ((left = BATdescriptor(*bid)) == NULL)
+               throw(MAL, "batudf.reverse", RUNTIME_OBJECT_MISSING);
+
+       /* do the work */
+       msg = UDFBATreverse_ ( &res, left );
+
        /* release input BAT-descriptor */
        BBPreleaseref(left->batCacheid);
 
-       /* register result BAT in buffer pool */
-       BBPkeepref((*ret = bn->batCacheid));
+       if (msg == MAL_SUCCEED) {
+               /* register result BAT in buffer pool */
+               BBPkeepref((*ret = res->batCacheid));
+       }
 
-       return MAL_SUCCEED;
+       return msg;
 }
 
 
@@ -146,19 +178,28 @@ UDFBATreverse(bat *ret, bat *bid)
 
 #define UDFfuse_scalar_impl(in,uin,out,shift)                          \
 /* fuse two (shift-byte) in values into one (2*shift-byte) out value */        
\
+/* actual implementation */                                            \
+static str UDFfuse_##in##_##out##_ ( out *ret , in one , in two )      \
+{                                                                      \
+       /* assert calling sanity */                                     \
+       assert(ret != NULL);                                            \
+                                                                       \
+       if (one == in##_nil || two == in##_nil)                         \
+               /* NULL/nil in => NULL/nil out */                       \
+               *ret = out##_nil;                                       \
+       else                                                            \
+               /* do the work; watch out for sign bits */              \
+               *ret = ( ((out)((uin)one)) << shift ) | ((uin)two);     \
+                                                                       \
+       return MAL_SUCCEED;                                             \
+}                                                                      \
+/* MAL wrapper */                                                      \
 str UDFfuse_##in##_##out ( out *ret , in *one , in *two )              \
 {                                                                      \
        /* assert calling sanity */                                     \
        assert(ret != NULL && one != NULL && two != NULL);              \
                                                                        \
-       if (*one == in##_nil || *two == in##_nil)                       \
-               /* NULL/nil in => NULL/nil out */                       \
-               *ret = out##_nil;                                       \
-       else                                                            \
-               /* do the work; watch out for sign bits */              \
-               *ret = ( ((out)((uin)*one)) << shift ) | ((uin)*two);   \
-                                                                       \
-       return MAL_SUCCEED;                                             \
+       return UDFfuse_##in##_##out##_ ( ret, *one, *two );             \
 }
 
 UDFfuse_scalar_impl(bte, unsigned char,  sht,  8)
@@ -171,41 +212,33 @@ UDFfuse_scalar_impl(int, unsigned int,  
  * Type-expanded optimized version,
  * accessing value arrays directly.
  */
- str
-UDFBATfuse(bat *ires, bat *ione, bat *itwo)
+
+/* actual implementation */
+static str
+UDFBATfuse_(BAT **ret, BAT *bone, BAT *btwo)
 {
-       BAT *bres = NULL, *bone = NULL, *btwo = NULL;
+       BAT *bres = NULL;
        bit two_tail_sorted_unsigned = FALSE;
        bit two_tail_revsorted_unsigned = FALSE;
 
        /* assert calling sanity */
-       assert(ires != NULL && ione != NULL && itwo != NULL);
+       assert(ret != NULL);
 
-       /* bat-id -> BAT-descriptor */
-       if ((bone = BATdescriptor(*ione)) == NULL)
+       /* handle NULL pointer */
+       if (bone == NULL || btwo == NULL)
                throw(MAL, "batudf.fuse", RUNTIME_OBJECT_MISSING);
 
-       /* bat-id -> BAT-descriptor */
-       if ((btwo = BATdescriptor(*itwo)) == NULL) {
-               BBPreleaseref(bone->batCacheid);
-               throw(MAL, "batudf.fuse", RUNTIME_OBJECT_MISSING);
-       }
-
        /* check for dense & aligned heads */
        if (!BAThdense(bone) ||
            !BAThdense(btwo) ||
            BATcount(bone) != BATcount(btwo) ||
            bone->hseqbase != btwo->hseqbase) {
-               BBPreleaseref(bone->batCacheid);
-               BBPreleaseref(btwo->batCacheid);
                throw(MAL, "batudf.fuse",
                      "heads of input BATs must be aligned");
        }
 
        /* check tail types */
        if (bone->ttype != btwo->ttype) {
-               BBPreleaseref(bone->batCacheid);
-               BBPreleaseref(btwo->batCacheid);
                throw(MAL, "batudf.fuse",
                      "tails of input BATs must be identical");
        }
@@ -302,12 +335,42 @@ do {      /* type-specific core algorithm */      
        /* result tail is key (unique), iff both input tails are */
        BATkey(BATmirror(bres), BATtkey(bone) || BATtkey(btwo));
 
+       *ret = bres;
+
+       return MAL_SUCCEED;
+}
+
+/* MAL wrapper */
+str
+UDFBATfuse(bat *ires, bat *ione, bat *itwo)
+{
+       BAT *bres = NULL, *bone = NULL, *btwo = NULL;
+       str msg = NULL;
+
+       /* assert calling sanity */
+       assert(ires != NULL && ione != NULL && itwo != NULL);
+
+       /* bat-id -> BAT-descriptor */
+       if ((bone = BATdescriptor(*ione)) == NULL)
+               throw(MAL, "batudf.fuse", RUNTIME_OBJECT_MISSING);
+
+       /* bat-id -> BAT-descriptor */
+       if ((btwo = BATdescriptor(*itwo)) == NULL) {
+               BBPreleaseref(bone->batCacheid);
+               throw(MAL, "batudf.fuse", RUNTIME_OBJECT_MISSING);
+       }
+
+       /* do the work */
+       msg = UDFBATfuse_ ( &bres, bone, btwo );
+
        /* release input BAT-descriptors */
        BBPreleaseref(bone->batCacheid);
        BBPreleaseref(btwo->batCacheid);
 
-       /* register result BAT in buffer pool */
-       BBPkeepref((*ires = bres->batCacheid));
+       if (msg == MAL_SUCCEED) {
+               /* register result BAT in buffer pool */
+               BBPkeepref((*ires = bres->batCacheid));
+       }
 
-       return MAL_SUCCEED;
+       return msg;
 }
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to