Changeset: 939b42b3f322 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/939b42b3f322
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/server/rel_schema.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/storage/objectset.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Jul2021
Log Message:

Unifying more storage calls. Both update and delete calls now return an integer 
to mark it succeeded or not.

Inserts never conflict so we don't need to check for conflicts on those.

The returned integer means 0 on success, 1 on malloc failure, 2 or 3 on 
transaction conflict (later on we can add different meanings for these two). 
Some calls may return other error codes.
This fixes transaction_isolation test, but I should add more tests.

And I did run all the TestWeb twice.


diffs (truncated from 2562 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
@@ -5695,10 +5695,22 @@ sql_truncate(backend *be, sql_table *t, 
 
                                        assert(s->base.id == sche->base.id);
                                        if ((seq = find_sql_sequence(tr, s, 
seq_name))) {
-                                               if 
(!sql_trans_sequence_restart(tr, seq, seq->start)) {
-                                                       sql_error(sql, 02, 
SQLSTATE(HY005) "Could not restart sequence %s.%s", sche->base.name, seq_name);
-                                                       error = 1;
-                                                       goto finalize;
+                                               switch 
(sql_trans_sequence_restart(tr, seq, seq->start)) {
+                                                       case -1:
+                                                               sql_error(sql, 
02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                                               error = 1;
+                                                               goto finalize;
+                                                       case -2:
+                                                       case -3:
+                                                               sql_error(sql, 
02, SQLSTATE(HY005) "RESTART SEQUENCE: transaction conflict detected");
+                                                               error = 1;
+                                                               goto finalize;
+                                                       case -4:
+                                                               sql_error(sql, 
02, SQLSTATE(HY005) "Could not restart sequence %s.%s", sche->base.name, 
seq_name);
+                                                               error = 1;
+                                                               goto finalize;
+                                                       default:
+                                                               break;
                                                }
                                        }
                                }
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
@@ -371,12 +371,20 @@ create_table_or_view(mvc *sql, char* sna
        }
 
        for (n = ol_first_node(t->columns); n; n = n->next) {
-               sql_column *c = n->data, *copied = mvc_copy_column(sql, nt, c);
-
-               if (copied == NULL) {
-                       sa_reset(sql->ta);
-                       sql->sa = osa;
-                       throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE 
TABLE: %s_%s_%s conflicts", s->base.name, t->base.name, c->base.name);
+               sql_column *c = n->data, *copied = NULL;
+
+               switch (mvc_copy_column(sql, nt, c, &copied)) {
+                       case -1:
+                               sa_reset(sql->ta);
+                               sql->sa = osa;
+                               throw(SQL, "sql.catalog", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       case -2:
+                       case -3:
+                               sa_reset(sql->ta);
+                               sql->sa = osa;
+                               throw(SQL, "sql.catalog", SQLSTATE(42000) 
"CREATE TABLE: %s_%s_%s conflicts", s->base.name, t->base.name, c->base.name);
+                       default:
+                               break;
                }
                if (isPartitionedByColumnTable(t) && c->base.id == 
t->part.pcol->base.id)
                        nt->part.pcol = copied;
@@ -405,9 +413,17 @@ create_table_or_view(mvc *sql, char* sna
        if (t->idxs) {
                for (n = ol_first_node(t->idxs); n; n = n->next) {
                        sql_idx *i = n->data;
-                       if (!mvc_copy_idx(sql, nt, i)) {
-                               sql->sa = osa;
-                               throw(SQL, "sql.catalog", SQLSTATE(42000) 
"CREATE TABLE: %s_%s_%s index conflicts", s->base.name, t->base.name, 
i->base.name);
+
+                       switch (mvc_copy_idx(sql, nt, i, NULL)) {
+                               case -1:
+                                       sql->sa = osa;
+                                       throw(SQL, "sql.catalog", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               case -2:
+                               case -3:
+                                       sql->sa = osa;
+                                       throw(SQL, "sql.catalog", 
SQLSTATE(42000) "CREATE TABLE: %s_%s_%s index conflicts", s->base.name, 
t->base.name, i->base.name);
+                               default:
+                                       break;
                        }
                }
        }
@@ -422,18 +438,33 @@ create_table_or_view(mvc *sql, char* sna
                                sql->sa = osa;
                                return err;
                        }
-                       if (!mvc_copy_key(sql, nt, k)) {
-                               sql->sa = osa;
-                               throw(SQL, "sql.catalog", SQLSTATE(42000) 
"CREATE TABLE: %s_%s_%s constraint conflicts", s->base.name, t->base.name, 
k->base.name);
+                       switch (mvc_copy_key(sql, nt, k, NULL)) {
+                               case -1:
+                                       sql->sa = osa;
+                                       throw(SQL, "sql.catalog", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               case -2:
+                               case -3:
+                                       sql->sa = osa;
+                                       throw(SQL, "sql.catalog", 
SQLSTATE(42000) "CREATE TABLE: %s_%s_%s constraint conflicts", s->base.name, 
t->base.name, k->base.name);
+                               default:
+                                       break;
                        }
                }
        }
        if (t->triggers) {
                for (n = ol_first_node(t->triggers); n; n = n->next) {
                        sql_trigger *tr = n->data;
-                       if (mvc_copy_trigger(sql, nt, tr)) {
-                               sql->sa = osa;
-                               throw(SQL, "sql.catalog", SQLSTATE(42000) 
"CREATE TABLE: %s_%s_%s trigger conflicts", s->base.name, t->base.name, 
nt->base.name);
+
+                       switch (mvc_copy_trigger(sql, nt, tr, NULL)) {
+                               case -1:
+                                       sql->sa = osa;
+                                       throw(SQL, "sql.catalog", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               case -2:
+                               case -3:
+                                       sql->sa = osa;
+                                       throw(SQL, "sql.catalog", 
SQLSTATE(42000) "CREATE TABLE: %s_%s_%s trigger conflicts", s->base.name, 
t->base.name, nt->base.name);
+                               default:
+                                       break;
                        }
                }
        }
@@ -1041,11 +1072,18 @@ mvc_restart_seq(Client cntxt, MalBlkPtr 
                throw(SQL, "sql.restart", SQLSTATE(HY050) "Cannot set sequence 
%s.%s start to a value lesser than the minimum ("LLFMT" < "LLFMT")", sname, 
seqname, start, seq->minvalue);
        if (seq->maxvalue && start > seq->maxvalue)
                throw(SQL, "sql.restart", SQLSTATE(HY050) "Cannot set sequence 
%s.%s start to a value higher than the maximum ("LLFMT" > "LLFMT")", sname, 
seqname, start, seq->maxvalue);
-       if (sql_trans_sequence_restart(m->session->tr, seq, start)) {
-               *res = start;
-               return MAL_SUCCEED;
+       switch (sql_trans_sequence_restart(m->session->tr, seq, start)) {
+               case -1:
+                       throw(SQL,"sql.restart",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.restart",SQLSTATE(42000) "RESTART 
SEQUENCE: transaction conflict detected");
+               case -4:
+                       throw(SQL,"sql.restart",SQLSTATE(HY050) "Cannot 
(re)start sequence %s.%s", sname, seqname);
+               default:
+                       *res = start;
        }
-       throw(SQL, "sql.restart", SQLSTATE(HY050) "Cannot (re)start sequence 
%s.%s", sname, seqname);
+       return MAL_SUCCEED;
 }
 
 str
@@ -1160,9 +1198,19 @@ mvc_bat_restart_seq(Client cntxt, MalBlk
                        msg = createException(SQL, "sql.restart", 
SQLSTATE(HY050) "Cannot set sequence %s.%s start to a value higher than the 
maximum ("LLFMT" > "LLFMT")", sname, seqname, start, seq->maxvalue);
                        goto bailout;
                }
-               if (!sql_trans_seqbulk_restart(m->session->tr, sb, nstart)) {
-                       msg = createException(SQL, "sql.restart", 
SQLSTATE(HY050) "Cannot restart sequence %s.%s", nsname, nseqname);
-                       goto bailout;
+               switch (sql_trans_seqbulk_restart(m->session->tr, sb, nstart)) {
+                       case -1:
+                               msg = 
createException(SQL,"sql.restart",SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               goto bailout;
+                       case -2:
+                       case -3:
+                               msg = 
createException(SQL,"sql.restart",SQLSTATE(42000) "RESTART SEQUENCE: 
transaction conflict detected");
+                               goto bailout;
+                       case -4:
+                               msg = 
createException(SQL,"sql.restart",SQLSTATE(HY050) "Cannot restart sequence 
%s.%s", nsname, nseqname);
+                               goto bailout;
+                       default:
+                               break;
                }
                if (BUNappend(r, &nstart, false) != GDK_SUCCEED) {
                        msg = createException(SQL, "sql.restart", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
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
@@ -185,7 +185,15 @@ alter_table_add_table(mvc *sql, char *ms
                        return createException(SQL, 
"sql.alter_table_add_table",SQLSTATE(42000) "ALTER TABLE: a range partition is 
required while adding under a range partition table");
                if (isListPartitionTable(mt))
                        return createException(SQL, 
"sql.alter_table_add_table",SQLSTATE(42000) "ALTER TABLE: a value partition is 
required while adding under a list partition table");
-               sql_trans_add_table(sql->session->tr, mt, pt);
+               switch (sql_trans_add_table(sql->session->tr, mt, pt)) {
+                       case -1:
+                               return 
createException(SQL,"sql.alter_table_add_table",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       case -2:
+                       case -3:
+                               return 
createException(SQL,"sql.alter_table_add_table",SQLSTATE(42000) "ALTER TABLE: 
transaction conflict detected");
+                       default:
+                               break;
+               }
        }
        return msg;
 }
@@ -471,7 +479,15 @@ alter_table_set_access(mvc *sql, char *s
                if (access && table_has_updates(sql->session->tr, t))
                        throw(SQL,"sql.alter_table_set_access",SQLSTATE(40000) 
"ALTER TABLE: set READ or INSERT ONLY not possible with outstanding updates 
(wait until updates are flushed)\n");
 
-               mvc_access(sql, t, access);
+               switch (mvc_access(sql, t, access)) {
+                       case -1:
+                               
throw(SQL,"sql.alter_table_set_access",SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       case -2:
+                       case -3:
+                               
throw(SQL,"sql.alter_table_set_access",SQLSTATE(42000) "ALTER TABLE: 
transaction conflict detected");
+                       default:
+                               break;
+               }
                if (access == 0 && (msg = sql_drop_statistics(sql, t)))
                        return msg;
        }
@@ -749,7 +765,15 @@ alter_seq(mvc *sql, char *sname, char *s
                throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: no 
such sequence '%s'", seq->base.name);
        /* if seq properties hold NULL values, then they should be ignored 
during the update */
        /* first alter the known values */
-       sql_trans_alter_sequence(sql->session->tr, nseq, seq->minvalue, 
seq->maxvalue, seq->increment, seq->cacheinc, seq->cycle);
+       switch (sql_trans_alter_sequence(sql->session->tr, nseq, seq->minvalue, 
seq->maxvalue, seq->increment, seq->cacheinc, seq->cycle)) {
+               case -1:
+                       throw(SQL,"sql.alter_seq",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.alter_seq",SQLSTATE(42000) "ALTER 
SEQUENCE: transaction conflict detected");
+               default:
+                       break;
+       }
        if (nseq->minvalue && nseq->maxvalue && nseq->maxvalue < seq->minvalue)
                throw(SQL, "sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: 
maximum value is lesser than the minimum ("LLFMT" < "LLFMT")", nseq->maxvalue, 
nseq->minvalue);
        if (val) {
@@ -759,8 +783,17 @@ alter_seq(mvc *sql, char *sname, char *s
                        throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER 
SEQUENCE: cannot set sequence start to a value lesser than the minimum ("LLFMT" 
< "LLFMT")", *val, nseq->minvalue);
                if (nseq->maxvalue && *val > nseq->maxvalue)
                        throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER 
SEQUENCE: cannot set sequence start to a value higher than the maximum ("LLFMT" 
> "LLFMT")", *val, nseq->maxvalue);
-               if (!sql_trans_sequence_restart(sql->session->tr, nseq, *val))
-                       throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER 
SEQUENCE: failed to restart sequence %s.%s", sname, nseq->base.name);
+               switch (sql_trans_sequence_restart(sql->session->tr, nseq, 
*val)) {
+                       case -1:
+                               throw(SQL,"sql.alter_seq",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       case -2:
+                       case -3:
+                               throw(SQL,"sql.alter_seq",SQLSTATE(42000) 
"ALTER SEQUENCE: transaction conflict detected");
+                       case -4:
+                               throw(SQL,"sql.alter_seq",SQLSTATE(42000) 
"ALTER SEQUENCE: failed to restart sequence %s.%s", sname, nseq->base.name);
+                       default:
+                               break;
+               }
        }
        return MAL_SUCCEED;
 }
@@ -983,7 +1016,15 @@ alter_table(Client cntxt, mvc *sql, char
                                                throw(SQL,"sql.alter_table", 
SQLSTATE(40000) "NOT NULL CONSTRAINT: cannot change NOT NULL CONSTRAINT for 
column '%s' as its part of the PRIMARY KEY\n", c->base.name);
                                }
                        }
-                       mvc_null(sql, nc, c->null);
+                       switch (mvc_null(sql, nc, c->null)) {
+                               case -1:
+                                       throw(SQL,"sql.alter_table", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               case -2:
+                               case -3:
+                                       throw(SQL,"sql.alter_table", 
SQLSTATE(42000) "NOT NULL CONSTRAINT: transaction conflict detected");
+                               default:
+                                       break;
+                       }
                        /* for non empty check for nulls */
                        sqlstore *store = sql->session->tr->store;
                        if (c->null == 0) {
@@ -996,13 +1037,30 @@ alter_table(Client cntxt, mvc *sql, char
                                        throw(SQL,"sql.alter_table", 
SQLSTATE(40002) "ALTER TABLE: NOT NULL constraint violated for column %s.%s", 
c->t->base.name, c->base.name);
                        }
                }
-               if (c->def != nc->def)
-                       mvc_default(sql, nc, c->def);
+               if (c->def != nc->def) {
+                       switch (mvc_default(sql, nc, c->def)) {
+                               case -1:
+                                       throw(SQL,"sql.alter_table", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               case -2:
+                               case -3:
+                                       throw(SQL,"sql.alter_table", 
SQLSTATE(42000) "DEFAULT: transaction conflict detected");
+                               default:
+                                       break;
+                       }
+               }
 
                if (c->storage_type != nc->storage_type) {
                        if (c->t->access == TABLE_WRITABLE)
                                throw(SQL,"sql.alter_table", SQLSTATE(40002) 
"ALTER TABLE: SET STORAGE for column %s.%s only allowed on READ or INSERT ONLY 
tables", c->t->base.name, c->base.name);
-                       mvc_storage(sql, nc, c->storage_type);
+                       switch (mvc_storage(sql, nc, c->storage_type)) {
+                               case -1:
+                                       throw(SQL,"sql.alter_table", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               case -2:
+                               case -3:
+                                       throw(SQL,"sql.alter_table", 
SQLSTATE(42000) "ALTER TABLE: SET STORAGE transaction conflict detected");
+                               default:
+                                       break;
+                       }
                }
        }
        /* handle new columns */
@@ -1012,8 +1070,15 @@ alter_table(Client cntxt, mvc *sql, char
 
                if (c->base.deleted) /* skip */
                        continue;
-               if (mvc_copy_column(sql, nt, c) == NULL)
-                       throw(SQL,"sql.alter_table", SQLSTATE(40002) "ALTER 
TABLE: Failed to create column %s.%s", c->t->base.name, c->base.name);
+               switch (mvc_copy_column(sql, nt, c, NULL)) {
+                       case -1:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to