Changeset: 55fe940b6a3d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/55fe940b6a3d
Modified Files:
sql/backends/monet5/sql.c
Branch: default
Log Message:
Merge with Jan2022 branch.
diffs (truncated from 494 to 300 lines):
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -5026,7 +5026,18 @@ str_column_vacuum_callback(int argc, voi
} while(0);
- sql_trans_end(session, SQL_OK);
+ switch (sql_trans_end(session, SQL_OK)) {
+ case SQL_ERR:
+ TRC_ERROR((component_t) SQL,
"[str_column_vacuum_callback] -- transaction commit failed (kernel error: %s)",
GDKerrbuf);
+ res = GDK_FAIL;
+ break;
+ case SQL_CONFLICT:
+ TRC_ERROR((component_t) SQL,
"[str_column_vacuum_callback] -- transaction is aborted because of concurrency
conflicts, will ROLLBACK instead");
+ res = GDK_FAIL;
+ break;
+ default:
+ break;
+ }
sql_session_destroy(session);
sa_destroy(sa);
return res;
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -527,9 +527,15 @@ mvc_commit(mvc *m, int chain, const char
}
if (!tr->parent && !name) {
- if (sql_trans_end(m->session, ok) != SQL_OK) {
- /* transaction conflict */
- return createException(SQL, "sql.commit",
SQLSTATE(40000) "%s transaction is aborted because of concurrency conflicts,
will ROLLBACK instead", operation);
+ switch (sql_trans_end(m->session, ok)) {
+ case SQL_ERR:
+ GDKfatal("%s transaction commit failed; exiting
(kernel error: %s)", operation, GDKerrbuf);
+ break;
+ case SQL_CONFLICT:
+ /* transaction conflict */
+ return createException(SQL, "sql.commit",
SQLSTATE(40001) "%s transaction is aborted because of concurrency conflicts,
will ROLLBACK instead", operation);
+ default:
+ break;
}
msg = WLCcommit(m->clientid);
if (msg != MAL_SUCCEED) {
@@ -559,19 +565,37 @@ mvc_commit(mvc *m, int chain, const char
/* if there is nothing to commit reuse the current transaction */
if (list_empty(tr->changes)) {
- if (!chain)
- (void)sql_trans_end(m->session, ok);
+ if (!chain) {
+ switch (sql_trans_end(m->session, ok)) {
+ case SQL_ERR:
+ GDKfatal("%s transaction commit failed;
exiting (kernel error: %s)", operation, GDKerrbuf);
+ break;
+ case SQL_CONFLICT:
+ if (!msg)
+ msg = createException(SQL,
"sql.commit", SQLSTATE(40001) "%s transaction is aborted because of concurrency
conflicts, will ROLLBACK instead", operation);
+ break;
+ default:
+ break;
+ }
+ }
m->type = Q_TRANS;
TRC_INFO(SQL_TRANS,
"Commit done (no changes)\n");
return msg;
}
- if ((ok = sql_trans_commit(tr)) == SQL_ERR)
- GDKfatal("%s transaction commit failed; exiting (kernel error:
%s)", operation, GDKerrbuf);
-
- (void)sql_trans_end(m->session, ok);
- if (chain && sql_trans_begin(m->session) < 0)
+ switch (sql_trans_end(m->session, ok)) {
+ case SQL_ERR:
+ GDKfatal("%s transaction commit failed; exiting (kernel
error: %s)", operation, GDKerrbuf);
+ break;
+ case SQL_CONFLICT:
+ if (!msg)
+ msg = createException(SQL, "sql.commit",
SQLSTATE(40001) "%s transaction is aborted because of concurrency conflicts,
will ROLLBACK instead", operation);
+ break;
+ default:
+ break;
+ }
+ if (chain && sql_trans_begin(m->session) < 0 && !msg)
msg = createException(SQL, "sql.commit", SQLSTATE(40000) "%s
finished successfully, but the session's schema could not be found while
starting the next transaction", operation);
m->type = Q_TRANS;
TRC_INFO(SQL_TRANS,
diff --git
a/sql/test/BugTracker-2021/Tests/concurrent-add-column.Bug-7196.SQL.py
b/sql/test/BugTracker-2021/Tests/concurrent-add-column.Bug-7196.SQL.py
--- a/sql/test/BugTracker-2021/Tests/concurrent-add-column.Bug-7196.SQL.py
+++ b/sql/test/BugTracker-2021/Tests/concurrent-add-column.Bug-7196.SQL.py
@@ -12,7 +12,7 @@ with SQLTestCase() as mdb1:
mdb1.execute('alter table test add column data int;').assertSucceeded()
mdb2.execute("insert into test values (2);").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('select * from test;').assertDataResultMatch([(1,None)])
mdb2.execute('select * from test;').assertDataResultMatch([(1,None)])
diff --git
a/sql/test/BugTracker-2021/Tests/serializable-snapshot.Bug-7200.SQL.py
b/sql/test/BugTracker-2021/Tests/serializable-snapshot.Bug-7200.SQL.py
--- a/sql/test/BugTracker-2021/Tests/serializable-snapshot.Bug-7200.SQL.py
+++ b/sql/test/BugTracker-2021/Tests/serializable-snapshot.Bug-7200.SQL.py
@@ -20,7 +20,7 @@ class TestClient(threading.Thread):
for i in range(0, MAX_ITERATIONS):
try:
self._cursor.execute("INSERT INTO t VALUES (%d,%d);" % (i, i))
- except pymonetdb.exceptions.IntegrityError:
+ except pymonetdb.exceptions.DatabaseError:
pass
diff --git a/sql/test/dict/Tests/dict02.SQL.py
b/sql/test/dict/Tests/dict02.SQL.py
--- a/sql/test/dict/Tests/dict02.SQL.py
+++ b/sql/test/dict/Tests/dict02.SQL.py
@@ -47,7 +47,7 @@ with SQLTestCase() as mdb1:
mdb1.execute('call
"sys"."dict_compress"(\'sys\',\'t0\',\'c0\',false);').assertSucceeded()
mdb2.execute("insert into t0 values (4),(5),(6);").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('select c0 from
t0;').assertSucceeded().assertDataResultMatch([(1,),(2,),(3,)])
mdb2.execute('select c0 from
t0;').assertSucceeded().assertDataResultMatch([(1,),(2,),(3,)])
diff --git a/sql/test/transactions/Tests/mergetable-deps-crash.test
b/sql/test/transactions/Tests/mergetable-deps-crash.test
--- a/sql/test/transactions/Tests/mergetable-deps-crash.test
+++ b/sql/test/transactions/Tests/mergetable-deps-crash.test
@@ -27,7 +27,7 @@ statement ok
commit
@connection(id=2)
-statement error 40000!COMMIT: transaction is aborted because of concurrency
conflicts, will ROLLBACK instead
+statement error 40001!COMMIT: transaction is aborted because of concurrency
conflicts, will ROLLBACK instead
commit
@connection(id=1)
diff --git a/sql/test/transactions/Tests/transaction_isolation2.SQL.py
b/sql/test/transactions/Tests/transaction_isolation2.SQL.py
--- a/sql/test/transactions/Tests/transaction_isolation2.SQL.py
+++ b/sql/test/transactions/Tests/transaction_isolation2.SQL.py
@@ -173,7 +173,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("ALTER TABLE parent1 ADD TABLE child AS PARTITION FROM
'1' TO '2';").assertSucceeded()
mdb2.execute("ALTER TABLE parent2 ADD TABLE child AS PARTITION FROM
'0' TO '4';").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('start transaction;').assertSucceeded()
mdb1.execute('ALTER TABLE parent1 DROP TABLE child;').assertSucceeded()
mdb1.execute('DROP TABLE parent1;').assertSucceeded()
@@ -196,7 +196,7 @@ with SQLTestCase() as mdb1:
mdb1.execute('insert into longs values (4),(5),(6);').assertSucceeded()
mdb2.execute('insert into longs values (5),(6),(7);').assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead") # Duplicate values on the primary key 'i' from 'longs'
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead") # Duplicate values on the primary key 'i' from 'longs'
mdb1.execute('SELECT i FROM longs order by
i;').assertDataResultMatch([(1,),(2,),(3,),(4,),(5,),(6,)])
mdb1.execute('start transaction;').assertSucceeded()
@@ -204,7 +204,7 @@ with SQLTestCase() as mdb1:
mdb1.execute('delete from longs where i > 3;').assertRowCount(3)
mdb2.execute('insert into integers values (4);').assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead") # The foreign key value 4 doesn't exist on the primary
key
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead") # The foreign key value 4 doesn't exist on the primary
key
mdb1.execute('SELECT i FROM longs order by
i;').assertDataResultMatch([(1,),(2,),(3,)])
mdb1.execute('start transaction;').assertSucceeded()
diff --git a/sql/test/transactions/Tests/transaction_isolation3.SQL.py
b/sql/test/transactions/Tests/transaction_isolation3.SQL.py
--- a/sql/test/transactions/Tests/transaction_isolation3.SQL.py
+++ b/sql/test/transactions/Tests/transaction_isolation3.SQL.py
@@ -19,7 +19,7 @@ with SQLTestCase() as mdb1:
mdb1.execute('insert into notpossible values
(5,1),(5,2),(5,3);').assertSucceeded()
mdb2.execute('alter table notpossible add primary key
(i);').assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute("CREATE TABLE integers (i int, j int);").assertSucceeded()
mdb1.execute('start transaction;').assertSucceeded()
@@ -27,14 +27,14 @@ with SQLTestCase() as mdb1:
mdb1.execute('alter table integers add primary key
(i);').assertSucceeded()
mdb2.execute('insert into integers values
(5,1),(5,2),(5,3);').assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('start transaction;').assertSucceeded()
mdb2.execute('start transaction;').assertSucceeded()
mdb1.execute('insert into integers values
(6,NULL),(7,NULL),(8,NULL);').assertSucceeded()
mdb2.execute('alter table integers alter j set not
null;').assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('truncate table integers;').assertSucceeded()
mdb1.execute('start transaction;').assertSucceeded()
@@ -42,7 +42,7 @@ with SQLTestCase() as mdb1:
mdb1.execute('alter table integers alter j set not
null;').assertSucceeded()
mdb2.execute('insert into integers values
(6,NULL),(7,NULL),(8,NULL);').assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('create schema ups;').assertSucceeded()
mdb1.execute('create merge table parent1(a int) PARTITION BY RANGE ON
(a);').assertSucceeded()
@@ -52,7 +52,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("ALTER TABLE parent1 ADD TABLE child1 AS PARTITION FROM
'1' TO '2';").assertSucceeded()
mdb2.execute("alter table child1 set schema ups;").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('create merge table parent2(a int) PARTITION BY RANGE ON
(a);').assertSucceeded()
mdb1.execute('create table child2(c int);').assertSucceeded()
@@ -61,7 +61,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("ALTER TABLE parent2 ADD TABLE child2 AS PARTITION FROM
'1' TO '2';").assertSucceeded()
mdb2.execute("insert into child2 values (3);").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('create table x(y int, z int);').assertSucceeded()
mdb1.execute('insert into x values (1, 1);').assertSucceeded()
@@ -70,7 +70,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("create view myv(a,b) as select y, z from
x;").assertSucceeded()
mdb2.execute("alter table x drop column y;").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('select * from
myv;').assertSucceeded().assertDataResultMatch([(1,1)])
mdb1.execute("create table ups.no (a int, b int);").assertSucceeded()
@@ -80,7 +80,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("create function sys.another() returns table(i int) begin
return select a from ups.no; end;").assertSucceeded()
mdb2.execute("alter table ups.no drop column a;").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('select * from
another();').assertSucceeded().assertDataResultMatch([(2,)])
mdb1.execute("CREATE TABLE y (i int);").assertSucceeded()
@@ -92,7 +92,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("alter table y add constraint nono foreign key(i)
references integers2(i);").assertSucceeded()
mdb2.execute("insert into y values (4);").assertSucceeded() # violates
foreign key if mdb1 committed successfully
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute("create function pain() returns int return
1;").assertSucceeded()
mdb1.execute('start transaction;').assertSucceeded()
@@ -100,7 +100,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("create view myv2(a) as select pain();").assertSucceeded()
mdb2.execute("drop function pain();").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('select * from
myv2;').assertSucceeded().assertDataResultMatch([(1,)])
mdb1.execute("CREATE TABLE longs (i bigint);").assertSucceeded()
@@ -109,7 +109,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("create or replace trigger myt after insert on integers
referencing new row as new_row for each row insert into longs
values(16);").assertSucceeded()
mdb2.execute("drop table longs;").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('insert into integers values (4,4);').assertSucceeded()
mdb1.execute('select * from
longs;').assertSucceeded().assertDataResultMatch([(16,)])
@@ -119,7 +119,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("create view myv3(a) as select i from
z;").assertSucceeded()
mdb2.execute("alter table z rename to zz;").assertSucceeded() # myv3
uses the table
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute("create table zzz (i int);").assertSucceeded()
mdb1.execute('start transaction;').assertSucceeded()
@@ -127,7 +127,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("alter table zzz rename to aaa;").assertSucceeded()
mdb2.execute("create view myv8(a) as select i from
zzz;").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('create table ww(y int, z int);').assertSucceeded()
mdb1.execute('insert into ww values (1, 1);').assertSucceeded()
@@ -136,7 +136,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("create view myv4(a,b) as select y, z from
ww;").assertSucceeded()
mdb2.execute("alter table ww rename column y to yy;").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
- mdb2.execute('commit;').assertFailed(err_code="40000",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
+ mdb2.execute('commit;').assertFailed(err_code="40001",
err_message="COMMIT: transaction is aborted because of concurrency conflicts,
will ROLLBACK instead")
mdb1.execute('select * from
myv4;').assertSucceeded().assertDataResultMatch([(1,1)])
mdb1.execute('create table bbb(y int, z int);').assertSucceeded()
@@ -146,7 +146,7 @@ with SQLTestCase() as mdb1:
mdb1.execute("alter table bbb rename column y to
yy;").assertSucceeded()
mdb2.execute("create view myv9(a,b) as select y, z from
bbb;").assertSucceeded()
mdb1.execute('commit;').assertSucceeded()
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list