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