]> granicus.if.org Git - postgresql/commitdiff
Add some test coverage of EvalPlanQual with non-locked tables.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 29 Jul 2015 17:27:15 +0000 (13:27 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 29 Jul 2015 17:27:56 +0000 (13:27 -0400)
A Salesforce colleague of mine griped that the regression tests don't
exercise EvalPlanQualFetchRowMarks() and allied routines.  Which is
a fair complaint.  Add test cases that go through the REFERENCE and COPY
code paths.  Unfortunately we don't have sufficient infrastructure right
now to exercise the FDW code path in the isolation tests, but this is
surely better than before.

src/test/isolation/expected/eval-plan-qual.out
src/test/isolation/specs/eval-plan-qual.spec

index 433533e6117f9561356484bce352356c1cacc12a..457461e355caa1c8c41089d2a35b225d2a58be2e 100644 (file)
@@ -104,3 +104,43 @@ a              b              c
 2              2              2              
 2              3              0              
 step c2: COMMIT;
+
+starting permutation: wx2 partiallock c2 c1 read
+step wx2: UPDATE accounts SET balance = balance + 450 WHERE accountid = 'checking';
+step partiallock: 
+       SELECT * FROM accounts a1, accounts a2
+         WHERE a1.accountid = a2.accountid
+         FOR UPDATE OF a1;
+ <waiting ...>
+step c2: COMMIT;
+step partiallock: <... completed>
+accountid      balance        accountid      balance        
+
+checking       1050           checking       600            
+savings        600            savings        600            
+step c1: COMMIT;
+step read: SELECT * FROM accounts ORDER BY accountid;
+accountid      balance        
+
+checking       1050           
+savings        600            
+
+starting permutation: wx2 lockwithvalues c2 c1 read
+step wx2: UPDATE accounts SET balance = balance + 450 WHERE accountid = 'checking';
+step lockwithvalues: 
+       SELECT * FROM accounts a1, (values('checking'),('savings')) v(id)
+         WHERE a1.accountid = v.id
+         FOR UPDATE OF a1;
+ <waiting ...>
+step c2: COMMIT;
+step lockwithvalues: <... completed>
+accountid      balance        id             
+
+checking       1050           checking       
+savings        600            savings        
+step c1: COMMIT;
+step read: SELECT * FROM accounts ORDER BY accountid;
+accountid      balance        
+
+checking       1050           
+savings        600            
index 6fb24322863dc2ff7a81e8c027b6b5aafbe55c94..a391466722f477141b6e455358bdb663c4d0085e 100644 (file)
@@ -50,6 +50,20 @@ step "writep1"       { UPDATE p SET b = -1 WHERE a = 1 AND b = 1 AND c = 0; }
 step "writep2" { UPDATE p SET b = -b WHERE a = 1 AND c = 0; }
 step "c1"      { COMMIT; }
 
+# these tests are meant to exercise EvalPlanQualFetchRowMarks,
+# ie, handling non-locked tables in an EvalPlanQual recheck
+
+step "partiallock"     {
+       SELECT * FROM accounts a1, accounts a2
+         WHERE a1.accountid = a2.accountid
+         FOR UPDATE OF a1;
+}
+step "lockwithvalues"  {
+       SELECT * FROM accounts a1, (values('checking'),('savings')) v(id)
+         WHERE a1.accountid = v.id
+         FOR UPDATE OF a1;
+}
+
 session "s2"
 setup          { BEGIN ISOLATION LEVEL READ COMMITTED; }
 step "wx2"     { UPDATE accounts SET balance = balance + 450 WHERE accountid = 'checking'; }
@@ -79,3 +93,5 @@ permutation "wy1" "wy2" "c1" "c2" "read"
 permutation "upsert1" "upsert2" "c1" "c2" "read"
 permutation "readp1" "writep1" "readp2" "c1" "c2"
 permutation "writep2" "returningp1" "c1" "c2"
+permutation "wx2" "partiallock" "c2" "c1" "read"
+permutation "wx2" "lockwithvalues" "c2" "c1" "read"