Changeset: de5d1c06d69f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/de5d1c06d69f Added Files: sql/test/prepare/Tests/prepare-mergetable.SQL.py sql/test/prepare/Tests/prepare-mergetable.sql sql/test/prepare/Tests/prepare-mergetable.stable.out 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_transaction.c sql/backends/monet5/sql_upgrades.c sql/server/rel_distribute.c sql/server/rel_distribute.h sql/server/rel_exp.c sql/server/rel_optimizer.c sql/server/rel_optimizer.h sql/server/rel_partition.c sql/server/rel_select.c sql/server/rel_unnest.c sql/server/rel_updates.c sql/server/sql_mvc.c sql/server/sql_mvc.h sql/server/sql_partition.c sql/server/sql_semantic.c sql/test/prepare/Tests/All Branch: default Log Message:
Merged rel_distribute calls into rel_optimizer, so they run only when necessary. Removed unecessary includes and don't compute which side to run mitosis when instantiating a SQL function diffs (truncated from 853 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 @@ -16,8 +16,6 @@ #include "rel_prop.h" #include "rel_select.h" #include "rel_updates.h" -#include "rel_unnest.h" -#include "rel_optimizer.h" #include "rel_predicates.h" #include "sql_env.h" #include "sql_optimizer.h" @@ -3883,7 +3881,7 @@ sql_parse(backend *be, sql_schema *s, co sql_rel *rel = rel_parse(be->mvc, s, query, mode); stmt *sq = NULL; - if ((rel = sql_processrelation(be->mvc, rel, 1, 1))) + if ((rel = sql_processrelation(be->mvc, rel, 1, 1, 1))) sq = rel_bin(be, rel); return sq; } 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 @@ -24,10 +24,7 @@ #include "sql_optimizer.h" #include "sql_datetime.h" #include "sql_partition.h" -#include "rel_unnest.h" -#include "rel_optimizer.h" #include "rel_partition.h" -#include "rel_distribute.h" #include "rel_select.h" #include "rel_rel.h" #include "rel_exp.h" @@ -130,9 +127,7 @@ sql_symbol2relation(backend *be, symbol rel = rel_semantic(query, sym); Tbegin = GDKusec(); if (rel) - rel = sql_processrelation(be->mvc, rel, extra_opts, extra_opts); - if (rel) - rel = rel_distribute(be->mvc, rel); + rel = sql_processrelation(be->mvc, rel, 1, extra_opts, extra_opts); if (rel) rel = rel_partition(be->mvc, rel); if (rel && (rel_no_mitosis(be->mvc, rel) || rel_need_distinct_query(rel))) @@ -492,7 +487,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, 0, 0); if (r) { list *blist = rel_dependencies(sql, r); if (mvc_create_dependencies(sql, blist, 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 @@ -27,14 +27,11 @@ #include "mal_debugger.h" #include "rel_select.h" -#include "rel_unnest.h" -#include "rel_optimizer.h" #include "rel_prop.h" #include "rel_rel.h" #include "rel_exp.h" #include "rel_bin.h" #include "rel_dump.h" -#include "rel_remote.h" #include "orderidx.h" #define initcontext() \ @@ -577,7 +574,7 @@ create_trigger(mvc *sql, char *sname, ch } r = rel_parse(sql, s, buf, m_deps); if (r) - r = sql_processrelation(sql, r, 0, 0); + r = sql_processrelation(sql, r, 0, 0, 0); if (r) { list *blist = rel_dependencies(sql, r); if (mvc_create_dependencies(sql, blist, tri->base.id, TRIGGER_DEPENDENCY)) { @@ -1062,7 +1059,7 @@ create_func(mvc *sql, char *sname, char } r = rel_parse(sql, s, buf, m_deps); if (r) - r = sql_processrelation(sql, r, 0, 0); + r = sql_processrelation(sql, r, 0, 0, 0); if (r) { node *n; list *blist = 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 @@ -26,10 +26,6 @@ #include "sql_user.h" #include "sql_optimizer.h" #include "sql_datetime.h" -#include "rel_unnest.h" -#include "rel_optimizer.h" -#include "rel_partition.h" -#include "rel_distribute.h" #include "rel_select.h" #include "rel_rel.h" #include "rel_exp.h" @@ -775,7 +771,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS refs = sa_list(m->sa); rel = rel_read(m, *expr, &pos, refs); if (*opt && rel) - rel = sql_processrelation(m, rel, 1, 1); + rel = sql_processrelation(m, rel, 0, 1, 1); if (!rel) { if (strlen(m->errstr) > 6 && m->errstr[5] == '!') msg = createException(SQL, "RAstatement", "%s", m->errstr); @@ -971,7 +967,7 @@ RAstatement2(Client cntxt, MalBlkPtr mb, refs = sa_list(m->sa); rel = rel_read(m, expr, &pos, refs); if (rel) - rel = sql_processrelation(m, rel, 1, 1); + rel = sql_processrelation(m, rel, 0, 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 @@ -40,17 +40,12 @@ #include "mal_debugger.h" #include "rel_select.h" -#include "rel_unnest.h" -#include "rel_optimizer.h" -#include "rel_distribute.h" -#include "rel_partition.h" #include "rel_prop.h" #include "rel_rel.h" #include "rel_exp.h" #include "rel_psm.h" #include "rel_bin.h" #include "rel_dump.h" -#include "rel_remote.h" #include "msabaoth.h" /* msab_getUUID */ #include "muuid.h" @@ -1228,11 +1223,7 @@ backend_create_sql_func(backend *be, sql f->sql++; r = rel_parse(m, f->s, f->query, m_instantiate); if (r) - r = sql_processrelation(m, r, 1, 0); - if (r) - r = rel_distribute(m, r); - if (r) - r = rel_partition(m, r); + r = sql_processrelation(m, r, 1, 1, 0); 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 @@ -14,8 +14,6 @@ #include "rel_rel.h" #include "rel_exp.h" #include "rel_prop.h" -#include "rel_unnest.h" -#include "rel_optimizer.h" #include "mal_namespace.h" #include "mal_builder.h" @@ -3412,7 +3410,7 @@ stmt_func(backend *be, stmt *ops, const rel->p = prop_remove(rel->p, p); /* sql_processrelation may split projections, so make sure the topmost relation only contains references */ rel = rel_project(be->mvc->sa, rel, rel_projections(be->mvc, rel, NULL, 1, 1)); - if (!(rel = sql_processrelation(be->mvc, rel, 1, 1))) + if (!(rel = sql_processrelation(be->mvc, rel, 0, 1, 1))) return NULL; if (p) { p->p = rel->p; diff --git a/sql/backends/monet5/sql_transaction.c b/sql/backends/monet5/sql_transaction.c --- a/sql/backends/monet5/sql_transaction.c +++ b/sql/backends/monet5/sql_transaction.c @@ -26,13 +26,11 @@ #include "mal_debugger.h" #include "rel_select.h" -#include "rel_optimizer.h" #include "rel_prop.h" #include "rel_rel.h" #include "rel_exp.h" #include "rel_bin.h" #include "rel_dump.h" -#include "rel_remote.h" #include "orderidx.h" #define initcontext() \ 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 @@ -19,10 +19,7 @@ #include "sql_upgrades.h" #include "rel_rel.h" #include "rel_semantic.h" -#include "rel_unnest.h" -#include "rel_optimizer.h" - -#include "rel_remote.h" + #include "mal_authorize.h" /* this function can be used to recreate the system tables (types, @@ -850,7 +847,7 @@ sql_update_nov2019_missing_dependencies( r = rel_parse(sql, s, relt, m_deps); if (r) - r = sql_processrelation(sql, r, 0, 0); + r = sql_processrelation(sql, r, 0, 0, 0); if (r) { list *id_l = rel_dependencies(sql, r); @@ -886,7 +883,7 @@ sql_update_nov2019_missing_dependencies( r = rel_parse(sql, s, relt, m_deps); if (r) - r = sql_processrelation(sql, r, 0, 0); + r = sql_processrelation(sql, r, 0, 0, 0); if (r) { list *id_l = rel_dependencies(sql, r); @@ -914,7 +911,7 @@ sql_update_nov2019_missing_dependencies( r = rel_parse(sql, s, relt, m_deps); if (r) - r = sql_processrelation(sql, r, 0, 0); + r = sql_processrelation(sql, r, 0, 0, 0); if (r) { list *id_l = rel_dependencies(sql, r); 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 @@ -11,8 +11,6 @@ #include "rel_rel.h" #include "rel_basetable.h" #include "rel_exp.h" -#include "rel_prop.h" -#include "rel_dump.h" #include "sql_privileges.h" static int @@ -158,8 +156,8 @@ replica_rewrite(visitor *v, sql_table *t return res; } -static sql_rel * -replica(visitor *v, sql_rel *rel) +sql_rel * +rel_rewrite_replica(visitor *v, sql_rel *rel) { /* for merge statement join, ignore the multiple references */ if (rel_is_ref(rel) && !(rel->flag&MERGE_LEFT)) { @@ -187,8 +185,8 @@ replica(visitor *v, sql_rel *rel) return rel; } -static sql_rel * -distribute(visitor *v, sql_rel *rel) +sql_rel * +rel_rewrite_remote(visitor *v, sql_rel *rel) { prop *p, *pl, *pr; @@ -248,9 +246,9 @@ distribute(visitor *v, sql_rel *rel) /* cleanup replica's */ visitor rv = { .sql = v->sql }; - l = rel->l = rel_visitor_bottomup(&rv, l, &replica); + l = rel->l = rel_visitor_bottomup(&rv, l, &rel_rewrite_replica); rv.data = NULL; - r = rel->r = rel_visitor_bottomup(&rv, r, &replica); + r = rel->r = rel_visitor_bottomup(&rv, r, &rel_rewrite_replica); if ((!l || !r) && v->sql->session->status) /* if the recursive calls failed */ return NULL; } @@ -259,20 +257,20 @@ distribute(visitor *v, sql_rel *rel) find_prop(r->p, PROP_REMOTE) == NULL) { visitor rv = { .sql = v->sql, .data = pl->value }; - if (!(r = rel_visitor_bottomup(&rv, r, &replica)) && v->sql->session->status) + if (!(r = rel_visitor_bottomup(&rv, r, &rel_rewrite_replica)) && v->sql->session->status) return NULL; rv.data = NULL; - if (!(r = rel->r = rel_visitor_bottomup(&rv, r, &distribute)) && v->sql->session->status) + if (!(r = rel->r = rel_visitor_bottomup(&rv, r, &rel_rewrite_remote)) && v->sql->session->status) return NULL; } 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 }; - if (!(l = rel_visitor_bottomup(&rv, l, &replica)) && v->sql->session->status) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list