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

Reply via email to