Changeset: ea64f06142be for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/ea64f06142be Modified Files: gdk/gdk.h sql/server/rel_optimizer.c sql/server/rel_select.c sql/storage/store.c Branch: properties Log Message:
Merged with default diffs (168 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -9842,8 +9842,20 @@ rel_setjoins_2_joingroupby(visitor *v, s } list *lexps = rel_projections(v->sql, l, NULL, 1, 1); aexps = list_merge(aexps, lexps, (fdup)NULL); - rel = rel_groupby(v->sql, rel, list_append(sa_list(v->sql->sa), exp_ref(v->sql, lid))); - rel->exps = aexps; + if (rel_is_ref(rel)) { + sql_rel *l = rel_create(v->sql->sa); + if (!l) + return NULL; + *l = *rel; + /* properly increment the ref counts */ + rel_dup(rel->l); + rel_dup(rel->r); + l->ref.refcnt = 1; + rel = rel_inplace_groupby(rel, l, list_append(sa_list(v->sql->sa), exp_ref(v->sql, lid)), aexps); + } else { + rel = rel_groupby(v->sql, rel, list_append(sa_list(v->sql->sa), exp_ref(v->sql, lid))); + rel->exps = aexps; + } } } return rel; diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1963,7 +1963,7 @@ rel_in_value_exp(sql_query *query, sql_r } else if (exp_is_rel(re)) { sql_rel *r = exp_rel_get_rel(sql->sa, re); add_select = 1; - if (rel && *rel) + if (rel && *rel && is_join((*rel)->op)) set_dependent((*rel)); if (is_project(r->op) && is_project_true(r->l) && list_length(r->exps) == 1) re = r->exps->h->data; diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3864,7 +3864,8 @@ transaction_check_dependencies_and_remov for (; he && ok == LOG_OK; he = he->chain) { sql_dependency_change *schange = (sql_dependency_change*) he->value; - if (lchange->objid == schange->objid && lchange->type == schange->type) + /* conflict only if transactions overlap */ + if (schange->ts >= tr->ts && lchange->objid == schange->objid && lchange->type == schange->type) ok = LOG_CONFLICT; } } @@ -3878,7 +3879,8 @@ transaction_check_dependencies_and_remov for (; he && ok == LOG_OK; he = he->chain) { sql_dependency_change *schange = (sql_dependency_change*) he->value; - if (lchange->objid == schange->objid && lchange->type == schange->type) + /* conflict only if transactions overlap */ + if (schange->ts >= tr->ts && lchange->objid == schange->objid && lchange->type == schange->type) ok = LOG_CONFLICT; } } diff --git a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320-Windows.test b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320-Windows.test --- a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320-Windows.test +++ b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320-Windows.test @@ -8,14 +8,14 @@ query T nosort plan copy into cm_tmp from E'\\file1',E'\\file2' ---- insert( -| table("sys"."cm_tmp") [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL ] +| table("sys"."cm_tmp") [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL UNIQUE ] | union ( | | project ( -| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n", varchar NULL, varchar "null", varchar "\\file1", bigint(18) "-1", bigint(18) "0", int(9) "0", varchar NULL, int(9) "0", int(9) "1"), +| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n", varchar NULL, varchar "null", varchar "\\file1", bigint(19) "-1", bigint(19) "0", int(9) "0", varchar NULL, int(9) "0", int(9) "1"), | | | ) [ "cm_tmp"."i" ] | | ) [ "cm_tmp"."i" ], | | project ( -| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n", varchar NULL, varchar "null", varchar "\\file2", bigint(18) "-1", bigint(18) "0", int(9) "0", varchar NULL, int(9) "0", int(9) "1"), +| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n", varchar NULL, varchar "null", varchar "\\file2", bigint(19) "-1", bigint(19) "0", int(9) "0", varchar NULL, int(9) "0", int(9) "1"), | | | ) [ "cm_tmp"."i" ] | | ) [ "cm_tmp"."i" ] | ) [ int(32) NULL ] @@ -25,14 +25,14 @@ query T nosort plan copy into cm_tmp from E'a:\\file1','Z:/file2' ---- insert( -| table("sys"."cm_tmp") [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL ] +| table("sys"."cm_tmp") [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL UNIQUE ] | union ( | | project ( -| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n", varchar NULL, varchar "null", varchar "a:\\file1", bigint(18) "-1", bigint(18) "0", int(9) "0", varchar NULL, int(9) "0", int(9) "1"), +| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n", varchar NULL, varchar "null", varchar "a:\\file1", bigint(19) "-1", bigint(19) "0", int(9) "0", varchar NULL, int(9) "0", int(9) "1"), | | | ) [ "cm_tmp"."i" ] | | ) [ "cm_tmp"."i" ], | | project ( -| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n", varchar NULL, varchar "null", varchar "Z:/file2", bigint(18) "-1", bigint(18) "0", int(9) "0", varchar NULL, int(9) "0", int(9) "1"), +| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n", varchar NULL, varchar "null", varchar "Z:/file2", bigint(19) "-1", bigint(19) "0", int(9) "0", varchar NULL, int(9) "0", int(9) "1"), | | | ) [ "cm_tmp"."i" ] | | ) [ "cm_tmp"."i" ] | ) [ int(32) NULL ] diff --git a/sql/test/BugTracker-2022/Tests/All b/sql/test/BugTracker-2022/Tests/All new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2022/Tests/All @@ -0,0 +1,1 @@ +transaction-conflict.Bug-7228 diff --git a/sql/test/BugTracker-2022/Tests/SingleServer b/sql/test/BugTracker-2022/Tests/SingleServer new file mode 100644 diff --git a/sql/test/BugTracker-2022/Tests/transaction-conflict.Bug-7228.test b/sql/test/BugTracker-2022/Tests/transaction-conflict.Bug-7228.test new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2022/Tests/transaction-conflict.Bug-7228.test @@ -0,0 +1,55 @@ +@connection(id=1, username=monetdb, password=monetdb) +statement ok +START TRANSACTION + +@connection(id=2, username=monetdb, password=monetdb) +statement ok +START TRANSACTION + +@connection(id=2) +statement ok +CREATE TABLE a(s string, i int, b1 bigint) + +@connection(id=2) +statement ok +COMMIT + +@connection(id=2) +statement ok +START TRANSACTION + +@connection(id=2) +statement ok +ALTER TABLE a ADD UNIQUE (s, b1) + +@connection(id=2) +statement ok +COMMIT + +@connection(id=2) +statement ok +START TRANSACTION + +@connection(id=2) +statement ok +CREATE TABLE b(i int) + +@connection(id=2) +statement ok +UPDATE a SET i = 1 + +@connection(id=2) +statement ok +DROP TABLE b + +@connection(id=2) +statement ok +COMMIT + +@connection(id=2) +statement ok +DROP TABLE a + +@connection(id=1) +statement ok +ROLLBACK _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list