Changeset: e5f7dd52b431 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e5f7dd52b431 Modified Files: MonetDB.spec sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_cast.c sql/backends/monet5/sql_result.c sql/backends/monet5/sql_upgrades.c sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out sql/benchmarks/tpch/LOCKED/Tests/01-22.stable.out.int128 sql/benchmarks/tpch/LOCKED/Tests/02.stable.out sql/benchmarks/tpch/Tests/01-22.stable.out sql/benchmarks/tpch/Tests/01-22.stable.out.int128 sql/benchmarks/tpch/Tests/02.stable.out sql/server/rel_optimizer.c sql/server/rel_rel.c sql/test/BugTracker-2009/Tests/bool-str-bug.stable.out sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out.int128 sql/test/BugTracker-2016/Tests/storagemodel.stable.out sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out sql/test/SQLite_regress/sqllogictest/Tests/select3.test.stable.out sql/test/SQLite_regress/sqllogictest/Tests/select3.test.stable.out.int128 sql/test/leaks/Tests/check1.stable.out.int128 Branch: default Log Message:
Merge with Dec2016 branch. diffs (truncated from 52515 to 300 lines): diff --git a/MonetDB.spec b/MonetDB.spec --- a/MonetDB.spec +++ b/MonetDB.spec @@ -877,6 +877,15 @@ developer, but if you do want to test, t %build +# There is a bug in GCC version 4.8 on AArch64 architectures +# that causes it to report an internal error when compiling +# testing/difflib.c. The work around is to not use -fstack-protector-strong. +# The bug exhibits itself on CentOS 7 on AArch64. +if [ `gcc -v 2>&1 | grep -c 'Target: aarch64\|gcc version 4\.'` -eq 2 ]; then + # set CFLAGS before configure, so that this value gets used + CFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions --param=ssp-buffer-size=4 -grecord-gcc-switches ' + export CFLAGS +fi %{configure} \ --enable-assert=no \ --enable-console=yes \ diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -217,7 +217,7 @@ handle_in_exps(backend *be, sql_exp *ce, sql_subtype *bt = sql_bind_localtype("bit"); sql_subfunc *cmp = (in) ?sql_bind_func(sql->sa, sql->session->schema, "=", tail_type(c), tail_type(c), F_FUNC) - :sql_bind_func(sql->sa, sql->session->schema, "!=", tail_type(c), tail_type(c), F_FUNC); + :sql_bind_func(sql->sa, sql->session->schema, "<>", tail_type(c), tail_type(c), F_FUNC); sql_subfunc *a = (in)?sql_bind_func(sql->sa, sql->session->schema, "or", bt, bt, F_FUNC) :sql_bind_func(sql->sa, sql->session->schema, "and", bt, bt, F_FUNC); @@ -1705,7 +1705,11 @@ rel2bin_join(backend *be, sql_rel *rel, prop *p; /* only handle simple joins here */ - if (exp_has_func(e) && e->flag != cmp_filter) { + if ((exp_has_func(e) && e->flag != cmp_filter) || + (e->flag == cmp_or && + exps_card(e->l) == CARD_MULTI && + exps_card(e->r) == CARD_MULTI) + ) { if (!join && !list_length(lje)) { stmt *l = bin_first_column(be, left); stmt *r = bin_first_column(be, right); @@ -1910,6 +1914,12 @@ rel2bin_semijoin(backend *be, sql_rel *r /* only handle simple joins here */ if (list_length(lje) && (idx || e->type != e_cmp || e->flag != cmp_equal)) break; + if ((exp_has_func(e) && e->flag != cmp_filter) || + (e->flag == cmp_or && + exps_card(e->l) == CARD_MULTI && + exps_card(e->r) == CARD_MULTI) ) { + break; + } s = exp_bin(be, en->data, left, right, NULL, NULL, NULL, NULL); if (!s) { @@ -1933,8 +1943,12 @@ rel2bin_semijoin(backend *be, sql_rel *r } if (list_length(lje) > 1) { join = releqjoin(be, lje, rje, 0 /* no hash used */, cmp_equal, 0); + } else if (!join && list_length(lje) == list_length(rje) && list_length(lje)) { + join = stmt_join(be, lje->h->data, rje->h->data, 0, cmp_equal); } else if (!join) { - join = stmt_join(be, lje->h->data, rje->h->data, 0, cmp_equal); + stmt *l = bin_first_column(be, left); + stmt *r = bin_first_column(be, right); + join = stmt_join(be, l, r, 0, cmp_all); } } else { stmt *l = bin_first_column(be, left); diff --git a/sql/backends/monet5/sql_cast.c b/sql/backends/monet5/sql_cast.c --- a/sql/backends/monet5/sql_cast.c +++ b/sql/backends/monet5/sql_cast.c @@ -366,6 +366,9 @@ SQLstr_cast_(str *res, mvc *m, int eclas int sz = MAX(2, len + 1); /* nil should fit */ if (tpe != TYPE_str) { + /* TODO get max size for all from type */ + if (len == 0 && tpe == TYPE_bit) /* should hold false */ + sz = 6; r = GDKmalloc(sz); if (r == NULL) throw(SQL, "str_cast", MAL_MALLOC_FAIL); diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c --- a/sql/backends/monet5/sql_result.c +++ b/sql/backends/monet5/sql_result.c @@ -1185,8 +1185,15 @@ convert2str(mvc *m, int eclass, int d, i l = sql_timestamp_tostr((void *) &ts_res, buf, &len, mtype, p); } else if (eclass == EC_BIT) { bit b = *(bit *) p; - (*buf)[0] = '0' + !!b; /* or: '1' - !b */ - (*buf)[1] = 0; + if (len <= 0 || len > 5) { + if (b) + strcpy(*buf, "true"); + else + strcpy(*buf, "false"); + } else { + (*buf)[0] = b?'t':'f'; + (*buf)[1] = 0; + } } else { l = (*BATatoms[mtype].atomToStr) (buf, &len, p); } diff --git a/sql/backends/monet5/sql_upgrades.c b/sql/backends/monet5/sql_upgrades.c --- a/sql/backends/monet5/sql_upgrades.c +++ b/sql/backends/monet5/sql_upgrades.c @@ -1373,6 +1373,31 @@ sql_update_default(Client c, mvc *sql) return err; /* usually MAL_SUCCEED */ } +static str +sql_update_dec2016_sp3(Client c, mvc *sql) +{ + size_t bufsize = 2048, pos = 0; + char *buf = GDKmalloc(bufsize), *err = NULL; + char *schema = stack_get_string(sql, "current_schema"); + + pos += snprintf(buf + pos, bufsize - pos, + "set schema \"sys\";\n" + "drop procedure sys.settimeout(bigint);" + "drop procedure sys.settimeout(bigint,bigint);" + "drop procedure sys.setsession(bigint);" + "create procedure sys.settimeout(\"query\" bigint) external name clients.settimeout;" + "create procedure sys.settimeout(\"query\" bigint, \"session\" bigint) external name clients.settimeout;" + "create procedure sys.setsession(\"timeout\" bigint) external name clients.setsession;"); + if (schema) + pos += snprintf(buf + pos, bufsize - pos, "set schema \"%s\";\n", schema); + assert(pos < bufsize); + + printf("Running database upgrade commands:\n%s\n", buf); + err = SQLstatementIntern(c, &buf, "update", 1, 0, NULL); + GDKfree(buf); + return err; /* usually MAL_SUCCEED */ +} + void SQLupgrades(Client c, mvc *m) { @@ -1484,6 +1509,16 @@ SQLupgrades(Client c, mvc *m) freeException(err); } + sql_find_subtype(&tp, "bigint", 0, 0); + if ((f = sql_bind_func(m->sa, s, "settimeout", &tp, NULL, F_PROC)) != NULL && + /* The settimeout function used to be in the sql module */ + f->func->sql && f->func->query && strstr(f->func->query, "sql") != NULL) { + if ((err = sql_update_dec2016_sp3(c, m)) != NULL) { + fprintf(stderr, "!%s\n", err); + GDKfree(err); + } + } + if (mvc_bind_table(m, s, "function_languages") == NULL) { if ((err = sql_update_default(c, m)) != NULL) { fprintf(stderr, "!%s\n", err); diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -3616,6 +3616,8 @@ rel_push_aggr_down(int *changes, mvc *sq set_has_nil(e); e = exp_column(sql->sa, exp_find_rel_name(e), exp_name(e), exp_subtype(e), e->card, has_nil(e), is_intern(e)); ne = exp_aggr1(sql->sa, e, a, need_distinct(e), 1, e->card, 1); + if (cnt) + ne->p = prop_create(sql->sa, PROP_COUNT, ne->p); } else { ne = exp_copy(sql->sa, oa); } @@ -8472,11 +8474,6 @@ rel_apply_rewrite(int *changes, mvc *sql sql_rel *nl = rel_apply(sql, rel_dup(rel->l), rel_dup(r->l), rel->exps, rel->flag); sql_rel *rr = rel_dup(r->r); - if (0 && rr->subquery) { - rr->subquery = 0; - rr = rel_project(sql->sa, rr, rel_projections(sql, rr, NULL, 1, 2)); - rr->subquery = 1; - } nl = rel_crossproduct(sql->sa, nl, rr, r->op); nl->exps = exps_copy(sql->sa, r->exps); rel_destroy(rel); @@ -8485,11 +8482,6 @@ rel_apply_rewrite(int *changes, mvc *sql sql_rel *nr = rel_apply(sql, rel_dup(rel->l), rel_dup(r->r), rel->exps, rel->flag); sql_rel *rl = rel_dup(r->l); - if (0 && rl->subquery) { - rl->subquery = 0; - rl = rel_project(sql->sa, rl, rel_projections(sql, rl, NULL, 1, 2)); - rl->subquery = 1; - } nr = rel_crossproduct(sql->sa, rl, nr, r->op); nr->exps = exps_copy(sql->sa, r->exps); rel_destroy(rel); @@ -8513,16 +8505,18 @@ rel_apply_rewrite(int *changes, mvc *sql int has_gbe = (ogbe && list_length(ogbe) > 0); node *n; - list *gbe = new_exp_list(sql->sa), *exps; - sql_exp *ident; + list *gbe = new_exp_list(sql->sa);//, *exps; + sql_exp *ident, *r_ident; /* add project + identity around l */ l = rel_add_identity(sql, rel_dup(l), &ident); ident = exp_column(sql->sa, exp_relname(ident), exp_name(ident), exp_subtype(ident), ident->card, has_nil(ident), is_intern(ident)); list_append(gbe, ident); + r->l = rel_add_identity(sql, rel_dup(r->l), &r_ident); + r_ident = exp_column(sql->sa, exp_relname(r_ident), exp_name(r_ident), exp_subtype(r_ident), r_ident->card, has_nil(r_ident), is_intern(r_ident)); aggr = rel_projections(sql, l, NULL, 1, 1); /* columns of R */ - exps = rel_projections(sql, r->l, NULL, 1, 1); /* columns before groupgby */ + //exps = rel_projections(sql, r->l, NULL, 1, 2); /* columns before groupgby */ if (has_gbe) list_merge(gbe, ogbe, (fdup)NULL); @@ -8531,12 +8525,13 @@ rel_apply_rewrite(int *changes, mvc *sql /* count_nil(*) -> count(col) */ if (!has_gbe && e->type == e_aggr && strcmp(((sql_subaggr *)e->f)->aggr->base.name, "count") == 0 && !e->l) { - sql_exp *c = exps->t->data; + //sql_exp *c = exps->t->data; + sql_exp *c = r_ident; list *l = new_exp_list(sql->sa); set_no_nil(e); e->l = l; - c = exp_column(sql->sa, exp_relname(c), exp_name(c), exp_subtype(c), exp_card(c), has_nil(c), is_intern(c)); + //c = exp_column(sql->sa, exp_relname(c), exp_name(c), exp_subtype(c), exp_card(c), has_nil(c), is_intern(c)); append(l, c); } if (e->type == e_aggr && e->card < CARD_AGGR) /* also fix projects, see above */ diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -784,9 +784,9 @@ list * rel_projections(mvc *sql, sql_rel *rel, const char *tname, int settname, int intern ) { list *lexps, *rexps, *exps; - int intern_only = (intern==2)?1:0; + int include_subquery = (intern==2)?1:0; - if (!rel || (is_subquery(rel) /*&& is_project(rel->op)*/ && rel->op == op_project)) + if (!rel || (!include_subquery && is_subquery(rel) && rel->op == op_project)) return new_exp_list(sql->sa); switch(rel->op) { @@ -821,8 +821,6 @@ rel_projections(mvc *sql, sql_rel *rel, for (en = rel->exps->h; en; en = en->next) { sql_exp *e = en->data; if (intern || !is_intern(e)) { - if (!is_intern(e) && intern_only && (exp_name(e)[0] != '%' && exp_name(e)[0] != 'L' && exp_relname(e)[0] != 'L')) - continue; append(exps, e = exp_alias_or_copy(sql, tname, exp_name(e), rel, e)); if (!settname) /* noname use alias */ exp_setrelname(sql->sa, e, label); diff --git a/sql/test/BugTracker-2009/Tests/bool-str-bug.stable.out b/sql/test/BugTracker-2009/Tests/bool-str-bug.stable.out --- a/sql/test/BugTracker-2009/Tests/bool-str-bug.stable.out +++ b/sql/test/BugTracker-2009/Tests/bool-str-bug.stable.out @@ -31,8 +31,8 @@ Ready. % b # name % char # type % 1 # length -[ "1" ] -[ "0" ] +[ "t" ] +[ "f" ] [ NULL ] # 19:54:05 > diff --git a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out --- a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out +++ b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out @@ -68,46 +68,58 @@ Ready. % .plan # table_name % rel # name % clob # type -% 374 # length +% 376 # length +REF 1 (2) +table(sys.bidder) [ bidder.id NOT NULL HASHCOL as b3.id, bidder.increase NOT NULL as b3.increase ] COUNT +REF 2 (3) +table(sys.bidder) [ bidder.id NOT NULL HASHCOL as b3a.id, bidder.open_auction_id NOT NULL as b3a.open_auction_id ] COUNT +REF 3 (2) +table(sys.bidder) [ bidder.id NOT NULL HASHCOL as b2.id, bidder.increase NOT NULL as b2.increase, bidder.%TID% NOT NULL as L32.%TID% ] COUNT +REF 4 (3) +table(sys.bidder) [ bidder.id NOT NULL HASHCOL as b2a.id, bidder.open_auction_id NOT NULL as b2a.open_auction_id, bidder.%TID% NOT NULL as L32.%TID% ] COUNT project ( | select ( | | project ( | | | select ( | | | | group by ( -| | | | | join ( -| | | | | | table(sys.bidder) [ bidder.id NOT NULL HASHCOL as b2a.id, bidder.open_auction_id NOT NULL as b2a.open_auction_id, bidder.%TID% NOT NULL as L32.%TID% ] COUNT , -| | | | | | project ( -| | | | | | | crossproduct ( -| | | | | | | | project ( +| | | | | project ( +| | | | | | join ( +| | | | | | | & REF 4 , +| | | | | | | project ( _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list