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

Modified Files:
        sql_storage.h store.mx 
Log Message:
added support for 'create cluster name on tname ( column list )'
which caused lots of changes all over the place.

also fixed (moved code out of sql -> mkey)
moved finally copy into over to a function and into relational alg.



U store.mx
Index: store.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/storage/store.mx,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- store.mx    9 Jun 2009 07:53:39 -0000       1.31
+++ store.mx    25 Jul 2009 22:08:38 -0000      1.32
@@ -124,6 +124,8 @@
        if (isTable(i->t))
                store_funcs.destroy_idx(NULL, i);
        base_destroy(&i->base);
+       if (i->type == isclustered && i->t->cluster == i)
+               i->t->cluster = NULL;
        _DELETE(i);
 }
 
@@ -369,7 +371,7 @@
        kc->trunc = *(int *)v;                  _DELETE(v);
        list_append(i->columns, kc);
        assert(kc->c);
-       if (i->type == hash_idx) 
+       if (hash_index(i->type)) 
                kc->c->unique = 1;
 }
 
@@ -398,6 +400,11 @@
        if (isTable(ni->t) && idx_is_column(ni->type))
                store_funcs.create_idx(tr, ni);
 
+       if (ni->type == isclustered)
+               t->cluster = ni;
+       /* TODO get clustered info from disk (for now we assume cluster is )*/
+       t->clustered = 1;
+
        kc_id = find_sql_column(keycolumns, "id");
        kc_nr = find_sql_column(keycolumns, "nr");
        rs = table_funcs.rids_select(tr, kc_id, &ni->base.id, &ni->base.id, 
NULL);
@@ -561,6 +568,7 @@
        t->cleared = 0;
 
        t->pkey = NULL;
+       t->cluster = NULL;
        t->s = s;
        t->sz = COLSIZE;
 
@@ -1102,6 +1110,7 @@
        cs_init(&t->keys, (fdestroy) &key_destroy);
        cs_init(&t->triggers, (fdestroy) &trigger_destroy);
        t->pkey = NULL;
+       t->cluster = NULL;
        t->sz = COLSIZE;
        t->cleared = 0;
        t->s = NULL;
@@ -1585,6 +1594,11 @@
        if (isNew(i) && flag == TR_NEW && tr->parent == gtrans) 
                i->base.flag = TR_OLD;
 
+       if (ni->type == isclustered) {
+               ni->t->cluster = ni;
+               ni->t->clustered = i->t->clustered;
+       }
+
        for (n = i->columns->h; n; n = n->next) {
                sql_kc *okc = n->data;
 
@@ -1669,6 +1683,7 @@
        cs_init(&t->triggers, (fdestroy) &trigger_destroy);
 
        t->pkey = NULL;
+       t->cluster = NULL;
 
        if (isTable(ot)) 
                store_funcs.dup_del(tr, ot, t);
@@ -2170,6 +2185,8 @@
        /* remove idx from schema */
        if (mode == R_APPLY)
                list_remove_data(i->t->s->idxs, i);
+       if (i->t->cluster == i)
+               i->t->cluster = NULL;
        return ok;
 }
 
@@ -2928,6 +2945,8 @@
 
        /* remove idx from schema and table*/
        list_remove_data(i->t->s->idxs, i);
+       if (i->t->cluster == i)
+               i->t->cluster = NULL;
        sql_trans_drop_dependencies(tr, i->base.id);
        if (isGlobalTable(i->t)) 
                tr->schema_updates ++;
@@ -3613,8 +3632,7 @@
        nk->type = kt;
        nk->columns = list_create((fdestroy) &kc_destroy);
        nk->t = t;
-       nk->idx = sql_trans_create_idx(tr, t, name, (nk->type == fkey) ? 
join_idx : hash_idx);
-       nk->idx->key = nk;
+       nk->idx = NULL;
 
        uk = (sql_ukey *) nk;
 
@@ -3712,6 +3730,7 @@
        return k;
 }
 
+
 sql_fkey *
 sql_trans_create_fkc(sql_trans *tr, sql_fkey *fk, sql_column *c /*, extra 
options such as trunc */ )
 {
@@ -3738,6 +3757,76 @@
        return (sql_fkey*)k;
 }
 
