summaryrefslogtreecommitdiffstats
path: root/src/test/isolation/specs/merge-join.spec
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/isolation/specs/merge-join.spec')
-rw-r--r--src/test/isolation/specs/merge-join.spec45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/test/isolation/specs/merge-join.spec b/src/test/isolation/specs/merge-join.spec
new file mode 100644
index 0000000..e33a02c
--- /dev/null
+++ b/src/test/isolation/specs/merge-join.spec
@@ -0,0 +1,45 @@
+# MERGE JOIN
+#
+# This test checks the EPQ recheck mechanism during MERGE when joining to a
+# source table using different join methods, per bug #18103
+
+setup
+{
+ CREATE TABLE src (id int PRIMARY KEY, val int);
+ CREATE TABLE tgt (id int PRIMARY KEY, val int);
+ INSERT INTO src SELECT x, x*10 FROM generate_series(1,3) g(x);
+ INSERT INTO tgt SELECT x, x FROM generate_series(1,3) g(x);
+}
+
+teardown
+{
+ DROP TABLE src, tgt;
+}
+
+session s1
+step b1 { BEGIN ISOLATION LEVEL READ COMMITTED; }
+step m1 { MERGE INTO tgt USING src ON tgt.id = src.id
+ WHEN MATCHED THEN UPDATE SET val = src.val
+ WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); }
+step s1 { SELECT * FROM tgt; }
+step c1 { COMMIT; }
+
+session s2
+step b2 { BEGIN ISOLATION LEVEL READ COMMITTED; }
+step hj { SET LOCAL enable_mergejoin = off; SET LOCAL enable_nestloop = off; }
+step mj { SET LOCAL enable_hashjoin = off; SET LOCAL enable_nestloop = off; }
+step nl { SET LOCAL enable_hashjoin = off; SET LOCAL enable_mergejoin = off; }
+step ex { EXPLAIN (verbose, costs off)
+ MERGE INTO tgt USING src ON tgt.id = src.id
+ WHEN MATCHED THEN UPDATE SET val = src.val
+ WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); }
+step m2 { MERGE INTO tgt USING src ON tgt.id = src.id
+ WHEN MATCHED THEN UPDATE SET val = src.val
+ WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); }
+step s2 { SELECT * FROM tgt; }
+step c2 { COMMIT; }
+
+permutation b1 m1 s1 c1 b2 m2 s2 c2
+permutation b1 b2 m1 hj ex m2 c1 c2 s1
+permutation b1 b2 m1 mj ex m2 c1 c2 s1
+permutation b1 b2 m1 nl ex m2 c1 c2 s1