Changeset: 699d3eb7ddb3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/699d3eb7ddb3 Modified Files: sql/storage/objectset.c Branch: nospare-aris Log Message:
Merge with nospare. diffs (truncated from 1510 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 @@ -223,19 +223,20 @@ typedef void *sql_store; struct sql_trans; struct sql_change; struct objectset; -struct versionchain; +struct object_node; struct os_iter { struct objectset *os; struct sql_trans *tr; - struct versionchain *n; + struct object_node *n; struct sql_hash_e *e; const char *name; }; /* 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)){ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list