Re: View restore error in 9.3-9.4 upgrade

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: David Steele <david(at)pgmasters(dot)net>
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: View restore error in 9.3-9.4 upgrade
Date: 2015-02-24 01:43:44
Message-ID: 19351.1424742224@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

David Steele <david(at)pgmasters(dot)net> writes:
> I upgraded from 9.3 to 9.4 last week using pg_dumpall and psql to dump
> and import the database. I got an error during the creation of one of
> the views and ended up having to patch the pl/pgsql manually to complete
> the migration.

> I've attached the relevant view and the function/views it depends on
> (view-bug.sql).

Hm. Here's the problem:

CREATE FUNCTION process_list() RETURNS SETOF pg_stat_activity
LANGUAGE plpgsql ...

In 9.3, the set of columns this returns is

regression=# \d pg_stat_activity
View "pg_catalog.pg_stat_activity"
Column | Type | Modifiers
------------------+--------------------------+-----------
datid | oid |
datname | name |
pid | integer |
usesysid | oid |
usename | name |
application_name | text |
client_addr | inet |
client_hostname | text |
client_port | integer |
backend_start | timestamp with time zone |
xact_start | timestamp with time zone |
query_start | timestamp with time zone |
state_change | timestamp with time zone |
waiting | boolean |
state | text |
query | text |

In 9.4, the set of columns this returns is

regression=# \d pg_stat_activity
View "pg_catalog.pg_stat_activity"
Column | Type | Modifiers
------------------+--------------------------+-----------
datid | oid |
datname | name |
pid | integer |
usesysid | oid |
usename | name |
application_name | text |
client_addr | inet |
client_hostname | text |
client_port | integer |
backend_start | timestamp with time zone |
xact_start | timestamp with time zone |
query_start | timestamp with time zone |
state_change | timestamp with time zone |
waiting | boolean |
state | text |
backend_xid | xid | <=========
backend_xmin | xid | <=========
query | text |

The two columns I marked are new in 9.4. Now, you reference the result of
this function with this:

FROM process_list() pg_stat_activity(datid, datname, pid, usesysid, usename, application_name, client_addr, client_hostname, client_port, backend_start, xact_start, query_start, state_change, waiting, state, query)

(that's not what you wrote originally, but ruleutils.c prints all the
known column aliases not just what you wrote). So everything up to
"state" matches, but then "query" is assigned as the alias for
"backend_xid", while "backend_xmin" and "query" remain unaliased.
And now you have two columns named "query" in that FROM-item.

I'm not sure that there's anything very nice that pg_dump could do
to deal with this. Pending some brilliant idea on how we might avoid
such problems, my own advice would be to not depend on system-defined
rowtypes to define the outputs of user-defined functions. If you
made your own rowtype with the columns you care about, and had the
function select just those columns not "select *", the code would
be much more robust against cross-version changes.

regards, tom lane

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Michael Paquier 2015-02-24 01:45:26 Re: View restore error in 9.3-9.4 upgrade
Previous Message David G Johnston 2015-02-24 01:02:23 Re: View restore error in 9.3-9.4 upgrade