+static sql_idx *
+table_has_idx( sql_table *t, list *keycols)
+{
+       node *n, *m, *o;
+       char *found = NULL;
+       int len = list_length(keycols);
+       
+       found = NEW_ARRAY(char, len);
+       if (t->idxs.set) for ( n = t->idxs.set->h; n; n = n->next ) {
+               sql_idx *i = n->data;
+               int nr;
+               
+               memset(found, 0, len);
+               for (m = keycols->h, nr = 0; m; m = m->next, nr++ ) {
+                       sql_kc *kc = m->data;
+
+                       for (o = i->columns->h; o; o = o->next) {
+                               sql_kc *ikc = o->data;
+
+                               if (kc->c == ikc->c) {
+                                       found[nr] = 1;
+                                       break;
+                               }
+                       }
+               }
+               for(nr = 0; nr<len; nr++)
+                       if (!found[nr])
+                               break;
+               if (nr == len) {
+                       _DELETE(found);
+                       return i;
+               }
+       }
+       if (found)
+               _DELETE(found);
+       return NULL;
+}
+
+sql_key *
+sql_trans_key_done(sql_trans *tr, sql_key *k) 
+{
+       node *n;
+       sql_idx *i;
+
+       /* for now we only mark the end of unique/primary key definitions */ 
+       if (k->type == fkey) 
+               return k;
+
+       if ((i = table_has_idx(k->t, k->columns)) != NULL) {
+               /* use available hash, or use the order */
+               if (hash_index(i->type)) {
+                       k->idx = i;
+                       if (!k->idx->key)
+                               k->idx->key = k;
+               }
+               return k;
+       }
+
+       /* we need to create an index */
+       k->idx = sql_trans_create_idx(tr, k->t, k->base.name, hash_idx);
+       k->idx->key = k;
+
+       for (n=k->columns->h; n; n = n->next) {
+               sql_kc *kc = n->data;
+
+               sql_trans_create_ic(tr, k->idx, kc->c);
+       }
+       return k;
+}
+
 void
 sql_trans_drop_key(sql_trans *tr, sql_schema *s, int id, int drop_action)
 {
@@ -3795,6 +3884,13 @@
        ni->t = t;
        ni->key = NULL;
 
+       if (ni->type == isclustered) {
+               t->cluster= ni;
+               if (store_funcs.count_col(t->columns.set->h->data) == 0) 
+                       t->clustered = 1;
+               /* TODO save clustered on disk */
+       }
+
        cs_add(&t->idxs, ni, TR_NEW);
        list_append(t->s->idxs, ni);
 
@@ -3820,7 +3916,8 @@
        ic->trunc = 0;
        list_append(i->columns, ic);
 
-       if (i->type == hash_idx && list_length(i->columns) > 1) {
+
+       if (hash_index(i->type) && list_length(i->columns) > 1) {
                /* Correct the unique flag of the keys first column */
                c->unique = list_length(i->columns); 
                if (c->unique == 2) {
@@ -3829,6 +3926,18 @@
                }
        }
 
+       /* should we switch to oph_idx ? */
+       if (0 && i->type == hash_idx && list_length(i->columns) == 1 &&
+           store_funcs.count_col(ic->c) && store_funcs.sorted_col(tr, ic->c)) {
+               sql_table *sysidx = find_sql_table(syss, "idxs");
+               sql_column *sysidxid = find_sql_column(sysidx, "id");
+               sql_column *sysidxtype = find_sql_column(sysidx, "type");
+               ssize_t rid = table_funcs.column_find_row(tr, sysidxid, 
&i->base.id, NULL);
+       
+               i->type = oph_idx;
+               table_funcs.column_update_value(tr, sysidxtype, rid, &i->type);
+       }
+
        table_funcs.table_insert(tr, sysic, &i->base.id, ic->c->base.name, 
&ic->trunc, &nr);
        sysic->base.wtime = sysic->s->base.wtime = tr->wtime = tr->stime;
        if (isGlobalTable(i->t)) 

U sql_storage.h
Index: sql_storage.h
===================================================================
RCS file: /cvsroot/monetdb/sql/src/storage/sql_storage.h,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -d -r1.56 -r1.57
--- sql_storage.h       7 Jan 2009 14:19:29 -0000       1.56
+++ sql_storage.h       25 Jul 2009 22:08:38 -0000      1.57
@@ -106,9 +106,11 @@
 
 /*
 -- count number of rows in column (excluding the deletes)
+-- check for sortedness
  */
 typedef size_t (*count_col_fptr) (sql_column *c);
 typedef size_t (*count_idx_fptr) (sql_idx *i);
+typedef int (*sorted_col_fptr) (sql_trans *tr, sql_column *c);
 
 /*
 -- create the necessary storage resources for columns, indices and tables
@@ -178,6 +180,7 @@
 
        count_col_fptr count_col;
        count_idx_fptr count_idx;
+       sorted_col_fptr sorted_col;
 
        create_col_fptr create_col;
        create_idx_fptr create_idx;
@@ -313,6 +316,8 @@
 extern sql_column *sql_trans_alter_default(sql_trans *tr, sql_column *col, 
char *val);
 
 extern sql_key *sql_trans_create_ukey(sql_trans *tr, sql_table *t, char *name, 
key_type kt);
+extern sql_key * sql_trans_key_done(sql_trans *tr, sql_key *k);
+
 extern sql_fkey *sql_trans_create_fkey(sql_trans *tr, sql_table *t, char 
*name, key_type kt, sql_key *rkey, int on_delete, int on_update);
 extern sql_key *sql_trans_create_kc(sql_trans *tr, sql_key *k, sql_column *c 
/*, extra options such as trunc */ );
 extern sql_fkey *sql_trans_create_fkc(sql_trans *tr, sql_fkey *k, sql_column 
*c /*, extra options such as trunc */ );


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

Reply via email to