Changeset: b7292d034c21 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b7292d034c21
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/miscellaneous/Tests/transaction_isolation.SQL.py
Branch: Jul2021
Log Message:

Always update bat storage before object storage so transaction conflicts won't 
leak


diffs (151 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
@@ -1982,7 +1982,7 @@ SQLrename_column(Client cntxt, MalBlkPtr
        if (mvc_bind_column(sql, t, new_name))
                throw(SQL, "sql.rename_column", SQLSTATE(3F000) "ALTER TABLE: 
there is a column named '%s' in table '%s'", new_name, table_name);
 
-       switch (sql_trans_rename_column(sql->session->tr, t, old_name, 
new_name)) {
+       switch (sql_trans_rename_column(sql->session->tr, t, col->base.id, 
old_name, new_name)) {
                case -1:
                        throw(SQL,"sql.rename_column", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                case -2:
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
@@ -352,7 +352,7 @@ extern BUN sql_trans_clear_table(sql_tra
 extern int sql_trans_alter_access(sql_trans *tr, sql_table *t, sht access);
 
 extern sql_column *sql_trans_create_column(sql_trans *tr, sql_table *t, const 
char *name, sql_subtype *tpe);
-extern int sql_trans_rename_column(sql_trans *tr, sql_table *t, const char 
*old_name, const char *new_name);
+extern int sql_trans_rename_column(sql_trans *tr, sql_table *t, sqlid id, 
const char *old_name, const char *new_name);
 extern int sql_trans_drop_column(sql_trans *tr, sql_table *t, sqlid id, int 
drop_action);
 extern int sql_trans_alter_null(sql_trans *tr, sql_column *col, int isnull);
 extern int sql_trans_alter_default(sql_trans *tr, sql_column *col, char *val);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3924,6 +3924,8 @@ sys_drop_part(sql_trans *tr, sql_part *p
        if (is_oid_nil(obj_oid))
                return -1;
 
+       if ((res = store->table_api.table_delete(tr, sysobj, obj_oid)))
+               return res;
        if (isRangePartitionTable(mt)) {
                sql_table *ranges = find_sql_table(tr, syss, 
"range_partitions");
                oid rid = store->table_api.column_find_row(tr, 
find_sql_column(ranges, "table_id"), &pt->member, NULL);
@@ -3946,8 +3948,6 @@ sys_drop_part(sql_trans *tr, sql_part *p
 
        if ((res = os_del(mt->s->parts, tr, pt->base.name, 
dup_base(&pt->base))))
                return res;
-       if ((res = store->table_api.table_delete(tr, sysobj, obj_oid)))
-               return res;
        return 0;
 }
 
@@ -4456,6 +4456,11 @@ sql_trans_rename_schema(sql_trans *tr, s
 
        assert(!strNil(new_name));
 
+       rid = store->table_api.column_find_row(tr, find_sql_column(sysschema, 
"id"), &id, NULL);
+       assert(!is_oid_nil(rid));
+       if ((res = store->table_api.column_update_value(tr, 
find_sql_column(sysschema, "name"), rid, (void*) new_name)))
+               return res;
+
        /* delete schema, add schema */
        if ((res = os_del(tr->cat->schemas, tr, s->base.name, 
dup_base(&s->base))))
                return res;
@@ -4464,12 +4469,6 @@ sql_trans_rename_schema(sql_trans *tr, s
                return res;
        }
 
-       rid = store->table_api.column_find_row(tr, find_sql_column(sysschema, 
"id"), &s->base.id, NULL);
-       assert(!is_oid_nil(rid));
-       if ((res = store->table_api.column_update_value(tr, 
find_sql_column(sysschema, "name"), rid, (void*) new_name))) {
-               schema_destroy(store, ns);
-               return res;
-       }
        return res;
 }
 
@@ -4840,6 +4839,11 @@ sql_trans_rename_table(sql_trans *tr, sq
 
        assert(!strNil(new_name));
 
+       rid = store->table_api.column_find_row(tr, find_sql_column(systable, 
"id"), &id, NULL);
+       assert(!is_oid_nil(rid));
+       if ((res = store->table_api.column_update_value(tr, 
find_sql_column(systable, "name"), rid, (void*) new_name)))
+               return res;
+
        if (isGlobal(t)) {
                if ((res = os_del(s->tables, tr, t->base.name, 
dup_base(&t->base))))
                        return res;
@@ -4849,11 +4853,6 @@ sql_trans_rename_table(sql_trans *tr, sq
                        cs_del(&tr->localtmps, tr->store, n, t->base.flags);
        }
 
-       rid = store->table_api.column_find_row(tr, find_sql_column(systable, 
"id"), &t->base.id, NULL);
-       assert(!is_oid_nil(rid));
-       if ((res = store->table_api.column_update_value(tr, 
find_sql_column(systable, "name"), rid, (void*) new_name)))
-               return res;
-
        if ((res = table_dup(tr, t, t->s, new_name, &dup)))
                return res;
        t = dup;
@@ -5243,7 +5242,7 @@ drop_sql_key(sql_table *t, sqlid id, int
 }
 
 int
-sql_trans_rename_column(sql_trans *tr, sql_table *t, const char *old_name, 
const char *new_name)
+sql_trans_rename_column(sql_trans *tr, sql_table *t, sqlid id, const char 
*old_name, const char *new_name)
 {
        sqlstore *store = tr->store;
        sql_table *syscolumn = find_sql_table(tr, find_sql_schema(tr, 
isGlobal(t)?"sys":"tmp"), "_columns");
@@ -5254,6 +5253,11 @@ sql_trans_rename_column(sql_trans *tr, s
 
        assert(!strNil(new_name));
 
+       rid = store->table_api.column_find_row(tr, find_sql_column(syscolumn, 
"id"), &id, NULL);
+       assert(!is_oid_nil(rid));
+       if ((res = store->table_api.column_update_value(tr, 
find_sql_column(syscolumn, "name"), rid, (void*) new_name)))
+               return res;
+
        if ((res = new_table(tr, t, &dup)))
                return res;
        t = dup;
@@ -5261,11 +5265,6 @@ sql_trans_rename_column(sql_trans *tr, s
                return -1;
        sql_column *c = n->data;
 
-       rid = store->table_api.column_find_row(tr, find_sql_column(syscolumn, 
"id"), &c->base.id, NULL);
-       assert(!is_oid_nil(rid));
-       if ((res = store->table_api.column_update_value(tr, 
find_sql_column(syscolumn, "name"), rid, (void*) new_name)))
-               return res;
-
        _DELETE(c->base.name);
        c->base.name = SA_STRDUP(tr->sa, new_name);
        if (ol_rehash(t->columns, old_name, n) == NULL)
diff --git a/sql/test/miscellaneous/Tests/transaction_isolation.SQL.py 
b/sql/test/miscellaneous/Tests/transaction_isolation.SQL.py
--- a/sql/test/miscellaneous/Tests/transaction_isolation.SQL.py
+++ b/sql/test/miscellaneous/Tests/transaction_isolation.SQL.py
@@ -173,9 +173,14 @@ with SQLTestCase() as mdb1:
         mdb1.execute('commit;').assertSucceeded()
         mdb2.execute('rollback;').assertSucceeded()
 
+        mdb1.execute("CREATE schema another").assertSucceeded()
+        mdb1.execute("CREATE TABLE longs (i bigint);").assertSucceeded()
+        mdb1.execute("insert into longs values 
(1),(2),(3),(NULL);").assertSucceeded()
+
         mdb1.execute('start transaction;').assertSucceeded()
         mdb2.execute('start transaction;').assertSucceeded()
         mdb1.execute('alter table integers rename to 
goodluck;').assertSucceeded()
+        mdb2.execute('alter table longs set schema another;').assertSucceeded()
         mdb2.execute('alter table integers rename to 
badluck;').assertFailed(err_code="42000", err_message="ALTER TABLE: transaction 
conflict detected")
         mdb1.execute('rollback;').assertSucceeded()
         mdb2.execute('rollback;').assertSucceeded()
@@ -197,3 +202,5 @@ with SQLTestCase() as mdb1:
         mdb2.execute('rollback;').assertSucceeded()
 
         mdb1.execute("drop table integers;")
+        mdb1.execute("drop table longs;")
+        mdb1.execute("drop schema another;")
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to