Changeset: 19e963bb241f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/19e963bb241f
Modified Files:
sql/backends/monet5/sql_cat.c
sql/storage/sql_storage.h
sql/storage/store.c
sql/storage/store_dependency.c
Branch: Jul2021
Log Message:
Return proper error codes on transaction conflict during ddl calls. More
cleanup still needed
diffs (truncated from 1305 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
@@ -234,14 +234,19 @@ alter_table_add_range_partition(mvc *sql
msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(HY013)
MAL_MALLOC_FAIL);
break;
case -2:
+ case -3:
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
+ "ALTER
TABLE: failed due to conflict with another transaction");
+ break;
+ case -10:
msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER
TABLE: minimum value length is higher than %d", STORAGE_MAX_VALUE_LENGTH);
break;
- case -3:
+ case -11:
msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER
TABLE: maximum value length is higher than %d", STORAGE_MAX_VALUE_LENGTH);
break;
- case -4:
+ case -12:
assert(err);
if (is_bit_nil(err->with_nills)) {
msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
@@ -380,19 +385,30 @@ alter_table_add_value_partition(mvc *sql
}
errcode = sql_trans_add_value_partition(sql->session->tr, mt, pt, tpe,
values, with_nills, update, &err);
- switch (errcode) {
- case 0:
- break;
- case -1:
- msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
- "ALTER
TABLE: the new partition is conflicting with the existing partition %s.%s",
-
err->t->s->base.name, err->base.name);
- break;
- default:
- msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
- "ALTER
TABLE: value at position %d length is higher than %d",
-
(errcode * -1) - 1, STORAGE_MAX_VALUE_LENGTH);
- break;
+ if (errcode <= -10) {
+ msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
+ "ALTER TABLE:
value at position %d length is higher than %d",
+ (errcode *
-1) - 10, STORAGE_MAX_VALUE_LENGTH);
+ } else {
+ switch (errcode) {
+ case 0:
+ break;
+ case -1:
+ msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(HY013)
MAL_MALLOC_FAIL);
+ break;
+ case -2:
+ case -3:
+ msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
+
"ALTER TABLE: failed due to conflict with another transaction");
+ break;
+ case -4:
+ msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
+
"ALTER TABLE: the new partition is conflicting with the existing partition
%s.%s",
+
err->t->s->base.name, err->base.name);
+ break;
+ default:
+ assert(0);
+ }
}
finish:
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -395,9 +395,9 @@ extern int sql_trans_begin(sql_session *
extern int sql_trans_end(sql_session *s, int commit /* rollback=0, or commit=1
temporaries */);
extern list* sql_trans_schema_user_dependencies(sql_trans *tr, sqlid
schema_id);
-extern void sql_trans_create_dependency(sql_trans *tr, sqlid id, sqlid
depend_id, sql_dependency depend_type);
-extern void sql_trans_drop_dependencies(sql_trans *tr, sqlid depend_id);
-extern void sql_trans_drop_dependency(sql_trans *tr, sqlid id, sqlid
depend_id, sql_dependency depend_type);
+extern int sql_trans_create_dependency(sql_trans *tr, sqlid id, sqlid
depend_id, sql_dependency depend_type);
+extern int sql_trans_drop_dependencies(sql_trans *tr, sqlid depend_id);
+extern int sql_trans_drop_dependency(sql_trans *tr, sqlid id, sqlid depend_id,
sql_dependency depend_type);
extern list* sql_trans_get_dependencies(sql_trans *tr, sqlid id,
sql_dependency depend_type, list *ignore_ids);
extern int sql_trans_get_dependency_type(sql_trans *tr, sqlid depend_id,
sql_dependency depend_type);
extern int sql_trans_check_dependency(sql_trans *tr, sqlid id, sqlid
depend_id, sql_dependency depend_type);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -728,6 +728,7 @@ load_table(sql_trans *tr, sql_schema *s,
if (os_add(s->idxs, tr, i->base.name, dup_base(&i->base))) {
idx_destroy(store, i);
table_destroy(store, t);
+ store->table_api.rids_destroy(rs);
return NULL;
}
}
@@ -743,6 +744,7 @@ load_table(sql_trans *tr, sql_schema *s,
os_add(tr->cat->objects, tr, k->base.name,
dup_base(&k->base))) {
key_destroy(store, k);
table_destroy(store, t);
+ store->table_api.rids_destroy(rs);
return NULL;
}
}
@@ -757,6 +759,7 @@ load_table(sql_trans *tr, sql_schema *s,
if (os_add(s->triggers, tr, k->base.name, dup_base(&k->base))) {
trigger_destroy(store, k);
table_destroy(store, t);
+ store->table_api.rids_destroy(rs);
}
}
store->table_api.rids_destroy(rs);
@@ -1021,6 +1024,7 @@ load_schema(sql_trans *tr, oid rid)
if (os_add(s->types, tr, t->base.name, &t->base)) {
type_destroy(store, t);
schema_destroy(store, s);
+ store->table_api.rids_destroy(rs);
return NULL;
}
}
@@ -1098,6 +1102,8 @@ load_schema(sql_trans *tr, oid rid)
return NULL;
}
if (os_add(s->funcs, tr, f->base.name, &f->base)) {
+ store->table_api.subrids_destroy(nrs);
+ store->table_api.rids_destroy(rs);
func_destroy(store, f);
schema_destroy(store, s);
return NULL;
@@ -1116,6 +1122,7 @@ load_schema(sql_trans *tr, oid rid)
if (os_add(s->seqs, tr, seq->base.name, &seq->base)) {
seq_destroy(store, seq);
schema_destroy(store, s);
+ store->table_api.rids_destroy(rs);
return NULL;
}
}
@@ -1142,6 +1149,7 @@ load_schema(sql_trans *tr, oid rid)
if (os_add(s->parts, tr, pt->base.name,
dup_base(&pt->base))) {
part_destroy(store, pt);
schema_destroy(store, s);
+ store->table_api.rids_destroy(rs);
return NULL;
}
}
@@ -1188,6 +1196,7 @@ load_trans(sql_trans* tr)
if (!instore(ns->base.id)) {
if (os_add(tr->cat->schemas, tr, ns->base.name,
&ns->base)) {
sql_trans_destroy(tr);
+ store->table_api.rids_destroy(schemas);
return false;
}
if (isTempSchema(ns))
@@ -2821,7 +2830,7 @@ new_table( sql_trans *tr, sql_table *t)
return t;
}
- sql_key *
+sql_key *
sql_trans_copy_key( sql_trans *tr, sql_table *t, sql_key *k)
{
sqlstore *store = tr->store;
@@ -3174,7 +3183,6 @@ sql_trans_rollback(sql_trans *tr)
node *next = n->next;
//sql_table *tt = n->data;
list_remove_node(tr->localtmps.set, store, n);
- //(void) sql_trans_drop_table_id(tr, tt->s,
tt->base.id, DROP_RESTRICT);
n = next;
}
tr->localtmps.nelm = NULL;
@@ -3186,10 +3194,6 @@ sql_trans_rollback(sql_trans *tr)
if (tt->commit_action == CA_DROP) {
(void) sql_trans_drop_table_id(tr, tt->s,
tt->base.id, DROP_RESTRICT);
- /*
- } else if (tt->commit_action != CA_PRESERVE
|| tt->commit_action == CA_DELETE) {
- sql_trans_clear_table(tr, tt);
- */
}
n = next;
}
@@ -3471,11 +3475,12 @@ sys_drop_ic(sql_trans *tr, sql_idx * i,
sql_schema *syss = find_sql_schema(tr, isGlobal(i->t)?"sys":"tmp");
sql_table *sysic = find_sql_table(tr, syss, "objects");
oid rid = store->table_api.column_find_row(tr, find_sql_column(sysic,
"id"), &i->base.id, find_sql_column(sysic, "name"), kc->c->base.name, NULL);
+ int res = 0;
if (is_oid_nil(rid))
return -1;
- if (store->table_api.table_delete(tr, sysic, rid))
- return -2;
+ if ((res = store->table_api.table_delete(tr, sysic, rid)))
+ return res;
return 0;
}
@@ -3499,10 +3504,8 @@ sql_trans_drop_any_comment(sql_trans *tr
assert(id_col);
row = store->table_api.column_find_row(tr, id_col, &id, NULL);
- if (!is_oid_nil(row)) {
- if (store->table_api.table_delete(tr, comments, row))
- return -1;
- }
+ if (!is_oid_nil(row) && store->table_api.table_delete(tr, comments,
row))
+ return -2;
return 0;
}
@@ -3514,24 +3517,26 @@ sys_drop_idx(sql_trans *tr, sql_idx * i,
sql_schema *syss = find_sql_schema(tr, isGlobal(i->t)?"sys":"tmp");
sql_table *sysidx = find_sql_table(tr, syss, "idxs");
oid rid = store->table_api.column_find_row(tr, find_sql_column(sysidx,
"id"), &i->base.id, NULL);
+ int res = 0;
if (is_oid_nil(rid))
return -1;
- if (store->table_api.table_delete(tr, sysidx, rid))
- return -2;
- if (sql_trans_drop_any_comment(tr, i->base.id))
- return -3;
+ if ((res = store->table_api.table_delete(tr, sysidx, rid)))
+ return res;
+ if ((res = sql_trans_drop_any_comment(tr, i->base.id)))
+ return res;
for (n = i->columns->h; n; n = n->next) {
sql_kc *ic = n->data;
- if (sys_drop_ic(tr, i, ic))
- return -4;
+ if ((res = sys_drop_ic(tr, i, ic)))
+ return res;
}
/* remove idx from schema and table*/
if (isGlobal(i->t))
if (os_del(i->t->s->idxs, tr, i->base.name, dup_base(&i->base)))
- return -5;
- sql_trans_drop_dependencies(tr, i->base.id);
+ return -3;
+ if ((res = sql_trans_drop_dependencies(tr, i->base.id)))
+ return res;
if (drop_action)
sql_trans_drop_all_dependencies(tr, i->base.id,
INDEX_DEPENDENCY);
@@ -3545,11 +3550,12 @@ sys_drop_kc(sql_trans *tr, sql_key *k, s
sql_schema *syss = find_sql_schema(tr, isGlobal(k->t)?"sys":"tmp");
sql_table *syskc = find_sql_table(tr, syss, "objects");
oid rid = store->table_api.column_find_row(tr, find_sql_column(syskc,
"id"), &k->base.id, find_sql_column(syskc, "name"), kc->c->base.name, NULL);
+ int res = 0;
if (is_oid_nil(rid))
return -1;
- if (store->table_api.table_delete(tr, syskc, rid))
- return -2;
+ if ((res = store->table_api.table_delete(tr, syskc, rid)))
+ return res;
return 0;
}
@@ -3561,28 +3567,30 @@ sys_drop_key(sql_trans *tr, sql_key *k,
sql_schema *syss = find_sql_schema(tr, isGlobal(k->t)?"sys":"tmp");
sql_table *syskey = find_sql_table(tr, syss, "keys");
oid rid = store->table_api.column_find_row(tr, find_sql_column(syskey,
"id"), &k->base.id, NULL);
+ int res = 0;
if (is_oid_nil(rid))
return -1;
- if (store->table_api.table_delete(tr, syskey, rid))
- return -2;
+ if ((res = store->table_api.table_delete(tr, syskey, rid)))
+ return res;
for (n = k->columns->h; n; n = n->next) {
sql_kc *kc = n->data;
- if (sys_drop_kc(tr, k, kc))
- return -3;
+ if ((res = sys_drop_kc(tr, k, kc)))
+ return res;
}
/* remove key from schema */
if (isGlobal(k->t)) {
if (os_del(k->t->s->keys, tr, k->base.name, dup_base(&k->base)))
- return -4;
+ return -3;
if (os_del(tr->cat->objects, tr, k->base.name,
dup_base(&k->base)))
- return -5;
+ return -3;
}
if (k->t->pkey == (sql_ukey*)k)
k->t->pkey = NULL;
- sql_trans_drop_dependencies(tr, k->base.id);
+ if ((res = sql_trans_drop_dependencies(tr, k->base.id)))
+ return res;
if (drop_action)
sql_trans_drop_all_dependencies(tr, k->base.id, (k->type ==
fkey) ? FKEY_DEPENDENCY : KEY_DEPENDENCY);
@@ -3596,11 +3604,12 @@ sys_drop_tc(sql_trans *tr, sql_trigger *
sql_schema *syss = find_sql_schema(tr, isGlobal(i->t)?"sys":"tmp");
sql_table *systc = find_sql_table(tr, syss, "objects");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list