Changeset: d309c63be9e5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d309c63be9e5
Modified Files:
        sql/src/include/sql_catalog.h
        sql/src/server/rel_bin.mx
        sql/src/storage/bat/bat_storage.mx
        sql/src/storage/sql_catalog.mx
        sql/src/storage/store.mx
Branch: default
Log Message:

introduced no_idx, which is a index without storage. On p/ukey creation
we create indices, but if the data is sorted we don't want it to cost anything.
Thats where the no_idx comes in.


diffs (249 lines):

diff -r 7839a8fd547c -r d309c63be9e5 sql/src/include/sql_catalog.h
--- a/sql/src/include/sql_catalog.h     Fri May 21 08:43:31 2010 +0200
+++ b/sql/src/include/sql_catalog.h     Fri May 21 16:17:32 2010 +0200
@@ -263,11 +263,13 @@
        clustered,              /* ie has a clustered replica */
        isclustered,            /* the table is (kept) clustered */
        oph_idx,                /* order preserving hash */
+       no_idx,                 /* no idx, ie no storage */
        new_idx_types
 } idx_type;
 
 #define hash_index(t)          (t == hash_idx || t == oph_idx )
-#define idx_is_column(t)       (hash_index(t) || t == join_idx)
+#define idx_is_column(t)       (hash_index(t) || t == join_idx || t == no_idx)
+#define idx_has_column(t)      (hash_index(t) || t == join_idx)
 
 typedef struct sql_idx {
        sql_base base;
@@ -373,6 +375,7 @@
        char unique;            /* NOT UNIQUE, UNIQUE, SUB_UNIQUE */
        int drop_action;        /* only used for alter statements */
        int storage_type;
+       int sorted;             /* for DECLARED (dupped tables) we keep order 
info */
 
        struct sql_table *t;
        void *data;
@@ -498,6 +501,7 @@
 
 extern node *find_sql_table_node(sql_schema *s, char *tname, int id);
 extern sql_table *find_sql_table(sql_schema *s, char *tname);
+extern sql_table *find_sql_table_id(sql_schema *s, int id);
 
 extern node *find_sql_sequence_node(sql_schema *s, char *sname, int id);
 extern sql_sequence *find_sql_sequence(sql_schema *s, char *sname);
diff -r 7839a8fd547c -r d309c63be9e5 sql/src/server/rel_bin.mx
--- a/sql/src/server/rel_bin.mx Fri May 21 08:43:31 2010 +0200
+++ b/sql/src/server/rel_bin.mx Fri May 21 16:17:32 2010 +0200
@@ -2611,9 +2611,6 @@
        sql_subtype *bt = sql_bind_localtype("bit");
        sql_subfunc *ne;
 
-       if (list_length(k->columns) > 1 && !idx_updates)
-               return NULL;
-
        ne = sql_bind_func_result(sql->session->schema, "<>", wrd, wrd, bt);
        if (list_length(k->columns) > 1) {
                stmt *ts = stmt_basetable(k->t, k->t->base.name);
@@ -2654,7 +2651,7 @@
                }
 
                /* 2e stage: find out if the updated are unique */
-               if (idx_updates->nrcols) {      /* update columns not atoms */
+               if (!updates || updates[updcol]->nrcols) {      /* update 
columns not atoms */
                        sql_subaggr *sum;
                        stmt *count_sum = NULL, *ssum;
                        group *g = NULL;
diff -r 7839a8fd547c -r d309c63be9e5 sql/src/storage/bat/bat_storage.mx
--- a/sql/src/storage/bat/bat_storage.mx        Fri May 21 08:43:31 2010 +0200
+++ b/sql/src/storage/bat/bat_storage.mx        Fri May 21 16:17:32 2010 +0200
@@ -136,7 +136,8 @@
 {
        if (access == RD_UPD)
                return bind_ucol(tr, c, access);
-       c->base.rtime = c->t->base.rtime = c->t->s->base.rtime = tr->rtime = 
tr->stime;
+       if (tr)
+               c->base.rtime = c->t->base.rtime = c->t->s->base.rtime = 
tr->rtime = tr->stime;
        return delta_bind_bat( c->data, access, isTemp(c));
 }
 
@@ -145,7 +146,8 @@
 {
        if (access == RD_UPD)
                return bind_uidx(tr, i, access);
-       i->base.rtime = i->t->base.rtime = i->t->s->base.rtime = tr->rtime = 
tr->stime;
+       if (tr)
+               i->base.rtime = i->t->base.rtime = i->t->s->base.rtime = 
tr->rtime = tr->stime;
        return delta_bind_bat( i->data, access, isTemp(i));
 }
 
@@ -420,7 +422,7 @@
                        sql_idx *i = n->data;
                        sql_delta *bat = i->data;
 
-                       if (bat->cached) {
+                       if (bat && bat->cached) {
                                bat_destroy(bat->cached);
                                bat->cached = NULL;
                        }
@@ -440,7 +442,7 @@
 {
        sql_delta *b = col->data;
        if (!b)
-               return 0;
+               return 1;
        return b->cnt;
 }
 
@@ -453,13 +455,40 @@
        return b->cnt;
 }
 
+
+sql_column *
+find_col( sql_trans *tr, char *sname, char *tname, char *cname )
+{
+       sql_schema *s = find_sql_schema(tr, sname);
+       sql_table *t;
+       sql_column *c = NULL;
+
+       if (s) 
+               t = find_sql_table(s, tname);
+       if (t) 
+               c = find_sql_column(t, cname);
+       return c;
+}
+
 static int
 sorted_col(sql_trans *tr, sql_column *col)
 {
-       BAT *b = bind_col(tr, col, RDONLY);
-       int sorted = BATtordered(b);
-       
-       bat_destroy(b);
+       int sorted = 0;
+
+       /* fallback to central bat */
+       if (tr && tr->parent && !col->data) {
+               col = find_col(tr->parent, 
+                       col->t->s->base.name, 
+                       col->t->base.name,
+                       col->base.name);
+       }
+
+       if (col && col->data) {
+               BAT *b = bind_col(tr, col, RDONLY);
+
+               sorted = BATtordered(b);
+               bat_destroy(b);
+       }
        return sorted;
 }
 
diff -r 7839a8fd547c -r d309c63be9e5 sql/src/storage/sql_catalog.mx
--- a/sql/src/storage/sql_catalog.mx    Fri May 21 08:43:31 2010 +0200
+++ b/sql/src/storage/sql_catalog.mx    Fri May 21 16:17:32 2010 +0200
@@ -171,6 +171,16 @@
        return NULL;
 }
 
+sql_table *
+find_sql_table_id(sql_schema *s, int id)
+{
+       node *n = find_sql_table_node(s, NULL, id);
+
+       if (n)
+               return n->data;
+       return NULL;
+}
+
 node *
 find_sql_sequence_node(sql_schema *s, char *sname, int id)
 {
diff -r 7839a8fd547c -r d309c63be9e5 sql/src/storage/store.mx
--- a/sql/src/storage/store.mx  Fri May 21 08:43:31 2010 +0200
+++ b/sql/src/storage/store.mx  Fri May 21 16:17:32 2010 +0200
@@ -397,7 +397,7 @@
        ni->t = t;
        ni->key = NULL;
 
-       if (isTable(ni->t) && idx_is_column(ni->type))
+       if (isTable(ni->t) && idx_has_column(ni->type))
                store_funcs.create_idx(tr, ni);
 
        if (ni->type == isclustered)
@@ -1141,6 +1141,7 @@
        col->t = t;
        col->unique = c->unique;
        col->storage_type = c->storage_type;
+       col->sorted = sql_trans_is_sorted(NULL, c);
        cs_add(&t->columns, col, TR_NEW);
        return col;
 }
@@ -1747,7 +1748,7 @@
        list_append(t->s->idxs, ni);
        cs_add(&t->idxs, ni, TR_NEW);
 
-       if (!isDeclaredTable(t) && isTable(ni->t) && idx_is_column(ni->type))
+       if (!isDeclaredTable(t) && isTable(ni->t) && idx_has_column(ni->type))
                store_funcs.create_idx(tr, ni);
        if (!isDeclaredTable(t))
                table_funcs.table_insert(tr, sysidx, &ni->base.id, &t->base.id, 
&ni->type, ni->base.name);
@@ -2242,7 +2243,7 @@
 rollforward_create_idx(sql_trans *tr, sql_idx * i, int mode)
 {
 
-       if (isTable(i->t) && idx_is_column(i->type)) {
+       if (isTable(i->t) && idx_has_column(i->type)) {
                int p = (tr->parent == gtrans && !isTempTable(i->t));
 
                if ((p && mode == R_SNAPSHOT && 
store_funcs.snapshot_create_idx(tr, i) != LOG_OK) ||
@@ -3697,6 +3698,21 @@
        ic->c = c;
        ic->trunc = 0;
        list_append(i->columns, ic);
+
+       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) {
+                       sql_kc *ic1 = i->columns->h->data;
+                       ic1->c->unique ++;
+               }
+       }
+
+       /* should we switch to oph_idx ? */
+       if (i->type == hash_idx && list_length(i->columns) == 1 && 
ic->c->sorted) 
+               //i->type = oph_idx;
+               i->type = no_idx;
+
        return i;
 }
 
@@ -4261,7 +4277,7 @@
        cs_add(&t->idxs, ni, TR_NEW);
        list_append(t->s->idxs, ni);
 
-       if (!isDeclaredTable(t) && isTable(ni->t) && idx_is_column(ni->type))
+       if (!isDeclaredTable(t) && isTable(ni->t) && idx_has_column(ni->type))
                store_funcs.create_idx(tr, ni);
        if (!isDeclaredTable(t))
                table_funcs.table_insert(tr, sysidx, &ni->base.id, &t->base.id, 
&ni->type, ni->base.name);
@@ -4294,14 +4310,15 @@
        }
 
        /* should we switch to oph_idx ? */
-       if (0 && i->type == hash_idx && list_length(i->columns) == 1 &&
+       if (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");
                oid rid = table_funcs.column_find_row(tr, sysidxid, 
&i->base.id, NULL);
        
-               i->type = oph_idx;
+               //i->type = oph_idx;
+               i->type = no_idx;
                table_funcs.column_update_value(tr, sysidxtype, rid, &i->type);
        }
 
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to