Re: all views in database broken at once

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Andrew Perrin <aperrin(at)socrates(dot)berkeley(dot)edu>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: all views in database broken at once
Date: 2001-03-24 17:06:41
Message-ID: 23099.985453601@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

Andrew Perrin <aperrin(at)socrates(dot)berkeley(dot)edu> writes:
> fgdata=# \d sx_l_m_r_a
> ERROR: cache lookup of attribute 197 in relation 47074 failed
> fgdata=# select * from pg_views;
> ERROR: cache lookup of attribute 317 in relation 48494 failed

> A SELECT from the rebuilt query itself works fine, so I know it's not
> actually a data problem. Is there anything I can do to rebuild these
> views? I don't think I have the original SQL sitting around to drop and
> recreate them.

You're in deep trouble :-(.

It's at least theoretically possible to fix this by hand, but it'll be
tedious. You'll need to dump out the "compiled" form of the view rule
for each broken view, manually correct the OID for each referenced view,
and UPDATE pg_rewrite with the corrected rule string.

A quick example:

regression=# create view vv1 as select * from int8_tbl;
CREATE
regression=# select ev_action from pg_rewrite where rulename = '_RETvv1';

({ QUERY :command 1 :utility <> :resultRelation 0 :into <> :isPortal false :isBinary false :isTemp false :hasAggs false :hasSubLinks false :rtable ({ RTE :relname vv1 :relid 147764 :subquery <> :alias { ATTR :relname *OLD* :attrs <>} :eref { ATTR :relname *OLD* :attrs ( "q1" "q2" )} :inh false :inFromCl false :checkForRead false :checkForWrite false :checkAsUser 0} { RTE :relname vv1 :relid 147764 :subquery <> :alias { ATTR :relname *NEW* :attrs <>} :eref { ATTR :relname *NEW* :attrs ( "q1" "q2" )} :inh false :inFromCl false :checkForRead false :checkForWrite false :checkAsUser 0} { RTE :relname int8_tbl :relid 18887 :subquery <> :alias <> :eref { ATTR :relname int8_tbl :attrs ( "q1" "q2" )} :inh true :inFromCl true :checkForRead true :checkForWrite false :checkAsUser 256}) :jointree { FROMEXPR :fromlist ({ RANGETBLREF 3 }) :quals <>} :rowMarks () :targetList ({ TARGETENTRY :resdom { RESDOM :resno 1 :restype 20 :restypmod -1 :resname q1 :reskey 0 :reskeyop 0 :resso!
rtgroupref 0 :resjunk false } :expr { VAR :varno 3 :varattno 1 :vartype 20 :vartypmod -1 :varlevelsup 0 :varnoold 3 :varoattno 1}} { TARGETENTRY :resdom { RESDOM :resno 2 :restype 20 :restypmod -1 :resname q2 :reskey 0 :reskeyop 0 :ressortgroupref 0 :resjunk false } :expr { VAR :varno 3 :varattno 2 :vartype 20 :vartypmod -1 :varlevelsup 0 :varnoold 3 :varoattno 2}}) :groupClause <> :havingQual <> :distinctClause <> :sortClause <> :limitOffset <> :limitCount <> :setOperations <> :resultRelations ()})

What you need to fix are the :relid fields of the RTE entries for the
referenced tables. The :relname field of the RTE gives the real name
of the table it references, and you look in pg_class for the associated
OID. For example,

regression=# select oid from pg_class where relname = 'int8_tbl';
oid
-------
18887
(1 row)

shows that the above view's reference to int8_tbl isn't broken.

Of course you'll need to be superuser to do the UPDATE on pg_rewrite,
and you will probably find that you need to quit and restart the backend
before it will use the changed view definition.

Good luck!

regards, tom lane

PS: Yes, I know we gotta fix this...

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Grant 2001-03-24 21:56:06 Re: Serials.
Previous Message Bruce Momjian 2001-03-24 16:44:18 Re: how do I check if a temporary table exists?