Commit 5bde1651 authored by Michael Paquier's avatar Michael Paquier

Switch function current_schema[s]() to be parallel-unsafe

When invoked for the first time in a session, current_schema() and
current_schemas() can finish by creating a temporary schema.  Currently
those functions are parallel-safe, however if for a reason or another
they get launched across multiple parallel workers, they would fail when
attempting to create a temporary schema as temporary contexts are not
supported in this case.

The original issue has been spotted by buildfarm members crake and
lapwing, after commit c5660e0a has introduced the first regression tests
based on current_schema() in the tree.  After that, 396676b0 has
introduced a workaround to avoid parallel plans but that was not
completely right either.

Catversion is bumped.

Author: Michael Paquier
Reviewed-by: Daniel Gustafsson
Discussion: https://postgr.es/m/20190118024618.GF1883@paquier.xyz
parent 6ca015f9
......@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
#define CATALOG_VERSION_NO 201903251
#define CATALOG_VERSION_NO 201903271
#endif
......@@ -2787,11 +2787,11 @@
prosrc => 'name_text' },
{ oid => '1402', descr => 'current schema name',
proname => 'current_schema', provolatile => 's', prorettype => 'name',
proargtypes => '', prosrc => 'current_schema' },
proname => 'current_schema', provolatile => 's', proparallel => 'u',
prorettype => 'name', proargtypes => '', prosrc => 'current_schema' },
{ oid => '1403', descr => 'current schema search list',
proname => 'current_schemas', provolatile => 's', prorettype => '_name',
proargtypes => 'bool', prosrc => 'current_schemas' },
proname => 'current_schemas', provolatile => 's', proparallel => 'u',
prorettype => '_name', proargtypes => 'bool', prosrc => 'current_schemas' },
{ oid => '1404', descr => 'substitute portion of string',
proname => 'overlay', prorettype => 'text',
......
......@@ -360,11 +360,8 @@ prepare transaction 'twophase_tab';
ERROR: cannot PREPARE a transaction that has operated on temporary objects
-- Corner case: current_schema may create a temporary schema if namespace
-- creation is pending, so check after that. First reset the connection
-- to remove the temporary namespace, and make sure that non-parallel plans
-- are used.
-- to remove the temporary namespace.
\c -
SET max_parallel_workers = 0;
SET max_parallel_workers_per_gather = 0;
SET search_path TO 'pg_temp';
BEGIN;
SELECT current_schema() ~ 'pg_temp' AS is_temp_schema;
......
......@@ -274,11 +274,8 @@ prepare transaction 'twophase_tab';
-- Corner case: current_schema may create a temporary schema if namespace
-- creation is pending, so check after that. First reset the connection
-- to remove the temporary namespace, and make sure that non-parallel plans
-- are used.
-- to remove the temporary namespace.
\c -
SET max_parallel_workers = 0;
SET max_parallel_workers_per_gather = 0;
SET search_path TO 'pg_temp';
BEGIN;
SELECT current_schema() ~ 'pg_temp' AS is_temp_schema;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment