Update of /cvsroot/monetdb/sql/src/server
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv30886/src/server

Modified Files:
        rel_bin.mx sql_schema.mx sql_statement.mx 
Log Message:
alters are handled now as updates (so each new column/index has
the same aligned bat storage). 


U rel_bin.mx
Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -d -r1.64 -r1.65
--- rel_bin.mx  23 Dec 2008 10:30:07 -0000      1.64
+++ rel_bin.mx  27 Dec 2008 21:27:44 -0000      1.65
@@ -1652,13 +1652,13 @@
                        stmt_relselect_fill(s, stmt_uselect(stmt_idxbat(k->idx, 
RDONLY), stmt_dup(idx_inserts), cmp_equal));
                        for (m = k->columns->h; m; m = m->next) {
                                sql_kc *c = m->data;
+
                                col = stmt_bat(c->c, stmt_dup(ts), RDONLY);
                                if ((k->type == ukey) && 
stmt_has_null(stmt_dup(col))) {
                                        sql_subtype *t = tail_type(col);
                                        stmt *n = stmt_atom(atom_general(t, 
NULL, 0));
                                        col = stmt_select2(col, n, stmt_dup(n), 
0);
                                }
-
                                stmt_relselect_fill(s, stmt_uselect( col, 
stmt_dup(nth(inserts, c->c->colnr)->op2.stval), cmp_equal));
                        }
                } else {
@@ -1666,13 +1666,13 @@
                        stmt_releqjoin_fill(s, stmt_idxbat(k->idx, RDONLY), 
stmt_dup(idx_inserts));
                        for (m = k->columns->h; m; m = m->next) {
                                sql_kc *c = m->data;
+
                                col = stmt_bat(c->c, stmt_dup(ts), RDONLY);
                                if ((k->type == ukey) && 
stmt_has_null(stmt_dup(col))) {
                                        sql_subtype *t = tail_type(col);
                                        stmt *n = stmt_atom(atom_general(t, 
NULL, 0));
                                        col = stmt_select2(col, n, stmt_dup(n), 
0);
                                }
-
                                stmt_releqjoin_fill(s, col, 
stmt_dup(nth(inserts, c->c->colnr)->op2.stval));
                        }
                }
@@ -1837,7 +1837,7 @@
        node *m;
        sql_subtype *it, *wrd;
        int bits = 1 + ((sizeof(wrd)*8)-1)/(list_length(i->columns));
-       stmt *h = NULL;
+       stmt *h = NULL, *o = NULL;
 
        if (list_length(i->columns) <= 1)
                return NULL;
@@ -1846,6 +1846,7 @@
        wrd = sql_bind_localtype("wrd");
        for (m = i->columns->h; m; m = m->next) {
                sql_kc *c = m->data;
+               stmt *i = stmt_dup(nth(inserts, c->c->colnr)->op2.stval);
 
                if (h) {
                        sql_subfunc *xor = 
sql_bind_func_result3(sql->session->schema, "rotate_xor_hash", wrd, it, 
&c->c->type, wrd);
@@ -1853,13 +1854,20 @@
                        h = stmt_Nop(stmt_list( list_append( list_append(
                                list_append(create_stmt_list(), h), 
                                stmt_atom_int(bits)), 
-                               stmt_dup(nth(inserts, 
c->c->colnr)->op2.stval))), 
+                               (o)?stmt_join(stmt_dup(o), i, cmp_equal):i)), 
                                xor);
                } else {
                        sql_subfunc *hf = 
sql_bind_func_result(sql->session->schema, "hash", &c->c->type, NULL, wrd);
-                       h = stmt_unop(stmt_dup(nth(inserts, 
c->c->colnr)->op2.stval), hf);
+                       if (i->nrcols == 0 && i->key) {
+                               h = stmt_unop(i, hf);
+                       } else {
+                               o = stmt_mark(stmt_reverse(i), 40); 
+                               h = stmt_unop(stmt_mark(stmt_dup(i), 40), hf);
+                       }
                }
        }
+       if (o)
+               return stmt_join(stmt_reverse(o), h, cmp_equal);
        return h;
 }
 
