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