Skip to content

Commit 90247e7

Browse files
committed
Add a regression test for contrib/pgrowlocks.
Dong Wook Lee, revised a bit by me Discussion: https://postgr.es/m/20220629055326.tdswmcjcr5jzbrsk@home-desktop
1 parent e548455 commit 90247e7

File tree

4 files changed

+281
-0
lines changed

4 files changed

+281
-0
lines changed

contrib/pgrowlocks/.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Generated subdirectories
2+
/log/
3+
/results/
4+
/output_iso/
5+
/tmp_check/
6+
/tmp_check_iso/

contrib/pgrowlocks/Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ EXTENSION = pgrowlocks
99
DATA = pgrowlocks--1.2.sql pgrowlocks--1.1--1.2.sql pgrowlocks--1.0--1.1.sql
1010
PGFILEDESC = "pgrowlocks - display row locking information"
1111

12+
ISOLATION = pgrowlocks
13+
ISOLATION_OPTS = --load-extension=pgrowlocks
14+
1215
ifdef USE_PGXS
1316
PG_CONFIG = pg_config
1417
PGXS := $(shell $(PG_CONFIG) --pgxs)
Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
Parsed test spec with 2 sessions
2+
3+
starting permutation: s1_begin s1_tuplock1 s2_rowlocks s1_commit
4+
step s1_begin: BEGIN;
5+
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
6+
a|b
7+
-+-
8+
1|2
9+
3|4
10+
(2 rows)
11+
12+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
13+
locked_row|multi|modes
14+
----------+-----+-----------------
15+
(0,1) |f |{"For Key Share"}
16+
(0,2) |f |{"For Key Share"}
17+
(2 rows)
18+
19+
step s1_commit: COMMIT;
20+
21+
starting permutation: s1_begin s1_tuplock2 s2_rowlocks s1_commit
22+
step s1_begin: BEGIN;
23+
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
24+
a|b
25+
-+-
26+
1|2
27+
3|4
28+
(2 rows)
29+
30+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
31+
locked_row|multi|modes
32+
----------+-----+-------------
33+
(0,1) |f |{"For Share"}
34+
(0,2) |f |{"For Share"}
35+
(2 rows)
36+
37+
step s1_commit: COMMIT;
38+
39+
starting permutation: s1_begin s1_tuplock3 s2_rowlocks s1_commit
40+
step s1_begin: BEGIN;
41+
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
42+
a|b
43+
-+-
44+
1|2
45+
3|4
46+
(2 rows)
47+
48+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
49+
locked_row|multi|modes
50+
----------+-----+---------------------
51+
(0,1) |f |{"For No Key Update"}
52+
(0,2) |f |{"For No Key Update"}
53+
(2 rows)
54+
55+
step s1_commit: COMMIT;
56+
57+
starting permutation: s1_begin s1_tuplock4 s2_rowlocks s1_commit
58+
step s1_begin: BEGIN;
59+
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
60+
a|b
61+
-+-
62+
1|2
63+
3|4
64+
(2 rows)
65+
66+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
67+
locked_row|multi|modes
68+
----------+-----+--------------
69+
(0,1) |f |{"For Update"}
70+
(0,2) |f |{"For Update"}
71+
(2 rows)
72+
73+
step s1_commit: COMMIT;
74+
75+
starting permutation: s1_begin s1_updatea s2_rowlocks s1_commit
76+
step s1_begin: BEGIN;
77+
step s1_updatea: UPDATE multixact_conflict SET a = 10 WHERE a = 1;
78+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
79+
locked_row|multi|modes
80+
----------+-----+--------
81+
(0,1) |f |{Update}
82+
(1 row)
83+
84+
step s1_commit: COMMIT;
85+
86+
starting permutation: s1_begin s1_updateb s2_rowlocks s1_commit
87+
step s1_begin: BEGIN;
88+
step s1_updateb: UPDATE multixact_conflict SET b = 11 WHERE b = 4;
89+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
90+
locked_row|multi|modes
91+
----------+-----+-----------------
92+
(0,2) |f |{"No Key Update"}
93+
(1 row)
94+
95+
step s1_commit: COMMIT;
96+
97+
starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit
98+
step s1_begin: BEGIN;
99+
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
100+
a|b
101+
-+-
102+
1|2
103+
3|4
104+
(2 rows)
105+
106+
step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
107+
a|b
108+
-+-
109+
1|2
110+
3|4
111+
(2 rows)
112+
113+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
114+
locked_row|multi|modes
115+
----------+-----+-----------------
116+
(0,1) |f |{"For Key Share"}
117+
(0,2) |f |{"For Key Share"}
118+
(2 rows)
119+
120+
step s1_commit: COMMIT;
121+
122+
starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit
123+
step s1_begin: BEGIN;
124+
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
125+
a|b
126+
-+-
127+
1|2
128+
3|4
129+
(2 rows)
130+
131+
step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
132+
a|b
133+
-+-
134+
1|2
135+
3|4
136+
(2 rows)
137+
138+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
139+
locked_row|multi|modes
140+
----------+-----+-------------------
141+
(0,1) |t |{"Key Share",Share}
142+
(0,2) |t |{"Key Share",Share}
143+
(2 rows)
144+
145+
step s1_commit: COMMIT;
146+
147+
starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit
148+
step s1_begin: BEGIN;
149+
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
150+
a|b
151+
-+-
152+
1|2
153+
3|4
154+
(2 rows)
155+
156+
step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
157+
a|b
158+
-+-
159+
1|2
160+
3|4
161+
(2 rows)
162+
163+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
164+
locked_row|multi|modes
165+
----------+-----+---------------------------------
166+
(0,1) |t |{"Key Share","For No Key Update"}
167+
(0,2) |t |{"Key Share","For No Key Update"}
168+
(2 rows)
169+
170+
step s1_commit: COMMIT;
171+
172+
starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit
173+
step s1_begin: BEGIN;
174+
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
175+
a|b
176+
-+-
177+
1|2
178+
3|4
179+
(2 rows)
180+
181+
step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
182+
a|b
183+
-+-
184+
1|2
185+
3|4
186+
(2 rows)
187+
188+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
189+
locked_row|multi|modes
190+
----------+-----+--------------------------
191+
(0,1) |t |{"Key Share","For Update"}
192+
(0,2) |t |{"Key Share","For Update"}
193+
(2 rows)
194+
195+
step s1_commit: COMMIT;
196+
197+
starting permutation: s1_begin s1_lcksvpt s1_updatea s2_rowlocks s1_commit
198+
step s1_begin: BEGIN;
199+
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
200+
a|b
201+
-+-
202+
1|2
203+
3|4
204+
(2 rows)
205+
206+
step s1_updatea: UPDATE multixact_conflict SET a = 10 WHERE a = 1;
207+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
208+
locked_row|multi|modes
209+
----------+-----+--------------------
210+
(0,1) |t |{"Key Share",Update}
211+
(0,2) |f |{"For Key Share"}
212+
(2 rows)
213+
214+
step s1_commit: COMMIT;
215+
216+
starting permutation: s1_begin s1_lcksvpt s1_updateb s2_rowlocks s1_commit
217+
step s1_begin: BEGIN;
218+
step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
219+
a|b
220+
-+-
221+
1|2
222+
3|4
223+
(2 rows)
224+
225+
step s1_updateb: UPDATE multixact_conflict SET b = 11 WHERE b = 4;
226+
step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
227+
locked_row|multi|modes
228+
----------+-----+-----------------------------
229+
(0,1) |f |{"For Key Share"}
230+
(0,2) |t |{"Key Share","No Key Update"}
231+
(2 rows)
232+
233+
step s1_commit: COMMIT;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Tests for contrib/pgrowlocks
2+
3+
setup {
4+
CREATE TABLE multixact_conflict (a int PRIMARY KEY, b int);
5+
INSERT INTO multixact_conflict VALUES (1, 2), (3, 4);
6+
}
7+
8+
teardown {
9+
DROP TABLE multixact_conflict;
10+
}
11+
12+
session s1
13+
step s1_begin { BEGIN; }
14+
step s1_tuplock1 { SELECT * FROM multixact_conflict FOR KEY SHARE; }
15+
step s1_tuplock2 { SELECT * FROM multixact_conflict FOR SHARE; }
16+
step s1_tuplock3 { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; }
17+
step s1_tuplock4 { SELECT * FROM multixact_conflict FOR UPDATE; }
18+
step s1_updatea { UPDATE multixact_conflict SET a = 10 WHERE a = 1; }
19+
step s1_updateb { UPDATE multixact_conflict SET b = 11 WHERE b = 4; }
20+
step s1_lcksvpt { SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s; }
21+
step s1_commit { COMMIT; }
22+
23+
session s2
24+
step s2_rowlocks { SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict'); }
25+
26+
permutation s1_begin s1_tuplock1 s2_rowlocks s1_commit
27+
permutation s1_begin s1_tuplock2 s2_rowlocks s1_commit
28+
permutation s1_begin s1_tuplock3 s2_rowlocks s1_commit
29+
permutation s1_begin s1_tuplock4 s2_rowlocks s1_commit
30+
permutation s1_begin s1_updatea s2_rowlocks s1_commit
31+
permutation s1_begin s1_updateb s2_rowlocks s1_commit
32+
33+
# test multixact cases using savepoints
34+
permutation s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit
35+
permutation s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit
36+
permutation s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit
37+
permutation s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit
38+
permutation s1_begin s1_lcksvpt s1_updatea s2_rowlocks s1_commit
39+
permutation s1_begin s1_lcksvpt s1_updateb s2_rowlocks s1_commit

0 commit comments

Comments
 (0)