View definition formatting
Hi all,
When using pg_get_viewdef(oid), the view definition is returned in a
reconstructed form (I assume) with all formatting removed. This is a
pain for apps like pgAdmin, that allow the user to edit their views,
particularly with very large ones.
Would it be possible and sensible to store the original view definition
for future use, such as we do for functions? Perhaps a new catalog
(pg_source?) could store these and other definitions such as rules for
use?
Regards, Dave.
Dave Page wrote:
Hi all,
When using pg_get_viewdef(oid), the view definition is returned in a
reconstructed form (I assume) with all formatting removed. This is a
pain for apps like pgAdmin, that allow the user to edit their views,
particularly with very large ones.Would it be possible and sensible to store the original view definition
for future use, such as we do for functions? Perhaps a new catalog
(pg_source?) could store these and other definitions such as rules for
use?
Not too obvious, but this should be covered in the TODO item "Allow RULE
recompilation". That is because if the rule/view is broken due to other
schema changes, the reconstruction might fail. Thus we need to save a
textual form and the original CREATE statement from the user seems
logical.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#================================================== JanWieck@Yahoo.com #
Jan Wieck <JanWieck@Yahoo.com> writes:
Dave Page wrote:
Would it be possible and sensible to store the original view definition
for future use, such as we do for functions? Perhaps a new catalog
(pg_source?) could store these and other definitions such as rules for
use?
Not too obvious, but this should be covered in the TODO item "Allow RULE
recompilation". That is because if the rule/view is broken due to other
schema changes, the reconstruction might fail.
Given the dependency mechanism in 7.3, it should no longer be possible
to break a rule that way. Of course, there are cases where you'd wish
the rule to *change* not just reject the update.
The major problem with any such proposal is that source-form storage has
its own set of inflexibilities. For example, we can currently allow
renaming of tables and columns that underlie a view, because the stored
form of the view doesn't contain those names and so it doesn't need to
change. If we store source text then we'd have to forbid such renaming
--- or else update the source text, which seems to require parsing,
adjustment of parsed tree, deparsing; which rather defeats the purpose
of Dave's request.
There are even more subtle problems: the source text may be ambiguous
in some way, so that reparsing it today might not generate the identical
intepretation to what you had before. Even "a+b" is ambiguous given
the possibility that user-defined operators could be added, or the
search path changed. Deparsing compensates for this by producing (or
at least trying to produce) a representation that is correct and
unambiguous in the current context.
One reason I'm disillusioned with this idea is that we do take the
trouble to store both source and internal form of column default
expressions, but in practice pg_attrdef.adsrc has fallen into disuse.
That track record doesn't bode well for adding source-form storage of
other things.
regards, tom lane
Thanks for the responses. I guess I'm going to have to write some view
formatting code... :-(
Oh well, at least it's for a good reason!!
Regards, Dave
It's rumoured that Tom Lane once said:
Show quoted text
Jan Wieck <JanWieck@Yahoo.com> writes:
Dave Page wrote:
Would it be possible and sensible to store the original view
definition for future use, such as we do for functions? Perhaps a new
catalog (pg_source?) could store these and other definitions such as
rules for use?Not too obvious, but this should be covered in the TODO item "Allow
RULE recompilation". That is because if the rule/view is broken due to
other schema changes, the reconstruction might fail.Given the dependency mechanism in 7.3, it should no longer be possible
to break a rule that way. Of course, there are cases where you'd wish
the rule to *change* not just reject the update.The major problem with any such proposal is that source-form storage
has its own set of inflexibilities. For example, we can currently
allow renaming of tables and columns that underlie a view, because the
stored form of the view doesn't contain those names and so it doesn't
need to change. If we store source text then we'd have to forbid such
renaming --- or else update the source text, which seems to require
parsing, adjustment of parsed tree, deparsing; which rather defeats the
purpose of Dave's request.There are even more subtle problems: the source text may be ambiguous
in some way, so that reparsing it today might not generate the
identical intepretation to what you had before. Even "a+b" is
ambiguous given the possibility that user-defined operators could be
added, or the search path changed. Deparsing compensates for this by
producing (or at least trying to produce) a representation that is
correct and
unambiguous in the current context.One reason I'm disillusioned with this idea is that we do take the
trouble to store both source and internal form of column default
expressions, but in practice pg_attrdef.adsrc has fallen into disuse.
That track record doesn't bode well for adding source-form storage of
other things.regards, tom lane
Dave Page writes:
When using pg_get_viewdef(oid), the view definition is returned in a
reconstructed form (I assume) with all formatting removed. This is a
pain for apps like pgAdmin, that allow the user to edit their views,
particularly with very large ones.
Perhaps as a workaround you could invent a standard indentation format and
format the rules automatically that way, so that users will be able to
find everything in the same place automatically after the second edit
cycle.
--
Peter Eisentraut peter_e@gmx.net
Peter Eisentraut <peter_e@gmx.net> writes:
Perhaps as a workaround you could invent a standard indentation format and
format the rules automatically that way, so that users will be able to
find everything in the same place automatically after the second edit
cycle.
Perhaps we could make pg_get_ruledef and friends try to prettyprint
their output a little better, instead of duplicating such logic in
various clients (which couldn't do nearly as well at it anyway without
re-parsing the string :-().
Does anyone have code that depends on these functions returning
single-line output? (I suppose the pg_rules and pg_views views might
get a bit ugly, but perhaps psql could be taught to format data with
embedded newlines better than it does now...)
regards, tom lane
On Tue, 2003-04-01 at 14:18, Tom Lane wrote:
Peter Eisentraut <peter_e@gmx.net> writes:
Perhaps as a workaround you could invent a standard indentation format and
format the rules automatically that way, so that users will be able to
find everything in the same place automatically after the second edit
cycle.Perhaps we could make pg_get_ruledef and friends try to prettyprint
their output a little better, instead of duplicating such logic in
various clients (which couldn't do nearly as well at it anyway without
re-parsing the string :-().Does anyone have code that depends on these functions returning
single-line output? (I suppose the pg_rules and pg_views views might
get a bit ugly, but perhaps psql could be taught to format data with
embedded newlines better than it does now...)
Could we turn the prettyprint incantation into a user callable function?
We could easily add that to the phpPgAdmin code to call that function
when pulling information from pg_views.definition and it's ilk, this
giving a nicely formatted output without having to modify the way it is
currently stored.
Robert Treat
Robert Treat <xzilla@users.sourceforge.net> writes:
On Tue, 2003-04-01 at 14:18, Tom Lane wrote:
Perhaps we could make pg_get_ruledef and friends try to prettyprint
their output a little better, instead of duplicating such logic in
various clients (which couldn't do nearly as well at it anyway without
re-parsing the string :-().
Could we turn the prettyprint incantation into a user callable function?
I don't think it's reasonable to implement the prettyprint as a separate
function, if that's what you mean. It would have to re-parse the string
which is exactly what I wanted to avoid. pg_get_ruledef itself already
knows what the statement structure is, and would need very little more
logic to do fairly reasonable pretty-printing.
We could make variants of pg_get_ruledef etc. that pretty-print,
while leaving the existing behavior alone, I suppose.
regards, tom lane
On Tue, 2003-04-01 at 14:18, Tom Lane wrote:
Peter Eisentraut <peter_e@gmx.net> writes:
Perhaps as a workaround you could invent a standard indentation format and
format the rules automatically that way, so that users will be able to
find everything in the same place automatically after the second edit
cycle.Perhaps we could make pg_get_ruledef and friends try to prettyprint
their output a little better, instead of duplicating such logic in
various clients (which couldn't do nearly as well at it anyway without
re-parsing the string :-().Does anyone have code that depends on these functions returning
single-line output? (I suppose the pg_rules and pg_views views might
get a bit ugly, but perhaps psql could be taught to format data with
embedded newlines better than it does now...)
I do -- but the only thing it does is format the output to look better.
--
Rod Taylor <rbt@rbt.ca>
PGP Key: http://www.rbt.ca/rbtpub.asc
Perhaps we could make pg_get_ruledef and friends try to prettyprint
their output a little better, instead of duplicating such logic in
various clients (which couldn't do nearly as well at it anyway without
re-parsing the string :-().Does anyone have code that depends on these functions returning
single-line output? (I suppose the pg_rules and pg_views views might
get a bit ugly, but perhaps psql could be taught to format data with
embedded newlines better than it does now...)
Well, phpPgAdmin kind of assumes that it does, however since it's written to a webpage, it will appear as one line anyway. I would need to just convert newlines to <br>s that's all.
The other dependency would be the new rule and trigger defs in that patch I sent in for psql recently. (And was committed).
Chris
-----Original Message-----
From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
Sent: 01 April 2003 20:59
To: Robert Treat
Cc: Peter Eisentraut; Dave Page; pgsql-hackers@postgresql.org
Subject: Re: [HACKERS] View definition formattingWe could make variants of pg_get_ruledef etc. that
pretty-print, while leaving the existing behavior alone, I suppose.
Hacking those functions never crossed my mind, but it would certainly do
what I require, and is probably more within the scope of things I could
do myself. *If* I get time and can figure it out, how would people feel
about pg_get_pp_viewdef(oid) etc?
Regards, Dave.
Import Notes
Resolved by subject fallback