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

Reply via email to