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

Reply via email to