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