Changeset: 9b46b889f1b1 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9b46b889f1b1 Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/rel_bin.h sql/backends/monet5/sql_upgrades.c sql/backends/monet5/sql_user.c sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/sql_mvc.c sql/server/sql_mvc.h sql/server/sql_partition.c sql/test/Dependencies/Tests/Dependencies.stable.out sql/test/Dependencies/Tests/Dependencies.stable.out.int128 sql/test/Dependencies/Tests/dependency_loop.stable.out sql/test/Dependencies/Tests/dependency_loop.stable.out.int128 sql/test/emptydb/Tests/check.stable.out sql/test/emptydb/Tests/check.stable.out.32bit sql/test/emptydb/Tests/check.stable.out.int128 Branch: Nov2019 Log Message:
Added upgrade code for missing dependencies on views and table returning functions. Move rel_dependencies function from rel_bin to rel_rel, as it's required by the sql server layer. The bootstrapped views 'tables', 'columns' and 'users' were missing their dependencies list on dependency table. diffs (truncated from 2449 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 @@ -5720,236 +5720,3 @@ output_rel_bin(backend *be, sql_rel *rel } return s; } - -static int exp_deps(mvc *sql, sql_exp *e, list *refs, list *l); - -static int -exps_deps(mvc *sql, list *exps, list *refs, list *l) -{ - node *n; - - for(n = exps->h; n; n = n->next) { - if (exp_deps(sql, 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 >= FUNC_OIDS && !list_find(l, id, (fcmp) &id_cmp)) - list_append(l, id); - return l; -} - -static int rel_deps(mvc *sql, sql_rel *r, list *refs, list *l); - -static int -exp_deps(mvc *sql, sql_exp *e, list *refs, list *l) -{ - if (THRhighwater()) { - (void) sql_error(sql, 10, SQLSTATE(42000) "query too complex: running out of stack space"); - return -1; - } - - switch(e->type) { - case e_psm: - if (e->flag & PSM_SET || e->flag & PSM_RETURN) { - return exp_deps(sql, 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(sql, e->l, refs, l) != 0 || - exps_deps(sql, e->r, refs, l) != 0) - return -1; - if (e->flag == PSM_IF && e->f) - return exps_deps(sql, e->r, refs, l); - } else if (e->flag & PSM_REL) { - sql_rel *rel = e->l; - return rel_deps(sql, rel, refs, l); - } else if (e->flag & PSM_EXCEPTION) { - return exps_deps(sql, e->l, refs, l); - } - case e_atom: - case e_column: - break; - case e_convert: - return exp_deps(sql, e->l, refs, l); - case e_func: { - sql_subfunc *f = e->f; - - if (e->l && exps_deps(sql, e->l, refs, l) != 0) - return -1; - cond_append(l, &f->func->base.id); - if (e->l && list_length(e->l) == 2 && strcmp(f->func->base.name, "next_value_for") == 0) { - /* add dependency on seq nr */ - list *nl = e->l; - sql_exp *schname = nl->h->data; - sql_exp *seqname = nl->t->data; - - char *sch_name = ((atom*)schname->l)->data.val.sval; - char *seq_name = ((atom*)seqname->l)->data.val.sval; - sql_schema *sche = mvc_bind_schema(sql, sch_name); - sql_sequence *seq = find_sql_sequence(sche, seq_name); - - cond_append(l, &seq->base.id); - } - } break; - case e_aggr: { - sql_subaggr *a = e->f; - - if (e->l &&exps_deps(sql, e->l, refs, l) != 0) - return -1; - cond_append(l, &a->aggr->base.id); - } break; - case e_cmp: { - if (get_cmp(e) == 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(sql, e->l, refs, l) != 0 || - exps_deps(sql, e->r, refs, l) != 0) - return -1; - } else if (e->flag == cmp_in || e->flag == cmp_notin) { - if (exp_deps(sql, e->l, refs, l) != 0 || - exps_deps(sql, e->r, refs, l) != 0) - return -1; - } else { - if (exp_deps(sql, e->l, refs, l) != 0 || - exp_deps(sql, e->r, refs, l) != 0) - return -1; - if (e->f) - return exp_deps(sql, e->f, refs, l); - } - } break; - } - return 0; -} - -static int -rel_deps(mvc *sql, sql_rel *r, list *refs, list *l) -{ - if (THRhighwater()) { - (void) sql_error(sql, 10, SQLSTATE(42000) "query too complex: running out of stack space"); - 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); - /* find all used columns */ - for (node *en = r->exps->h; en; en = en->next) { - sql_exp *exp = en->data; - const char *oname = exp->r; - - assert(!is_func(exp->type)); - 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: { - if ((r->flag == 0 || r->flag == 1) && r->r) { /* table producing function, excluding rel_relational_func cases */ - sql_exp *op = r->r; - sql_subfunc *f = op->f; - cond_append(l, &f->func->base.id); - } - } 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(sql, r->l, refs, l) != 0 || - rel_deps(sql, r->r, refs, l) != 0) - return -1; - break; - case op_project: - case op_select: - case op_groupby: - case op_topn: - case op_sample: - if (rel_deps(sql, r->l, refs, l) != 0) - return -1; - break; - case op_insert: - case op_update: - case op_delete: - case op_truncate: - if (rel_deps(sql, r->l, refs, l) != 0 || - rel_deps(sql, r->r, refs, l) != 0) - return -1; - break; - case op_ddl: - if (r->flag == ddl_output) { - if (r->l) - return rel_deps(sql, r->l, refs, l); - } else if (r->flag == ddl_list || r->flag == ddl_exception) { - if (r->l) - return rel_deps(sql, r->l, refs, l); - if (r->r) - return rel_deps(sql, r->r, refs, l); - } else if (r->flag == ddl_psm) { - break; - } else if (r->flag == ddl_create_seq || r->flag == ddl_alter_seq) { - if (r->l) - return rel_deps(sql, r->l, refs, l); - } - break; - } - if (!is_base(r->op) && r->exps) { - if (exps_deps(sql, r->exps, refs, l) != 0) - return -1; - } - if (is_groupby(r->op) && r->r) { - if (exps_deps(sql, r->r, refs, l) != 0) - return -1; - } - if (rel_is_ref(r)) { - list_append(refs, r); - list_append(refs, l); - } - return 0; -} - -list * -rel_dependencies(mvc *sql, sql_rel *r) -{ - list *refs = sa_list(sql->sa); - list *l = sa_list(sql->sa); - - if (rel_deps(sql, 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 @@ -17,6 +17,4 @@ extern stmt *output_rel_bin(backend *be, extern stmt *sql_parse(backend *be, sql_allocator *sa, const char *query, char mode); -extern list *rel_dependencies(mvc *sql, sql_rel *r); - #endif /*_REL_BIN_H_*/ 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 @@ -17,6 +17,10 @@ #include "mtime.h" #include <unistd.h> #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" @@ -1894,6 +1898,151 @@ sql_update_apr2019_sp1(Client c) return err; /* usually MAL_SUCCEED */ } +#define FLUSH_INSERTS_IF_BUFFERFILLED /* Each new value should add about 20 bytes to the buffer, "flush" when is 200 bytes from being full */ \ + if (pos > 7900) { \ + pos += snprintf(buf + pos, bufsize - pos, ") as t1(c1,c2,c3) where t1.c1 not in (select \"id\" from dependencies where depend_id = t1.c2);\n"); \ + assert(pos < bufsize); \ + err = SQLstatementIntern(c, &buf, "update", true, false, NULL); \ + if (err) \ + goto bailout; \ + pos = 0; \ + pos += snprintf(buf + pos, bufsize - pos, "insert into sys.dependencies select c1, c2, c3 from (values"); \ + ppos = pos; \ + first = true; \ + } + +static str +sql_update_nov2019_missing_dependencies(Client c, mvc *sql) +{ + size_t bufsize = 8192, pos = 0, ppos; + char *err = NULL, *buf = GDKmalloc(bufsize); + sql_allocator *old_sa = sql->sa; + bool first = true; + + if (buf == NULL) + throw(SQL, "sql_update_nov2019_missing_dependencies", SQLSTATE(HY001) MAL_MALLOC_FAIL); + + if (!(sql->sa = sa_create())) { + err = createException(SQL, "sql.catalog", SQLSTATE(HY001) MAL_MALLOC_FAIL); + goto bailout; + } + + pos += snprintf(buf + pos, bufsize - pos, "insert into sys.dependencies select c1, c2, c3 from (values"); + ppos = pos; /* later check if found updatable database objects */ + _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list