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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list