Fix instability in parallel regression tests.
authorTom Lane <[email protected]>
Thu, 25 Aug 2016 13:57:09 +0000 (09:57 -0400)
committerTom Lane <[email protected]>
Thu, 25 Aug 2016 13:57:09 +0000 (09:57 -0400)
Commit f0c7b789a added a test case in case.sql that creates and then drops
both an '=' operator and the type it's for.  Given the right timing, that
can cause a "cache lookup failed for type" failure in concurrent sessions,
which see the '=' operator as a potential match for '=' in a query, but
then the type is gone by the time they inquire into its properties.
It might be nice to make that behavior more robust someday, but as a
back-patchable solution, adjust the new test case so that the operator
is never visible to other sessions.  Like the previous commit, back-patch
to all supported branches.

Discussion: <5983.1471371667@sss.pgh.pa.us>

src/test/regress/expected/case.out
src/test/regress/sql/case.sql

index 35b6476e501570ee3a273994362eccc30ea8ae97..5f6aa16d31985bc16c8e5088e81d4df6bc1635db 100644 (file)
@@ -305,6 +305,9 @@ SELECT * FROM CASE_TBL;
 -- the isNull flag for the case test value incorrectly became true, causing
 -- the third WHEN-clause not to match.  The volatile function calls are needed
 -- to prevent constant-folding in the planner, which would hide the bug.
+-- Wrap this in a single transaction so the transient '=' operator doesn't
+-- cause problems in concurrent sessions
+BEGIN;
 CREATE FUNCTION vol(text) returns text as
   'begin return $1; end' language plpgsql volatile;
 SELECT CASE
@@ -335,13 +338,9 @@ SELECT CASE volfoo('bar') WHEN 'foo'::foodomain THEN 'is foo' ELSE 'is not foo'
  is not foo
 (1 row)
 
+ROLLBACK;
 --
 -- Clean up
 --
 DROP TABLE CASE_TBL;
 DROP TABLE CASE2_TBL;
-DROP OPERATOR = (foodomain, foodomain);
-DROP FUNCTION inline_eq(foodomain, foodomain);
-DROP FUNCTION volfoo(text);
-DROP DOMAIN foodomain;
-DROP FUNCTION vol(text);
index b2377e46109a6ccbf22659a976bae64b7c4f2baf..c860fae258a07eb857f78951aa0e3e480f605d51 100644 (file)
@@ -167,6 +167,10 @@ SELECT * FROM CASE_TBL;
 -- the third WHEN-clause not to match.  The volatile function calls are needed
 -- to prevent constant-folding in the planner, which would hide the bug.
 
+-- Wrap this in a single transaction so the transient '=' operator doesn't
+-- cause problems in concurrent sessions
+BEGIN;
+
 CREATE FUNCTION vol(text) returns text as
   'begin return $1; end' language plpgsql volatile;
 
@@ -194,14 +198,11 @@ CREATE OPERATOR = (procedure = inline_eq,
 
 SELECT CASE volfoo('bar') WHEN 'foo'::foodomain THEN 'is foo' ELSE 'is not foo' END;
 
+ROLLBACK;
+
 --
 -- Clean up
 --
 
 DROP TABLE CASE_TBL;
 DROP TABLE CASE2_TBL;
-DROP OPERATOR = (foodomain, foodomain);
-DROP FUNCTION inline_eq(foodomain, foodomain);
-DROP FUNCTION volfoo(text);
-DROP DOMAIN foodomain;
-DROP FUNCTION vol(text);