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