Add a regression test for contrib/pgrowlocks.
authorTom Lane <[email protected]>
Thu, 1 Sep 2022 19:02:34 +0000 (15:02 -0400)
committerTom Lane <[email protected]>
Thu, 1 Sep 2022 19:02:41 +0000 (15:02 -0400)
Dong Wook Lee, revised a bit by me

Discussion: https://postgr.es/m/20220629055326.tdswmcjcr5jzbrsk@home-desktop

contrib/pgrowlocks/.gitignore[new file with mode: 0644]
contrib/pgrowlocks/Makefile
contrib/pgrowlocks/expected/pgrowlocks.out[new file with mode: 0644]
contrib/pgrowlocks/specs/pgrowlocks.spec[new file with mode: 0644]

diff --git a/contrib/pgrowlocks/.gitignore b/contrib/pgrowlocks/.gitignore
new file mode 100644 (file)
index 0000000..b4903eb
--- /dev/null
@@ -0,0 +1,6 @@
+# Generated subdirectories
+/log/
+/results/
+/output_iso/
+/tmp_check/
+/tmp_check_iso/
index 294c05dd0f914e085f9164b800f5e5358a525538..e8080646643c59bbd610fb157572de55280243cb 100644 (file)
@@ -9,6 +9,9 @@ EXTENSION = pgrowlocks
 DATA = pgrowlocks--1.2.sql pgrowlocks--1.1--1.2.sql pgrowlocks--1.0--1.1.sql
 PGFILEDESC = "pgrowlocks - display row locking information"
 
+ISOLATION = pgrowlocks
+ISOLATION_OPTS = --load-extension=pgrowlocks
+
 ifdef USE_PGXS
 PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