@@ -2189,29 +2197,38 @@
        if (list_length(k->columns) > 1) {
                stmt *ts = stmt_basetable(k->t, k->t->base.name);
                node *m;
-               stmt *s;
+               stmt *s = NULL;
 
                /* 1st stage: find out if original (without the updated) 
                        do not contain the same values as the updated values. 
                        This is done using a relation join and a count (which 
                        should be zero)
                */
-               s = stmt_releqjoin_init();
-               stmt_releqjoin_fill(s, stmt_diff(stmt_idxbat(k->idx, RDONLY), 
stmt_dup(idx_updates)), stmt_dup(idx_updates));
-               for (m = k->columns->h; m; m = m->next) {
-                       sql_kc *c = m->data;
-                       stmt *upd, *l;
+               /* TODO split null removal and join/group (to make mkey save) */
+               if (!isNew(k)) {
+                       s = stmt_releqjoin_init();
+                       stmt_releqjoin_fill(s, stmt_diff(stmt_idxbat(k->idx, 
RDONLY), stmt_dup(idx_updates)), stmt_dup(idx_updates));
+                       for (m = k->columns->h; m; m = m->next) {
+                               sql_kc *c = m->data;
+                               stmt *upd, *l;
 
-                       if (updates[c->c->colnr]) {
-                               upd = stmt_dup(updates[c->c->colnr]->op2.stval);
-                       } else {
-                               upd = stmt_semijoin(stmt_bat(c->c, 
stmt_dup(ts), RDONLY), stmt_dup(updates[updcol]->op2.stval));
-                       }
-                       l = stmt_diff(stmt_bat(c->c, stmt_dup(ts), RDONLY), 
stmt_dup(upd));
-                       stmt_releqjoin_fill(s, l, upd);
+                               if (updates[c->c->colnr]) {
+                                       upd = 
stmt_dup(updates[c->c->colnr]->op2.stval);
+                               } else {
+                                       upd = stmt_semijoin(stmt_bat(c->c, 
stmt_dup(ts), RDONLY), stmt_dup(updates[updcol]->op2.stval));
+                               }
+                               if ((k->type == ukey) && 
stmt_has_null(stmt_dup(upd))) {
+                                       sql_subtype *t = tail_type(upd);
+                                       stmt *n = stmt_atom(atom_general(t, 
NULL, 0));
+                                       upd = stmt_select2(upd, n, stmt_dup(n), 
0);
+                               }
 
+                               l = stmt_diff(stmt_bat(c->c, stmt_dup(ts), 
RDONLY), stmt_dup(upd));
+                               stmt_releqjoin_fill(s, l, upd);
+
+                       }
+                       s = stmt_binop(stmt_aggr(s, NULL, cnt, 1), 
stmt_atom_wrd(0), ne);
                }
-               s = stmt_binop(stmt_aggr(s, NULL, cnt, 1), stmt_atom_wrd(0), 
ne);
 
                /* 2e stage: find out if the updated are unique */
                if (idx_updates->nrcols) {      /* update columns not atoms */
@@ -2234,6 +2251,13 @@
                                        upd = 
stmt_dup(updates[updcol]->op2.stval);
                                        upd = stmt_semijoin(stmt_bat(c->c, 
stmt_dup(ts), RDONLY), upd);
                                }
+                               /* remove nulls */
+                               if ((k->type == ukey) && 
stmt_has_null(stmt_dup(upd))) {
+                                       sql_subtype *t = tail_type(upd);
+                                       stmt *n = stmt_atom(atom_general(t, 
NULL, 0));
+                                       upd = stmt_select2(upd, n, stmt_dup(n), 
0);
+                               }
+
                                g = grp_create(upd, g, NULL);
                        }
                        ss = stmt_aggr(stmt_dup(g->grp), grp_dup(g), 
sql_dup_aggr(cnt), 1);
@@ -2245,7 +2269,10 @@
                        count_sum = stmt_binop(stmt_aggr(stmt_dup(ss), NULL, 
sql_dup_aggr(cnt), 1), check_types(sql, wrd, ssum, type_equal), 
sql_dup_func(ne));
 
                        /* combine results */
-                       s = stmt_binop(s, count_sum, or);
+                       if (s) 
+                               s = stmt_binop(s, count_sum, or);
+                       else
+                               s = count_sum;
                }
 
                if (k->type == pkey) {
@@ -2259,21 +2286,33 @@
                sql_kc *c = k->columns->h->data;
                stmt *h = stmt_dup(updates[c->c->colnr]->op2.stval);
                stmt *o = stmt_diff(stmt_bat(c->c, ts, RDONLY), stmt_dup(h));
-               stmt *s = stmt_join(o, stmt_reverse(h), cmp_equal);
+               stmt *s = NULL;
 
+       
                /* s should be empty */
-               s = stmt_binop(stmt_aggr(s, NULL, cnt, 1), stmt_atom_wrd(0), 
ne);
+               if (!isNew(k)) {
+                       s = stmt_join(o, stmt_reverse(h), cmp_equal);
+                       s = stmt_binop(stmt_aggr(s, NULL, cnt, 1), 
stmt_atom_wrd(0), ne);
+               }
 
                /* 2e stage: find out if updated are unique */
                if (h->nrcols) {        /* update columns not atoms */
                        sql_subaggr *sum;
                        stmt *count_sum = NULL;
                        sql_subfunc *or = 
sql_bind_func_result(sql->session->schema, "or", bt, bt, bt);
-                       stmt *ssum;
-
+                       stmt *ssum, *ss;
                        stmt *upd = stmt_dup(updates[c->c->colnr]->op2.stval);
-                       group *g = grp_create(upd, NULL, NULL);
-                       stmt *ss = stmt_aggr(stmt_dup(g->grp), g, 
sql_dup_aggr(cnt), 1);
+                       group *g;
+
+                       /* remove nulls */
+                       if ((k->type == ukey) && stmt_has_null(stmt_dup(upd))) {
+                               sql_subtype *t = tail_type(upd);
+                               stmt *n = stmt_atom(atom_general(t, NULL, 0));
+                               upd = stmt_select2(upd, n, stmt_dup(n), 0);
+                       }
+
+                       g = grp_create(upd, NULL, NULL);
+                       ss = stmt_aggr(stmt_dup(g->grp), g, sql_dup_aggr(cnt), 
1);
 
                        /* (count(ss) <> sum(ss)) */
                        sum = sql_bind_aggr(sql->session->schema, "sum", 
tail_type(ss));
@@ -2282,7 +2321,10 @@
                        count_sum = stmt_binop(check_types(sql, 
tail_type(ssum), stmt_aggr(stmt_dup(ss), NULL, sql_dup_aggr(cnt), 1), 
type_equal), ssum, sql_dup_func(ne));
 
                        /* combine results */
-                       s = stmt_binop(s, count_sum, or);
+                       if (s)
+                               s = stmt_binop(s, count_sum, or);
+                       else
+                               s = count_sum;
                }
 
                if (k->type == pkey) {
@@ -2549,7 +2591,7 @@
        node *m;
        sql_subtype *it, *wrd;
        int bits = 1 + ((sizeof(wrd)*8)-1)/(list_length(i->columns));
-       stmt *h = NULL, *ts;
+       stmt *h = NULL, *ts, *o = NULL;
 
        if (list_length(i->columns) <= 1)
                return NULL;
@@ -2574,31 +2616,58 @@
                        h = stmt_Nop(stmt_list( list_append( list_append(
                                list_append(create_stmt_list(), h), 
                                stmt_atom_int(bits)), 
-                               upd)), 
+                               stmt_join(stmt_dup(o), upd, cmp_equal))), 
                                xor);
                } else {
                        sql_subfunc *hf = 
sql_bind_func_result(sql->session->schema, "hash", &c->c->type, NULL, wrd);
-                       h = stmt_unop(upd, hf);
+                       o = stmt_mark(stmt_reverse(stmt_dup(upd)), 40); 
+                       h = stmt_unop(stmt_mark(upd, 40), hf);
                }
        }
        stmt_destroy(ts);
