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