diff --git a/contrib/pgrowlocks/expected/pgrowlocks.out b/contrib/pgrowlocks/expected/pgrowlocks.out
new file mode 100644 (file)
index 0000000..7254672
--- /dev/null
@@ -0,0 +1,233 @@
+Parsed test spec with 2 sessions
+
+starting permutation: s1_begin s1_tuplock1 s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes            
+----------+-----+-----------------
+(0,1)     |f    |{"For Key Share"}
+(0,2)     |f    |{"For Key Share"}
+(2 rows)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_tuplock2 s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes        
+----------+-----+-------------
+(0,1)     |f    |{"For Share"}
+(0,2)     |f    |{"For Share"}
+(2 rows)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_tuplock3 s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes                
+----------+-----+---------------------
+(0,1)     |f    |{"For No Key Update"}
+(0,2)     |f    |{"For No Key Update"}
+(2 rows)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_tuplock4 s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes         
+----------+-----+--------------
+(0,1)     |f    |{"For Update"}
+(0,2)     |f    |{"For Update"}
+(2 rows)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_updatea s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_updatea: UPDATE multixact_conflict SET a = 10 WHERE a = 1;
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes   
+----------+-----+--------
+(0,1)     |f    |{Update}
+(1 row)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_updateb s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_updateb: UPDATE multixact_conflict SET b = 11 WHERE b = 4;
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes            
+----------+-----+-----------------
+(0,2)     |f    |{"No Key Update"}
+(1 row)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s1_tuplock1: SELECT * FROM multixact_conflict FOR KEY SHARE;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes            
+----------+-----+-----------------
+(0,1)     |f    |{"For Key Share"}
+(0,2)     |f    |{"For Key Share"}
+(2 rows)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s1_tuplock2: SELECT * FROM multixact_conflict FOR SHARE;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes              
+----------+-----+-------------------
+(0,1)     |t    |{"Key Share",Share}
+(0,2)     |t    |{"Key Share",Share}
+(2 rows)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s1_tuplock3: SELECT * FROM multixact_conflict FOR NO KEY UPDATE;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes                            
+----------+-----+---------------------------------
+(0,1)     |t    |{"Key Share","For No Key Update"}
+(0,2)     |t    |{"Key Share","For No Key Update"}
+(2 rows)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s1_tuplock4: SELECT * FROM multixact_conflict FOR UPDATE;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes                     
+----------+-----+--------------------------
+(0,1)     |t    |{"Key Share","For Update"}
+(0,2)     |t    |{"Key Share","For Update"}
+(2 rows)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_lcksvpt s1_updatea s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s1_updatea: UPDATE multixact_conflict SET a = 10 WHERE a = 1;
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes               
+----------+-----+--------------------
+(0,1)     |t    |{"Key Share",Update}
+(0,2)     |f    |{"For Key Share"}   
+(2 rows)
+
+step s1_commit: COMMIT;
+
+starting permutation: s1_begin s1_lcksvpt s1_updateb s2_rowlocks s1_commit
+step s1_begin: BEGIN;
+step s1_lcksvpt: SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s;
+a|b
+-+-
+1|2
+3|4
+(2 rows)
+
+step s1_updateb: UPDATE multixact_conflict SET b = 11 WHERE b = 4;
+step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict');
+locked_row|multi|modes                        
+----------+-----+-----------------------------
+(0,1)     |f    |{"For Key Share"}            
+(0,2)     |t    |{"Key Share","No Key Update"}
+(2 rows)
+
+step s1_commit: COMMIT;
diff --git a/contrib/pgrowlocks/specs/pgrowlocks.spec b/contrib/pgrowlocks/specs/pgrowlocks.spec
new file mode 100644 (file)
index 0000000..4f4013c
--- /dev/null
@@ -0,0 +1,39 @@
+# Tests for contrib/pgrowlocks
+
+setup {
+    CREATE TABLE multixact_conflict (a int PRIMARY KEY, b int);
+    INSERT INTO multixact_conflict VALUES (1, 2), (3, 4);
+}
+
+teardown {
+    DROP TABLE multixact_conflict;
+}
+
+session s1
+step s1_begin { BEGIN; }
+step s1_tuplock1 { SELECT * FROM multixact_conflict FOR KEY SHARE; }
+step s1_tuplock2 { SELECT * FROM multixact_conflict FOR SHARE; }
+step s1_tuplock3 { SELECT * FROM multixact_conflict FOR NO KEY UPDATE; }
+step s1_tuplock4 { SELECT * FROM multixact_conflict FOR UPDATE; }
+step s1_updatea { UPDATE multixact_conflict SET a = 10 WHERE a = 1; }
+step s1_updateb { UPDATE multixact_conflict SET b = 11 WHERE b = 4; }
+step s1_lcksvpt { SELECT * FROM multixact_conflict FOR KEY SHARE; SAVEPOINT s; }
+step s1_commit { COMMIT; }
+
+session s2
+step s2_rowlocks { SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict'); }
+
+permutation s1_begin s1_tuplock1 s2_rowlocks s1_commit
+permutation s1_begin s1_tuplock2 s2_rowlocks s1_commit
+permutation s1_begin s1_tuplock3 s2_rowlocks s1_commit
+permutation s1_begin s1_tuplock4 s2_rowlocks s1_commit
+permutation s1_begin s1_updatea s2_rowlocks s1_commit
+permutation s1_begin s1_updateb s2_rowlocks s1_commit
+
+# test multixact cases using savepoints
+permutation s1_begin s1_lcksvpt s1_tuplock1 s2_rowlocks s1_commit
+permutation s1_begin s1_lcksvpt s1_tuplock2 s2_rowlocks s1_commit
+permutation s1_begin s1_lcksvpt s1_tuplock3 s2_rowlocks s1_commit
+permutation s1_begin s1_lcksvpt s1_tuplock4 s2_rowlocks s1_commit
+permutation s1_begin s1_lcksvpt s1_updatea s2_rowlocks s1_commit
+permutation s1_begin s1_lcksvpt s1_updateb s2_rowlocks s1_commit