Re: pg_views definition format - Mailing list pgsql-hackers

From Kevin Field
Subject Re: pg_views definition format
Date
Msg-id 5eab1997-0f18-4415-950f-7259217980b4@e24g2000vbe.googlegroups.com
Whole thread Raw
In response to pg_views definition format  (Kev <kevinjamesfield@gmail.com>)
Responses Re: pg_views definition format  (Greg Smith <gsmith@gregsmith.com>)
List pgsql-hackers
On May 13, 12:52 pm, t...@sss.pgh.pa.us (Tom Lane) wrote:
> Kev <kevinjamesfi...@gmail.com> writes:
> > ... I was surprised
> > to find that some of my views of the form:
> > select.........from b left join a on a.id=b.id
> > ...were being translated to this:
> > SELECT..........FROM (B LEFT JOIN a ON ((a.id = b.id)))
> > ...before being stored in the table pg_views is derived from.  My
> > surprise is at the double parentheses around "a.id = b.id".  Is that
> > supposed to be that way?  Is it likely to change?
>
> There isn't any such "table".  What pg_views is showing you is a reverse
> compilation of the internal parsetree for the rule.  Whether there are
> parentheses in a given place is dependent on whether the code thinks it
> might be safe to omit them ... and I think in the non-prettyprinted
> format the answer is always "no".  For instance with pg_views itself:
>
> regression=# select pg_get_viewdef('pg_views'::regclass);
>
pg_get_viewdef
>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  SELECT n.nspname AS schemaname, c.relname AS viewname, pg_get_userbyid(c.relowner) AS viewowner,
pg_get_viewdef(c.oid)AS definition FROM (pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE
(c.relkind= 'v'::"char");
 
> (1 row)
>
> regression=# select pg_get_viewdef('pg_views'::regclass, true);
>                                                             pg_get_viewdef
>
---------------------------------------------------------------------------------------------------------------------------------------
>   SELECT n.nspname AS schemaname, c.relname AS viewname, pg_get_userbyid(c.relowner) AS viewowner,
pg_get_viewdef(c.oid)AS definition
 
>     FROM pg_class c
>     LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
>    WHERE c.relkind = 'v'::"char";
> (1 row)
>
> Same parsetree, but the latter case is working a bit harder to make
> it look nice.  The default case is overparenthesizing intentionally
> to make dead certain the rule will be parsed the same way if it's
> dumped and reloaded.
>
>                         regards, tom lane

That's handy to know about pg_views.  I'm still not sure how I should
code my script to make it future-proof though (because things of the
form "((a))" seem beyond dead-certain...) unless...is there some
function I can call to parse and then recompile the SQL, so I can feed
in my generated code in any format I like and then have it translate?
Or would the only way to do this be to actually create a view and then
call pg_get_viewdef() and then delete the view?


pgsql-hackers by date:

Previous
From: Simon Riggs
Date:
Subject: Re: New trigger option of pg_standby
Next
From: Greg Smith
Date:
Subject: Re: pg_views definition format