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

Reply via email to