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