Changeset: e9534d1efdbe for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e9534d1efdbe Added Files: sql/server/rel_statistics.c sql/server/rel_statistics.h 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/CMakeLists.txt sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_exp.h 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_schema.c 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 tools/monetdbe/monetdbe.c Branch: properties Log Message:
Cleanup, properties should be orthogonal to the SQL layer, so propagate them at rel_statistics diffs (truncated from 1203 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))) + if ((rel = sql_processrelation(be->mvc, rel, 1, 1))) sq = rel_bin(be, rel); return sq; } @@ -3815,15 +3815,8 @@ sql_stack_add_inserted( mvc *sql, const sql_exp *ne; sql_column *c = n->data; bool has_nils = c->null; - ValPtr min = NULL, max = NULL; - - if (sql->storage_opt_allowed) { - if (has_nils && mvc_has_no_nil(sql, c)) - has_nils = false; - min = mvc_has_min_value(sql, c); - max = mvc_has_max_value(sql, c); - } - ne = exp_column(sql->sa, name, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); + + 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); @@ -4739,23 +4732,16 @@ sql_stack_add_updated(mvc *sql, const ch for (n = t->columns.set->h; n; n = n->next) { sql_column *c = n->data; bool has_nils = c->null; - ValPtr min = NULL, max = NULL; - - if (sql->storage_opt_allowed) { - if (has_nils && mvc_has_no_nil(sql, c)) - has_nils = false; - min = mvc_has_min_value(sql, c); - max = mvc_has_max_value(sql, c); - } + if (updates[c->colnr]) { - sql_exp *oe = exp_column(sql->sa, on, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); - sql_exp *ne = exp_column(sql->sa, nn, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); + 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, has_nils, 0, min, max); - sql_exp *ne = exp_column(sql->sa, nn, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); + 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); @@ -5044,17 +5030,8 @@ sql_stack_add_deleted(mvc *sql, const ch for (n = t->columns.set->h; n; n = n->next) { sql_column *c = n->data; bool has_nils = c->null; - ValPtr min = NULL, max = NULL; - - if (sql->storage_opt_allowed) { - if (has_nils && mvc_has_no_nil(sql, c)) - has_nils = false; - min = mvc_has_min_value(sql, c); - max = mvc_has_max_value(sql, c); - } - sql_exp *ne = exp_column(sql->sa, name, c->base.name, &c->type, CARD_MULTI, has_nils, 0, min, max); - - append(exps, ne); + + append(exps, exp_column(sql->sa, name, c->base.name, &c->type, CARD_MULTI, has_nils, 0)); } r = rel_table_func(sql->sa, NULL, NULL, exps, TRIGGER_WRAPPER); r->l = ti; 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 @@ -26,6 +26,7 @@ #include "sql_partition.h" #include "rel_unnest.h" #include "rel_optimizer.h" +#include "rel_statistics.h" #include "rel_partition.h" #include "rel_distribute.h" #include "rel_select.h" @@ -115,21 +116,22 @@ sql_symbol2relation(backend *be, symbol sql_rel *rel; sql_query *query = query_create(be->mvc); lng Tbegin; - 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 */ + int value_based_opt = be->mvc->emode != m_prepare, storage_based_opt; + rel = rel_semantic(query, sym); + storage_based_opt = value_based_opt && rel && !is_ddl(rel->op); Tbegin = GDKusec(); if (rel) - rel = sql_processrelation(be->mvc, rel, be->mvc->emode != m_prepare); + rel = sql_processrelation(be->mvc, rel, value_based_opt, storage_based_opt); if (rel) rel = rel_distribute(be->mvc, rel); if (rel) rel = rel_partition(be->mvc, rel); + if (rel && storage_based_opt) + rel = rel_statistics(be->mvc, rel); 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; } @@ -434,7 +436,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); + r = sql_processrelation(sql, r, 0, 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,7 +470,6 @@ 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) @@ -478,11 +477,9 @@ 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); - sql->storage_opt_allowed = prev_storage_opt_allowed; + r = sql_processrelation(sql, r, 0, 0); if (r) { list *id_l = rel_dependencies(sql, r); mvc_create_dependencies(sql, id_l, tri->base.id, TRIGGER_DEPENDENCY); @@ -807,18 +804,15 @@ 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); - sql->storage_opt_allowed = prev_storage_opt_allowed; + r = sql_processrelation(sql, r, 0, 0); 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); + rel = sql_processrelation(m, rel, 1, 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); + rel = sql_processrelation(m, rel, 1, 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,7 +1130,6 @@ 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)) { @@ -1148,15 +1147,13 @@ 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); + r = sql_processrelation(m, r, 1, 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); + rel = sql_processrelation(be->mvc, rel, 1, 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,18 +1051,15 @@ 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); - sql->storage_opt_allowed = prev_storage_opt_allowed; + r = sql_processrelation(sql, r, 0, 0); if (r) { list *id_l = rel_dependencies(sql, r); @@ -1088,18 +1085,15 @@ 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); - sql->storage_opt_allowed = prev_storage_opt_allowed; + r = sql_processrelation(sql, r, 0, 0); if (r) { list *id_l = rel_dependencies(sql, r); @@ -1119,18 +1113,15 @@ 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); - sql->storage_opt_allowed = prev_storage_opt_allowed; + r = sql_processrelation(sql, r, 0, 0); if (r) { list *id_l = rel_dependencies(sql, r); diff --git a/sql/server/CMakeLists.txt b/sql/server/CMakeLists.txt --- a/sql/server/CMakeLists.txt +++ b/sql/server/CMakeLists.txt @@ -45,6 +45,7 @@ target_sources(sqlserver rel_rewriter.c _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list