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