Changeset: 0b1b056e35d6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0b1b056e35d6
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/rel_bin.h
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/test/Dependencies/Tests/Dependencies.stable.out
        sql/test/Dependencies/Tests/dependency_loop.stable.out
        sql/test/Dependencies/Tests/dependency_loop.stable.out.int128
Branch: default
Log Message:

use the relational tree to compute the dependencies


diffs (truncated from 1125 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
@@ -4681,3 +4681,226 @@ output_rel_bin(mvc *sql, sql_rel *rel )
                s = stmt_output(sql->sa, s);
        return s;
 }
+
+static int exp_deps(sql_allocator *sa, sql_exp *e, list *refs, list *l);
+
+static int
+exps_deps(sql_allocator *sa, list *exps, list *refs, list *l)
+{
+       node *n;
+
+       for(n = exps->h; n; n = n->next) {
+               if (exp_deps(sa, n->data, refs, l) != 0)
+                       return -1;
+       }
+       return 0;
+}
+
+static int
+id_cmp(int *id1, int *id2)
+{
+       if (*id1 == *id2)
+               return 0;
+       return -1;
+}
+
+static list *
+cond_append(list *l, int *id)
+{
+       if (*id >= 2000 && !list_find(l, id, (fcmp) &id_cmp))
+                list_append(l, id);
+       return l;
+}
+
+static int rel_deps(sql_allocator *sa, sql_rel *r, list *refs, list *l);
+
+static int
+exp_deps(sql_allocator *sa, sql_exp *e, list *refs, list *l)
+{
+       switch(e->type) {
+       case e_psm:
+               if (e->flag & PSM_SET || e->flag & PSM_RETURN) {
+                       return exp_deps(sa, e->l, refs, l);
+               } else if (e->flag & PSM_VAR) {
+                       return 0;
+               } else if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
+                       if (exp_deps(sa, e->l, refs, l) != 0 ||
+                           exps_deps(sa, e->r, refs, l) != 0)
+                               return -1;
+                       if (e->flag == PSM_IF && e->f)
+                           return exps_deps(sa, e->r, refs, l);
+               } else if (e->flag & PSM_REL) {
+                       sql_rel *rel = e->l;
+                       rel_deps(sa, rel, refs, l);
+               }
+       case e_atom: 
+       case e_column: 
+               break;
+       case e_convert: 
+               return exp_deps(sa, e->l, refs, l);
+       case e_func: {
+                       sql_subfunc *f = e->f;
+
+                       if (e->l && exps_deps(sa, e->l, refs, l) != 0)
+                               return -1;
+                       cond_append(l, &f->func->base.id);
+               } break;
+       case e_aggr: {
+                       sql_subaggr *a = e->f;
+
+                       if (e->l &&exps_deps(sa, e->l, refs, l) != 0)
+                               return -1;
+                       cond_append(l, &a->aggr->base.id);
+               } break;
+       case e_cmp: {
+                       if (e->flag == cmp_or || get_cmp(e) == cmp_filter) {
+                               if (get_cmp(e) == cmp_filter) {
+                                       sql_subfunc *f = e->f;
+                                       cond_append(l, &f->func->base.id);
+                               }
+                               if (exps_deps(sa, e->l, refs, l) != 0 ||
+                                   exps_deps(sa, e->r, refs, l) != 0)
+                                       return -1;
+                       } else if (e->flag == cmp_in || e->flag == cmp_notin) {
+                               if (exp_deps(sa, e->l, refs, l) != 0 ||
+                                   exps_deps(sa, e->r, refs, l) != 0)
+                                       return -1;
+                       } else {
+                               if (exp_deps(sa, e->l, refs, l) != 0 ||
+                                   exp_deps(sa, e->r, refs, l) != 0)
+                                       return -1;
+                               if (e->f)
+                                       return exp_deps(sa, e->f, refs, l);
+                       }
+               }       break;
+       }
+       return 0;
+}
+
+static int
+rel_deps(sql_allocator *sa, sql_rel *r, list *refs, list *l)
+{
+       if (THRhighwater())
+               return -1;
+       if (!r)
+               return 0;
+
+       if (rel_is_ref(r) && refs_find_rel(refs, r)) /* allready handled */
+               return 0;
+       switch (r->op) {
+       case op_basetable: {
+               sql_table *t = r->l;
+               sql_column *c = r->r;
+
+               if (!t && c)
+                       t = c->t;
+               cond_append(l, &t->base.id);
+               if (isTable(t)) {
+                       /* find all used columns */
+                       node *en;
+                       for( en = r->exps->h; en; en = en->next ) {
+                               sql_exp *exp = en->data;
+                               const char *oname = exp->r;
+
+                               if (is_func(exp->type)) {
+                                       list *exps = exp->l;
+                                       sql_exp *cexp = exps->h->data;
+                                       const char *cname = cexp->r;
+
+                                       c = find_sql_column(t, cname);
+                                       cond_append(l, &c->base.id);
+                               } else if (oname[0] == '%' && strcmp(oname, 
TID) == 0) {
+                                       continue;
+                               } else if (oname[0] == '%') { 
+                                       sql_idx *i = find_sql_idx(t, oname+1);
+
+                                       cond_append(l, &i->base.id);
+                               } else {
+                                       sql_column *c = find_sql_column(t, 
oname);
+                                       cond_append(l, &c->base.id);
+                               }
+                       }
+               }
+       }       break;
+       case op_table:
+               /* */ 
+               break;
+       case op_join: 
+       case op_left: 
+       case op_right: 
+       case op_full: 
+       case op_semi:
+       case op_anti:
+       case op_union: 
+       case op_except: 
+       case op_inter: 
+               if (rel_deps(sa, r->l, refs, l) != 0 ||
+                   rel_deps(sa, r->r, refs, l) != 0)
+                       return -1;
+               break;
+       case op_apply:
+               //assert(0);
+               break;
+       case op_project:
+       case op_select: 
+       case op_groupby: 
+       case op_topn: 
+       case op_sample:
+               if (rel_deps(sa, r->l, refs, l) != 0)
+                       return -1;
+               break;
+       case op_insert: 
+       case op_update: 
+       case op_delete: 
+               if (rel_deps(sa, r->l, refs, l) != 0 ||
+                   rel_deps(sa, r->r, refs, l) != 0)
+                       return -1;
+               break;
+       case op_ddl:
+               if (r->flag == DDL_OUTPUT) {
+                       if (r->l)
+                               return rel_deps(sa, r->l, refs, l);
+               } else if (r->flag <= DDL_LIST) {
+                       if (r->l)
+                               return rel_deps(sa, r->l, refs, l);
+                       if (r->r)
+                               return rel_deps(sa, r->r, refs, l);
+               } else if (r->flag <= DDL_PSM) {
+                       exps_deps(sa, r->exps, refs, l);
+               } else if (r->flag <= DDL_ALTER_SEQ) {
+                       if (r->l)
+                               return rel_deps(sa, r->l, refs, l);
+               } else if (r->flag <= DDL_DROP_SEQ) {
+                       exps_deps(sa, r->exps, refs, l);
+               } else if (r->flag <= DDL_TRANS) {
+                       exps_deps(sa, r->exps, refs, l);
+               } else if (r->flag <= DDL_DROP_SCHEMA) {
+                       exps_deps(sa, r->exps, refs, l);
+               } else if (r->flag <= DDL_ALTER_TABLE) {
+                       exps_deps(sa, r->exps, refs, l);
+               } else if (r->flag <= DDL_ALTER_TABLE_SET_ACCESS) {
+                       exps_deps(sa, r->exps, refs, l);
+               }
+               break;
+       }
+       if (r->exps)
+               exps_deps(sa, r->exps, refs, l);
+       if (is_groupby(r->op) && r->r)
+               exps_deps(sa, r->r, refs, l);
+       if (rel_is_ref(r)) {
+               list_append(refs, r);
+               list_append(refs, l);
+       }
+       return 0;
+}
+
+list *
+rel_dependencies(sql_allocator *sa, sql_rel *r)
+{
+       list *refs = sa_list(sa);
+       list *l = sa_list(sa);
+
+       if (rel_deps(sa, r, refs, l) != 0)
+               return NULL;
+       return l;
+}
diff --git a/sql/backends/monet5/rel_bin.h b/sql/backends/monet5/rel_bin.h
--- a/sql/backends/monet5/rel_bin.h
+++ b/sql/backends/monet5/rel_bin.h
@@ -18,4 +18,6 @@ extern stmt * output_rel_bin(mvc *sql, s
 
 extern stmt * sql_parse(mvc *m, sql_allocator *sa, char *query, char mode);
 
+extern list *rel_dependencies(sql_allocator *sa, sql_rel *r);
+
 #endif /*_REL_BIN_H_*/
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
@@ -458,14 +458,9 @@ create_table_or_view(mvc *sql, char *sna
                if (r)
                        r = rel_optimizer(sql, r);
                if (r) {
-                       stmt *sqs = rel_bin(sql, r);
-                       list *view_id_l = stmt_list_dependencies(sql->sa, sqs, 
VIEW_DEPENDENCY);
-                       list *id_l = stmt_list_dependencies(sql->sa, sqs, 
COLUMN_DEPENDENCY);
-                       list *func_id_l = stmt_list_dependencies(sql->sa, sqs, 
FUNC_DEPENDENCY);
+                       list *id_l = rel_dependencies(sql->sa, r);
 
                        mvc_create_dependencies(sql, id_l, nt->base.id, 
VIEW_DEPENDENCY);
-                       mvc_create_dependencies(sql, view_id_l, nt->base.id, 
VIEW_DEPENDENCY);
-                       mvc_create_dependencies(sql, func_id_l, nt->base.id, 
VIEW_DEPENDENCY);
                }
                sa_destroy(sql->sa);
        }
@@ -981,10 +976,7 @@ create_func(mvc *sql, char *sname, sql_f
                        r = rel_optimizer(sql, r);
                if (r) {
                        node *n;
-                       stmt *sb = rel_bin(sql, r);
-                       list *id_col_l = stmt_list_dependencies(sql->sa, sb, 
COLUMN_DEPENDENCY);
-                       list *id_func_l = stmt_list_dependencies(sql->sa, sb, 
FUNC_DEPENDENCY);
-                       list *view_id_l = stmt_list_dependencies(sql->sa, sb, 
VIEW_DEPENDENCY);
+                       list *id_l = rel_dependencies(sql->sa, r);
 
                        if (!f->vararg && f->ops) {
                                for (n = f->ops->h; n; n = n->next) {
@@ -1002,9 +994,7 @@ create_func(mvc *sql, char *sname, sql_f
                                                mvc_create_dependency(sql, 
a->type.type->base.id, nf->base.id, TYPE_DEPENDENCY);
                                }
                        }
-                       mvc_create_dependencies(sql, id_col_l, nf->base.id, 
!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY);
-                       mvc_create_dependencies(sql, id_func_l, nf->base.id, 
!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY);
-                       mvc_create_dependencies(sql, view_id_l, nf->base.id, 
!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY);
+                       mvc_create_dependencies(sql, id_l, nf->base.id, 
!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY);
                }
                sa_destroy(sql->sa);
                sql->sa = sa;
@@ -1128,14 +1118,9 @@ create_trigger(mvc *sql, char *sname, ch
                        r = rel_optimizer(sql, r);
                /* TODO use relational part to find dependencies */
                if (r) {
-                       stmt *sqs = rel_bin(sql, r);
-                       list *col_l = stmt_list_dependencies(sql->sa, sqs, 
COLUMN_DEPENDENCY);
-                       list *func_l = stmt_list_dependencies(sql->sa, sqs, 
FUNC_DEPENDENCY);
-                       list *view_id_l = stmt_list_dependencies(sql->sa, sqs, 
VIEW_DEPENDENCY);
-
-                       mvc_create_dependencies(sql, col_l, tri->base.id, 
TRIGGER_DEPENDENCY);
-                       mvc_create_dependencies(sql, func_l, tri->base.id, 
TRIGGER_DEPENDENCY);
-                       mvc_create_dependencies(sql, view_id_l, tri->base.id, 
TRIGGER_DEPENDENCY);
+                       list *id_l = rel_dependencies(sql->sa, r);
+
+                       mvc_create_dependencies(sql, id_l, tri->base.id, 
TRIGGER_DEPENDENCY);
                }
                sa_destroy(sql->sa);
                sql->sa = sa;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to