Changeset: 309f95e550b2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/309f95e550b2 Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_gencode.c sql/server/rel_basetable.c sql/server/rel_distribute.c sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimize_proj.c sql/server/rel_optimize_sel.c sql/server/rel_optimizer_private.h sql/server/rel_prop.c sql/server/rel_prop.h sql/server/rel_rewriter.c sql/server/rel_rewriter.h sql/server/rel_select.c sql/server/rel_statistics.c sql/server/rel_statistics.h sql/server/rel_statistics_functions.c sql/server/rel_unnest.c sql/storage/bat/bat_storage.c sql/test/BugTracker-2017/Tests/sqlitelogictest-aggregation-having-avg.Bug-6428.test sql/test/BugTracker/Tests/explain.SF-1739353.test sql/test/merge-partitions/Tests/mergepart31.test Branch: properties Log Message:
Backported properties from future branch diffs (truncated from 1968 to 300 lines): 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 @@ -2539,7 +2539,7 @@ rel2bin_join(backend *be, sql_rel *rel, /* handle possible index lookups, expressions are in index order! */ if (!join && (p=find_prop(e->p, PROP_HASHCOL)) != NULL) { - sql_idx *i = p->value; + sql_idx *i = p->value.pval; int oldvtop = be->mb->vtop, oldstop = be->mb->stop, oldvid = be->mb->vid; join = s = rel2bin_hash_lookup(be, rel, left, right, i, en); @@ -3642,7 +3642,7 @@ rel2bin_select(backend *be, sql_rel *rel prop *p; if ((p=find_prop(e->p, PROP_HASHCOL)) != NULL) { - sql_idx *i = p->value; + sql_idx *i = p->value.pval; int oldvtop = be->mb->vtop, oldstop = be->mb->stop, oldvid = be->mb->vid; if (!(sel = rel2bin_hash_lookup(be, rel, sub, NULL, i, en))) { 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 @@ -318,7 +318,7 @@ static int MalBlkPtr curBlk = 0; InstrPtr curInstr = 0, p, o; Symbol backup = NULL; - const char *local_tbl = prp->value; + const char *local_tbl = prp->value.pval; node *n; int i, q, v, res = 0, added_to_cache = 0, *lret, *rret; size_t len = 1024, nr; diff --git a/sql/server/rel_basetable.c b/sql/server/rel_basetable.c --- a/sql/server/rel_basetable.c +++ b/sql/server/rel_basetable.c @@ -156,10 +156,10 @@ bind_col_exp(mvc *sql, char *name, sql_c if (c->t->pkey && ((sql_kc*)c->t->pkey->k.columns->h->data)->c == c) { p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p); - p->value = c->t->pkey; + p->value.pval = c->t->pkey; } else if (c->unique == 2) { p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p); - p->value = NULL; + p->value.pval = NULL; } set_basecol(e); return e; @@ -267,11 +267,11 @@ rel_base_projection( mvc *sql, sql_rel * sql_exp *e = exp_column(sql->sa, name, iname, t, CARD_MULTI, has_nils, unique, 1); if (hash_index(i->type)) { p = e->p = prop_create(sql->sa, PROP_HASHIDX, e->p); - p->value = i; + p->value.pval = i; } if (i->type == join_idx) { p = e->p = prop_create(sql->sa, PROP_JOINIDX, e->p); - p->value = i; + p->value.pval = i; } append(exps, e); } @@ -324,10 +324,10 @@ rel_base_add_columns( mvc *sql, sql_rel } if (c->t->pkey && ((sql_kc*)c->t->pkey->k.columns->h->data)->c == c) { p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p); - p->value = c->t->pkey; + p->value.pval = c->t->pkey; } else if (c->unique == 2) { p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p); - p->value = NULL; + p->value.pval = NULL; } set_basecol(e); append(r->exps, e); @@ -370,10 +370,10 @@ rewrite_basetable(mvc *sql, sql_rel *rel } if (c->t->pkey && ((sql_kc*)c->t->pkey->k.columns->h->data)->c == c) { p = e->p = prop_create(sa, PROP_HASHCOL, e->p); - p->value = c->t->pkey; + p->value.pval = c->t->pkey; } else if (c->unique == 2) { p = e->p = prop_create(sa, PROP_HASHCOL, e->p); - p->value = NULL; + p->value.pval = NULL; } set_basecol(e); append(rel->exps, e); @@ -409,11 +409,11 @@ rewrite_basetable(mvc *sql, sql_rel *rel /* index names are prefixed, to make them independent */ if (hash_index(i->type)) { p = e->p = prop_create(sa, PROP_HASHIDX, e->p); - p->value = i; + p->value.pval = i; } if (i->type == join_idx) { p = e->p = prop_create(sa, PROP_JOINIDX, e->p); - p->value = i; + p->value.pval = i; } append(rel->exps, e); } @@ -486,10 +486,10 @@ rel_rename_part(mvc *sql, sql_rel *p, sq sql_exp *ne = exp_alias(sql->sa, mtalias, c->base.name, pname, rc->base.name, &rc->type, CARD_MULTI, rc->null, is_column_unique(rc), 0); if (rc->t->pkey && ((sql_kc*)rc->t->pkey->k.columns->h->data)->c == rc) { prop *p = ne->p = prop_create(sql->sa, PROP_HASHCOL, ne->p); - p->value = rc->t->pkey; + p->value.pval = rc->t->pkey; } else if (rc->unique == 2) { prop *p = ne->p = prop_create(sql->sa, PROP_HASHCOL, ne->p); - p->value = NULL; + p->value.pval = NULL; } set_basecol(ne); rel_base_use(sql, p, rc->colnr); @@ -515,10 +515,10 @@ rel_rename_part(mvc *sql, sql_rel *p, sq /* index names are prefixed, to make them independent */ if (hash_index(ri->type)) { prop *p = ne->p = prop_create(sql->sa, PROP_HASHIDX, ne->p); - p->value = ri; + p->value.pval = ri; } else if (ri->type == join_idx) { prop *p = ne->p = prop_create(sql->sa, PROP_JOINIDX, ne->p); - p->value = ri; + p->value.pval = ri; } list_append(p->exps, ne); } diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c --- a/sql/server/rel_distribute.c +++ b/sql/server/rel_distribute.c @@ -103,7 +103,7 @@ rewrite_replica(mvc *sql, list *exps, sq if (remote_prop && p && isRemote(p)) { char *local_name = sa_strconcat(sql->sa, sa_strconcat(sql->sa, p->s->base.name, "."), p->base.name); prop *p = r->p = prop_create(sql->sa, PROP_REMOTE, r->p); - p->value = local_name; + p->value.pval = local_name; } return r; } @@ -227,7 +227,7 @@ rel_rewrite_remote_(visitor *v, sql_rel if (t && isRemote(t) && (p = find_prop(rel->p, PROP_REMOTE)) == NULL) { char *local_name = sa_strconcat(v->sql->sa, sa_strconcat(v->sql->sa, t->s->base.name, "."), t->base.name); p = rel->p = prop_create(v->sql->sa, PROP_REMOTE, rel->p); - p->value = local_name; + p->value.pval = local_name; } } break; case op_table: @@ -271,7 +271,7 @@ rel_rewrite_remote_(visitor *v, sql_rel if ((is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) && (pl = find_prop(l->p, PROP_REMOTE)) != NULL && find_prop(r->p, PROP_REMOTE) == NULL) { - visitor rv = { .sql = v->sql, .data = pl->value }; + visitor rv = { .sql = v->sql, .data = pl->value.pval }; if (!(r = rel_visitor_bottomup(&rv, r, &rel_rewrite_replica_)) && v->sql->session->status) return NULL; @@ -281,7 +281,7 @@ rel_rewrite_remote_(visitor *v, sql_rel } else if ((is_join(rel->op) || is_semi(rel->op) || is_set(rel->op)) && find_prop(l->p, PROP_REMOTE) == NULL && (pr = find_prop(r->p, PROP_REMOTE)) != NULL) { - visitor rv = { .sql = v->sql, .data = pr->value }; + visitor rv = { .sql = v->sql, .data = pr->value.pval }; if (!(l = rel_visitor_bottomup(&rv, l, &rel_rewrite_replica_)) && v->sql->session->status) return NULL; @@ -295,7 +295,7 @@ rel_rewrite_remote_(visitor *v, sql_rel if (l && (pl = find_prop(l->p, PROP_REMOTE)) != NULL && r && (pr = find_prop(r->p, PROP_REMOTE)) != NULL && - strcmp(pl->value, pr->value) == 0) { + strcmp(pl->value.pval, pr->value.pval) == 0) { l->p = prop_remove(l->p, pl); r->p = prop_remove(r->p, pr); if (!find_prop(rel->p, PROP_REMOTE)) { @@ -330,7 +330,7 @@ rel_rewrite_remote_(visitor *v, sql_rel } else if (rel->flag == ddl_list || rel->flag == ddl_exception) { if (l && (pl = find_prop(l->p, PROP_REMOTE)) != NULL && r && (pr = find_prop(r->p, PROP_REMOTE)) != NULL && - strcmp(pl->value, pr->value) == 0) { + strcmp(pl->value.pval, pr->value.pval) == 0) { l->p = prop_remove(l->p, pl); r->p = prop_remove(r->p, pr); if (!find_prop(rel->p, PROP_REMOTE)) { 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 @@ -323,10 +323,10 @@ exp_print(mvc *sql, stream *fout, sql_ex mnstr_printf(fout, " NOT NULL"); if (e->type != e_atom && e->type != e_cmp && is_unique(e)) mnstr_printf(fout, " UNIQUE"); - if (e->p) { + if (e->p && e->type != e_atom) { for (prop *p = e->p; p; p = p->p) { - /* Don't show min/max on atoms, or when running tests with forcemito */ - if (e->type != e_atom && (!(GDKdebug & FORCEMITOMASK) || (p->kind != PROP_MIN && p->kind != PROP_MAX))) { + /* Don't show min/max/unique est on atoms, or when running tests with forcemito */ + if ((GDKdebug & FORCEMITOMASK) == 0 || (p->kind != PROP_MIN && p->kind != PROP_MAX && p->kind != PROP_NUNIQUES)) { char *pv = propvalue2string(sql->ta, p); mnstr_printf(fout, " %s %s", propkind2string(p), pv); } @@ -584,8 +584,10 @@ rel_print_rel(mvc *sql, stream *fout, s } if (rel->p) { for (prop *p = rel->p; p; p = p->p) { - char *pv = propvalue2string(sql->ta, p); - mnstr_printf(fout, " %s %s", propkind2string(p), pv); + if (p->kind != PROP_COUNT || (GDKdebug & FORCEMITOMASK) == 0) { + char *pv = propvalue2string(sql->ta, p); + mnstr_printf(fout, " %s %s", propkind2string(p), pv); + } } } } @@ -841,7 +843,7 @@ read_prop(mvc *sql, sql_exp *exp, char * return sql_error(sql, -1, SQLSTATE(42000) "Schema %s missing\n", sname); if (!find_prop(exp->p, PROP_JOINIDX)) { p = exp->p = prop_create(sql->sa, PROP_JOINIDX, exp->p); - if (!(p->value = mvc_bind_idx(sql, s, iname))) + if (!(p->value.pval = mvc_bind_idx(sql, s, iname))) return sql_error(sql, -1, SQLSTATE(42000) "Index %s missing\n", iname); } skipWS(r,pos); @@ -916,7 +918,7 @@ exp_read_min_or_max(mvc *sql, sql_exp *e } if (!find_prop(exp->p, kind)) { prop *p = exp->p = prop_create(sql->sa, kind, exp->p); - p->value = a; + p->value.pval = a; } skipWS(r, pos); } 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 @@ -2418,7 +2418,7 @@ exp_unsafe(sql_exp *e, int allow_identit case e_func: { sql_subfunc *f = e->f; - if (IS_ANALYTIC(f->func) || (!allow_identity && is_identity(e, NULL))) + if (IS_ANALYTIC(f->func) || !LANG_INT_OR_MAL(f->func->lang) || f->func->side_effect || (!allow_identity && is_identity(e, NULL))) return 1; return exps_have_unsafe(e->l, allow_identity); } break; 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 @@ -15,6 +15,8 @@ #include "sql_semantic.h" #include "rel_prop.h" +#define LANG_INT_OR_MAL(l) ((l)==FUNC_LANG_INT || (l)==FUNC_LANG_MAL) + #define new_exp_list(sa) sa_list(sa) #define exp2list(sa,e) append(sa_list(sa),e) diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c --- a/sql/server/rel_optimize_proj.c +++ b/sql/server/rel_optimize_proj.c @@ -1361,7 +1361,7 @@ exp_is_const_op(sql_exp *exp, sql_exp *t if (f->func->side_effect || IS_ANALYTIC(f->func)) return 0; return exps_are_const_op(exp->l, tope, expr); - } + } case e_cmp: if (exp->flag == cmp_or || exp->flag == cmp_filter) return exps_are_const_op(exp->l, tope, expr) && exps_are_const_op(exp->r, tope, expr); @@ -2424,6 +2424,100 @@ rel_distinct_aggregate_on_unique_values( return rel; } +static inline sql_rel * +rel_remove_const_aggr(visitor *v, sql_rel *rel) +{ + if (!rel) + return rel; + if (rel && is_groupby(rel->op) && list_length(rel->exps) >= 1 && !rel_is_ref(rel)) { + int needed = 0; + for (node *n = rel->exps->h; n; n = n->next) { + sql_exp *exp = (sql_exp*) n->data; + + if (exp_is_atom(exp) && exp->type != e_aggr) + needed++; + } + if (needed) { + if (!list_empty(rel->r)) { + int atoms = 0; + /* corner case, all grouping columns are atoms */ + for (node *n = ((list*)rel->r)->h; n; n = n->next) { + sql_exp *exp = (sql_exp*) n->data; + + if (exp_is_atom(exp)) + atoms++; + } + if (atoms == list_length(rel->r)) { + list *nexps = sa_list(v->sql->sa); + for (node *n = rel->exps->h; n; ) { _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org