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