Changeset: f687a7a4c6fb for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f687a7a4c6fb Modified Files: sql/backends/monet5/UDF/80_udf.sql sql/backends/monet5/UDF/udf.c sql/backends/monet5/UDF/udf.h sql/backends/monet5/UDF/udf.mal Branch: pythonudf Log Message:
Revert some code accidently checked in. diffs (165 lines): diff --git a/sql/backends/monet5/UDF/80_udf.sql b/sql/backends/monet5/UDF/80_udf.sql --- a/sql/backends/monet5/UDF/80_udf.sql +++ b/sql/backends/monet5/UDF/80_udf.sql @@ -8,8 +8,8 @@ -- Reverse a string -create function reverse(src integer) -returns double external name udf.reverse; +create function reverse(src string) +returns string external name udf.reverse; -- fuse two (1-byte) tinyint values into one (2-byte) smallint value 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 @@ -15,16 +15,46 @@ /* actual implementation */ /* all non-exported functions must be declared static */ static char * -UDFreverse_(dbl *ret, const int src) +UDFreverse_(char **ret, const char *src) { - *ret = sqrt(src); + size_t len = 0; + char *dst = NULL; + + /* assert calling sanity */ + assert(ret != NULL); + + /* handle NULL pointer and NULL value */ + if (src == NULL || strcmp(src, str_nil) == 0) { + *ret = GDKstrdup(str_nil); + if (*ret == NULL) + throw(MAL, "udf.reverse", + "failed to create copy of str_nil"); + + return MAL_SUCCEED; + } + + /* allocate result string */ + len = strlen(src); + *ret = dst = GDKmalloc(len + 1); + if (dst == NULL) + throw(MAL, "udf.reverse", + "failed to allocate string of length " SZFMT, len + 1); + + /* copy characters from src to dst in reverse order */ + dst[len] = 0; + while (len > 0) + *dst++ = src[--len]; + return MAL_SUCCEED; } /* MAL wrapper */ char * -UDFreverse(dbl *ret, const int *arg) +UDFreverse(char **ret, const char **arg) { + /* assert calling sanity */ + assert(ret != NULL && arg != NULL); + return UDFreverse_ ( ret, *arg ); } @@ -39,7 +69,9 @@ UDFreverse(dbl *ret, const int *arg) static char * UDFBATreverse_(BAT **ret, BAT *src) { + BATiter li; BAT *bn = NULL; + BUN p = 0, q = 0; /* assert calling sanity */ assert(ret != NULL); @@ -49,28 +81,44 @@ UDFBATreverse_(BAT **ret, BAT *src) throw(MAL, "batudf.reverse", RUNTIME_OBJECT_MISSING); /* check tail type */ - if (src->ttype != TYPE_int) { + if (src->ttype != TYPE_str) { throw(MAL, "batudf.reverse", - "tail-type of input BAT must be TYPE_int"); + "tail-type of input BAT must be TYPE_str"); } /* allocate void-headed result BAT */ - bn = BATnew(TYPE_void, TYPE_dbl, BATcount(src), TRANSIENT); + bn = BATnew(TYPE_void, TYPE_str, BATcount(src), TRANSIENT); if (bn == NULL) { throw(MAL, "batudf.reverse", MAL_MALLOC_FAIL); } BATseqbase(bn, src->hseqbase); - { - size_t i; - int *ptr = (int*) src->T->heap.base; - dbl *res = (dbl*) bn->T->heap.base; + /* create BAT iterator */ + li = bat_iterator(src); - for(i = 0; i < BATcount(src); i++) { - res[i] = sqrt(ptr[i]); + /* the core of the algorithm, expensive due to malloc/frees */ + BATloop(src, p, q) { + char *tr = NULL, *err = NULL; + + const char *t = (const char *) BUNtail(li, p); + + /* revert tail value */ + err = UDFreverse_(&tr, t); + if (err != MAL_SUCCEED) { + /* error -> bail out */ + BBPunfix(bn->batCacheid); + return err; } + + /* assert logical sanity */ + assert(tr != NULL); + + /* append reversed tail in result BAT */ + BUNappend(bn, tr, FALSE); + + /* free memory allocated in UDFreverse_() */ + GDKfree(tr); } - BATsetcount(bn, BATcount(src)); *ret = bn; diff --git a/sql/backends/monet5/UDF/udf.h b/sql/backends/monet5/UDF/udf.h --- a/sql/backends/monet5/UDF/udf.h +++ b/sql/backends/monet5/UDF/udf.h @@ -29,7 +29,7 @@ /* export MAL wrapper functions */ -udf_export char * UDFreverse(dbl *ret, const int *arg); +udf_export char * UDFreverse(char **ret, const char **arg); udf_export char * UDFBATreverse(bat *ret, const bat *arg); /* using C macro for convenient type-expansion */ diff --git a/sql/backends/monet5/UDF/udf.mal b/sql/backends/monet5/UDF/udf.mal --- a/sql/backends/monet5/UDF/udf.mal +++ b/sql/backends/monet5/UDF/udf.mal @@ -7,7 +7,7 @@ # scalar MAL signatures module udf; -command reverse(ra1:int):dbl +command reverse(ra1:str):str address UDFreverse comment "Reverse a string"; @@ -15,7 +15,7 @@ comment "Reverse a string"; # BAT MAL signatures module batudf; -command reverse(b:bat[:int]):bat[:dbl] +command reverse(b:bat[:str]):bat[:str] address UDFBATreverse comment "Reverse a BAT of strings"; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list