Changeset: 13de516b7f00 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/13de516b7f00
Modified Files:
sql/backends/monet5/rel_predicates.c
sql/include/sql_catalog.h
sql/server/rel_schema.c
sql/storage/store.c
sql/test/BugTracker-2021/Tests/All
Branch: Jan2022
Log Message:
Merged with Jul2021
diffs (166 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
@@ -19,12 +19,12 @@
#define sql_shared_module_name "sql"
#define sql_private_module_name "user"
-#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
@@ -75,11 +75,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
@@ -1821,12 +1821,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
@@ -6953,7 +6953,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
@@ -34,5 +34,6 @@ groupby-subquery.Bug-7180
grouping-sets-aliases.Bug-7185
copyinto-copyfrom.Bug-7186
concurrent-add-column.Bug-7196
+serializable-snapshot.Bug-7200
unique-idx.Bug-7201
distinct-with-orderby.Bug-7202
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,42 @@
+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
+EXPECTED_SUM = sum(range(0, MAX_ITERATIONS))
+
+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,%d);" % (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(*), COUNT(DISTINCT k), SUM(k) from T;")
+if cursor1.fetchall() != [(MAX_ITERATIONS, MAX_ITERATIONS, EXPECTED_SUM)]:
+ sys.stderr.write("[(%d,%d,%d)] expected" % (MAX_ITERATIONS,
MAX_ITERATIONS, EXPECTED_SUM))
+cursor1.execute("DROP TABLE T;")
+
+cursor1.close()
+cursor2.close()
+client1.close()
+client2.close()
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list