Changeset: a3effae77118 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a3effae77118
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql_cat.c
sql/include/sql_catalog.h
sql/server/rel_propagate.c
sql/server/rel_schema.c
sql/server/rel_updates.c
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_utils.c
sql/storage/objectset.c
sql/storage/sql_catalog.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: nospare
Log Message:
adding more handling of temporals and savepoints
also split changes log callback into, commit-rollback and log.
diffs (truncated from 1539 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1324,12 +1324,12 @@ exp_bin(backend *be, sql_exp *e, stmt *l
static stmt *
stmt_col( backend *be, sql_column *c, stmt *del, int part)
{
- sql_trans *tr = be->mvc->session->tr;
+ //sql_trans *tr = be->mvc->session->tr;
stmt *sc = stmt_bat(be, c, RDONLY, part);
if (isTable(c->t) && c->t->access != TABLE_READONLY &&
- (!isNew(c) || (c->t->s && !inTransaction(tr, c->t)) || !isNew(c->t)
/* alter */) &&
- (c->t->persistence == SQL_PERSIST || c->t->s) &&
!c->t->commit_action) {
+ (!isNew(c) /*|| (c->t->s && !inTransaction(tr, c->t))*/ ||
!isNew(c->t) /* alter */) &&
+ (c->t->persistence == SQL_PERSIST || c->t->s) /*&&
!c->t->commit_action*/) {
stmt *i = stmt_bat(be, c, RD_INS, 0);
stmt *u = stmt_bat(be, c, RD_UPD_ID, part);
sc = stmt_project_delta(be, sc, u, i);
@@ -1344,12 +1344,12 @@ stmt_col( backend *be, sql_column *c, st
static stmt *
stmt_idx( backend *be, sql_idx *i, stmt *del, int part)
{
- sql_trans *tr = be->mvc->session->tr;
+ //sql_trans *tr = be->mvc->session->tr;
stmt *sc = stmt_idxbat(be, i, RDONLY, part);
if (isTable(i->t) && i->t->access != TABLE_READONLY &&
- (!isNew(i) || (i->t->s && !inTransaction(tr, i->t)) ||
!isNew(i->t)/* alter */) &&
- (i->t->persistence == SQL_PERSIST || i->t->s) &&
!i->t->commit_action) {
+ (!isNew(i) /*|| (i->t->s && !inTransaction(tr, i->t))*/ ||
!isNew(i->t)/* alter */) &&
+ (i->t->persistence == SQL_PERSIST || i->t->s) /*&&
!i->t->commit_action*/) {
stmt *ic = stmt_idxbat(be, i, RD_INS, 0);
stmt *u = stmt_idxbat(be, i, RD_UPD_ID, part);
sc = stmt_project_delta(be, sc, u, ic);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2548,7 +2548,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
sqlstore *store = m->store;
nr = store->storage_api.count_col(tr, c, 1);
- if (isTable(t) && t->access == TABLE_WRITABLE && (!isNew(t) /* alter */
|| !inTransaction(tr, t)) &&
+ if (isTable(t) && t->access == TABLE_WRITABLE && (!isNew(t) /* alter
*//* || !inTransaction(tr, t)*/) &&
t->persistence == SQL_PERSIST && !t->commit_action)
inr = store->storage_api.count_col(tr, c, 0);
nr -= inr;
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -214,7 +214,7 @@ alter_table_add_range_partition(mvc *sql
"ALTER
TABLE: cannot add range partition into a %s table",
(isListPartitionTable(mt))?"list partition":"merge");
goto finish;
- } else if (!update && isPartition(pt)) {
+ } else if (!update && partition_find_part(sql->session->tr, pt, NULL)) {
msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER TABLE: table
'%s.%s' is already part of another table",
psname, ptname);
@@ -337,7 +337,7 @@ alter_table_add_value_partition(mvc *sql
"ALTER
TABLE: cannot add value partition into a %s table",
(isRangePartitionTable(mt))?"range partition":"merge");
goto finish;
- } else if (!update && isPartition(pt)) {
+ } else if (!update && partition_find_part(sql->session->tr, pt, NULL)) {
msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
"ALTER TABLE: table
'%s.%s' is already part of another table",
psname, ptname);
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -234,8 +234,9 @@ struct os_iter {
/* transaction changes */
typedef int (*tc_validate_fptr) (struct sql_trans *tr, struct sql_change *c,
ulng commit_ts, ulng oldest);
-typedef int (*tc_log_fptr) (struct sql_trans *tr, struct sql_change *c, ulng
commit_ts, ulng oldest);
-typedef int (*tc_cleanup_fptr) (sql_store store, struct sql_change *c, ulng
commit_ts, ulng oldest); /* garbage collection, ie cleanup structures when
possible */
+typedef int (*tc_log_fptr) (struct sql_trans *tr, struct sql_change *c);
/* write changes to the
log */
+typedef int (*tc_commit_fptr) (struct sql_trans *tr, struct sql_change *c,
ulng commit_ts, ulng oldest);/* commit/rollback changes */
+typedef int (*tc_cleanup_fptr) (sql_store store, struct sql_change *c, ulng
commit_ts, ulng oldest); /* garbage collection, ie cleanup structures when
possible */
typedef void (*destroy_fptr)(sql_store store, sql_base *b);
extern struct objectset *os_new(sql_allocator *sa, destroy_fptr destroy, bool
temporary, bool unique);
@@ -643,7 +644,6 @@ typedef enum table_types {
#define isRemote(x) ((x)->type==tt_remote)
#define isReplicaTable(x) ((x)->type==tt_replica_table)
#define isKindOfTable(x) (isTable(x) || isMergeTable(x) ||
isRemote(x) || isReplicaTable(x))
-#define isPartition(x) ((x)->partition)
#define TABLE_WRITABLE 0
#define TABLE_READONLY 1
@@ -701,7 +701,6 @@ typedef struct sql_table {
struct sql_schema *s;
struct sql_table *po; /* the outer transactions table */
- char partition; /* number of times this table is part of some
hierachy of tables */
union {
struct sql_column *pcol; /* If it is partitioned on a column */
struct sql_expression *pexp; /* If it is partitioned by an
expression */
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -272,7 +272,7 @@ propagate_validation_to_upper_tables(sql
sql_part *it = NULL;
for (sql_table *prev = mt ; prev; prev = it?it->t:NULL) {
- if (!isPartition(prev) ||
(it=partition_find_part(sql->session->tr, prev, NULL)) == NULL)
+ if ((it=partition_find_part(sql->session->tr, prev, NULL)) ==
NULL)
break;
sql_part *spt = it;
if (spt) {
@@ -1056,7 +1056,7 @@ rel_propagate(sql_query *query, sql_rel
if (l->op == op_basetable) {
sql_table *t = l->l;
- if (isPartition(t) && !find_prop(l->p, PROP_USED)) {
+ if (partition_find_part(sql->session->tr, t, NULL) &&
!find_prop(l->p, PROP_USED)) {
isSubtable = true;
if (is_insert(rel->op)) { /* insertion directly to
sub-table (must do validation) */
sql_rel *nrel = rel_subtable_insert(query, rel,
t, changes);
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -682,10 +682,9 @@ table_element(sql_query *query, symbol *
(isView(t) ||
((isMergeTable(t) || isReplicaTable(t)) && (s->token !=
SQL_TABLE && s->token != SQL_DROP_TABLE && cs_size(&t->members))) ||
(isTable(t) && (s->token == SQL_TABLE || s->token ==
SQL_DROP_TABLE)) ||
- (isPartition(t) && (s->token == SQL_DROP_COLUMN || s->token ==
SQL_COLUMN || s->token == SQL_CONSTRAINT)) ||
- (isPartition(t) &&
- (s->token == SQL_DEFAULT || s->token == SQL_DROP_DEFAULT ||
s->token == SQL_NOT_NULL || s->token == SQL_NULL ||
- s->token == SQL_DROP_CONSTRAINT)))){
+ (partition_find_part(sql->session->tr, t, NULL) &&
+ (s->token == SQL_DROP_COLUMN || s->token == SQL_COLUMN
|| s->token == SQL_CONSTRAINT ||
+ s->token == SQL_DEFAULT || s->token ==
SQL_DROP_DEFAULT || s->token == SQL_NOT_NULL || s->token == SQL_NULL ||
s->token == SQL_DROP_CONSTRAINT)))){
char *msg = "";
switch (s->token) {
@@ -726,7 +725,7 @@ table_element(sql_query *query, symbol *
sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s %s '%s'%s\n",
action,
msg,
- isPartition(t)?"a PARTITION of a MERGE or
REPLICA TABLE":
+ partition_find_part(sql->session->tr, t,
NULL)?"a PARTITION of a MERGE or REPLICA TABLE":
isMergeTable(t)?"MERGE TABLE":
isRemote(t)?"REMOTE TABLE":
isReplicaTable(t)?"REPLICA TABLE":"VIEW",
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -912,7 +912,7 @@ update_generate_assignments(sql_query *q
if (isPartitionedByColumnTable(t) || isPartitionedByExpressionTable(t))
mt = t;
- else if (isPartition(t))
+ else if (partition_find_part(sql->session->tr, t, NULL))
mt = partition_find_part(sql->session->tr, t, NULL)->t;
if (mt && isPartitionedByColumnTable(mt)) {
@@ -1773,7 +1773,7 @@ copyfromloader(sql_query *query, dlist *
return NULL;
else if (isPartitionedByColumnTable(t) ||
isPartitionedByExpressionTable(t))
return sql_error(sql, 02, SQLSTATE(42000) "COPY LOADER INTO:
not possible for partitioned tables at the moment");
- else if (isPartition(t)) {
+ else if (partition_find_part(sql->session->tr, t, NULL)) {
sql_part *mt = partition_find_part(sql->session->tr, t, NULL);
if (mt && (isPartitionedByColumnTable(mt->t) ||
isPartitionedByExpressionTable(mt->t)))
return sql_error(sql, 02, SQLSTATE(42000) "COPY LOADER
INTO: not possible for tables child of partitioned tables at the moment");
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
@@ -27,15 +27,24 @@
* save points these need too look at the parent transaction (and are private
too one transaction).
*/
-static int log_update_col( sql_trans *tr, sql_change *c, ulng commit_ts, ulng
oldest);
-static int log_update_idx( sql_trans *tr, sql_change *c, ulng commit_ts, ulng
oldest);
-static int log_update_del( sql_trans *tr, sql_change *c, ulng commit_ts, ulng
oldest);
+static int log_update_col( sql_trans *tr, sql_change *c);
+static int log_update_idx( sql_trans *tr, sql_change *c);
+static int log_update_del( sql_trans *tr, sql_change *c);
+static int commit_update_col( sql_trans *tr, sql_change *c, ulng commit_ts,
ulng oldest);
+static int commit_update_idx( sql_trans *tr, sql_change *c, ulng commit_ts,
ulng oldest);
+static int commit_update_del( sql_trans *tr, sql_change *c, ulng commit_ts,
ulng oldest);
+static int log_create_col(sql_trans *tr, sql_change *change);
+static int log_create_idx(sql_trans *tr, sql_change *change);
+static int log_create_del(sql_trans *tr, sql_change *change);
+static int commit_create_col(sql_trans *tr, sql_change *change, ulng
commit_ts, ulng oldest);
+static int commit_create_idx(sql_trans *tr, sql_change *change, ulng
commit_ts, ulng oldest);
+static int commit_create_del(sql_trans *tr, sql_change *change, ulng
commit_ts, ulng oldest);
+static int log_destroy_col(sql_trans *tr, sql_change *change);
+static int log_destroy_idx(sql_trans *tr, sql_change *change);
+static int log_destroy_del(sql_trans *tr, sql_change *change);
static int tc_gc_col( sql_store Store, sql_change *c, ulng commit_ts, ulng
oldest);
static int tc_gc_idx( sql_store Store, sql_change *c, ulng commit_ts, ulng
oldest);
static int tc_gc_del( sql_store Store, sql_change *c, ulng commit_ts, ulng
oldest);
-static int log_create_col(sql_trans *tr, sql_change *change, ulng commit_ts,
ulng oldest);
-static int log_create_idx(sql_trans *tr, sql_change *change, ulng commit_ts,
ulng oldest);
-static int log_create_del(sql_trans *tr, sql_change *change, ulng commit_ts,
ulng oldest);
/* used for communication between {append,update}_prepare and
{append,update}_execute */
struct prep_exec_cookie {
@@ -74,6 +83,8 @@ temp_dup_delta(ulng tid, int type)
bat->ucnt = bat->cnt = 0;
bat->cleared = 0;
bat->ts = tid;
+ bat->refcnt = 1;
+ bat->name = NULL;
return bat;
}
@@ -98,6 +109,8 @@ temp_dup_dbat(ulng tid)
bat_destroy(b);
bat->cnt = 0;
bat->ts = tid;
+ bat->refcnt = 1;
+ bat->dname = NULL;
return bat;
}
@@ -237,7 +250,7 @@ bind_uidx(sql_trans *tr, sql_idx * i, in
}
static BAT *
-delta_bind_bat( sql_delta *bat, int access, int temp)
+delta_bind_bat( sql_delta *bat, int access, int is_new)
{
BAT *b;
@@ -245,7 +258,7 @@ delta_bind_bat( sql_delta *bat, int acce
assert(bat != NULL);
if (access == QUICK)
return quick_descriptor(bat->bid);
- if (temp || access == RD_INS) {
+ if (is_new || access == RD_INS) {
assert(bat->ibid);
b = temp_descriptor(bat->ibid);
if (b == NULL)
@@ -315,7 +328,7 @@ bind_col(sql_trans *tr, sql_column *c, i
if (access == RD_UPD_ID || access == RD_UPD_VAL)
return bind_ucol(tr, c, access);
sql_delta *d = timestamp_delta(tr, c->data, c->type.type->localtype,
isTempTable(c->t));
- return delta_bind_bat( d, access, isTempTable(c->t) || isNew(c->t));
+ return delta_bind_bat( d, access, isNew(c->t));
}
static BAT *
@@ -620,8 +633,9 @@ dup_delta(sql_trans *tr, sql_delta *obat
bat->ibid = temp_copy(bat->ibid, 1);
if (bat->ibid == BID_NIL)
return LOG_ERR;
- } else if (c_isnew && !bat->bid) {
- /* move the bat to the new col, fixup the old col*/
+ } else if (c_isnew && !bat->bid && !tr->parent) {
+ /* tr->parent (ie savepoint) keep the same structure as
the parent */
+ /* move the bat to the new col, fixup the old col */
b = COLnew((oid) obat->cnt, type, sz, PERSISTENT);
if (b == NULL)
return LOG_ERR;
@@ -707,8 +721,8 @@ update_col_prepare(sql_trans *tr, sql_co
return NULL;
assert(delta && delta->ts == tr->tid);
- if (!isTempTable(c->t) && !inTransaction(tr, c->t) && odelta != delta)
- trans_add(tr, &c->base, delta, &tc_gc_col, &log_update_col);
+ if ((!inTransaction(tr, c->t) && odelta != delta && isGlobal(c->t)) ||
isLocalTemp(c->t))
+ trans_add(tr, &c->base, delta, &tc_gc_col, &commit_update_col,
isLocalTemp(c->t)?NULL:&log_update_col);
return make_cookie(tr, delta, isNew(c));
}
@@ -778,8 +792,8 @@ update_idx_prepare(sql_trans *tr, sql_id
return NULL;
assert(delta && delta->ts == tr->tid);
- if (!isTempTable(i->t) && !inTransaction(tr, i->t) && odelta != delta)
- trans_add(tr, &i->base, delta, &tc_gc_idx, &log_update_idx);
+ if ((!inTransaction(tr, i->t) && odelta != delta && isGlobal(i->t)) ||
isLocalTemp(i->t))
+ trans_add(tr, &i->base, delta, &tc_gc_idx, &commit_update_idx,
isLocalTemp(i->t)?NULL:&log_update_idx);
return make_cookie(tr, delta, isNew(i));
}
@@ -819,6 +833,7 @@ delta_append_bat( sql_delta *bat, BAT *i
bat->ibid = id;
temp_dup(id);
BAThseqbase(i, bat->ibase);
+ bat_set_access(i, BAT_READ);
} else {
if (!isEbat(b)){
assert(b->theap.storage != STORE_PRIV);
@@ -922,8 +937,8 @@ append_col_prepare(sql_trans *tr, sql_co
return NULL;
assert(delta && delta->ts == tr->tid);
- if (!isTempTable(c->t) && !inTransaction(tr, c->t) && odelta != delta)
- trans_add(tr, &c->base, delta, &tc_gc_col, &log_update_col);
+ if ((!inTransaction(tr, c->t) && odelta != delta && isGlobal(c->t)) ||
isLocalTemp(c->t))
+ trans_add(tr, &c->base, delta, &tc_gc_col, &commit_update_col,
isLocalTemp(c->t)?NULL:&log_update_col);
return make_cookie(tr, delta, false);
}
@@ -967,8 +982,8 @@ append_idx_prepare(sql_trans *tr, sql_id
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list