Changeset: 3443fd016b5c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3443fd016b5c
Added Files:
        sql/test/BugTracker-2021/Tests/serializable-snapshot.Bug-7200.SQL.py
Modified Files:
        sql/backends/monet5/rel_predicates.c
        sql/include/sql_catalog.h
        sql/server/rel_schema.c
        sql/server/rel_trans.c
        sql/storage/store.c
        sql/test/BugTracker-2021/Tests/All
Branch: Jul2021
Log Message:

Fix for bug #7200 ie clean some old macros and give errors on transaction 
features not yet supported


diffs (163 lines):

diff --git a/sql/backends/monet5/rel_predicates.c 
b/sql/backends/monet5/rel_predicates.c
--- a/sql/backends/monet5/rel_predicates.c
+++ b/sql/backends/monet5/rel_predicates.c
@@ -117,7 +117,7 @@ rel_find_predicates(visitor *v, sql_rel 
 sql_rel *
 rel_predicates(backend *be, sql_rel *rel)
 {
-       if (be->mvc->session->level < tr_serializable)
+       if ((be->mvc->session->level & tr_snapshot) == tr_snapshot)
                return rel;
        visitor v = { .sql = be->mvc };
        rel = rel_visitor_topdown(&v, rel, &rel_find_predicates);
@@ -127,7 +127,7 @@ rel_predicates(backend *be, sql_rel *rel
 int
 add_column_predicate(backend *be, sql_column *c)
 {
-       if (be->mvc->session->level < tr_serializable || isNew(c) || 
!isGlobal(c->t) || isGlobalTemp(c->t))
+       if ((be->mvc->session->level & tr_snapshot) == tr_snapshot || isNew(c) 
|| !isGlobal(c->t) || isGlobalTemp(c->t))
                return LOG_OK;
        return sql_trans_add_predicate(be->mvc->session->tr, c, 0, NULL, NULL, 
false, false);
 }
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -16,12 +16,12 @@
 #include "stream.h"
 #include "matomic.h"
 
-#define tr_none                0
-#define tr_readonly    1
-#define tr_writable    2
-#define tr_snapshot 4
-#define tr_serializable 8
-#define tr_append      16
+#define tr_none                1
+#define tr_readonly    2
+#define tr_writable    4
+#define tr_append      8
+#define tr_snapshot 16
+#define tr_serializable 32
 
 #define ACT_NO_ACTION 0
 #define ACT_CASCADE 1
@@ -72,11 +72,6 @@ typedef enum sql_dependency {
 #define ROLE_SYSADMIN 2
 #define USER_MONETDB  3
 
-#define ISO_READ_UNCOMMITED 1
-#define ISO_READ_COMMITED   2
-#define ISO_READ_REPEAT            3
-#define ISO_SERIALIZABLE    4
-
 #define SCALE_NONE     0
 #define SCALE_FIX      1       /* many numerical functions require equal
                            scales/precision for all their inputs */
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -1742,12 +1742,14 @@ sql_alter_table(sql_query *query, dlist 
        if (te->token == SQL_ALTER_TABLE) {
                int state = te->data.i_val;
 
-               if (state == tr_readonly)
+               if (state == tr_readonly) {
                        state = TABLE_READONLY;
-               else if (state == tr_append)
+               } else if (state == tr_append) {
                        state = TABLE_APPENDONLY;
-               else
+               } else {
+                       assert(state == tr_writable);
                        state = TABLE_WRITABLE;
+               }
                return rel_alter_table(sql->sa, ddl_alter_table_set_access, 
sname, tname, NULL, NULL, state);
        }
 
diff --git a/sql/server/rel_trans.c b/sql/server/rel_trans.c
--- a/sql/server/rel_trans.c
+++ b/sql/server/rel_trans.c
@@ -58,7 +58,15 @@ rel_transactions(sql_query *query, symbo
        }       break;
        case TR_START:
        case TR_MODE:
-               assert(s->type == type_int);
+               assert(s->type == type_int && (s->data.i_val & tr_append) == 0);
+
+               if ((s->data.i_val & tr_none) == tr_none)
+                       return sql_error(sql, 01, SQLSTATE(42000) "Transaction 
diagnostic not supported");
+               if ((s->data.i_val & tr_readonly) == tr_readonly)
+                       return sql_error(sql, 01, SQLSTATE(42000) "Readonly 
transactions not supported");
+               if ((s->data.i_val & tr_snapshot) == tr_snapshot && 
(s->data.i_val & tr_serializable) == tr_serializable)
+                       return sql_error(sql, 01, SQLSTATE(42000) "Cannot set 
multiple ISO levels on the same transaction");
+               s->data.i_val &= ~tr_writable; /* all transactions are writable 
by default */
                ret = rel_trans(sql, ddl_trans, s->data.i_val, NULL);
                break;
        default:
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -6810,7 +6810,8 @@ sql_session_reset(sql_session *s, int ac
        s->schema_name = def_schema_name;
        s->schema = NULL;
        s->auto_commit = s->ac_on_commit = ac;
-       s->level = ISO_SERIALIZABLE;
+       s->level &= ~tr_snapshot;
+       s->level |= tr_serializable;
        return 1;
 }
 
diff --git a/sql/test/BugTracker-2021/Tests/All 
b/sql/test/BugTracker-2021/Tests/All
--- a/sql/test/BugTracker-2021/Tests/All
+++ b/sql/test/BugTracker-2021/Tests/All
@@ -31,3 +31,4 @@ truncate-restart.Bug-7173
 remote-table-large.Bug-7178
 grouping-sets-aliases.Bug-7185
 concurrent-add-column.Bug-7196
+serializable-snapshot.Bug-7200
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
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2021/Tests/serializable-snapshot.Bug-7200.SQL.py
@@ -0,0 +1,41 @@
+import pymonetdb, sys, threading, os
+
+client1 = pymonetdb.connect(port = int(os.getenv('MAPIPORT', '50000')), 
database = os.getenv('TSTDB', 'demo'), hostname = os.getenv('MAPIHOST', 
'localhost'), autocommit=True)
+client2 = pymonetdb.connect(port = int(os.getenv('MAPIPORT', '50000')), 
database = os.getenv('TSTDB', 'demo'), hostname = os.getenv('MAPIHOST', 
'localhost'), autocommit=True)
+cursor1 = client1.cursor()
+cursor2 = client2.cursor()
+
+MAX_ITERATIONS = 1000
+
+cursor1.execute("CREATE TABLE T (k int PRIMARY KEY, v int);")
+
+class TestClient(threading.Thread):
+
+    def __init__(self, cursor):
+        threading.Thread.__init__ (self)
+        self._cursor = cursor
+
+    def run(self):
+        for i in range(0, MAX_ITERATIONS):
+            try:
+                self._cursor.execute("INSERT INTO t values (%d,%s)" % (i, i))
+            except pymonetdb.exceptions.IntegrityError:
+                pass
+
+
+thread1 = TestClient(cursor1)
+thread2 = TestClient(cursor2)
+thread1.start()
+thread2.start()
+thread1.join()
+thread2.join()
+
+cursor1.execute("SELECT COUNT(*) from T")
+if cursor1.fetchall() != [(MAX_ITERATIONS,)]:
+    sys.stderr.write("[(%s,)] expected" % (MAX_ITERATIONS,))
+cursor1.execute("DROP TABLE T;")
+
+cursor1.close()
+cursor2.close()
+client1.close()
+client2.close()
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to