Changeset: c087501dc488 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c087501dc488
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_upgrades.c
        sql/server/rel_optimizer.c
        sql/server/rel_optimizer.h
        sql/server/rel_psm.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_partition.c
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: properties
Log Message:

Allow storage related optimizations to be used around the SQL layer. Check for 
not null properties of BATs while binding SQL columns. It doesn't deal with 
deltas yet. Also optimize count(nonil) -> count(*)


diffs (truncated from 750 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
@@ -3579,7 +3579,7 @@ sql_parse(backend *be, const char *query
        sql_rel *rel = rel_parse(be->mvc, be->mvc->session->schema, 
(char*)query, mode);
        stmt *sq = NULL;
 
-       if ((rel = sql_processrelation(be->mvc, rel, 1, 1)))
+       if ((rel = sql_processrelation(be->mvc, rel, 1)))
                sq = rel_bin(be, rel);
        return sq;
 }
@@ -3812,9 +3812,13 @@ sql_stack_add_inserted( mvc *sql, const 
        ti->type = 1;
        ti->nn = name;
        for (n = t->columns.set->h; n; n = n->next) {
+               sql_exp *ne;
                sql_column *c = n->data;
-               sql_exp *ne = exp_column(sql->sa, name, c->base.name, &c->type, 
CARD_MULTI, c->null, 0);
-
+               bool has_nils = c->null;
+
+               if (has_nils && sql->storage_opt_allowed && mvc_has_no_nil(sql, 
c))
+                       has_nils = false;
+               ne = exp_column(sql->sa, name, c->base.name, &c->type, 
CARD_MULTI, has_nils, 0);
                append(exps, ne);
        }
        r = rel_table_func(sql->sa, NULL, NULL, exps, TRIGGER_WRAPPER);
@@ -4729,16 +4733,19 @@ sql_stack_add_updated(mvc *sql, const ch
        ti->nn = nn;
        for (n = t->columns.set->h; n; n = n->next) {
                sql_column *c = n->data;
-
+               bool has_nils = c->null;
+
+               if (has_nils && sql->storage_opt_allowed && mvc_has_no_nil(sql, 
c))
+                       has_nils = false;
                if (updates[c->colnr]) {
-                       sql_exp *oe = exp_column(sql->sa, on, c->base.name, 
&c->type, CARD_MULTI, c->null, 0);
-                       sql_exp *ne = exp_column(sql->sa, nn, c->base.name, 
&c->type, CARD_MULTI, c->null, 0);
+                       sql_exp *oe = exp_column(sql->sa, on, c->base.name, 
&c->type, CARD_MULTI, has_nils, 0);
+                       sql_exp *ne = exp_column(sql->sa, nn, c->base.name, 
&c->type, CARD_MULTI, has_nils, 0);
 
                        append(exps, oe);
                        append(exps, ne);
                } else {
-                       sql_exp *oe = exp_column(sql->sa, on, c->base.name, 
&c->type, CARD_MULTI, c->null, 0);
-                       sql_exp *ne = exp_column(sql->sa, nn, c->base.name, 
&c->type, CARD_MULTI, c->null, 0);
+                       sql_exp *oe = exp_column(sql->sa, on, c->base.name, 
&c->type, CARD_MULTI, has_nils, 0);
+                       sql_exp *ne = exp_column(sql->sa, nn, c->base.name, 
&c->type, CARD_MULTI, has_nils, 0);
 
                        append(exps, oe);
                        append(exps, ne);
@@ -5026,7 +5033,11 @@ sql_stack_add_deleted(mvc *sql, const ch
        ti->nn = name;
        for (n = t->columns.set->h; n; n = n->next) {
                sql_column *c = n->data;
-               sql_exp *ne = exp_column(sql->sa, name, c->base.name, &c->type, 
CARD_MULTI, c->null, 0);
+               bool has_nils = c->null;
+
+               if (has_nils && sql->storage_opt_allowed && mvc_has_no_nil(sql, 
c))
+                       has_nils = false;
+               sql_exp *ne = exp_column(sql->sa, name, c->base.name, &c->type, 
CARD_MULTI, has_nils, 0);
 
                append(exps, ne);
        }
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -115,12 +115,13 @@ sql_symbol2relation(backend *be, symbol 
        sql_rel *rel;
        sql_query *query = query_create(be->mvc);
        lng Tbegin;
-       int extra_opts = be->mvc->emode != m_prepare;
-
+       bool prev_storage_opt_allowed = be->mvc->storage_opt_allowed;
+
+       be->mvc->storage_opt_allowed = be->mvc->emode != m_prepare; /* Don't 
perform storage optimizations on prepared statements */
        rel = rel_semantic(query, sym);
        Tbegin = GDKusec();
        if (rel)
-               rel = sql_processrelation(be->mvc, rel, extra_opts, extra_opts);
+               rel = sql_processrelation(be->mvc, rel, be->mvc->emode != 
m_prepare);
        if (rel)
                rel = rel_distribute(be->mvc, rel);
        if (rel)
@@ -128,6 +129,7 @@ sql_symbol2relation(backend *be, symbol 
        if (rel && (rel_no_mitosis(rel) || rel_need_distinct_query(rel)))
                be->no_mitosis = 1;
        be->reloptimizer = GDKusec() - Tbegin;
+       be->mvc->storage_opt_allowed = prev_storage_opt_allowed;
        return rel;
 }
 
@@ -432,7 +434,7 @@ create_table_or_view(mvc *sql, char* sna
 
                r = rel_parse(sql, s, nt->query, m_deps);
                if (r)
-                       r = sql_processrelation(sql, r, 0, 0);
+                       r = sql_processrelation(sql, r, 0);
                if (r) {
                        list *id_l = rel_dependencies(sql, r);
                        mvc_create_dependencies(sql, id_l, nt->base.id, 
VIEW_DEPENDENCY);
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -470,6 +470,7 @@ create_trigger(mvc *sql, char *sname, ch
                char *buf;
                sql_rel *r = NULL;
                sql_allocator *sa = sql->sa;
+               bool prev_storage_opt_allowed = sql->storage_opt_allowed;
 
                sql->sa = sa_create(sql->pa);
                if (!sql->sa)
@@ -477,9 +478,11 @@ create_trigger(mvc *sql, char *sname, ch
                buf = sa_strdup(sql->sa, query);
                if (!buf)
                        throw(SQL, "sql.catalog",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               sql->storage_opt_allowed = false; /* can't do storage related 
optimizations while compiling a trigger */
                r = rel_parse(sql, s, buf, m_deps);
                if (r)
-                       r = sql_processrelation(sql, r, 0, 0);
+                       r = sql_processrelation(sql, r, 0);
+               sql->storage_opt_allowed = prev_storage_opt_allowed;
                if (r) {
                        list *id_l = rel_dependencies(sql, r);
                        mvc_create_dependencies(sql, id_l, tri->base.id, 
TRIGGER_DEPENDENCY);
@@ -804,15 +807,18 @@ create_func(mvc *sql, char *sname, char 
                char *buf;
                sql_rel *r = NULL;
                sql_allocator *sa = sql->sa;
+               bool prev_storage_opt_allowed = sql->storage_opt_allowed;
 
                assert(nf->query);
                if (!(sql->sa = sa_create(sql->pa)))
                        throw(SQL, "sql.create_func", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                if (!(buf = sa_strdup(sql->sa, nf->query)))
                        throw(SQL, "sql.create_func", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               sql->storage_opt_allowed = false; /* can't do storage related 
optimizations while compiling a function */
                r = rel_parse(sql, s, buf, m_deps);
                if (r)
-                       r = sql_processrelation(sql, r, 0, 0);
+                       r = sql_processrelation(sql, r, 0);
+               sql->storage_opt_allowed = prev_storage_opt_allowed;
                if (r) {
                        node *n;
                        list *id_l = rel_dependencies(sql, r);
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -771,7 +771,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS
                int oldstop = c->curprg->def->stop;
 
                if (*opt && rel)
-                       rel = sql_processrelation(m, rel, 1, 1);
+                       rel = sql_processrelation(m, rel, 1);
 
                if ((msg = MSinitClientPrg(c, "user", "test")) != MAL_SUCCEED) {
                        rel_destroy(rel);
@@ -902,7 +902,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb,
        rel = rel_read(m, expr, &pos, refs);
        stack_pop_frame(m);
        if (rel)
-               rel = sql_processrelation(m, rel, 1, 1);
+               rel = sql_processrelation(m, rel, 1);
        if (!rel) {
                if (strlen(m->errstr) > 6 && m->errstr[5] == '!')
                        msg = createException(SQL, "RAstatement2", "%s", 
m->errstr);
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
@@ -1130,6 +1130,7 @@ backend_create_sql_func(backend *be, sql
        int i, retseen = 0, sideeffects = 0, vararg = (f->varres || f->vararg), 
no_inline = 0, clientid = be->mvc->clientid;
        sql_rel *r;
        str msg = MAL_SUCCEED;
+       bool prev_storage_opt_allowed = m->storage_opt_allowed;
 
        /* nothing to do for internal and ready (not recompiling) functions, 
besides finding respective MAL implementation */
        if (!f->sql && (f->lang == FUNC_LANG_INT || f->lang == FUNC_LANG_MAL)) {
@@ -1147,13 +1148,15 @@ backend_create_sql_func(backend *be, sql
                return 0;
        if (!vararg)
                f->sql++;
+       m->storage_opt_allowed = false; /* can't do storage related 
optimizations while compiling a function */
        r = rel_parse(m, f->s, f->query, m_instantiate);
        if (r)
-               r = sql_processrelation(m, r, 1, 0);
+               r = sql_processrelation(m, r, 1);
        if (r)
                r = rel_distribute(m, r);
        if (r)
                r = rel_partition(m, r);
+       m->storage_opt_allowed = prev_storage_opt_allowed;
        if (r && !f->sql)       /* native function */
                return 0;
 
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3415,7 +3415,7 @@ stmt_func(backend *be, stmt *ops, const 
        p = find_prop(rel->p, PROP_REMOTE);
        if (p)
                rel->p = prop_remove(rel->p, p);
-       rel = sql_processrelation(be->mvc, rel, 1, 1);
+       rel = sql_processrelation(be->mvc, rel, 1);
        if (p) {
                p->p = rel->p;
                rel->p = 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
@@ -1051,15 +1051,18 @@ sql_update_nov2019_missing_dependencies(
                                if (f->query && f->lang == FUNC_LANG_SQL) {
                                        char *relt;
                                        sql_rel *r = NULL;
+                                       bool prev_storage_opt_allowed = 
sql->storage_opt_allowed;
 
                                        if (!(relt = sa_strdup(sql->sa, 
f->query))) {
                                                err = createException(SQL, 
"sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                                goto bailout;
                                        }
 
+                                       sql->storage_opt_allowed = false;
                                        r = rel_parse(sql, s, relt, m_deps);
                                        if (r)
-                                               r = sql_processrelation(sql, r, 
0, 0);
+                                               r = sql_processrelation(sql, r, 
0);
+                                       sql->storage_opt_allowed = 
prev_storage_opt_allowed;
                                        if (r) {
                                                list *id_l = 
rel_dependencies(sql, r);
 
@@ -1085,15 +1088,18 @@ sql_update_nov2019_missing_dependencies(
                                if (t->query && isView(t)) {
                                        char *relt;
                                        sql_rel *r = NULL;
+                                       bool prev_storage_opt_allowed = 
sql->storage_opt_allowed;
 
                                        if (!(relt = sa_strdup(sql->sa, 
t->query))) {
                                                err = createException(SQL, 
"sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                                goto bailout;
                                        }
 
+                                       sql->storage_opt_allowed = false;
                                        r = rel_parse(sql, s, relt, m_deps);
                                        if (r)
-                                               r = sql_processrelation(sql, r, 
0, 0);
+                                               r = sql_processrelation(sql, r, 
0);
+                                       sql->storage_opt_allowed = 
prev_storage_opt_allowed;
                                        if (r) {
                                                list *id_l = 
rel_dependencies(sql, r);
 
@@ -1113,15 +1119,18 @@ sql_update_nov2019_missing_dependencies(
                                                sql_trigger *tr = 
(sql_trigger*) mm->data;
                                                char *relt;
                                                sql_rel *r = NULL;
+                                               bool prev_storage_opt_allowed = 
sql->storage_opt_allowed;
 
                                                if (!(relt = sa_strdup(sql->sa, 
tr->statement))) {
                                                        err = 
createException(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
                                                        goto bailout;
                                                }
 
+                                               sql->storage_opt_allowed = 
false;
                                                r = rel_parse(sql, s, relt, 
m_deps);
                                                if (r)
-                                                       r = 
sql_processrelation(sql, r, 0, 0);
+                                                       r = 
sql_processrelation(sql, r, 0);
+                                               sql->storage_opt_allowed = 
prev_storage_opt_allowed;
                                                if (r) {
                                                        list *id_l = 
rel_dependencies(sql, r);
 
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
@@ -1171,7 +1171,7 @@ reorder_join(visitor *v, sql_rel *rel)
 static sql_rel *
 rel_join_order(visitor *v, sql_rel *rel)
 {
-       visitor ev = { .sql = v->sql, .value_based_opt = v->value_based_opt, 
.storage_based_opt = v->storage_based_opt };
+       visitor ev = { .sql = v->sql, .value_based_opt = v->value_based_opt };
 
        if (!rel)
                return rel;
@@ -1507,7 +1507,7 @@ rel_push_func_down(visitor *v, sql_rel *
                        return rel;
                if (exps_can_push_func(exps, rel) && exps_need_push_down(exps)) 
{
                        sql_rel *nrel, *ol = l, *or = r;
-                       visitor nv = { .sql = v->sql, .parent = v->parent, 
.value_based_opt = v->value_based_opt, .storage_based_opt = 
v->storage_based_opt };
+                       visitor nv = { .sql = v->sql, .parent = v->parent, 
.value_based_opt = v->value_based_opt };
 
                        /* we need a full projection, group by's and unions 
cannot be extended
                         * with more expressions */
@@ -5613,7 +5613,7 @@ sql_class_base_score(visitor *v, sql_col
                case TYPE_dbl:
                        return 75 - 53;
                default: {
-                       if (equality_based && c && v->storage_based_opt && (de 
= mvc_is_duplicate_eliminated(v->sql, c)))
+                       if (equality_based && c && v->sql->storage_opt_allowed 
&& (de = mvc_is_duplicate_eliminated(v->sql, c)))
                                return 150 - de * 8;
                        /* strings and blobs not duplicate eliminated don't get 
any points here */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to