Changeset: d28de3c310ec for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d28de3c310ec
Modified Files:
        sql/server/rel_multiset.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_unnest.c
        sql/storage/store.c
Branch: nested
Log Message:

create sequence numbers for unique multiset row ids


diffs (155 lines):

diff --git a/sql/server/rel_multiset.c b/sql/server/rel_multiset.c
--- a/sql/server/rel_multiset.c
+++ b/sql/server/rel_multiset.c
@@ -67,7 +67,7 @@ fm_insert(visitor *v, sql_rel *rel)
 static sql_rel *
 fm_join(visitor *v, sql_rel *rel)
 {
-       if (list_empty(rel->exps)) {
+       if (list_empty(rel->exps) && is_dependent(rel)) {
                bool needed = false;
                sql_rel *l = rel->l;
                sql_rel *r = rel->r;
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1337,14 +1337,6 @@ list *
                                r = rels->h->data;
                        if (r)
                                exps = _rel_projections(sql, r, tname, 
settname, intern, basecol);
-                       /* for every other relation in the list */
-                       // TODO: do we need the assertion here? for no-assert 
the loop is no-op
-                       /*
-                       for (node *n = rels->h->next; n; n = n->next) {
-                               rexps = _rel_projections(sql, n->data, tname, 
settname, intern, basecol);
-                               assert(list_length(exps) == list_length(rexps));
-                       }
-                       */
                        /* it's a multi-union (expressions have to be the same 
in all the operands)
                         * so we are ok only with the expressions of the first 
operand
                         */
@@ -1404,10 +1396,10 @@ rel_projections(mvc *sql, sql_rel *rel, 
        (e_column), in most cases this means go down the join tree and
        find the base column.
  */
-static int
+static sql_rel *
 rel_bind_path_(mvc *sql, sql_rel *rel, sql_exp *e, list *path )
 {
-       int found = 0;
+       sql_rel *found = NULL;
 
        if (mvc_highwater(sql)) {
                sql_error(sql, 10, SQLSTATE(42000) "Query too complex: running 
out of stack space");
@@ -1426,7 +1418,7 @@ rel_bind_path_(mvc *sql, sql_rel *rel, s
                if (!found && !list_empty(rel->attr)) {
                        assert(e->nid);
                        if (exps_bind_nid(rel->attr, e->nid))
-                               found = 1;
+                               found = rel;
                }
                break;
        case op_semi:
@@ -1447,11 +1439,11 @@ rel_bind_path_(mvc *sql, sql_rel *rel, s
                if (is_basetable(rel->op) && !rel->exps) {
                        assert(e->nid);
                        if (rel_base_has_nid(rel, e->nid))
-                               found = 1;
+                               found = rel;
                } else if (rel->exps) {
                        assert(e->nid);
                        if (exps_bind_nid(rel->exps, e->nid))
-                               found = 1;
+                               found = rel;
                }
                break;
        case op_insert:
@@ -1462,7 +1454,7 @@ rel_bind_path_(mvc *sql, sql_rel *rel, s
        case op_ddl:
                break;
        }
-       if (found)
+       if (path && found)
                list_prepend(path, rel);
        return found;
 }
@@ -1490,6 +1482,12 @@ rel_bind_path(mvc *sql, sql_rel *rel, sq
        return path;
 }
 
+sql_rel *
+rel_bind_nid(mvc *sql, sql_rel *rel, sql_exp *e)
+{
+       return rel_bind_path_(sql, rel, e, NULL);
+}
+
 static sql_rel *
 rel_select_push_exp_down(mvc *sql, sql_rel *rel, sql_exp *e)
 {
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -77,6 +77,7 @@ extern sql_rel *rel_select_copy(allocato
 extern sql_exp *rel_bind_column( mvc *sql, sql_rel *rel, const char *cname, 
int f, int no_tname);
 extern sql_exp *rel_bind_column2( mvc *sql, sql_rel *rel, sql_alias *tname, 
const char *cname, int f );
 extern sql_exp *rel_first_column(mvc *sql, sql_rel *rel);
+extern sql_rel *rel_bind_nid(mvc *sql, sql_rel *rel, sql_exp *e);
 
 extern sql_rel *rel_inplace_basetable(sql_rel *rel, sql_rel *bt);
 extern sql_rel *rel_inplace_setop(mvc *sql, sql_rel *rel, sql_rel *l, sql_rel 
*r, operator_type setop, list *exps);
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -468,13 +468,17 @@ rel_dependent_var(mvc *sql, sql_rel *l, 
                list *freevar = rel_freevar(sql, r);
                if (freevar) {
                        node *n;
-                       list *boundvar = rel_projections(sql, l, NULL, 1, 0);
 
                        for(n = freevar->h; n; n = n->next) {
                                sql_exp *e = n->data, *ne = NULL;
                                /* each freevar should be an e_column */
-                               ne = exps_bind_nid(boundvar, e->nid);
-                               if (ne) {
+                               sql_rel *r = rel_bind_nid(sql, l, e);
+                               if (r) {
+                                       ne = exps_bind_nid(r->exps, e->nid);
+                                       if (!ne && r->attr)
+                                               ne = exps_bind_nid(r->attr, 
e->nid);
+                                       assert(ne);
+                                       ne = exp_ref(sql, ne);
                                        if (!res)
                                                res = sa_list(sql->sa);
                                        append(res, ne);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3887,6 +3887,8 @@ sql_trans_copy_column( sql_trans *tr, sq
                        col->storage_type = _STRDUP(buf);
                        if ((res = sql_trans_create_table(&tt, tr, t->s, 
col->storage_type, NULL, tt_table, true, t->persistence, 0, 0, 0)) != LOG_OK)
                                return res;
+                       if (sql_trans_create_sequence(tr, t->s, 
col->storage_type, 1, 1, lng_nil, 1, 1, false, true) != LOG_OK)
+                               return res;
                }
                /* All nested types, need the internal columns for the field 
contents */
                for (node *n = col->type.type->d.fields->h; n; n = n->next) {
@@ -4716,6 +4718,8 @@ sys_drop_tc(sql_trans *tr, sql_trigger *
 static int
 sys_drop_sequence(sql_trans *tr, sql_sequence * seq, int drop_action)
 {
+       if (!seq)
+               return -1;
        sqlstore *store = tr->store;
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *sysseqs = find_sql_table(tr, syss, "sequences");
@@ -4848,7 +4852,9 @@ sys_drop_column(sql_trans *tr, sql_colum
        if ((res = sys_drop_default_object(tr, col, drop_action)))
                return res;
 
-       if (col->type.multiset && col->storage_type && (res = 
sql_trans_drop_table(tr, col->t->s, col->storage_type, drop_action)))
+       if (col->type.multiset && col->storage_type &&
+                       ((res = sql_trans_drop_table(tr, col->t->s, 
col->storage_type, drop_action)) ||
+                        (res = sql_trans_drop_sequence(tr, col->t->s, 
find_sql_sequence(tr, col->t->s, col->storage_type), drop_action))))
                return res;
 
        col->base.deleted = 1;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to