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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list