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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list