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

Reply via email to