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

Reply via email to