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