-       return h;
+       return stmt_join(stmt_reverse(o), h, cmp_equal);
 }
 
+/*
+         A referential constraint is satisfied if one of the following con-
+         ditions is true, depending on the <match option> specified in the
+         <referential constraint definition>:
+
+         -  If no <match type> was specified then, for each row R1 of the
+            referencing table, either at least one of the values of the
+            referencing columns in R1 shall be a null value, or the value of
+            each referencing column in R1 shall be equal to the value of the
+            corresponding referenced column in some row of the referenced
+            table.
+
+         -  If MATCH FULL was specified then, for each row R1 of the refer-
+            encing table, either the value of every referencing column in R1
+            shall be a null value, or the value of every referencing column
+            in R1 shall not be null and there shall be some row R2 of the
+            referenced table such that the value of each referencing col-
+            umn in R1 is equal to the value of the corresponding referenced
+            column in R2.
+
+         -  If MATCH PARTIAL was specified then, for each row R1 of the
+            referencing table, there shall be some row R2 of the refer-
+            enced table such that the value of each referencing column in
+            R1 is either null or is equal to the value of the corresponding
+            referenced column in R2.
+*/
+
 static stmt *
 join_idx_update(sql_idx * i, stmt **updates, int updcol)
 {
-       int nulls = 0;
+       int nulls = 0, len;
        node *m, *o;
        sql_idx *ri = ((sql_fkey *) i->key)->rkey->k.idx;
        stmt *s = NULL, *rts = stmt_basetable(ri->t, ri->t->base.name), *ts;
-       stmt *null = NULL;
+       stmt *null = NULL, *nnull = NULL;
+       stmt **new_updates = table_update_array(i->t, &len);
 
        ts = stmt_basetable(i->t, i->t->base.name);
-       s = stmt_releqjoin_init();
        for (m = i->columns->h, o = ri->columns->h; m && o; m = m->next, o = 
o->next) {
                sql_kc *c = m->data;
-               sql_kc *rc = o->data;
                stmt *upd;
 
                if (updates[c->c->colnr]) {
@@ -2607,19 +2676,39 @@
                        upd = stmt_dup(updates[updcol]->op2.stval);
                        upd = stmt_semijoin(stmt_bat(c->c, stmt_dup(ts), 
RDONLY), upd);
                }
-               if (c->c->null) {       /* new nulls (MATCH SIMPLE) */
+               new_updates[c->c->colnr] = upd;
+
+               /* FOR MATCH FULL/SIMPLE/PARTIAL see above */
+               /* Currently only the default MATCH SIMPLE is supported */
+               if (c->c->null) {
                        stmt *nn = stmt_dup(upd);
 
                        nn = stmt_uselect(nn, 
stmt_atom(atom_general(&c->c->type, NULL, 0)), cmp_equal);
                        if (null)
-                               null = stmt_semijoin(null, nn);
+                               null = stmt_union(null, nn);
                        else
                                null = nn;
                        nulls = 1;
                }
-               stmt_releqjoin_fill(s, upd, stmt_dup(stmt_bat(rc->c, 
stmt_dup(rts), RDONLY)));
 
        }
+
+       /* we only need to check non null values */
+       if (nulls) 
+               /* convert nulls to table ids */
+               nnull = stmt_diff(stmt_dup(updates[updcol]->op2.stval), 
stmt_dup(null));
+
+
+       s = stmt_releqjoin_init();
+       for (m = i->columns->h, o = ri->columns->h; m && o; m = m->next, o = 
o->next) {
+               sql_kc *c = m->data;
+               sql_kc *rc = o->data;
+               stmt *upd = new_updates[c->c->colnr];
+
+               if (nulls) /* remove nulls */
+                       upd = stmt_semijoin(upd, stmt_dup(nnull)); 
+               stmt_releqjoin_fill(s, upd, stmt_dup(stmt_bat(rc->c, 
stmt_dup(rts), RDONLY)));
+       }
        /* add missing nulls */
        if (nulls)
                s = stmt_union(s, stmt_const(null, 
stmt_atom(atom_general(sql_bind_localtype("oid"), NULL, 0))));

U sql_statement.mx
Index: sql_statement.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_statement.mx,v
retrieving revision 1.177
retrieving revision 1.178
diff -u -d -r1.177 -r1.178
--- sql_statement.mx    21 Dec 2008 19:38:22 -0000      1.177
+++ sql_statement.mx    27 Dec 2008 21:27:44 -0000      1.178
@@ -1117,7 +1117,8 @@
 {
        stmt *s = stmt_bat(c, basetable, access );
 
-       if (c->base.flag != TR_NEW && isTable(c->t) &&
+       if (isTable(c->t) &&
+          (c->base.flag != TR_NEW || c->t->base.flag != TR_NEW /* alter */) &&
            access == RDONLY && c->t->persistence == SQL_PERSIST && 
!c->t->commit_action) {
                stmt *i = stmt_bat(c, stmt_dup(basetable), RD_INS );
                stmt *u = stmt_bat(c, stmt_dup(basetable), RD_UPD );
@@ -1150,7 +1151,8 @@
 {
        stmt *s = stmt_idxbat(idx, access);
 
-       if (idx->base.flag != TR_NEW && isTable(idx->t) &&
+       if (isTable(idx->t) &&
+          (idx->base.flag != TR_NEW || idx->t->base.flag != TR_NEW /* alter 
*/) && 
            access == RDONLY && idx->t->persistence == SQL_PERSIST && 
!idx->t->commit_action) {
                stmt *i = stmt_idxbat(idx, RD_INS);
                stmt *u = stmt_idxbat(idx, RD_UPD);

U sql_schema.mx
Index: sql_schema.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_schema.mx,v
retrieving revision 1.161
retrieving revision 1.162
diff -u -d -r1.161 -r1.162
--- sql_schema.mx       27 Dec 2008 16:42:06 -0000      1.161
+++ sql_schema.mx       27 Dec 2008 21:27:44 -0000      1.162
@@ -996,6 +996,8 @@
        sql_kc *ic = idx->columns->h->data;
        sql_rel *updates, *update;
 
+       if (isNew(ic->c)) /* column is just created, ie gets update by it self 
*/
+               return stmt_none();
        exps = new_exp_list();
        exps = append(exps, 
                exp_column(t->base.name, "%TID%", sql_bind_localtype("oid"), 
CARD_MULTI, 0, 1));
@@ -1317,8 +1319,12 @@
 
                        if (!cs->def) {
                                a = atom_general(&cs->type, NULL, 0);
-                               if (a)
-                                       res = stmt_append_col(cs, 
stmt_const(stmt_bat(mvc_first_column(sql, t), stmt_basetable(t, t->base.name), 
RDONLY), stmt_atom(a)));
+                               if (a) {
+                                       if (isNew(t))
+                                               res = stmt_append_col(cs, 
stmt_const(stmt_bat(mvc_first_column(sql, t), stmt_basetable(t, t->base.name), 
RDONLY), stmt_atom(a)));
+                                       else
+                                               res = stmt_update_col(cs, 
stmt_const(stmt_bat(mvc_first_column(sql, t), stmt_basetable(t, t->base.name), 
RDONLY), stmt_atom(a)));
+                               }
                        } else {
                                stmt *sq;
                                char *msg = NULL;
@@ -1338,7 +1344,10 @@
                                   foreach new value. This is handled by
                                   stmt_const and push_project.
                                */
-                               res = stmt_append_col(cs, 
stmt_const(stmt_bat(mvc_first_column(sql, t), stmt_basetable(t, t->base.name), 
RDONLY), sq));
+                               if (isNew(t))
+                                       res = stmt_append_col(cs, 
stmt_const(stmt_bat(mvc_first_column(sql, t), stmt_basetable(t, t->base.name), 
RDONLY), sq));
+                               else
+                                       res = stmt_update_col(cs, 
stmt_const(stmt_bat(mvc_first_column(sql, t), stmt_basetable(t, t->base.name), 
RDONLY), sq));
                        }
                        if (!res) {
                                return sql_error(sql, 02, "ALTER TABLE: failed 
to create default value '%s'\n", cs->def ? cs->def : "NULL");


------------------------------------------------------------------------------
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to