Changeset: 670f75c4f015 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/670f75c4f015 Branch: pax-log Log Message:
Merge with default. diffs (240 lines): diff --git a/clients/Tests/All b/clients/Tests/All --- a/clients/Tests/All +++ b/clients/Tests/All @@ -1,6 +1,6 @@ exports HAVE_HGE&HAVE_FITS&HAVE_GEOM&HAVE_LIBR&HAVE_LIBPY3&HAVE_NETCDF&HAVE_SHP&NOT_WIN32?MAL-signatures-hge !HAVE_HGE&HAVE_FITS&HAVE_GEOM&HAVE_LIBR&HAVE_LIBPY3&HAVE_NETCDF&HAVE_SHP&NOT_WIN32?MAL-signatures -NOT_WIN32&MERCURIAL?melcheck +NOT_WIN32&melcheck mclient-uri testcondvar diff --git a/clients/Tests/melcheck.sh b/clients/Tests/melcheck.sh --- a/clients/Tests/melcheck.sh +++ b/clients/Tests/melcheck.sh @@ -1,3 +1,12 @@ #!/bin/sh cd $TSTSRCBASE -hg -q files -I '{monetdb5,sql,geom}/**.[ch]' -X '**/Tests/**' | python3 -c 'import MonetDBtesting.melcheck' + +hg_root="$(hg root 2>/dev/null)" +git_root="$(git rev-parse --show-toplevel 2>/dev/null)" + +if [ "$hg_root" = "$TSTSRCBASE" ]; then + hg -q files -I '{monetdb5,sql,geom}/**.[ch]' -X '**/Tests/**' +elif [ "$git_root" = "$TSTSRCBASE" ]; then + git ls-files -- 'monetdb5/**.[ch]' 'sql/**.[ch]' 'geom/**.[ch]' ':!:**/Tests/*' +fi \ +| python3 -c 'import MonetDBtesting.melcheck' diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake --- a/cmake/monetdb-defines.cmake +++ b/cmake/monetdb-defines.cmake @@ -316,7 +316,7 @@ macro(monetdb_configure_misc) if(NOT DEFINED PYTHON3_LIBDIR) # Used for installing testing python module (don't pass a location, else we need to strip this again) - execute_process(COMMAND "${Python3_EXECUTABLE}" "-c" "import sysconfig; print(sysconfig.get_path('purelib', vars={'base': ''})[1:])" + execute_process(COMMAND "${Python3_EXECUTABLE}" "-c" "import sysconfig; print((sysconfig.get_path('purelib', vars={'base':''}, scheme='rpm_prefix') if 'rpm_prefix' in sysconfig.get_scheme_names() else sysconfig.get_path('purelib', vars={'base':''}))[1:])" RESULT_VARIABLE PY3_LIBDIR_CODE OUTPUT_VARIABLE PYTHON3_SITEDIR OUTPUT_STRIP_TRAILING_WHITESPACE) diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -2306,17 +2306,18 @@ gdk_export BAT *BATsample_with_seed(BAT #define CHECK_QRY_TIMEOUT_MASK (CHECK_QRY_TIMEOUT_STEP - 1) #define TIMEOUT_MSG "Timeout was reached!" +#define EXITING_MSG "Server is exiting!" -#define TIMEOUT_HANDLER(rtpe) \ - do { \ - GDKerror(TIMEOUT_MSG); \ - return rtpe; \ +#define TIMEOUT_HANDLER(rtpe) \ + do { \ + GDKerror("%s\n", GDKexiting() ? EXITING_MSG : TIMEOUT_MSG); \ + return rtpe; \ } while(0) -#define GOTO_LABEL_TIMEOUT_HANDLER(label) \ - do { \ - GDKerror(TIMEOUT_MSG); \ - goto label; \ +#define GOTO_LABEL_TIMEOUT_HANDLER(label) \ + do { \ + GDKerror("%s\n", GDKexiting() ? EXITING_MSG : TIMEOUT_MSG); \ + goto label; \ } while(0) #define GDK_CHECK_TIMEOUT_BODY(timeoffset, callback) \ diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -1420,6 +1420,12 @@ void } void +_exp_print(mvc *sql, sql_exp *e) { + exp_print(sql, GDKstdout, e, 0, NULL, 1, 0); + mnstr_printf(GDKstdout, "\n"); +} + +void rel_print(mvc *sql, sql_rel *rel, int depth) { list *refs = sa_list(sql->sa); diff --git a/sql/backends/monet5/sql_gencode.h b/sql/backends/monet5/sql_gencode.h --- a/sql/backends/monet5/sql_gencode.h +++ b/sql/backends/monet5/sql_gencode.h @@ -30,6 +30,8 @@ extern int monet5_create_relational_func extern void rel_print(mvc *sql, sql_rel *rel, int depth); extern void _rel_print(mvc *sql, sql_rel *rel); +extern void _exp_print(mvc *sql, sql_exp *e); + extern int constantAtom(backend *be, MalBlkPtr mb, atom *a); extern InstrPtr table_func_create_result(MalBlkPtr mb, InstrPtr q, sql_func *f, list *restypes); extern InstrPtr relational_func_create_result(mvc *sql, MalBlkPtr mb, InstrPtr q, sql_rel *f); diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -113,7 +113,7 @@ static void exps_print(mvc *sql, stream static void rel_print_rel(mvc *sql, stream *fout, sql_rel *rel, int depth, list *refs, int decorate); -static void +void exp_print(mvc *sql, stream *fout, sql_exp *e, int depth, list *refs, int comma, int alias) { (void)sql; diff --git a/sql/server/rel_dump.h b/sql/server/rel_dump.h --- a/sql/server/rel_dump.h +++ b/sql/server/rel_dump.h @@ -16,5 +16,6 @@ extern void rel_print_(mvc *sql, stream extern void rel_print_refs(mvc *sql, stream* fout, sql_rel *rel, int depth, list *refs, int decorate); extern sql_rel *rel_read(mvc *sql, char *ra, int *pos, list *refs); +extern void exp_print(mvc *sql, stream *fout, sql_exp *e, int depth, list *refs, int comma, int alias); #endif /*_REL_DUMP_H_*/ diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c --- a/sql/server/rel_exp.c +++ b/sql/server/rel_exp.c @@ -286,6 +286,40 @@ exp_in_func(mvc *sql, sql_exp *le, sql_e } sql_exp * +exp_in_aggr(mvc *sql, sql_exp *le, sql_exp *vals, int anyequal, int is_tuple) +{ + sql_subfunc *a_func = NULL; + sql_exp *e = le; + + if (is_tuple) { + list *l = exp_get_values(e); + e = l->h->data; + } + if (!(a_func = sql_bind_func(sql, "sys", anyequal ? "anyequal" : "allnotequal", exp_subtype(e), exp_subtype(e), F_AGGR, true))) + return sql_error(sql, 02, SQLSTATE(42000) "(NOT) IN operator on type %s missing", exp_subtype(e) ? exp_subtype(e)->type->base.name : "unknown"); + e = exp_aggr2(sql->sa, le, vals, a_func, need_distinct(e), need_no_nil(e), e->card, has_nil(e)); + if (e) { + unsigned int exps_card = CARD_ATOM; + + /* ignore the cardinalites of sub-relations */ + if (vals->type == e_atom && vals->f) { + for (node *n = ((list*)vals->f)->h ; n ; n = n->next) { + sql_exp *next = n->data; + + if (!exp_is_rel(next) && exps_card < next->card) + exps_card = next->card; + } + } else if (!exp_is_rel(vals)) + exps_card = vals->card; + + e->card = MAX(le->card, exps_card); + if (!has_nil(le) && !has_nil(vals)) + set_has_no_nil(e); + } + return e; +} + +sql_exp * exp_compare_func(mvc *sql, sql_exp *le, sql_exp *re, const char *compareop, int quantifier) { sql_subfunc *cmp_func = sql_bind_func(sql, "sys", compareop, exp_subtype(le), exp_subtype(le), F_FUNC, true); 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 @@ -41,6 +41,7 @@ extern sql_exp *exp_filter(sql_allocator extern sql_exp *exp_or(sql_allocator *sa, list *l, list *r, int anti); extern sql_exp *exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype); extern sql_exp *exp_in_func(mvc *sql, sql_exp *le, sql_exp *vals, int anyequal, int is_tuple); +extern sql_exp *exp_in_aggr(mvc *sql, sql_exp *le, sql_exp *vals, int anyequal, int is_tuple); extern sql_exp *exp_compare_func(mvc *sql, sql_exp *le, sql_exp *re, const char *compareop, int quantifier); #define exp_fromtype(e) ((list*)e->r)->h->data 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 @@ -2062,7 +2062,10 @@ rel_in_value_exp(sql_query *query, sql_r if (!e) { if (add_select && rel && *rel && !is_project((*rel)->op) && !is_select((*rel)->op) && !is_base((*rel)->op)) *rel = rel_select(sql->sa, *rel, NULL); - e = exp_in_func(sql, le, values, (sc->token == SQL_IN), is_tuple); + if ((rel && *rel) || exp_has_rel(le) || exp_has_rel(values)) + e = exp_in_func(sql, le, values, (sc->token == SQL_IN), is_tuple); + else + e = exp_in_aggr(sql, le, values, (sc->token == SQL_IN), is_tuple); } } return e; diff --git a/sql/test/BugTracker-2016/Tests/storagemodel.test b/sql/test/BugTracker-2016/Tests/storagemodel.test --- a/sql/test/BugTracker-2016/Tests/storagemodel.test +++ b/sql/test/BugTracker-2016/Tests/storagemodel.test @@ -86,10 +86,10 @@ bug3923 i int 10000 -10000 -8312 +40000 0 -2000 +0 +8000 0 1 NULL @@ -192,10 +192,10 @@ bug3923 i int 10000 -10000 -8312 +40000 0 -2000 +0 +8000 0 1 NULL diff --git a/sql/test/BugTracker-2022/Tests/create_func_with_case_and_in.test b/sql/test/BugTracker-2022/Tests/create_func_with_case_and_in.test --- a/sql/test/BugTracker-2022/Tests/create_func_with_case_and_in.test +++ b/sql/test/BugTracker-2022/Tests/create_func_with_case_and_in.test @@ -6,4 +6,14 @@ END; query T rowsort select foo(10); ---- -'YES' +YES + +statement ok +CREATE FUNCTION nfoo(t INT) RETURNS STRING BEGIN +RETURN CASE WHEN t NOT IN (10, 20, 30) THEN 'YES' ELSE 'NO' END; +END; + +query T rowsort +select nfoo(10); +---- +NO _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org