Fwd: [BUGS] pg_dump search path issue - Mailing list pgsql-general

From Elijah Zupancic
Subject Fwd: [BUGS] pg_dump search path issue
Date
Msg-id CALy1bpeMtBKC=YvD_vD8BWNvWdyuYQ9g_qoiP-+0rSwfcPwwhg@mail.gmail.com
Whole thread Raw
List pgsql-general
I posted this to pgbugs a little while ago and I couldn't get much
traction. I'm hoping that someone in the general list may be able to
help me with this. Namely, this question:

For contrib functions - is there even a way for embedded queries in
functions to be auto-coded to the correct schema when you run CREATE
EXTENSION? I know the command (CREATE EXTENSION) takes a schema name,
but how does that get added to embedded queries? Is there a best
practice for this?

---------- Forwarded message ----------
From: Elijah Zupancic <elijah@zupancic.name>
Date: Wed, Feb 4, 2015 at 6:01 PM
Subject: Re: [BUGS] pg_dump search path issue
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-bugs@postgresql.org


Hi Tom,

Thanks for your reply. The functions in question are user defined
inasmuch as they are from the contrib package.

Here is a sample of one of the errors:

psql:./prod-db-2015-02-04.sql:1688: ERROR:  function
cube_distance(public.earth, public.earth) does not exist
LINE 1: SELECT sec_to_gc(cube_distance($1, $2))
                         ^
HINT:  No function matches the given name and argument types. You
might need to add explicit type casts.
QUERY:  SELECT sec_to_gc(cube_distance($1, $2))
CONTEXT:  SQL function "earth_distance" during inlining
SELECT 0

This happens when pg_dump tries to recreate the definition of a
materialized view.

When I look at the dump, I see it sets a search path like: SET
search_path = aggregator, pg_catalog;

Then it goes a ways and creates a bunch of tables. Then it gets to the
materialized view. Upon closer inspection, the materialized view is
then calling the public.earth_distance function properly. However, the
earth distance function is calling an unqualified (missing the schema
specifier) function like so:

SELECT sec_to_gc(cube_distance($1, $2))

So, I'm with you - this is a problem with how the functions were
created. They should specify the schema so that they work correctly.
However, for contrib functions - is there even a way for them to be
auto-coded to the correct schema when you run CREATE EXTENSION? I know
the command takes a schema name, but how does that get added to
embedded queries? If there, is a best practice for this, I can take a
stab at patching earthdistance.

Thanks,
Elijah Zupancic

On Wed, Feb 4, 2015 at 5:32 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> Elijah Zupancic <elijah@zupancic.name> writes:
>> In the SQL dump, you will notice that the SET search_path = xxx values
>> will often not include the public schema which holds the functions
>> needed to properly recreate tables that depend on extensions.
>
> All the cases I've seen of this involve user-defined functions that are
> broken, often dangerously so.  A function should not assume that it's
> being called with any particular search_path; if it's intended for use in
> a multi-schema database, good practice is to either explicitly qualify
> names or use a SET clause to force the search_path to be what it expects.
>
>> It seems like the code that generates the SET search_path should check
>> to see if any of the objects it is dumping depend on functions that
>> use the public schema.
>
> If that didn't involve solving the halting problem, we might try to do
> it.  But for better or worse, functions in Postgres are mostly black boxes
> so far as callers are concerned.  It's not possible for pg_dump to know
> that some function has an expectation of being invoked with a particular
> search path.
>
>                         regards, tom lane



--
-Elijah


--
-Elijah


pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: Cluster seems broken after pg_basebackup
Next
From: Guillaume Lelarge
Date:
Subject: Re: Cluster seems broken after pg_basebackup