Changeset: 256b9f030953 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/256b9f030953
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/sql_mvc.c
        sql/test/miscellaneous/Tests/transaction_isolation.SQL.py
Branch: Jul2021
Log Message:

Throw transaction conflict error messages, but more improvements still needed


diffs (truncated from 355 to 300 lines):

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
@@ -440,8 +440,15 @@ alter_table_del_table(mvc *sql, char *ms
        if (!(n = members_find_child_id(mt->members, pt->base.id)))
                throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: table '%s.%s' isn't part of %s '%s.%s'", ps->base.name, ptname, 
errtable, ms->base.name, mtname);
 
-       if (sql_trans_del_table(sql->session->tr, mt, pt, drop_action))
-               throw(SQL,"sql.alter_table_del_table",SQLSTATE(42000) "ALTER 
TABLE: transaction conflict detected");
+       switch (sql_trans_del_table(sql->session->tr, mt, pt, drop_action)) {
+               case -1:
+                       throw(SQL,"sql.alter_table_del_table",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.alter_table_del_table",SQLSTATE(42000) 
"ALTER TABLE: transaction conflict detected");
+               default:
+                       break;
+       }
        return MAL_SUCCEED;
 }
 
@@ -450,6 +457,7 @@ alter_table_set_access(mvc *sql, char *s
 {
        sql_schema *s = NULL;
        sql_table *t = NULL;
+       str msg = MAL_SUCCEED;
 
        if (!(s = mvc_bind_schema(sql, sname)))
                throw(SQL,"sql.alter_table_set_access",SQLSTATE(3F000) "ALTER 
TABLE: no such schema '%s'", sname);
@@ -464,8 +472,8 @@ alter_table_set_access(mvc *sql, char *s
                        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);
-               if (access == 0)
-                       sql_drop_statistics(sql, t);
+               if (access == 0 && (msg = sql_drop_statistics(sql, t)))
+                       return msg;
        }
        return MAL_SUCCEED;
 }
@@ -538,8 +546,15 @@ drop_trigger(mvc *sql, char *sname, char
                        return MAL_SUCCEED;
                throw(SQL,"sql.drop_trigger", SQLSTATE(3F000) "DROP TRIGGER: 
unknown trigger %s\n", tname);
        }
-       if (mvc_drop_trigger(sql, s, tri))
-               throw(SQL,"sql.drop_trigger", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       switch (mvc_drop_trigger(sql, s, tri)) {
+               case -1:
+                       throw(SQL,"sql.drop_trigger",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.drop_trigger",SQLSTATE(42000) "DROP 
TRIGGER: transaction conflict detected");
+               default:
+                       break;
+       }
        return MAL_SUCCEED;
 }
 
@@ -640,8 +655,15 @@ drop_key(mvc *sql, char *sname, char *tn
        key = n->data;
        if (!drop_action && mvc_check_dependency(sql, key->base.id, 
KEY_DEPENDENCY, NULL))
                throw(SQL,"sql.drop_key", SQLSTATE(42000) "ALTER TABLE: cannot 
drop constraint '%s': there are database objects which depend on it", 
key->base.name);
-       if (mvc_drop_key(sql, s, key, drop_action))
-               throw(SQL,"sql.drop_key", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       switch (mvc_drop_key(sql, s, key, drop_action)) {
+               case -1:
+                       throw(SQL,"sql.drop_key",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.drop_key",SQLSTATE(42000) "ALTER TABLE: 
transaction conflict detected");
+               default:
+                       break;
+       }
        return MAL_SUCCEED;
 }
 
@@ -675,8 +697,15 @@ drop_index(Client cntxt, mvc *sql, char 
                        BBPunfix(b->batCacheid);
                }
        }
-       if (mvc_drop_idx(sql, s, i))
-               throw(SQL,"sql.drop_index", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+       switch (mvc_drop_idx(sql, s, i)) {
+               case -1:
+                       throw(SQL,"sql.drop_index",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.drop_index",SQLSTATE(42000) "DROP INDEX: 
transaction conflict detected");
+               default:
+                       break;
+       }
        return NULL;
 }
 
@@ -751,7 +780,15 @@ drop_seq(mvc *sql, char *sname, char *na
        if (mvc_check_dependency(sql, seq->base.id, BEDROPPED_DEPENDENCY, NULL))
                throw(SQL,"sql.drop_seq", SQLSTATE(2B000) "DROP SEQUENCE: 
unable to drop sequence %s (there are database objects which depend on it)\n", 
seq->base.name);
 
-       sql_trans_drop_sequence(sql->session->tr, s, seq, 0);
+       switch (sql_trans_drop_sequence(sql->session->tr, s, seq, 0)) {
+               case -1:
+                       throw(SQL,"sql.drop_seq",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.drop_seq",SQLSTATE(42000) "DROP 
SEQUENCE: transaction conflict detected");
+               default:
+                       break;
+       }
        return NULL;
 }
 
@@ -760,6 +797,7 @@ drop_func(mvc *sql, char *sname, char *n
 {
        sql_schema *s = NULL;
        char *F = NULL, *fn = NULL;
+       int res = 0;
 
        FUNC_TYPE_STR(type, F, fn)
 
@@ -777,14 +815,12 @@ drop_func(mvc *sql, char *sname, char *n
 
                        if (!action && mvc_check_dependency(sql, func->base.id, 
!IS_PROC(func) ? FUNC_DEPENDENCY : PROC_DEPENDENCY, NULL))
                                throw(SQL,"sql.drop_func", SQLSTATE(42000) 
"DROP %s: there are database objects dependent on %s %s;", F, fn, 
func->base.name);
-                       if (mvc_drop_func(sql, s, func, action))
-                               throw(SQL,"sql.drop_func", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       res = mvc_drop_func(sql, s, func, action);
                }
        } else if (fid == -2) { /* if exists option */
                return MAL_SUCCEED;
        } else { /* fid == -1 */
                list *list_func = sql_find_funcs_by_name(sql, s->base.name, 
name, type);
-               int res;
 
                if (list_func)
                        for (node *n = list_func->h; n; n = n->next) {
@@ -797,8 +833,16 @@ drop_func(mvc *sql, char *sname, char *n
                        }
                res = mvc_drop_all_func(sql, s, list_func, action);
                list_destroy(list_func);
-               if (res)
-                       throw(SQL,"sql.drop_func", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+       }
+
+       switch (res) {
+               case -1:
+                       throw(SQL,"sql.drop_func",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.drop_func",SQLSTATE(42000) "DROP %s: 
transaction conflict detected", F);
+               default:
+                       break;
        }
        return MAL_SUCCEED;
 }
@@ -918,8 +962,15 @@ alter_table(Client cntxt, mvc *sql, char
 
                sql_column *nc = mvc_bind_column(sql, nt, c->base.name);
                if (c->base.deleted) {
-                       if (mvc_drop_column(sql, nt, nc, c->drop_action))
-                               throw(SQL,"sql.alter_table", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       switch (mvc_drop_column(sql, nt, nc, c->drop_action)) {
+                               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: transaction conflict 
detected");
+                               default:
+                                       break;
+                       }
                        continue;
                }
                if (c->null != nc->null && isTable(nt)) {
@@ -972,8 +1023,15 @@ alter_table(Client cntxt, mvc *sql, char
                                if (i->base.new || !i->base.deleted)
                                        continue;
                                sql_idx *ni = mvc_bind_idx(sql, s, 
i->base.name);
-                               if (mvc_drop_idx(sql, s, ni))
-                                       throw(SQL,"sql.alter_table", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               switch (mvc_drop_idx(sql, s, ni)) {
+                                       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: transaction conflict 
detected");
+                                       default:
+                                               break;
+                               }
                        }
                /* alter add index */
                for (n = ol_first_node(t->idxs); n; n = n->next) {
@@ -1016,8 +1074,15 @@ alter_table(Client cntxt, mvc *sql, char
                        if (k->base.deleted) {
                                sql_key *nk = mvc_bind_key(sql, s, 
k->base.name);
                                if (nk) {
-                                       if (mvc_drop_key(sql, s, nk, 
k->drop_action))
-                                               throw(SQL,"sql.alter_table", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       switch (mvc_drop_key(sql, s, nk, 
k->drop_action)) {
+                                               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: transaction conflict 
detected");
+                                               default:
+                                                       break;
+                                       }
                                }
                        } else { /* new */
                                str err;
@@ -1142,9 +1207,16 @@ SQLdrop_schema(Client cntxt, MalBlkPtr m
                os_size(s->tables, tr) || os_size(s->types, tr) || 
os_size(s->funcs, tr) || os_size(s->seqs, tr)))
                throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: 
unable to drop schema '%s' (there are database objects which depend on it)", 
sname);
 
-       if (mvc_drop_schema(sql, s, action))
-               throw(SQL,"sql.drop_schema", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       return msg;
+       switch (mvc_drop_schema(sql, s, action)) {
+               case -1:
+                       throw(SQL,"sql.drop_schema",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.drop_schema",SQLSTATE(42000) "DROP 
SCHEMA: transaction conflict detected");
+               default:
+                       break;
+       }
+       return MAL_SUCCEED;
 }
 
 str
@@ -1274,8 +1346,15 @@ SQLdrop_type(Client cntxt, MalBlkPtr mb,
                throw(SQL,"sql.drop_type", SQLSTATE(3F000) "DROP TYPE: type 
'%s' does not exist", name);
        if (!drop_action && mvc_check_dependency(sql, t->base.id, 
TYPE_DEPENDENCY, NULL))
                throw(SQL,"sql.drop_type", SQLSTATE(42000) "DROP TYPE: unable 
to drop type %s (there are database objects which depend on it)\n", name);
-       if (!mvc_drop_type(sql, s, t, drop_action))
-               throw(SQL,"sql.drop_type", SQLSTATE(0D000) "DROP TYPE: failed 
to drop type '%s'", name);
+       switch (mvc_drop_type(sql, s, t, drop_action)) {
+               case -1:
+                       throw(SQL,"sql.drop_type",SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       throw(SQL,"sql.drop_type",SQLSTATE(42000) "DROP TYPE: 
transaction conflict detected");
+               default:
+                       break;
+       }
        return msg;
 }
 
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -852,6 +852,7 @@ rel_create_func(sql_query *query, dlist 
 
        if ((sf = sql_bind_func_(sql, s->base.name, fname, type_list, type)) != 
NULL && create) {
                if (replace) {
+                       int res = 0;
                        sql_func *func = sf->func;
                        if (!mvc_schema_privs(sql, s)) {
                                list_destroy(type_list);
@@ -865,9 +866,16 @@ rel_create_func(sql_query *query, dlist 
                                list_destroy(type_list);
                                return sql_error(sql, 02, SQLSTATE(42000) 
"CREATE OR REPLACE %s: not allowed to replace system %s %s;", F, fn, 
func->base.name);
                        }
-                       if (mvc_drop_func(sql, s, func, 0)) {
-                               list_destroy(type_list);
-                               return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       res = mvc_drop_func(sql, s, func, 0);
+                       list_destroy(type_list);
+                       switch (res) {
+                               case -1:
+                                       return sql_error(sql, 02, 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                               case -2:
+                               case -3:
+                                       return sql_error(sql, 02, 
SQLSTATE(42000) "CREATE OR REPLACE %s: transaction conflict detected", F);
+                               default:
+                                       break;
                        }
                        sf = NULL;
                } else {
@@ -1293,8 +1301,15 @@ create_trigger(sql_query *query, dlist *
                        return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot 
create trigger on view '%s'", base, tname);
                if ((st = mvc_bind_trigger(sql, ss, triggername)) != NULL) {
                        if (replace) {
-                               if (mvc_drop_trigger(sql, ss, st))
-                                       return sql_error(sql, 02, 
SQLSTATE(HY013) "%s: %s", base, MAL_MALLOC_FAIL);
+                               switch (mvc_drop_trigger(sql, ss, st)) {
+                                       case -1:
+                                               return sql_error(sql, 02, 
SQLSTATE(HY013) "%s: %s", base, MAL_MALLOC_FAIL);
+                                       case -2:
+                                       case -3:
+                                               return sql_error(sql, 02, 
SQLSTATE(42000) "%s: transaction conflict detected", base);
+                                       default:
+                                               break;
+                               }
                        } else {
                                return sql_error(sql, 02, SQLSTATE(42000) "%s: 
name '%s' already in use", base, triggername);
                        }
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
@@ -891,9 +891,16 @@ table_element(sql_query *query, symbol *
                                }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to