diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2016-08-25 09:57:09 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2016-08-25 09:57:21 -0400 |
commit | e6bd440688af13449bcb1b80698e6ef4b16245a6 (patch) | |
tree | f26a02c4868fb7b2f2761d5223be9e3a53e998d3 /src | |
parent | 006fb80a569179d3df4932857818925667e8d581 (diff) | |
download | postgresql-e6bd440688af13449bcb1b80698e6ef4b16245a6.tar.gz postgresql-e6bd440688af13449bcb1b80698e6ef4b16245a6.zip |
Fix instability in parallel regression tests.
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/test/regress/expected/case.out | 9 | ||||
-rw-r--r-- | src/test/regress/sql/case.sql | 11 |
2 files changed, 10 insertions, 10 deletions
diff --git a/src/test/regress/expected/case.out b/src/test/regress/expected/case.out index 35b6476e501..5f6aa16d319 100644 --- a/src/test/regress/expected/case.out +++ b/src/test/regress/expected/case.out @@ -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); diff --git a/src/test/regress/sql/case.sql b/src/test/regress/sql/case.sql index b2377e46109..c860fae258a 100644 --- a/src/test/regress/sql/case.sql +++ b/src/test/regress/sql/case.sql @@ -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); |