Changeset: 0dc0ef3e0c0f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0dc0ef3e0c0f
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_storage.h
sql/storage/store.c
Branch: Feb2013
Log Message:
make sure we mark bats as key when we have a unique contraint without null's
diffs (134 lines):
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -1371,8 +1371,8 @@ gtr_minmax( sql_trans *tr )
return _gtr_update(tr, >r_minmax_table);
}
-int
-tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat, BUN
snapshot_minsize)
+static int
+tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat, BUN
snapshot_minsize, int unique)
{
int ok = LOG_OK;
BAT *ups, *ins, *cur;
@@ -1390,6 +1390,8 @@ tr_update_delta( sql_trans *tr, sql_delt
cur = temp_descriptor(obat->bid);
ins = temp_descriptor(cbat->ibid);
+ if (unique)
+ BATkey(BATmirror(cur), TRUE);
/* any inserts */
if (BUNlast(ins) > BUNfirst(ins) || cleared) {
if (BUNlast(ins) > ins->batInserted && (store_nr_active > 1)) {
@@ -1428,6 +1430,8 @@ tr_update_delta( sql_trans *tr, sql_delt
/* swap cur and ins */
BAT *newcur = ins;
+ if (unique)
+ BATkey(BATmirror(newcur), TRUE);
temp_destroy(obat->bid);
temp_destroy(cbat->bid);
@@ -1517,7 +1521,7 @@ tr_update_delta( sql_trans *tr, sql_delt
return ok;
}
-int
+static int
tr_update_dbat(sql_trans *tr, sql_dbat *tdb, sql_dbat *fdb, int cleared)
{
int ok = LOG_OK;
@@ -1566,7 +1570,13 @@ update_table(sql_trans *tr, sql_table *f
if (!cc->base.wtime)
continue;
assert(oc->base.wtime < cc->base.wtime);
- tr_update_delta(tr, oc->data, cc->data, SNAPSHOT_MINSIZE);
+ tr_update_delta(tr, oc->data, cc->data, SNAPSHOT_MINSIZE,
cc->unique == 1);
+ oc->null = cc->null;
+ oc->unique = cc->unique;
+ if (cc->storage_type && (!cc->storage_type ||
strcmp(cc->storage_type, oc->storage_type) != 0))
+ oc->storage_type = sa_strdup(tr->sa, cc->storage_type);
+ if (cc->def && (!cc->def || strcmp(cc->def, oc->def) != 0))
+ oc->def = sa_strdup(tr->sa, cc->def);
if (oc->base.rtime < cc->base.rtime)
oc->base.rtime = cc->base.rtime;
@@ -1583,7 +1593,7 @@ update_table(sql_trans *tr, sql_table *f
if (!oi->data || !ci->base.wtime)
continue;
- tr_update_delta(tr, oi->data, ci->data,
SNAPSHOT_MINSIZE);
+ tr_update_delta(tr, oi->data, ci->data,
SNAPSHOT_MINSIZE, 0);
if (oi->base.rtime < ci->base.rtime)
oi->base.rtime = ci->base.rtime;
@@ -1600,7 +1610,7 @@ update_table(sql_trans *tr, sql_table *f
return ok;
}
-int
+static int
tr_log_delta( sql_trans *tr, sql_delta *cbat, int cleared)
{
int ok = LOG_OK;
@@ -1636,7 +1646,7 @@ tr_log_delta( sql_trans *tr, sql_delta *
return ok;
}
-int
+static int
tr_log_dbat(sql_trans *tr, sql_dbat *fdb, int cleared)
{
int ok = LOG_OK;
diff --git a/sql/storage/bat/bat_storage.h b/sql/storage/bat/bat_storage.h
--- a/sql/storage/bat/bat_storage.h
+++ b/sql/storage/bat/bat_storage.h
@@ -71,10 +71,6 @@ extern int log_destroy_delta(sql_delta *
extern int log_destroy_dbat(sql_dbat *bat);
extern BUN clear_delta(sql_trans *tr, sql_delta *bat);
extern BUN clear_dbat(sql_trans *tr, sql_dbat *bat);
-extern int tr_update_delta( sql_trans *tr, sql_delta *obat, sql_delta *cbat,
BUN snapshot_minsize);
-extern int tr_update_dbat(sql_trans *tr, sql_dbat *tdb, sql_dbat *fdb, int
cleared);
-extern int tr_log_delta( sql_trans *tr, sql_delta *cbat, int cleared);
-extern int tr_log_dbat(sql_trans *tr, sql_dbat *fdb, int cleared);
#endif /*BATSTORAGE_H */
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1791,7 +1791,7 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
sql_table *sysidx = find_sql_table(syss, "idxs");
sql_table *sysic = find_sql_table(syss, "objects");
node *n;
- int nr;
+ int nr, unique = 0;
sql_idx *ni = SA_ZNEW(tr->sa, sql_idx);
base_init(tr->sa, &ni->base, i->base.id, TR_NEW, i->base.name);
@@ -1801,10 +1801,16 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
ni->type = i->type;
ni->key = NULL;
+ if (list_length(i->columns) == 1)
+ unique = 1;
for (n = i->columns->h, nr = 0; n; n = n->next, nr++) {
sql_kc *okc = n->data, *ic;
list_append(ni->columns, ic = kc_dup_(tr, TR_NEW, okc, t, 1));
+ if (ic->c->unique != (unique & !okc->c->null)) {
+ ic->c->base.wtime = tr->wstime;
+ okc->c->unique = ic->c->unique = (unique &
(!okc->c->null));
+ }
table_funcs.table_insert(tr, sysic, &ni->base.id,
ic->c->base.name, &nr);
sysic->base.wtime = sysic->s->base.wtime = tr->wtime =
tr->wstime;
@@ -2441,7 +2447,6 @@ rollforward_create_seq(sql_trans *tr, sq
return k;
}
-
static sql_column *
rollforward_create_column(sql_trans *tr, sql_column *c, int mode)
{
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list