Changeset: a0e97360da4d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a0e97360da4d
Modified Files:
        gdk/ChangeLog.Jul2015
        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
        sql/backends/monet5/sql.c
        sql/server/rel_exp.h
        sql/server/rel_psm.c
        sql/server/rel_select.c
        sql/test/BugTracker-2012/Tests/All
        sql/test/json/Tests/All
        sql/test/pg_regress/Tests/All
        testing/Mtest.py.in
        tools/embedded/Tests/All
        tools/mserver/mserver5.c
Branch: pythonudf
Log Message:

Merge.


diffs (truncated from 585 to 300 lines):

diff --git a/gdk/ChangeLog.Jul2015 b/gdk/ChangeLog.Jul2015
--- a/gdk/ChangeLog.Jul2015
+++ b/gdk/ChangeLog.Jul2015
@@ -1,3 +1,9 @@
 # ChangeLog file for MonetDB
 # This file is updated with Maddlog
 
+* Mon Apr  4 2016 Sjoerd Mullender <sjo...@acm.org>
+- Fixed a bug that caused various instances where old data returned or
+  where crashes occurred.  The problem was that internally data wasn't
+  always marked dirty when it was being changed, causiing later processing
+  to not deal with the changed data correctly.
+
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 string)
-returns string external name udf.reverse;
+create function reverse(src integer)
+returns double 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,46 +15,16 @@
 /* actual implementation */
 /* all non-exported functions must be declared static */
 static char *
-UDFreverse_(char **ret, const char *src)
+UDFreverse_(dbl *ret, const int 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];
-
+       *ret = sqrt(src);
        return MAL_SUCCEED;
 }
 
 /* MAL wrapper */
 char *
-UDFreverse(char **ret, const char **arg)
+UDFreverse(dbl *ret, const int *arg)
 {
-       /* assert calling sanity */
-       assert(ret != NULL && arg != NULL);
-
        return UDFreverse_ ( ret, *arg );
 }
 
