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

Reply via email to