Changeset: 876b180dc580 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=876b180dc580 Added Files: sql/test/BugTracker-2020/Tests/ilike-matches.Bug-6864.sql sql/test/BugTracker-2020/Tests/ilike-matches.Bug-6864.stable.err sql/test/BugTracker-2020/Tests/ilike-matches.Bug-6864.stable.out Modified Files: buildtools/conf/Maddlog configure.ag gdk/gdk_batop.c monetdb5/modules/mal/pcre.c sql/server/rel_optimizer.c sql/server/rel_unnest.c sql/test/BugTracker-2016/Tests/memory-consumption-query-PLAN-25joins.Bug-3972.stable.out sql/test/BugTracker-2020/Tests/All Branch: default Log Message:
Merged with Jun2020 diffs (truncated from 523 to 300 lines): diff --git a/buildtools/conf/Maddlog b/buildtools/conf/Maddlog --- a/buildtools/conf/Maddlog +++ b/buildtools/conf/Maddlog @@ -123,7 +123,7 @@ fi case "$CL" in '') d=. - while [ ! -f $d/vertoo.data -a ! -f $d/ChangeLog -a ! -f $d/ChangeLog.$tag ]; do + while [ ! -f $d/.bumpversion.cfg -a ! -f $d/ChangeLog -a ! -f $d/ChangeLog.$tag ]; do if [ $d -ef / ]; then echo "$0: cannot find top directory of package" >&2 exit 1 diff --git a/configure.ag b/configure.ag --- a/configure.ag +++ b/configure.ag @@ -131,7 +131,7 @@ AS_CASE([$CC], # __GNUC_MINOR__, and __GNUC_PATCHLEVEL__ macros. CC="$CC -no-gcc"]) -AS_IF([test -f "$srcdir"/vertoo.data], +AS_IF([test -f "$srcdir"/.bumpversion.cfg], [ # Developers compiling from Mercurial: # default is --enable-strict --enable-assert --enable-debug --disable-optimize --enable-developer --enable-profiler=auto @@ -1989,15 +1989,15 @@ AM_CONDITIONAL([HAVE_LIDAR], [test "x$ha dnl check for profiler library AS_CASE([$enable_profiler], - [no], [have_profiler=no], + [no], [], [ PKG_CHECK_MODULES([PROFILER], [libprofiler], - [have_profiler=yes], - [have_profiler=no; why_not_profiler="(profiler library not found)"]) - AS_VAR_IF([have_profiler], [yes], [ + [enable_profiler=yes], + [enable_profiler=no; why_not_profiler="(profiler library not found)"]) + AS_VAR_IF([enable_profiler], [yes], [ AC_DEFINE([HAVE_LIBPROFILER], 1, [Define if you have the profiler library]) AC_SUBST([PKG_PROFILER], [libprofiler])])]) -AM_CONDITIONAL([HAVE_LIBPROFILER], [test x$have_profiler != xno]) +AM_CONDITIONAL([HAVE_LIBPROFILER], [test enable_profiler != xno]) # checks for header files @@ -2605,6 +2605,7 @@ for comp in \ 'optimize ' \ 'developer ' \ 'sanitizer ' \ + 'profiler ' \ ; do AS_VAR_COPY([dft], [dft_$comp]) AS_VAR_COPY([enable], [enable_$comp]) diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -865,6 +865,15 @@ BATreplace(BAT *b, BAT *p, BAT *n, bool return GDK_FAIL; } + BATiter bi = bat_iterator(b); + BATiter ni = bat_iterator(n); + if (BATcount(b) == 0 || + (b->tsorted && b->trevsorted && + n->tsorted && n->trevsorted && + ATOMcmp(b->ttype, BUNtail(bi, 0), BUNtail(ni, 0)) == 0)) { + return GDK_SUCCEED; + } + HASHdestroy(b); OIDXdestroy(b); IMPSdestroy(b); @@ -881,8 +890,6 @@ BATreplace(BAT *b, BAT *p, BAT *n, bool int (*atomcmp)(const void *, const void *) = ATOMcompare(b->ttype); const void *nil = ATOMnilptr(b->ttype); oid hseqend = b->hseqbase + BATcount(b); - BATiter bi = bat_iterator(b); - BATiter ni = bat_iterator(n); bool anynil = false; b->theap.dirty = true; @@ -2127,8 +2134,29 @@ BATconstant(oid hseq, int tailtype, cons ((hge *) p)[i] = *(hge *) v; break; #endif + case TYPE_str: + /* insert the first value, then just copy the + * offset lots of times */ + if (tfastins_nocheck(bn, 0, v, Tsize(bn)) != GDK_SUCCEED) { + BBPreclaim(bn); + return NULL; + } + char val[sizeof(var_t)]; + memcpy(val, bn->theap.base, bn->twidth); + if (bn->twidth == 1 && n > 1) { + /* single byte value: we have a + * function for that */ + memset(bn->theap.base + 1, val[0], n - 1); + } else { + char *p = bn->theap.base; + for (i = 1; i < n; i++) { + p += bn->twidth; + memcpy(p, val, bn->twidth); + } + } + break; default: - for (i = 0, n += i; i < n; i++) + for (i = 0; i < n; i++) if (tfastins_nocheck(bn, i, v, Tsize(bn)) != GDK_SUCCEED) { BBPreclaim(bn); return NULL; diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c --- a/monetdb5/modules/mal/pcre.c +++ b/monetdb5/modules/mal/pcre.c @@ -477,7 +477,7 @@ re_create(const char *pat, bool caseigno } else if (*wp == esc) { escaped = true; } else if (*wp == '%') { - n->len = (size_t) (wq - r->w); + n->len = (size_t) (wq - n->w); while (wp[1] == '%') wp++; if (wp[1]) { @@ -507,7 +507,7 @@ re_create(const char *pat, bool caseigno } else if ((unsigned char) *p == esc) { escaped = true; } else if (*p == '%') { - n->len = (size_t) (q - r->k); + n->len = (size_t) (q - n->k); while (p[1] == '%') p++; if (p[1]) { 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 @@ -1265,10 +1265,7 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel sql->errstr[0] = 0; if (!e && exp_is_atom(ne)) return ne; - ne = exp_ref(sql, e); - if (is_outerjoin(t->op)) /* TODO if e is found on the left side of the left join or the right of the right join the has_no_nil flag can be kept */ - set_has_nil(ne); - return ne; + return exp_ref(sql ,e); case e_cmp: if (e->flag == cmp_or || e->flag == cmp_filter) { list *l = exps_rename(sql, e->l, f, t); @@ -2440,21 +2437,58 @@ rel_distinct_project2groupby(mvc *sql, s (l->op == op_select || l->op == op_semi) && exps_unique(sql, rel, rel->exps)) set_nodistinct(rel); - /* rewrite distinct project ( join(p,f) [ p.pk = f.fk] ) [ p.pk ] -> - * project(p)[p.pk] - */ + /* rewrite distinct project ( join(p,f) [ p.pk = f.fk ] ) [ p.pk ] + * into project( (semi)join(p,f) [ p.pk = f.fk ] ) [ p.pk ] */ if (rel->op == op_project && rel->l && !rel->r /* no order by */ && need_distinct(rel) && - l && l->op == op_join && rel_is_join_on_pkey(l) /* [ pk == fk ] */) { - sql_rel *j = l; - sql_rel *p = j->l; - sql_exp *je = l->exps->h->data, *le = je->l; - - if (exps_find_exp(rel->exps, le)) { /* rel must have the same primary key on the projection list */ - int pside = (rel_find_exp(p, le) != NULL)?1:0; - - p = (pside)?j->l:j->r; - rel->l = rel_dup(p); - rel_destroy(j); + l && (is_select(l->op) || l->op == op_join) && rel_is_join_on_pkey(l) /* [ pk == fk ] */) { + sql_exp *found = NULL, *pk = NULL; + bool all_exps_atoms = true; + + for (node *m = l->exps->h ; m ; m = m->next) { /* find a primary key join */ + sql_exp *je = (sql_exp *) m->data; + sql_exp *le = je->l, *re = je->r; + + if (find_prop(le->p, PROP_HASHCOL)) { /* le is the primary key */ + all_exps_atoms = true; + + for (node *n = rel->exps->h; n && all_exps_atoms; n = n->next) { + sql_exp *e = (sql_exp *) n->data; + + if (exp_match(e, le) || exp_refers(e, le)) + found = e; + else if (e->card > CARD_ATOM) + all_exps_atoms = false; + } + pk = le; + } + if (!found && find_prop(re->p, PROP_HASHCOL)) { /* re is the primary key */ + all_exps_atoms = true; + + for (node *n = rel->exps->h; n && all_exps_atoms; n = n->next) { + sql_exp *e = (sql_exp *) n->data; + + if (exp_match(e, re) || exp_refers(e, re)) + found = e; + else if (e->card > CARD_ATOM) + all_exps_atoms = false; + } + pk = re; + } + } + + if (all_exps_atoms && found) { /* rel must have the same primary key on the projection list */ + /* if the join has no multiple references it can be re-written into a semijoin */ + if (l->op == op_join && !(rel_is_ref(l)) && list_length(rel->exps) == 1) { /* other expressions may come from the other side */ + if (rel_find_exp(l->r, pk)) { + sql_rel *temp = l->l; + l->l = l->r; + l->r = temp; + + l->op = op_semi; + } else if (rel_find_exp(l->l, pk)) { + l->op = op_semi; + } + } *changes = 1; set_nodistinct(rel); return rel; @@ -3988,28 +4022,73 @@ rel_merge_rse(mvc *sql, sql_rel *rel, in return rel; } -/* find in the list of expression an expression which uses e */ +static sql_exp *list_exps_uses_exp(list *exps, const char *rname, const char *name); + +static sql_exp* +exp_uses_exp(sql_exp *e, const char *rname, const char *name) +{ + sql_exp *res = NULL; + + switch (e->type) { + case e_psm: + case e_atom: + break; + case e_convert: + return exp_uses_exp(e->l, rname, name); + case e_column: { + if (e->l && rname && strcmp(e->l, rname) == 0 && + e->r && name && strcmp(e->r, name) == 0) + return e; + if (!e->l && !rname && + e->r && name && strcmp(e->r, name) == 0) + return e; + } break; + case e_func: + case e_aggr: { + if (e->l) + return list_exps_uses_exp(e->l, rname, name); + } break; + case e_cmp: { + if (e->flag == cmp_in || e->flag == cmp_notin) { + if ((res = exp_uses_exp(e->l, rname, name))) + return res; + return list_exps_uses_exp(e->r, rname, name); + } else if (e->flag == cmp_or || e->flag == cmp_filter) { + if ((res = list_exps_uses_exp(e->l, rname, name))) + return res; + return list_exps_uses_exp(e->r, rname, name); + } else { + if ((res = exp_uses_exp(e->l, rname, name))) + return res; + if ((res = exp_uses_exp(e->r, rname, name))) + return res; + if (e->f) + return exp_uses_exp(e->f, rname, name); + } + } break; + } + return NULL; +} + static sql_exp * -exps_uses_exp( list *exps, sql_exp *e) -{ - node *n; - const char *rname = exp_relname(e); - const char *name = exp_name(e); +list_exps_uses_exp(list *exps, const char *rname, const char *name) +{ + sql_exp *res = NULL; if (!exps) return NULL; - - for ( n = exps->h; n; n = n->next) { - sql_exp *u = n->data; - - if (u->l && rname && strcmp(u->l, rname) == 0 && - u->r && name && strcmp(u->r, name) == 0) - return u; - if (!u->l && !rname && - u->r && name && strcmp(u->r, name) == 0) - return u; - } - return NULL; + for (node *n = exps->h; n && !res; n = n->next) { + sql_exp *e = n->data; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list