@@ -69,9 +39,7 @@ UDFreverse(char **ret, const char **arg)
 static char *
 UDFBATreverse_(BAT **ret, BAT *src)
 {
-       BATiter li;
        BAT *bn = NULL;
-       BUN p = 0, q = 0;
 
        /* assert calling sanity */
        assert(ret != NULL);
@@ -81,44 +49,28 @@ UDFBATreverse_(BAT **ret, BAT *src)
                throw(MAL, "batudf.reverse", RUNTIME_OBJECT_MISSING);
 
        /* check tail type */
-       if (src->ttype != TYPE_str) {
+       if (src->ttype != TYPE_int) {
                throw(MAL, "batudf.reverse",
-                     "tail-type of input BAT must be TYPE_str");
+                     "tail-type of input BAT must be TYPE_int");
        }
 
        /* allocate void-headed result BAT */
-       bn = BATnew(TYPE_void, TYPE_str, BATcount(src), TRANSIENT);
+       bn = BATnew(TYPE_void, TYPE_dbl, BATcount(src), TRANSIENT);
        if (bn == NULL) {
                throw(MAL, "batudf.reverse", MAL_MALLOC_FAIL);
        }
        BATseqbase(bn, src->hseqbase);
 
-       /* create BAT iterator */
-       li = bat_iterator(src);
+       {
+               size_t i;
+               int *ptr = (int*) src->T->heap.base;
+               dbl *res = (dbl*) bn->T->heap.base;
 
-       /* 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;
+               for(i = 0; i < BATcount(src); i++) {
+                       res[i] = sqrt(ptr[i]);
                }
-
-               /* 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(char **ret, const char **arg);
+udf_export char * UDFreverse(dbl *ret, const int *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:str):str
+command reverse(ra1:int):dbl
 address UDFreverse
 comment "Reverse a string";
 
@@ -15,7 +15,7 @@ comment "Reverse a string";
 # BAT MAL signatures
 module batudf;
 
-command reverse(b:bat[:str]):bat[:str]
+command reverse(b:bat[:int]):bat[:dbl]
 address UDFBATreverse
 comment "Reverse a BAT of strings";
 
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -3372,7 +3372,7 @@ mvc_import_table_wrap(Client cntxt, MalB
 {
        backend *be;
        BAT **b = NULL;
-       unsigned char *tsep = NULL, *rsep = NULL, *ssep = NULL, *ns = NULL;
+       unsigned char *tsep = NULL, *rsep = NULL, *ssep = NULL, *ns = NULL, *fn 
= NULL;
        ssize_t len = 0;
        sql_table *t = *(sql_table **) getArgReference(stk, pci, pci->retc + 0);
        unsigned char **T = (unsigned char **) getArgReference_str(stk, pci, 
pci->retc + 1);
@@ -3429,7 +3429,17 @@ mvc_import_table_wrap(Client cntxt, MalB
        if (!fname) {
                msg = mvc_import_table(cntxt, &b, be->mvc, be->mvc->scanner.rs, 
t, (char *) tsep, (char *) rsep, (char *) ssep, (char *) ns, *sz, *offset, 
*locked, *besteffort);
        } else {
-               ss = open_rastream(*fname);
+               len = strlen(*fname);
+               if ((fn = GDKmalloc(len + 1)) == NULL) {
+                       GDKfree(ns);
+                       GDKfree(tsep);
+                       GDKfree(rsep);
+                       GDKfree(ssep);
+                       throw(MAL, "sql.copy_from", MAL_MALLOC_FAIL);
+               }
+               GDKstrFromStr(fn, (unsigned char*)*fname, len);
+
+               ss = open_rastream((const char *) fn);
                if (!ss || mnstr_errnr(ss)) {
                        int errnr = mnstr_errnr(ss);
                        if (ss)
@@ -3438,9 +3448,11 @@ mvc_import_table_wrap(Client cntxt, MalB
                        GDKfree(rsep);
                        GDKfree(ssep);
                        GDKfree(ns);
-                       msg = createException(IO, "sql.copy_from", "could not 
open file '%s': %s", *fname, strerror(errnr));
+                       msg = createException(IO, "sql.copy_from", "could not 
open file '%s': %s", fn, strerror(errnr));
+                       GDKfree(fn);
                        return msg;
                }
+               GDKfree(fn);
 #if SIZEOF_VOID_P == 4
                s = bstream_create(ss, 0x20000);
 #else
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -13,6 +13,8 @@
 #include "sql_mvc.h"
 #include "sql_atom.h"
 
+#define ERR_AMBIGUOUS          050000
+
 #define new_exp_list(sa) sa_list(sa)
 #define exp2list(sa,e)   append(sa_list(sa),e)
 
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -602,6 +602,14 @@ sequential_block (mvc *sql, sql_subtype 
        return l;
 }
 
+static int
+arg_cmp(void *A, void *N) 
+{
+       sql_arg *a = A;
+       char *name = N;
+       return strcmp(a->name, name);
+}
+
 static list *
 result_type(mvc *sql, symbol *res) 
 {
@@ -618,6 +626,9 @@ result_type(mvc *sql, symbol *res)
                for(;n; n = n->next->next) {
                        sql_subtype *ct = &n->next->data.typeval;
 
+                       if (list_find(types, n->data.sval, &arg_cmp) != NULL)
+                               return sql_error(sql, ERR_AMBIGUOUS, "CREATE 
FUNC: identifier '%s' ambiguous", n->data.sval);
+
                        a = sql_create_arg(sql->sa, n->data.sval, ct, ARG_OUT);
                        list_append(types, a);
                }
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -3005,6 +3005,12 @@ rel_nop(mvc *sql, sql_rel **rel, symbol 
        }
        if (sname)
                s = mvc_bind_schema(sql, sname);
+       
+       /* first try aggregate */
+       f = find_func(sql, s, fname, nr_args, F_AGGR, NULL);
+       if (f)
+               return _rel_aggr(sql, rel, 0, s, fname, l->next->data.lval->h, 
fs);
+
        f = bind_func_(sql, s, fname, tl, type);
        if (f) {
                return exp_op(sql->sa, exps, f);
diff --git a/sql/test/BugTracker-2012/Tests/All 
b/sql/test/BugTracker-2012/Tests/All
--- a/sql/test/BugTracker-2012/Tests/All
+++ b/sql/test/BugTracker-2012/Tests/All
@@ -69,7 +69,7 @@ create_function.Bug-3172
 currenttime.Bug-2781
 timestamp_minus_date.Bug-2977
 null_except_null.Bug-3040
-create_index_update.Bug-3098.sql
+create_index_update.Bug-3098
 algebra_find.Bug-2728
 row_number_does_not_work_in_complex_query.Bug-2805
 day-of-month-localization.Bug-2962
@@ -82,7 +82,7 @@ large-number-operation-strange-results.B
 inet-casts.Bug-3205
 fixed_limit_for_prepare.Bug-3208
 exp_bin_assertion.Bug-3209
-querycache.Bug-3212.sql
+querycache.Bug-3212
 url_script_test.Bug-2972
 huge_insert.Bug-2803
 huge_table_update.Bug-2803
diff --git a/sql/test/json/Tests/All b/sql/test/json/Tests/All
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to