pg_dump --pretty-print-views
Hi,
At the company I work for, we've been splitting dumps into separate
files and diffing them for a while now. By far the biggest problem we
had was with views: pg_dump by default dumps views on one line, in a
format which maximizes compatibility. Now this has several problems for
our use case:
1) The one-line equivalent of a 200-line view is completely impossible
to read.
2) If there's a difference between the two dumped view definitions,
it takes a long time to find where and what exactly it is.
3) For some reason some expressions are dumped differently depending
on how exactly they are written, cluttering the diff with false
positives.
While we can do the actual splitting of objects from a -Fc dump
relatively easily, we can't fix the view definitions after they've been
dumped. So I'm proposing a --pretty-print-views setting to pg_dump
(patch attached).
Any feedback is welcome.
Regards,
Marko Tiikkaja
Attachments:
pretty_print_views.patchtext/plain; charset=UTF-8; name=pretty_print_views.patch; x-mac-creator=0; x-mac-type=0Download
*** a/doc/src/sgml/ref/pg_dump.sgml
--- b/doc/src/sgml/ref/pg_dump.sgml
***************
*** 719,724 **** PostgreSQL documentation
--- 719,736 ----
</varlistentry>
<varlistentry>
+ <term><option>--pretty-print-views</></term>
+ <listitem>
+ <para>
+ Output views in a <quote>pretty-printed</quote> format. This makes the
+ view definitions appearing in the dump easier to read for humans, but
+ at the same time makes them less likely to be interpreted in the exact
+ same way between different versions of <productname>PostgreSQL</>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><option>--quote-all-identifiers</></term>
<listitem>
<para>
*** a/src/bin/pg_dump/pg_dump.c
--- b/src/bin/pg_dump/pg_dump.c
***************
*** 137,142 **** static int dump_inserts = 0;
--- 137,143 ----
static int column_inserts = 0;
static int no_security_labels = 0;
static int no_unlogged_table_data = 0;
+ static int pretty_print_views = 0;
static int serializable_deferrable = 0;
***************
*** 345,350 **** main(int argc, char **argv)
--- 346,352 ----
{"inserts", no_argument, &dump_inserts, 1},
{"lock-wait-timeout", required_argument, NULL, 2},
{"no-tablespaces", no_argument, &outputNoTablespaces, 1},
+ {"pretty-print-views", no_argument, &pretty_print_views, 1},
{"quote-all-identifiers", no_argument, "e_all_identifiers, 1},
{"role", required_argument, NULL, 3},
{"section", required_argument, NULL, 5},
***************
*** 606,611 **** main(int argc, char **argv)
--- 608,619 ----
no_security_labels = 1;
/*
+ * Pretty-printing views requires PostgreSQL 7.4 or later
+ */
+ if (pretty_print_views && fout->remoteVersion < 70400)
+ exit_horribly(NULL, "--pretty-print-views requires server version 7.4 or later\n");
+
+ /*
* Start transaction-snapshot mode transaction to dump consistent data.
*/
ExecuteSqlStatement(fout, "BEGIN");
***************
*** 840,845 **** help(const char *progname)
--- 848,856 ----
printf(_(" --no-security-labels do not dump security label assignments\n"));
printf(_(" --no-tablespaces do not dump tablespace assignments\n"));
printf(_(" --no-unlogged-table-data do not dump unlogged table data\n"));
+ printf(_(" --pretty-print-views\n"
+ " dump views in a more human-readable format (reduces\n"
+ " compatibility of the output dump)\n"));
printf(_(" --quote-all-identifiers quote all identifiers, even if not key words\n"));
printf(_(" --section=SECTION dump named section (pre-data, data, or post-data)\n"));
printf(_(" --serializable-deferrable wait until the dump can run without anomalies\n"));
***************
*** 12387,12393 **** dumpTableSchema(Archive *fout, TableInfo *tbinfo)
reltypename = "VIEW";
/* Fetch the view definition */
! if (fout->remoteVersion >= 70300)
{
/* Beginning in 7.3, viewname is not unique; rely on OID */
appendPQExpBuffer(query,
--- 12398,12411 ----
reltypename = "VIEW";
/* Fetch the view definition */
! if (pretty_print_views)
! {
! /* Server must be 7.4 or later, so viewname is not unique; rely on OID */
! appendPQExpBuffer(query,
! "SELECT pg_catalog.pg_get_viewdef('%u'::pg_catalog.oid, TRUE) AS viewdef",
! tbinfo->dobj.catId.oid);
! }
! else if (fout->remoteVersion >= 70300)
{
/* Beginning in 7.3, viewname is not unique; rely on OID */
appendPQExpBuffer(query,
On Thu, Jan 10, 2013 at 01:23:10PM +0100, Marko Tiikkaja wrote:
Hi,
At the company I work for, we've been splitting dumps into separate
files and diffing them for a while now. By far the biggest problem
we had was with views: pg_dump by default dumps views on one line,
in a format which maximizes compatibility. Now this has several
problems for our use case:1) The one-line equivalent of a 200-line view is completely impossible
to read.
2) If there's a difference between the two dumped view definitions,
it takes a long time to find where and what exactly it is.
3) For some reason some expressions are dumped differently depending
on how exactly they are written, cluttering the diff with false
positives.While we can do the actual splitting of objects from a -Fc dump
relatively easily, we can't fix the view definitions after they've
been dumped. So I'm proposing a --pretty-print-views setting to
pg_dump (patch attached).Any feedback is welcome.
Why not make this the new default? That way, new users will have the
benefit, and people with tools or processes that depend on the old
behavior can still have it.
Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com
iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics
Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
* David Fetter (david@fetter.org) wrote:
On Thu, Jan 10, 2013 at 01:23:10PM +0100, Marko Tiikkaja wrote:
Any feedback is welcome.
Why not make this the new default? That way, new users will have the
benefit, and people with tools or processes that depend on the old
behavior can still have it.
I tend to agree with this, I've never really liked having the view def
all on one massive line.
Well, I'll caveat that with this- being able to grep -C2 and pull the
views and the view definitions has been nice on occation, but you can
pull independent objects out with pg_restore from a -Fc dump and, in
general, I think the advantage of having the view definition look
reasonable in the dump is more than being able to do tricks on views
(but not tables, etc anyway..) with grep.
Thanks,
Stephen
On 01/10/2013 07:23 AM, Marko Tiikkaja wrote:
Hi,
At the company I work for, we've been splitting dumps into separate
files and diffing them for a while now. By far the biggest problem we
had was with views: pg_dump by default dumps views on one line, in a
format which maximizes compatibility. Now this has several problems
for our use case:1) The one-line equivalent of a 200-line view is completely impossible
to read.
2) If there's a difference between the two dumped view definitions,
it takes a long time to find where and what exactly it is.
3) For some reason some expressions are dumped differently depending
on how exactly they are written, cluttering the diff with false
positives.While we can do the actual splitting of objects from a -Fc dump
relatively easily, we can't fix the view definitions after they've
been dumped. So I'm proposing a --pretty-print-views setting to
pg_dump (patch attached).
For versions >= 9.2 it would be better to allow passing in a
pretty-print value, like 80 or 0, instead of just passing 'true'. The
new line-wrapping that the integer argument triggers is much more
readable than the supposedly pretty value that 'true' provides.
cheers
andrew
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 1/10/13 3:22 PM, Andrew Dunstan wrote:
For versions >= 9.2 it would be better to allow passing in a
pretty-print value, like 80 or 0, instead of just passing 'true'. The
new line-wrapping that the integer argument triggers is much more
readable than the supposedly pretty value that 'true' provides.
Ooh, I had no idea we exposed that in SQL. I like this idea.
Regards,
Marko Tiikkaja
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Marko Tiikkaja <pgmail@joh.to> writes:
While we can do the actual splitting of objects from a -Fc dump
relatively easily, we can't fix the view definitions after they've been
dumped. So I'm proposing a --pretty-print-views setting to pg_dump
(patch attached).
-1. The reason that pg_dump does not pretty-print things is that
it's unsafe; there is no real guarantee that the view will reload as
intended, because it's under-parenthesized. (Even if we were sure
it would reload safely into current code, which I'm not, what of
future versions that could have different operator precedences?)
I don't think we should offer a foot-gun option like this at all,
and as for making it the default, not bloody likely.
I think your schema-diffing needs would be better served by a tool
specifically directed at that problem; which pg_dump is not, but
I believe there are some out there.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Thu, Jan 10, 2013 at 11:21:13AM -0500, Tom Lane wrote:
Marko Tiikkaja <pgmail@joh.to> writes:
While we can do the actual splitting of objects from a -Fc dump
relatively easily, we can't fix the view definitions after they've
been dumped. So I'm proposing a --pretty-print-views setting to
pg_dump (patch attached).-1. The reason that pg_dump does not pretty-print things is that
it's unsafe; there is no real guarantee that the view will reload as
intended, because it's under-parenthesized. (Even if we were sure
it would reload safely into current code, which I'm not, what of
future versions that could have different operator precedences?)
Under what circumstances do pretty-printed views not reload? It seems
to me that such circumstances would be pretty_print() bugs by
definition.
Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com
iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics
Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
David Fetter <david@fetter.org> writes:
On Thu, Jan 10, 2013 at 11:21:13AM -0500, Tom Lane wrote:
-1. The reason that pg_dump does not pretty-print things is that
it's unsafe; there is no real guarantee that the view will reload as
intended, because it's under-parenthesized. (Even if we were sure
it would reload safely into current code, which I'm not, what of
future versions that could have different operator precedences?)
Under what circumstances do pretty-printed views not reload? It seems
to me that such circumstances would be pretty_print() bugs by
definition.
It would not be a bug, particularly not in the case of a subsequent
release with different operator precedence. pg_dump's charter is to be
safe. Pretty-printing's charter is to look nice. These goals are not
compatible. If they were, we'd never have made a separate pretty
printing mode at all.
Now, we could consider changing the "safe" mode so that it tries to
provide nice whitespace/line breaks while not risking removal of
parentheses. But that would be a totally different patch, and I'm
not sure how much it would address Marko's desires anyway.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 01/10/2013 12:09 PM, Tom Lane wrote:
Now, we could consider changing the "safe" mode so that it tries to
provide nice whitespace/line breaks while not risking removal of
parentheses. But that would be a totally different patch, and I'm
not sure how much it would address Marko's desires anyway.
I think there's a very good case for breaking the nexus between
PRETTYFLAG_PAREN and PRETTYFLAG_INDENT+line wrapping for views. Only
PRETTYFLAG_PAREN affects the safety issue. The others are just about
white space in safe places.
cheers
andrew
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Andrew Dunstan <andrew@dunslane.net> writes:
I think there's a very good case for breaking the nexus between
PRETTYFLAG_PAREN and PRETTYFLAG_INDENT+line wrapping for views. Only
PRETTYFLAG_PAREN affects the safety issue. The others are just about
white space in safe places.
What I was actually thinking about was turning on indent/linewrapping
all the time (ie, no change on pg_dump's side, just hack ruleutils).
If we believe it's safe, why not just do it? It's the paren-removal
that pg_dump can't tolerate.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 01/10/2013 12:35 PM, Tom Lane wrote:
Andrew Dunstan <andrew@dunslane.net> writes:
I think there's a very good case for breaking the nexus between
PRETTYFLAG_PAREN and PRETTYFLAG_INDENT+line wrapping for views. Only
PRETTYFLAG_PAREN affects the safety issue. The others are just about
white space in safe places.What I was actually thinking about was turning on indent/linewrapping
all the time (ie, no change on pg_dump's side, just hack ruleutils).
If we believe it's safe, why not just do it? It's the paren-removal
that pg_dump can't tolerate.
Works for me.
cheers
andrew
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Thu, Jan 10, 2013 at 11:07 PM, Andrew Dunstan <andrew@dunslane.net>wrote:
On 01/10/2013 12:35 PM, Tom Lane wrote:
Andrew Dunstan <andrew@dunslane.net> writes:
I think there's a very good case for breaking the nexus between
PRETTYFLAG_PAREN and PRETTYFLAG_INDENT+line wrapping for views. Only
PRETTYFLAG_PAREN affects the safety issue. The others are just about
white space in safe places.What I was actually thinking about was turning on indent/linewrapping
all the time (ie, no change on pg_dump's side, just hack ruleutils).
If we believe it's safe, why not just do it? It's the paren-removal
that pg_dump can't tolerate.Works for me.
Nice idea.
Marko, just hack ruleutils some thing like this:
diff --git a/src/backend/utils/adt/ruleutils.c
b/src/backend/utils/adt/ruleutils.c
index 266cec5..a46f588 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -511,8 +511,9 @@ pg_get_viewdef(PG_FUNCTION_ARGS)
{
/* By OID */
Oid viewoid = PG_GETARG_OID(0);
+ int prettyFlags = PRETTYFLAG_INDENT;
- PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, 0, -1)));
+ PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid,
prettyFlags, WRAP_COLUMN_DEFAULT)));
}
Thanks
cheers
andrew
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/**mailpref/pgsql-hackers<http://www.postgresql.org/mailpref/pgsql-hackers>
--
Jeevan B Chalke
Senior Software Engineer, R&D
EnterpriseDB Corporation
The Enterprise PostgreSQL Company
Phone: +91 20 30589500
Website: www.enterprisedb.com
EnterpriseDB Blog: http://blogs.enterprisedb.com/
Follow us on Twitter: http://www.twitter.com/enterprisedb
This e-mail message (and any attachment) is intended for the use of the
individual or entity to whom it is addressed. This message contains
information from EnterpriseDB Corporation that may be privileged,
confidential, or exempt from disclosure under applicable law. If you are
not the intended recipient or authorized to receive this for the intended
recipient, any use, dissemination, distribution, retention, archiving, or
copying of this communication is strictly prohibited. If you have received
this e-mail in error, please notify the sender immediately by reply e-mail
and delete this message.
On Fri, 18 Jan 2013 07:46:21 +0100, Jeevan Chalke
<jeevan.chalke@enterprisedb.com> wrote:
Nice idea.
Marko, just hack ruleutils some thing like this:
Here's a patch attempting to do just that.
The actual code changes were trivial, the patch is mostly just regression
tests.
As for the docs, I wasn't entirely happy with what they say about
pg_get_viewdef(), but it didn't look like they needed to be changed by
this either.
Regards,
Marko Tiikkaja
Attachments:
prettyprint_v2.patchapplication/octet-stream; name=prettyprint_v2.patchDownload
*** a/src/backend/utils/adt/ruleutils.c
--- b/src/backend/utils/adt/ruleutils.c
***************
*** 512,519 **** pg_get_viewdef(PG_FUNCTION_ARGS)
{
/* By OID */
Oid viewoid = PG_GETARG_OID(0);
! PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, 0, -1)));
}
--- 512,520 ----
{
/* By OID */
Oid viewoid = PG_GETARG_OID(0);
+ int prettyFlags = PRETTYFLAG_INDENT;
! PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, -1)));
}
***************
*** 525,531 **** pg_get_viewdef_ext(PG_FUNCTION_ARGS)
bool pretty = PG_GETARG_BOOL(1);
int prettyFlags;
! prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0;
PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT)));
}
--- 526,532 ----
bool pretty = PG_GETARG_BOOL(1);
int prettyFlags;
! prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT)));
}
*** a/src/test/regress/expected/aggregates.out
--- b/src/test/regress/expected/aggregates.out
***************
*** 943,951 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! --------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
--- 943,952 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
***************
*** 959,967 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
(1 row)
create or replace view agg_view1 as
--- 960,969 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! -------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
(1 row)
create or replace view agg_view1 as
***************
*** 975,983 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.b) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
(1 row)
create or replace view agg_view1 as
--- 977,986 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! -------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.b) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
(1 row)
create or replace view agg_view1 as
***************
*** 990,998 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c ORDER BY (v.b + 1)) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
--- 993,1002 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c ORDER BY (v.b + 1)) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
***************
*** 1005,1013 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.a, v.c ORDER BY v.b) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
--- 1009,1018 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.a, v.c ORDER BY v.b) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
***************
*** 1020,1028 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c ORDER BY v.c USING ~<~ NULLS LAST) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
--- 1025,1034 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c ORDER BY v.c USING ~<~ NULLS LAST) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
***************
*** 1036,1044 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.a, v.c USING ~<~ NULLS LAST, v.b) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 2) i(i);
(1 row)
drop view agg_view1;
--- 1042,1051 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! -------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.a, v.c USING ~<~ NULLS LAST, v.b) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 2) i(i);
(1 row)
drop view agg_view1;
*** a/src/test/regress/expected/collate.out
--- b/src/test/regress/expected/collate.out
***************
*** 194,204 **** CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "POSIX") FROM collate_test10;
SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'collview%' ORDER BY 1;
! table_name | view_definition
! ------------+------------------------------------------------------------------------------------------------------------------------
! collview1 | SELECT collate_test1.a, collate_test1.b FROM collate_test1 WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text);
! collview2 | SELECT collate_test1.a, collate_test1.b FROM collate_test1 ORDER BY (collate_test1.b COLLATE "C");
! collview3 | SELECT collate_test10.a, lower(((collate_test10.x || collate_test10.x) COLLATE "POSIX")) AS lower FROM collate_test10;
(3 rows)
-- collation propagation in various expression types
--- 194,209 ----
CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "POSIX") FROM collate_test10;
SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'collview%' ORDER BY 1;
! table_name | view_definition
! ------------+----------------------------------------------------------------------------------------------------
! collview1 | SELECT collate_test1.a, collate_test1.b +
! | FROM collate_test1 +
! | WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text);
! collview2 | SELECT collate_test1.a, collate_test1.b +
! | FROM collate_test1 +
! | ORDER BY (collate_test1.b COLLATE "C");
! collview3 | SELECT collate_test10.a, lower(((collate_test10.x || collate_test10.x) COLLATE "POSIX")) AS lower+
! | FROM collate_test10;
(3 rows)
-- collation propagation in various expression types
*** a/src/test/regress/expected/rules.out
--- b/src/test/regress/expected/rules.out
***************
*** 1277,1344 **** drop table cchild;
-- Check that ruleutils are working
--
SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schema' ORDER BY viewname;
! viewname | definition
! ---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r WHERE (ih.thepath ## r.thepath);
! pg_available_extension_versions | SELECT e.name, e.version, (x.extname IS NOT NULL) AS installed, e.superuser, e.relocatable, e.schema, e.requires, e.comment FROM (pg_available_extension_versions() e(name, version, superuser, relocatable, schema, requires, comment) LEFT JOIN pg_extension x ON (((e.name = x.extname) AND (e.version = x.extversion))));
! pg_available_extensions | SELECT e.name, e.default_version, x.extversion AS installed_version, e.comment FROM (pg_available_extensions() e(name, default_version, comment) LEFT JOIN pg_extension x ON ((e.name = x.extname)));
! pg_cursors | SELECT c.name, c.statement, c.is_holdable, c.is_binary, c.is_scrollable, c.creation_time FROM pg_cursor() c(name, statement, is_holdable, is_binary, is_scrollable, creation_time);
! pg_group | SELECT pg_authid.rolname AS groname, pg_authid.oid AS grosysid, ARRAY(SELECT pg_auth_members.member FROM pg_auth_members WHERE (pg_auth_members.roleid = pg_authid.oid)) AS grolist FROM pg_authid WHERE (NOT pg_authid.rolcanlogin);
! pg_indexes | SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, t.spcname AS tablespace, pg_get_indexdef(i.oid) AS indexdef FROM ((((pg_index x JOIN pg_class c ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace))) WHERE ((c.relkind = 'r'::"char") AND (i.relkind = 'i'::"char"));
! pg_locks | SELECT l.locktype, l.database, l.relation, l.page, l.tuple, l.virtualxid, l.transactionid, l.classid, l.objid, l.objsubid, l.virtualtransaction, l.pid, l.mode, l.granted, l.fastpath FROM pg_lock_status() l(locktype, database, relation, page, tuple, virtualxid, transactionid, classid, objid, objsubid, virtualtransaction, pid, mode, granted, fastpath);
! pg_prepared_statements | SELECT p.name, p.statement, p.prepare_time, p.parameter_types, p.from_sql FROM pg_prepared_statement() p(name, statement, prepare_time, parameter_types, from_sql);
! pg_prepared_xacts | SELECT p.transaction, p.gid, p.prepared, u.rolname AS owner, d.datname AS database FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) LEFT JOIN pg_database d ON ((p.dbid = d.oid)));
! pg_roles | SELECT pg_authid.rolname, pg_authid.rolsuper, pg_authid.rolinherit, pg_authid.rolcreaterole, pg_authid.rolcreatedb, pg_authid.rolcatupdate, pg_authid.rolcanlogin, pg_authid.rolreplication, pg_authid.rolconnlimit, '********'::text AS rolpassword, pg_authid.rolvaliduntil, s.setconfig AS rolconfig, pg_authid.oid FROM (pg_authid LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid))));
! pg_rules | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition FROM ((pg_rewrite r JOIN pg_class c ON ((c.oid = r.ev_class))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name);
! pg_seclabels | (((((((((SELECT l.objoid, l.classoid, l.objsubid, CASE WHEN (rel.relkind = 'r'::"char") THEN 'table'::text WHEN (rel.relkind = 'v'::"char") THEN 'view'::text WHEN (rel.relkind = 'S'::"char") THEN 'sequence'::text WHEN (rel.relkind = 'f'::"char") THEN 'foreign table'::text ELSE NULL::text END AS objtype, rel.relnamespace AS objnamespace, CASE WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) END AS objname, l.provider, l.label FROM ((pg_seclabel l JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) WHERE (l.objsubid = 0) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'column'::text AS objtype, rel.relnamespace AS objnamespace, ((CASE WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) END || '.'::text) || (att.attname)::text) AS objname, l.provider, l.label FROM (((pg_seclabel l JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum)))) JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) WHERE (l.objsubid <> 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, CASE WHEN (pro.proisagg = true) THEN 'aggregate'::text WHEN (pro.proisagg = false) THEN 'function'::text ELSE NULL::text END AS objtype, pro.pronamespace AS objnamespace, (((CASE WHEN pg_function_is_visible(pro.oid) THEN quote_ident((pro.proname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((pro.proname)::text)) END || '('::text) || pg_get_function_arguments(pro.oid)) || ')'::text) AS objname, l.provider, l.label FROM ((pg_seclabel l JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid)))) JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, CASE WHEN (typ.typtype = 'd'::"char") THEN 'domain'::text ELSE 'type'::text END AS objtype, typ.typnamespace AS objnamespace, CASE WHEN pg_type_is_visible(typ.oid) THEN quote_ident((typ.typname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((typ.typname)::text)) END AS objname, l.provider, l.label FROM ((pg_seclabel l JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid)))) JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'large object'::text AS objtype, NULL::oid AS objnamespace, (l.objoid)::text AS objname, l.provider, l.label FROM (pg_seclabel l JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid))) WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0))) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'language'::text AS objtype, NULL::oid AS objnamespace, quote_ident((lan.lanname)::text) AS objname, l.provider, l.label FROM (pg_seclabel l JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid)))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'schema'::text AS objtype, nsp.oid AS objnamespace, quote_ident((nsp.nspname)::text) AS objname, l.provider, l.label FROM (pg_seclabel l JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid)))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'event trigger'::text AS objtype, NULL::oid AS objnamespace, quote_ident((evt.evtname)::text) AS objname, l.provider, l.label FROM (pg_seclabel l JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid)))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, 0 AS objsubid, 'database'::text AS objtype, NULL::oid AS objnamespace, quote_ident((dat.datname)::text) AS objname, l.provider, l.label FROM (pg_shseclabel l JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid))))) UNION ALL SELECT l.objoid, l.classoid, 0 AS objsubid, 'tablespace'::text AS objtype, NULL::oid AS objnamespace, quote_ident((spc.spcname)::text) AS objname, l.provider, l.label FROM (pg_shseclabel l JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid))))) UNION ALL SELECT l.objoid, l.classoid, 0 AS objsubid, 'role'::text AS objtype, NULL::oid AS objnamespace, quote_ident((rol.rolname)::text) AS objname, l.provider, l.label FROM (pg_shseclabel l JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
! pg_settings | SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val, a.enumvals, a.boot_val, a.reset_val, a.sourcefile, a.sourceline FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, sourcefile, sourceline);
! pg_shadow | SELECT pg_authid.rolname AS usename, pg_authid.oid AS usesysid, pg_authid.rolcreatedb AS usecreatedb, pg_authid.rolsuper AS usesuper, pg_authid.rolcatupdate AS usecatupd, pg_authid.rolreplication AS userepl, pg_authid.rolpassword AS passwd, (pg_authid.rolvaliduntil)::abstime AS valuntil, s.setconfig AS useconfig FROM (pg_authid LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid)))) WHERE pg_authid.rolcanlogin;
! pg_stat_activity | SELECT s.datid, d.datname, s.pid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_hostname, s.client_port, s.backend_start, s.xact_start, s.query_start, s.state_change, s.waiting, s.state, s.query FROM pg_database d, pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, waiting, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port), pg_authid u WHERE ((s.datid = d.oid) AND (s.usesysid = u.oid));
! pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch FROM (((pg_class c JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
! pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_numscans(c.oid) AS seq_scan, pg_stat_get_tuples_returned(c.oid) AS seq_tup_read, (sum(pg_stat_get_numscans(i.indexrelid)))::bigint AS idx_scan, ((sum(pg_stat_get_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_tuples_fetched(c.oid)) AS idx_tup_fetch, pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_tuples_deleted(c.oid) AS n_tup_del, pg_stat_get_tuples_hot_updated(c.oid) AS n_tup_hot_upd, pg_stat_get_live_tuples(c.oid) AS n_live_tup, pg_stat_get_dead_tuples(c.oid) AS n_dead_tup, pg_stat_get_last_vacuum_time(c.oid) AS last_vacuum, pg_stat_get_last_autovacuum_time(c.oid) AS last_autovacuum, pg_stat_get_last_analyze_time(c.oid) AS last_analyze, pg_stat_get_last_autoanalyze_time(c.oid) AS last_autoanalyze, pg_stat_get_vacuum_count(c.oid) AS vacuum_count, pg_stat_get_autovacuum_count(c.oid) AS autovacuum_count, pg_stat_get_analyze_count(c.oid) AS analyze_count, pg_stat_get_autoanalyze_count(c.oid) AS autoanalyze_count FROM ((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) GROUP BY c.oid, n.nspname, c.relname;
! pg_stat_bgwriter | SELECT pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, pg_stat_get_checkpoint_write_time() AS checkpoint_write_time, pg_stat_get_checkpoint_sync_time() AS checkpoint_sync_time, pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint, pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, pg_stat_get_buf_written_backend() AS buffers_backend, pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync, pg_stat_get_buf_alloc() AS buffers_alloc, pg_stat_get_bgwriter_stat_reset_time() AS stats_reset;
! pg_stat_database | SELECT d.oid AS datid, d.datname, pg_stat_get_db_numbackends(d.oid) AS numbackends, pg_stat_get_db_xact_commit(d.oid) AS xact_commit, pg_stat_get_db_xact_rollback(d.oid) AS xact_rollback, (pg_stat_get_db_blocks_fetched(d.oid) - pg_stat_get_db_blocks_hit(d.oid)) AS blks_read, pg_stat_get_db_blocks_hit(d.oid) AS blks_hit, pg_stat_get_db_tuples_returned(d.oid) AS tup_returned, pg_stat_get_db_tuples_fetched(d.oid) AS tup_fetched, pg_stat_get_db_tuples_inserted(d.oid) AS tup_inserted, pg_stat_get_db_tuples_updated(d.oid) AS tup_updated, pg_stat_get_db_tuples_deleted(d.oid) AS tup_deleted, pg_stat_get_db_conflict_all(d.oid) AS conflicts, pg_stat_get_db_temp_files(d.oid) AS temp_files, pg_stat_get_db_temp_bytes(d.oid) AS temp_bytes, pg_stat_get_db_deadlocks(d.oid) AS deadlocks, pg_stat_get_db_blk_read_time(d.oid) AS blk_read_time, pg_stat_get_db_blk_write_time(d.oid) AS blk_write_time, pg_stat_get_db_stat_reset_time(d.oid) AS stats_reset FROM pg_database d;
! pg_stat_database_conflicts | SELECT d.oid AS datid, d.datname, pg_stat_get_db_conflict_tablespace(d.oid) AS confl_tablespace, pg_stat_get_db_conflict_lock(d.oid) AS confl_lock, pg_stat_get_db_conflict_snapshot(d.oid) AS confl_snapshot, pg_stat_get_db_conflict_bufferpin(d.oid) AS confl_bufferpin, pg_stat_get_db_conflict_startup_deadlock(d.oid) AS confl_deadlock FROM pg_database d;
! pg_stat_replication | SELECT s.pid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_hostname, s.client_port, s.backend_start, w.state, w.sent_location, w.write_location, w.flush_location, w.replay_location, w.sync_priority, w.sync_state FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, waiting, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port), pg_authid u, pg_stat_get_wal_senders() w(pid, state, sent_location, write_location, flush_location, replay_location, sync_priority, sync_state) WHERE ((s.usesysid = u.oid) AND (s.pid = w.pid));
! pg_stat_sys_indexes | SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, pg_stat_all_indexes.relname, pg_stat_all_indexes.indexrelname, pg_stat_all_indexes.idx_scan, pg_stat_all_indexes.idx_tup_read, pg_stat_all_indexes.idx_tup_fetch FROM pg_stat_all_indexes WHERE ((pg_stat_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_indexes.schemaname ~ '^pg_toast'::text));
! pg_stat_sys_tables | SELECT pg_stat_all_tables.relid, pg_stat_all_tables.schemaname, pg_stat_all_tables.relname, pg_stat_all_tables.seq_scan, pg_stat_all_tables.seq_tup_read, pg_stat_all_tables.idx_scan, pg_stat_all_tables.idx_tup_fetch, pg_stat_all_tables.n_tup_ins, pg_stat_all_tables.n_tup_upd, pg_stat_all_tables.n_tup_del, pg_stat_all_tables.n_tup_hot_upd, pg_stat_all_tables.n_live_tup, pg_stat_all_tables.n_dead_tup, pg_stat_all_tables.last_vacuum, pg_stat_all_tables.last_autovacuum, pg_stat_all_tables.last_analyze, pg_stat_all_tables.last_autoanalyze, pg_stat_all_tables.vacuum_count, pg_stat_all_tables.autovacuum_count, pg_stat_all_tables.analyze_count, pg_stat_all_tables.autoanalyze_count FROM pg_stat_all_tables WHERE ((pg_stat_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_tables.schemaname ~ '^pg_toast'::text));
! pg_stat_user_functions | SELECT p.oid AS funcid, n.nspname AS schemaname, p.proname AS funcname, pg_stat_get_function_calls(p.oid) AS calls, pg_stat_get_function_total_time(p.oid) AS total_time, pg_stat_get_function_self_time(p.oid) AS self_time FROM (pg_proc p LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_function_calls(p.oid) IS NOT NULL));
! pg_stat_user_indexes | SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, pg_stat_all_indexes.relname, pg_stat_all_indexes.indexrelname, pg_stat_all_indexes.idx_scan, pg_stat_all_indexes.idx_tup_read, pg_stat_all_indexes.idx_tup_fetch FROM pg_stat_all_indexes WHERE ((pg_stat_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_indexes.schemaname !~ '^pg_toast'::text));
! pg_stat_user_tables | SELECT pg_stat_all_tables.relid, pg_stat_all_tables.schemaname, pg_stat_all_tables.relname, pg_stat_all_tables.seq_scan, pg_stat_all_tables.seq_tup_read, pg_stat_all_tables.idx_scan, pg_stat_all_tables.idx_tup_fetch, pg_stat_all_tables.n_tup_ins, pg_stat_all_tables.n_tup_upd, pg_stat_all_tables.n_tup_del, pg_stat_all_tables.n_tup_hot_upd, pg_stat_all_tables.n_live_tup, pg_stat_all_tables.n_dead_tup, pg_stat_all_tables.last_vacuum, pg_stat_all_tables.last_autovacuum, pg_stat_all_tables.last_analyze, pg_stat_all_tables.last_autoanalyze, pg_stat_all_tables.vacuum_count, pg_stat_all_tables.autovacuum_count, pg_stat_all_tables.analyze_count, pg_stat_all_tables.autoanalyze_count FROM pg_stat_all_tables WHERE ((pg_stat_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_tables.schemaname !~ '^pg_toast'::text));
! pg_stat_xact_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_xact_numscans(c.oid) AS seq_scan, pg_stat_get_xact_tuples_returned(c.oid) AS seq_tup_read, (sum(pg_stat_get_xact_numscans(i.indexrelid)))::bigint AS idx_scan, ((sum(pg_stat_get_xact_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_xact_tuples_fetched(c.oid)) AS idx_tup_fetch, pg_stat_get_xact_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_xact_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_xact_tuples_deleted(c.oid) AS n_tup_del, pg_stat_get_xact_tuples_hot_updated(c.oid) AS n_tup_hot_upd FROM ((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) GROUP BY c.oid, n.nspname, c.relname;
! pg_stat_xact_sys_tables | SELECT pg_stat_xact_all_tables.relid, pg_stat_xact_all_tables.schemaname, pg_stat_xact_all_tables.relname, pg_stat_xact_all_tables.seq_scan, pg_stat_xact_all_tables.seq_tup_read, pg_stat_xact_all_tables.idx_scan, pg_stat_xact_all_tables.idx_tup_fetch, pg_stat_xact_all_tables.n_tup_ins, pg_stat_xact_all_tables.n_tup_upd, pg_stat_xact_all_tables.n_tup_del, pg_stat_xact_all_tables.n_tup_hot_upd FROM pg_stat_xact_all_tables WHERE ((pg_stat_xact_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_xact_all_tables.schemaname ~ '^pg_toast'::text));
! pg_stat_xact_user_functions | SELECT p.oid AS funcid, n.nspname AS schemaname, p.proname AS funcname, pg_stat_get_xact_function_calls(p.oid) AS calls, pg_stat_get_xact_function_total_time(p.oid) AS total_time, pg_stat_get_xact_function_self_time(p.oid) AS self_time FROM (pg_proc p LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_xact_function_calls(p.oid) IS NOT NULL));
! pg_stat_xact_user_tables | SELECT pg_stat_xact_all_tables.relid, pg_stat_xact_all_tables.schemaname, pg_stat_xact_all_tables.relname, pg_stat_xact_all_tables.seq_scan, pg_stat_xact_all_tables.seq_tup_read, pg_stat_xact_all_tables.idx_scan, pg_stat_xact_all_tables.idx_tup_fetch, pg_stat_xact_all_tables.n_tup_ins, pg_stat_xact_all_tables.n_tup_upd, pg_stat_xact_all_tables.n_tup_del, pg_stat_xact_all_tables.n_tup_hot_upd FROM pg_stat_xact_all_tables WHERE ((pg_stat_xact_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_xact_all_tables.schemaname !~ '^pg_toast'::text));
! pg_statio_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, (pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read, pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit FROM (((pg_class c JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
! pg_statio_all_sequences | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS blks_read, pg_stat_get_blocks_hit(c.oid) AS blks_hit FROM (pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'S'::"char");
! pg_statio_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS heap_blks_read, pg_stat_get_blocks_hit(c.oid) AS heap_blks_hit, (sum((pg_stat_get_blocks_fetched(i.indexrelid) - pg_stat_get_blocks_hit(i.indexrelid))))::bigint AS idx_blks_read, (sum(pg_stat_get_blocks_hit(i.indexrelid)))::bigint AS idx_blks_hit, (pg_stat_get_blocks_fetched(t.oid) - pg_stat_get_blocks_hit(t.oid)) AS toast_blks_read, pg_stat_get_blocks_hit(t.oid) AS toast_blks_hit, (pg_stat_get_blocks_fetched(x.oid) - pg_stat_get_blocks_hit(x.oid)) AS tidx_blks_read, pg_stat_get_blocks_hit(x.oid) AS tidx_blks_hit FROM ((((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid))) LEFT JOIN pg_class x ON ((t.reltoastidxid = x.oid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) GROUP BY c.oid, n.nspname, c.relname, t.oid, x.oid;
! pg_statio_sys_indexes | SELECT pg_statio_all_indexes.relid, pg_statio_all_indexes.indexrelid, pg_statio_all_indexes.schemaname, pg_statio_all_indexes.relname, pg_statio_all_indexes.indexrelname, pg_statio_all_indexes.idx_blks_read, pg_statio_all_indexes.idx_blks_hit FROM pg_statio_all_indexes WHERE ((pg_statio_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_indexes.schemaname ~ '^pg_toast'::text));
! pg_statio_sys_sequences | SELECT pg_statio_all_sequences.relid, pg_statio_all_sequences.schemaname, pg_statio_all_sequences.relname, pg_statio_all_sequences.blks_read, pg_statio_all_sequences.blks_hit FROM pg_statio_all_sequences WHERE ((pg_statio_all_sequences.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_sequences.schemaname ~ '^pg_toast'::text));
! pg_statio_sys_tables | SELECT pg_statio_all_tables.relid, pg_statio_all_tables.schemaname, pg_statio_all_tables.relname, pg_statio_all_tables.heap_blks_read, pg_statio_all_tables.heap_blks_hit, pg_statio_all_tables.idx_blks_read, pg_statio_all_tables.idx_blks_hit, pg_statio_all_tables.toast_blks_read, pg_statio_all_tables.toast_blks_hit, pg_statio_all_tables.tidx_blks_read, pg_statio_all_tables.tidx_blks_hit FROM pg_statio_all_tables WHERE ((pg_statio_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_tables.schemaname ~ '^pg_toast'::text));
! pg_statio_user_indexes | SELECT pg_statio_all_indexes.relid, pg_statio_all_indexes.indexrelid, pg_statio_all_indexes.schemaname, pg_statio_all_indexes.relname, pg_statio_all_indexes.indexrelname, pg_statio_all_indexes.idx_blks_read, pg_statio_all_indexes.idx_blks_hit FROM pg_statio_all_indexes WHERE ((pg_statio_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_indexes.schemaname !~ '^pg_toast'::text));
! pg_statio_user_sequences | SELECT pg_statio_all_sequences.relid, pg_statio_all_sequences.schemaname, pg_statio_all_sequences.relname, pg_statio_all_sequences.blks_read, pg_statio_all_sequences.blks_hit FROM pg_statio_all_sequences WHERE ((pg_statio_all_sequences.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_sequences.schemaname !~ '^pg_toast'::text));
! pg_statio_user_tables | SELECT pg_statio_all_tables.relid, pg_statio_all_tables.schemaname, pg_statio_all_tables.relname, pg_statio_all_tables.heap_blks_read, pg_statio_all_tables.heap_blks_hit, pg_statio_all_tables.idx_blks_read, pg_statio_all_tables.idx_blks_hit, pg_statio_all_tables.toast_blks_read, pg_statio_all_tables.toast_blks_hit, pg_statio_all_tables.tidx_blks_read, pg_statio_all_tables.tidx_blks_hit FROM pg_statio_all_tables WHERE ((pg_statio_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_tables.schemaname !~ '^pg_toast'::text));
! pg_stats | SELECT n.nspname AS schemaname, c.relname AS tablename, a.attname, s.stainherit AS inherited, s.stanullfrac AS null_frac, s.stawidth AS avg_width, s.stadistinct AS n_distinct, CASE WHEN (s.stakind1 = 1) THEN s.stavalues1 WHEN (s.stakind2 = 1) THEN s.stavalues2 WHEN (s.stakind3 = 1) THEN s.stavalues3 WHEN (s.stakind4 = 1) THEN s.stavalues4 WHEN (s.stakind5 = 1) THEN s.stavalues5 ELSE NULL::anyarray END AS most_common_vals, CASE WHEN (s.stakind1 = 1) THEN s.stanumbers1 WHEN (s.stakind2 = 1) THEN s.stanumbers2 WHEN (s.stakind3 = 1) THEN s.stanumbers3 WHEN (s.stakind4 = 1) THEN s.stanumbers4 WHEN (s.stakind5 = 1) THEN s.stanumbers5 ELSE NULL::real[] END AS most_common_freqs, CASE WHEN (s.stakind1 = 2) THEN s.stavalues1 WHEN (s.stakind2 = 2) THEN s.stavalues2 WHEN (s.stakind3 = 2) THEN s.stavalues3 WHEN (s.stakind4 = 2) THEN s.stavalues4 WHEN (s.stakind5 = 2) THEN s.stavalues5 ELSE NULL::anyarray END AS histogram_bounds, CASE WHEN (s.stakind1 = 3) THEN s.stanumbers1[1] WHEN (s.stakind2 = 3) THEN s.stanumbers2[1] WHEN (s.stakind3 = 3) THEN s.stanumbers3[1] WHEN (s.stakind4 = 3) THEN s.stanumbers4[1] WHEN (s.stakind5 = 3) THEN s.stanumbers5[1] ELSE NULL::real END AS correlation, CASE WHEN (s.stakind1 = 4) THEN s.stavalues1 WHEN (s.stakind2 = 4) THEN s.stavalues2 WHEN (s.stakind3 = 4) THEN s.stavalues3 WHEN (s.stakind4 = 4) THEN s.stavalues4 WHEN (s.stakind5 = 4) THEN s.stavalues5 ELSE NULL::anyarray END AS most_common_elems, CASE WHEN (s.stakind1 = 4) THEN s.stanumbers1 WHEN (s.stakind2 = 4) THEN s.stanumbers2 WHEN (s.stakind3 = 4) THEN s.stanumbers3 WHEN (s.stakind4 = 4) THEN s.stanumbers4 WHEN (s.stakind5 = 4) THEN s.stanumbers5 ELSE NULL::real[] END AS most_common_elem_freqs, CASE WHEN (s.stakind1 = 5) THEN s.stanumbers1 WHEN (s.stakind2 = 5) THEN s.stanumbers2 WHEN (s.stakind3 = 5) THEN s.stanumbers3 WHEN (s.stakind4 = 5) THEN s.stanumbers4 WHEN (s.stakind5 = 5) THEN s.stanumbers5 ELSE NULL::real[] END AS elem_count_histogram FROM (((pg_statistic s JOIN pg_class c ON ((c.oid = s.starelid))) JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum)))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE ((NOT a.attisdropped) AND has_column_privilege(c.oid, a.attnum, 'select'::text));
! pg_tables | SELECT n.nspname AS schemaname, c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS tablespace, c.relhasindex AS hasindexes, c.relhasrules AS hasrules, c.relhastriggers AS hastriggers FROM ((pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace))) WHERE (c.relkind = 'r'::"char");
! pg_timezone_abbrevs | SELECT pg_timezone_abbrevs.abbrev, pg_timezone_abbrevs.utc_offset, pg_timezone_abbrevs.is_dst FROM pg_timezone_abbrevs() pg_timezone_abbrevs(abbrev, utc_offset, is_dst);
! pg_timezone_names | SELECT pg_timezone_names.name, pg_timezone_names.abbrev, pg_timezone_names.utc_offset, pg_timezone_names.is_dst FROM pg_timezone_names() pg_timezone_names(name, abbrev, utc_offset, is_dst);
! pg_user | SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb, pg_shadow.usesuper, pg_shadow.usecatupd, pg_shadow.userepl, '********'::text AS passwd, pg_shadow.valuntil, pg_shadow.useconfig FROM pg_shadow;
! pg_user_mappings | SELECT u.oid AS umid, s.oid AS srvid, s.srvname, u.umuser, CASE WHEN (u.umuser = (0)::oid) THEN 'public'::name ELSE a.rolname END AS usename, CASE WHEN (pg_has_role(s.srvowner, 'USAGE'::text) OR has_server_privilege(s.oid, 'USAGE'::text)) THEN u.umoptions ELSE NULL::text[] END AS umoptions FROM ((pg_user_mapping u LEFT JOIN pg_authid a ON ((a.oid = u.umuser))) JOIN pg_foreign_server s ON ((u.umserver = s.oid)));
! pg_views | 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");
! rtest_v1 | SELECT rtest_t1.a, rtest_t1.b FROM rtest_t1;
! rtest_vcomp | SELECT x.part, (x.size * y.factor) AS size_in_cm FROM rtest_comp x, rtest_unitfact y WHERE (x.unit = y.unit);
! rtest_vview1 | SELECT x.a, x.b FROM rtest_view1 x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y WHERE (y.a = x.a)));
! rtest_vview2 | SELECT rtest_view1.a, rtest_view1.b FROM rtest_view1 WHERE rtest_view1.v;
! rtest_vview3 | SELECT x.a, x.b FROM rtest_vview2 x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y WHERE (y.a = x.a)));
! rtest_vview4 | SELECT x.a, x.b, count(y.a) AS refcount FROM rtest_view1 x, rtest_view2 y WHERE (x.a = y.a) GROUP BY x.a, x.b;
! rtest_vview5 | SELECT rtest_view1.a, rtest_view1.b, rtest_viewfunc1(rtest_view1.a) AS refcount FROM rtest_view1;
! shoe | SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit FROM shoe_data sh, unit un WHERE (sh.slunit = un.un_name);
! shoe_ready | SELECT rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail FROM shoe rsh, shoelace rsl WHERE (((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >= rsh.slminlen_cm)) AND (rsl.sl_len_cm <= rsh.slmaxlen_cm));
! shoelace | SELECT s.sl_name, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, (s.sl_len * u.un_fact) AS sl_len_cm FROM shoelace_data s, unit u WHERE (s.sl_unit = u.un_name);
! shoelace_candelete | SELECT shoelace_obsolete.sl_name, shoelace_obsolete.sl_avail, shoelace_obsolete.sl_color, shoelace_obsolete.sl_len, shoelace_obsolete.sl_unit, shoelace_obsolete.sl_len_cm FROM shoelace_obsolete WHERE (shoelace_obsolete.sl_avail = 0);
! shoelace_obsolete | SELECT shoelace.sl_name, shoelace.sl_avail, shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm FROM shoelace WHERE (NOT (EXISTS (SELECT shoe.shoename FROM shoe WHERE (shoe.slcolor = shoelace.sl_color))));
! street | SELECT r.name, r.thepath, c.cname FROM ONLY road r, real_city c WHERE (c.outline ## r.thepath);
! toyemp | SELECT emp.name, emp.age, emp.location, (12 * emp.salary) AS annualsal FROM emp;
(60 rows)
SELECT tablename, rulename, definition FROM pg_rules
--- 1277,1643 ----
-- Check that ruleutils are working
--
SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schema' ORDER BY viewname;
! viewname | definition
! ---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit +
! | FROM ihighway ih, ramp r +
! | WHERE (ih.thepath ## r.thepath);
! pg_available_extension_versions | SELECT e.name, e.version, (x.extname IS NOT NULL) AS installed, e.superuser, e.relocatable, e.schema, e.requires, e.comment +
! | FROM (pg_available_extension_versions() e(name, version, superuser, relocatable, schema, requires, comment) +
! | LEFT JOIN pg_extension x ON (((e.name = x.extname) AND (e.version = x.extversion))));
! pg_available_extensions | SELECT e.name, e.default_version, x.extversion AS installed_version, e.comment +
! | FROM (pg_available_extensions() e(name, default_version, comment) +
! | LEFT JOIN pg_extension x ON ((e.name = x.extname)));
! pg_cursors | SELECT c.name, c.statement, c.is_holdable, c.is_binary, c.is_scrollable, c.creation_time +
! | FROM pg_cursor() c(name, statement, is_holdable, is_binary, is_scrollable, creation_time);
! pg_group | SELECT pg_authid.rolname AS groname, pg_authid.oid AS grosysid, ARRAY( SELECT pg_auth_members.member +
! | FROM pg_auth_members +
! | WHERE (pg_auth_members.roleid = pg_authid.oid)) AS grolist +
! | FROM pg_authid +
! | WHERE (NOT pg_authid.rolcanlogin);
! pg_indexes | SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, t.spcname AS tablespace, pg_get_indexdef(i.oid) AS indexdef +
! | FROM ((((pg_index x +
! | JOIN pg_class c ON ((c.oid = x.indrelid))) +
! | JOIN pg_class i ON ((i.oid = x.indexrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace))) +
! | WHERE ((c.relkind = 'r'::"char") AND (i.relkind = 'i'::"char"));
! pg_locks | SELECT l.locktype, l.database, l.relation, l.page, l.tuple, l.virtualxid, l.transactionid, l.classid, l.objid, l.objsubid, l.virtualtransaction, l.pid, l.mode, l.granted, l.fastpath +
! | FROM pg_lock_status() l(locktype, database, relation, page, tuple, virtualxid, transactionid, classid, objid, objsubid, virtualtransaction, pid, mode, granted, fastpath);
! pg_prepared_statements | SELECT p.name, p.statement, p.prepare_time, p.parameter_types, p.from_sql +
! | FROM pg_prepared_statement() p(name, statement, prepare_time, parameter_types, from_sql);
! pg_prepared_xacts | SELECT p.transaction, p.gid, p.prepared, u.rolname AS owner, d.datname AS database +
! | FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) +
! | LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) +
! | LEFT JOIN pg_database d ON ((p.dbid = d.oid)));
! pg_roles | SELECT pg_authid.rolname, pg_authid.rolsuper, pg_authid.rolinherit, pg_authid.rolcreaterole, pg_authid.rolcreatedb, pg_authid.rolcatupdate, pg_authid.rolcanlogin, pg_authid.rolreplication, pg_authid.rolconnlimit, '********'::text AS rolpassword, pg_authid.rolvaliduntil, s.setconfig AS rolconfig, pg_authid.oid +
! | FROM (pg_authid +
! | LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid))));
! pg_rules | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition +
! | FROM ((pg_rewrite r +
! | JOIN pg_class c ON ((c.oid = r.ev_class))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (r.rulename <> '_RETURN'::name);
! pg_seclabels | ( ( ( ( ( ( ( ( ( SELECT l.objoid, l.classoid, l.objsubid, +
! | CASE +
! | WHEN (rel.relkind = 'r'::"char") THEN 'table'::text +
! | WHEN (rel.relkind = 'v'::"char") THEN 'view'::text +
! | WHEN (rel.relkind = 'S'::"char") THEN 'sequence'::text +
! | WHEN (rel.relkind = 'f'::"char") THEN 'foreign table'::text +
! | ELSE NULL::text +
! | END AS objtype, rel.relnamespace AS objnamespace, +
! | CASE +
! | WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) +
! | ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) +
! | END AS objname, l.provider, l.label +
! | FROM ((pg_seclabel l +
! | JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) +
! | JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) +
! | WHERE (l.objsubid = 0) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'column'::text AS objtype, rel.relnamespace AS objnamespace, (( +
! | CASE +
! | WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) +
! | ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) +
! | END || '.'::text) || (att.attname)::text) AS objname, l.provider, l.label +
! | FROM (((pg_seclabel l +
! | JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) +
! | JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum)))) +
! | JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) +
! | WHERE (l.objsubid <> 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, +
! | CASE +
! | WHEN (pro.proisagg = true) THEN 'aggregate'::text +
! | WHEN (pro.proisagg = false) THEN 'function'::text +
! | ELSE NULL::text +
! | END AS objtype, pro.pronamespace AS objnamespace, ((( +
! | CASE +
! | WHEN pg_function_is_visible(pro.oid) THEN quote_ident((pro.proname)::text) +
! | ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((pro.proname)::text)) +
! | END || '('::text) || pg_get_function_arguments(pro.oid)) || ')'::text) AS objname, l.provider, l.label +
! | FROM ((pg_seclabel l +
! | JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid)))) +
! | JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, +
! | CASE +
! | WHEN (typ.typtype = 'd'::"char") THEN 'domain'::text +
! | ELSE 'type'::text +
! | END AS objtype, typ.typnamespace AS objnamespace, +
! | CASE +
! | WHEN pg_type_is_visible(typ.oid) THEN quote_ident((typ.typname)::text) +
! | ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((typ.typname)::text)) +
! | END AS objname, l.provider, l.label +
! | FROM ((pg_seclabel l +
! | JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid)))) +
! | JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'large object'::text AS objtype, NULL::oid AS objnamespace, (l.objoid)::text AS objname, l.provider, l.label +
! | FROM (pg_seclabel l +
! | JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid))) +
! | WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0))) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'language'::text AS objtype, NULL::oid AS objnamespace, quote_ident((lan.lanname)::text) AS objname, l.provider, l.label +
! | FROM (pg_seclabel l +
! | JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid)))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'schema'::text AS objtype, nsp.oid AS objnamespace, quote_ident((nsp.nspname)::text) AS objname, l.provider, l.label +
! | FROM (pg_seclabel l +
! | JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid)))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'event trigger'::text AS objtype, NULL::oid AS objnamespace, quote_ident((evt.evtname)::text) AS objname, l.provider, l.label +
! | FROM (pg_seclabel l +
! | JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid)))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, 0 AS objsubid, 'database'::text AS objtype, NULL::oid AS objnamespace, quote_ident((dat.datname)::text) AS objname, l.provider, l.label +
! | FROM (pg_shseclabel l +
! | JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid))))) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, 0 AS objsubid, 'tablespace'::text AS objtype, NULL::oid AS objnamespace, quote_ident((spc.spcname)::text) AS objname, l.provider, l.label +
! | FROM (pg_shseclabel l +
! | JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid))))) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, 0 AS objsubid, 'role'::text AS objtype, NULL::oid AS objnamespace, quote_ident((rol.rolname)::text) AS objname, l.provider, l.label +
! | FROM (pg_shseclabel l +
! | JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
! pg_settings | SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val, a.enumvals, a.boot_val, a.reset_val, a.sourcefile, a.sourceline +
! | FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, sourcefile, sourceline);
! pg_shadow | SELECT pg_authid.rolname AS usename, pg_authid.oid AS usesysid, pg_authid.rolcreatedb AS usecreatedb, pg_authid.rolsuper AS usesuper, pg_authid.rolcatupdate AS usecatupd, pg_authid.rolreplication AS userepl, pg_authid.rolpassword AS passwd, (pg_authid.rolvaliduntil)::abstime AS valuntil, s.setconfig AS useconfig +
! | FROM (pg_authid +
! | LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid)))) +
! | WHERE pg_authid.rolcanlogin;
! pg_stat_activity | SELECT s.datid, d.datname, s.pid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_hostname, s.client_port, s.backend_start, s.xact_start, s.query_start, s.state_change, s.waiting, s.state, s.query +
! | FROM pg_database d, pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, waiting, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port), pg_authid u +
! | WHERE ((s.datid = d.oid) AND (s.usesysid = u.oid));
! pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch +
! | FROM (((pg_class c +
! | JOIN pg_index x ON ((c.oid = x.indrelid))) +
! | JOIN pg_class i ON ((i.oid = x.indexrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
! pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_numscans(c.oid) AS seq_scan, pg_stat_get_tuples_returned(c.oid) AS seq_tup_read, (sum(pg_stat_get_numscans(i.indexrelid)))::bigint AS idx_scan, ((sum(pg_stat_get_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_tuples_fetched(c.oid)) AS idx_tup_fetch, pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_tuples_deleted(c.oid) AS n_tup_del, pg_stat_get_tuples_hot_updated(c.oid) AS n_tup_hot_upd, pg_stat_get_live_tuples(c.oid) AS n_live_tup, pg_stat_get_dead_tuples(c.oid) AS n_dead_tup, pg_stat_get_last_vacuum_time(c.oid) AS last_vacuum, pg_stat_get_last_autovacuum_time(c.oid) AS last_autovacuum, pg_stat_get_last_analyze_time(c.oid) AS last_analyze, pg_stat_get_last_autoanalyze_time(c.oid) AS last_autoanalyze, pg_stat_get_vacuum_count(c.oid) AS vacuum_count, pg_stat_get_autovacuum_count(c.oid) AS autovacuum_count, pg_stat_get_analyze_count(c.oid) AS analyze_count, pg_stat_get_autoanalyze_count(c.oid) AS autoanalyze_count+
! | FROM ((pg_class c +
! | LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) +
! | GROUP BY c.oid, n.nspname, c.relname;
! pg_stat_bgwriter | SELECT pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, pg_stat_get_checkpoint_write_time() AS checkpoint_write_time, pg_stat_get_checkpoint_sync_time() AS checkpoint_sync_time, pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint, pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, pg_stat_get_buf_written_backend() AS buffers_backend, pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync, pg_stat_get_buf_alloc() AS buffers_alloc, pg_stat_get_bgwriter_stat_reset_time() AS stats_reset;
! pg_stat_database | SELECT d.oid AS datid, d.datname, pg_stat_get_db_numbackends(d.oid) AS numbackends, pg_stat_get_db_xact_commit(d.oid) AS xact_commit, pg_stat_get_db_xact_rollback(d.oid) AS xact_rollback, (pg_stat_get_db_blocks_fetched(d.oid) - pg_stat_get_db_blocks_hit(d.oid)) AS blks_read, pg_stat_get_db_blocks_hit(d.oid) AS blks_hit, pg_stat_get_db_tuples_returned(d.oid) AS tup_returned, pg_stat_get_db_tuples_fetched(d.oid) AS tup_fetched, pg_stat_get_db_tuples_inserted(d.oid) AS tup_inserted, pg_stat_get_db_tuples_updated(d.oid) AS tup_updated, pg_stat_get_db_tuples_deleted(d.oid) AS tup_deleted, pg_stat_get_db_conflict_all(d.oid) AS conflicts, pg_stat_get_db_temp_files(d.oid) AS temp_files, pg_stat_get_db_temp_bytes(d.oid) AS temp_bytes, pg_stat_get_db_deadlocks(d.oid) AS deadlocks, pg_stat_get_db_blk_read_time(d.oid) AS blk_read_time, pg_stat_get_db_blk_write_time(d.oid) AS blk_write_time, pg_stat_get_db_stat_reset_time(d.oid) AS stats_reset +
! | FROM pg_database d;
! pg_stat_database_conflicts | SELECT d.oid AS datid, d.datname, pg_stat_get_db_conflict_tablespace(d.oid) AS confl_tablespace, pg_stat_get_db_conflict_lock(d.oid) AS confl_lock, pg_stat_get_db_conflict_snapshot(d.oid) AS confl_snapshot, pg_stat_get_db_conflict_bufferpin(d.oid) AS confl_bufferpin, pg_stat_get_db_conflict_startup_deadlock(d.oid) AS confl_deadlock +
! | FROM pg_database d;
! pg_stat_replication | SELECT s.pid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_hostname, s.client_port, s.backend_start, w.state, w.sent_location, w.write_location, w.flush_location, w.replay_location, w.sync_priority, w.sync_state +
! | FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, waiting, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port), pg_authid u, pg_stat_get_wal_senders() w(pid, state, sent_location, write_location, flush_location, replay_location, sync_priority, sync_state) +
! | WHERE ((s.usesysid = u.oid) AND (s.pid = w.pid));
! pg_stat_sys_indexes | SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, pg_stat_all_indexes.relname, pg_stat_all_indexes.indexrelname, pg_stat_all_indexes.idx_scan, pg_stat_all_indexes.idx_tup_read, pg_stat_all_indexes.idx_tup_fetch +
! | FROM pg_stat_all_indexes +
! | WHERE ((pg_stat_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_indexes.schemaname ~ '^pg_toast'::text));
! pg_stat_sys_tables | SELECT pg_stat_all_tables.relid, pg_stat_all_tables.schemaname, pg_stat_all_tables.relname, pg_stat_all_tables.seq_scan, pg_stat_all_tables.seq_tup_read, pg_stat_all_tables.idx_scan, pg_stat_all_tables.idx_tup_fetch, pg_stat_all_tables.n_tup_ins, pg_stat_all_tables.n_tup_upd, pg_stat_all_tables.n_tup_del, pg_stat_all_tables.n_tup_hot_upd, pg_stat_all_tables.n_live_tup, pg_stat_all_tables.n_dead_tup, pg_stat_all_tables.last_vacuum, pg_stat_all_tables.last_autovacuum, pg_stat_all_tables.last_analyze, pg_stat_all_tables.last_autoanalyze, pg_stat_all_tables.vacuum_count, pg_stat_all_tables.autovacuum_count, pg_stat_all_tables.analyze_count, pg_stat_all_tables.autoanalyze_count +
! | FROM pg_stat_all_tables +
! | WHERE ((pg_stat_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_tables.schemaname ~ '^pg_toast'::text));
! pg_stat_user_functions | SELECT p.oid AS funcid, n.nspname AS schemaname, p.proname AS funcname, pg_stat_get_function_calls(p.oid) AS calls, pg_stat_get_function_total_time(p.oid) AS total_time, pg_stat_get_function_self_time(p.oid) AS self_time +
! | FROM (pg_proc p +
! | LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) +
! | WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_function_calls(p.oid) IS NOT NULL));
! pg_stat_user_indexes | SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, pg_stat_all_indexes.relname, pg_stat_all_indexes.indexrelname, pg_stat_all_indexes.idx_scan, pg_stat_all_indexes.idx_tup_read, pg_stat_all_indexes.idx_tup_fetch +
! | FROM pg_stat_all_indexes +
! | WHERE ((pg_stat_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_indexes.schemaname !~ '^pg_toast'::text));
! pg_stat_user_tables | SELECT pg_stat_all_tables.relid, pg_stat_all_tables.schemaname, pg_stat_all_tables.relname, pg_stat_all_tables.seq_scan, pg_stat_all_tables.seq_tup_read, pg_stat_all_tables.idx_scan, pg_stat_all_tables.idx_tup_fetch, pg_stat_all_tables.n_tup_ins, pg_stat_all_tables.n_tup_upd, pg_stat_all_tables.n_tup_del, pg_stat_all_tables.n_tup_hot_upd, pg_stat_all_tables.n_live_tup, pg_stat_all_tables.n_dead_tup, pg_stat_all_tables.last_vacuum, pg_stat_all_tables.last_autovacuum, pg_stat_all_tables.last_analyze, pg_stat_all_tables.last_autoanalyze, pg_stat_all_tables.vacuum_count, pg_stat_all_tables.autovacuum_count, pg_stat_all_tables.analyze_count, pg_stat_all_tables.autoanalyze_count +
! | FROM pg_stat_all_tables +
! | WHERE ((pg_stat_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_tables.schemaname !~ '^pg_toast'::text));
! pg_stat_xact_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_xact_numscans(c.oid) AS seq_scan, pg_stat_get_xact_tuples_returned(c.oid) AS seq_tup_read, (sum(pg_stat_get_xact_numscans(i.indexrelid)))::bigint AS idx_scan, ((sum(pg_stat_get_xact_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_xact_tuples_fetched(c.oid)) AS idx_tup_fetch, pg_stat_get_xact_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_xact_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_xact_tuples_deleted(c.oid) AS n_tup_del, pg_stat_get_xact_tuples_hot_updated(c.oid) AS n_tup_hot_upd +
! | FROM ((pg_class c +
! | LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) +
! | GROUP BY c.oid, n.nspname, c.relname;
! pg_stat_xact_sys_tables | SELECT pg_stat_xact_all_tables.relid, pg_stat_xact_all_tables.schemaname, pg_stat_xact_all_tables.relname, pg_stat_xact_all_tables.seq_scan, pg_stat_xact_all_tables.seq_tup_read, pg_stat_xact_all_tables.idx_scan, pg_stat_xact_all_tables.idx_tup_fetch, pg_stat_xact_all_tables.n_tup_ins, pg_stat_xact_all_tables.n_tup_upd, pg_stat_xact_all_tables.n_tup_del, pg_stat_xact_all_tables.n_tup_hot_upd +
! | FROM pg_stat_xact_all_tables +
! | WHERE ((pg_stat_xact_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_xact_all_tables.schemaname ~ '^pg_toast'::text));
! pg_stat_xact_user_functions | SELECT p.oid AS funcid, n.nspname AS schemaname, p.proname AS funcname, pg_stat_get_xact_function_calls(p.oid) AS calls, pg_stat_get_xact_function_total_time(p.oid) AS total_time, pg_stat_get_xact_function_self_time(p.oid) AS self_time +
! | FROM (pg_proc p +
! | LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) +
! | WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_xact_function_calls(p.oid) IS NOT NULL));
! pg_stat_xact_user_tables | SELECT pg_stat_xact_all_tables.relid, pg_stat_xact_all_tables.schemaname, pg_stat_xact_all_tables.relname, pg_stat_xact_all_tables.seq_scan, pg_stat_xact_all_tables.seq_tup_read, pg_stat_xact_all_tables.idx_scan, pg_stat_xact_all_tables.idx_tup_fetch, pg_stat_xact_all_tables.n_tup_ins, pg_stat_xact_all_tables.n_tup_upd, pg_stat_xact_all_tables.n_tup_del, pg_stat_xact_all_tables.n_tup_hot_upd +
! | FROM pg_stat_xact_all_tables +
! | WHERE ((pg_stat_xact_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_xact_all_tables.schemaname !~ '^pg_toast'::text));
! pg_statio_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, (pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read, pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit +
! | FROM (((pg_class c +
! | JOIN pg_index x ON ((c.oid = x.indrelid))) +
! | JOIN pg_class i ON ((i.oid = x.indexrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
! pg_statio_all_sequences | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS blks_read, pg_stat_get_blocks_hit(c.oid) AS blks_hit +
! | FROM (pg_class c +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = 'S'::"char");
! pg_statio_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS heap_blks_read, pg_stat_get_blocks_hit(c.oid) AS heap_blks_hit, (sum((pg_stat_get_blocks_fetched(i.indexrelid) - pg_stat_get_blocks_hit(i.indexrelid))))::bigint AS idx_blks_read, (sum(pg_stat_get_blocks_hit(i.indexrelid)))::bigint AS idx_blks_hit, (pg_stat_get_blocks_fetched(t.oid) - pg_stat_get_blocks_hit(t.oid)) AS toast_blks_read, pg_stat_get_blocks_hit(t.oid) AS toast_blks_hit, (pg_stat_get_blocks_fetched(x.oid) - pg_stat_get_blocks_hit(x.oid)) AS tidx_blks_read, pg_stat_get_blocks_hit(x.oid) AS tidx_blks_hit +
! | FROM ((((pg_class c +
! | LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) +
! | LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid))) +
! | LEFT JOIN pg_class x ON ((t.reltoastidxid = x.oid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) +
! | GROUP BY c.oid, n.nspname, c.relname, t.oid, x.oid;
! pg_statio_sys_indexes | SELECT pg_statio_all_indexes.relid, pg_statio_all_indexes.indexrelid, pg_statio_all_indexes.schemaname, pg_statio_all_indexes.relname, pg_statio_all_indexes.indexrelname, pg_statio_all_indexes.idx_blks_read, pg_statio_all_indexes.idx_blks_hit +
! | FROM pg_statio_all_indexes +
! | WHERE ((pg_statio_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_indexes.schemaname ~ '^pg_toast'::text));
! pg_statio_sys_sequences | SELECT pg_statio_all_sequences.relid, pg_statio_all_sequences.schemaname, pg_statio_all_sequences.relname, pg_statio_all_sequences.blks_read, pg_statio_all_sequences.blks_hit +
! | FROM pg_statio_all_sequences +
! | WHERE ((pg_statio_all_sequences.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_sequences.schemaname ~ '^pg_toast'::text));
! pg_statio_sys_tables | SELECT pg_statio_all_tables.relid, pg_statio_all_tables.schemaname, pg_statio_all_tables.relname, pg_statio_all_tables.heap_blks_read, pg_statio_all_tables.heap_blks_hit, pg_statio_all_tables.idx_blks_read, pg_statio_all_tables.idx_blks_hit, pg_statio_all_tables.toast_blks_read, pg_statio_all_tables.toast_blks_hit, pg_statio_all_tables.tidx_blks_read, pg_statio_all_tables.tidx_blks_hit +
! | FROM pg_statio_all_tables +
! | WHERE ((pg_statio_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_tables.schemaname ~ '^pg_toast'::text));
! pg_statio_user_indexes | SELECT pg_statio_all_indexes.relid, pg_statio_all_indexes.indexrelid, pg_statio_all_indexes.schemaname, pg_statio_all_indexes.relname, pg_statio_all_indexes.indexrelname, pg_statio_all_indexes.idx_blks_read, pg_statio_all_indexes.idx_blks_hit +
! | FROM pg_statio_all_indexes +
! | WHERE ((pg_statio_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_indexes.schemaname !~ '^pg_toast'::text));
! pg_statio_user_sequences | SELECT pg_statio_all_sequences.relid, pg_statio_all_sequences.schemaname, pg_statio_all_sequences.relname, pg_statio_all_sequences.blks_read, pg_statio_all_sequences.blks_hit +
! | FROM pg_statio_all_sequences +
! | WHERE ((pg_statio_all_sequences.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_sequences.schemaname !~ '^pg_toast'::text));
! pg_statio_user_tables | SELECT pg_statio_all_tables.relid, pg_statio_all_tables.schemaname, pg_statio_all_tables.relname, pg_statio_all_tables.heap_blks_read, pg_statio_all_tables.heap_blks_hit, pg_statio_all_tables.idx_blks_read, pg_statio_all_tables.idx_blks_hit, pg_statio_all_tables.toast_blks_read, pg_statio_all_tables.toast_blks_hit, pg_statio_all_tables.tidx_blks_read, pg_statio_all_tables.tidx_blks_hit +
! | FROM pg_statio_all_tables +
! | WHERE ((pg_statio_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_tables.schemaname !~ '^pg_toast'::text));
! pg_stats | SELECT n.nspname AS schemaname, c.relname AS tablename, a.attname, s.stainherit AS inherited, s.stanullfrac AS null_frac, s.stawidth AS avg_width, s.stadistinct AS n_distinct, +
! | CASE +
! | WHEN (s.stakind1 = 1) THEN s.stavalues1 +
! | WHEN (s.stakind2 = 1) THEN s.stavalues2 +
! | WHEN (s.stakind3 = 1) THEN s.stavalues3 +
! | WHEN (s.stakind4 = 1) THEN s.stavalues4 +
! | WHEN (s.stakind5 = 1) THEN s.stavalues5 +
! | ELSE NULL::anyarray +
! | END AS most_common_vals, +
! | CASE +
! | WHEN (s.stakind1 = 1) THEN s.stanumbers1 +
! | WHEN (s.stakind2 = 1) THEN s.stanumbers2 +
! | WHEN (s.stakind3 = 1) THEN s.stanumbers3 +
! | WHEN (s.stakind4 = 1) THEN s.stanumbers4 +
! | WHEN (s.stakind5 = 1) THEN s.stanumbers5 +
! | ELSE NULL::real[] +
! | END AS most_common_freqs, +
! | CASE +
! | WHEN (s.stakind1 = 2) THEN s.stavalues1 +
! | WHEN (s.stakind2 = 2) THEN s.stavalues2 +
! | WHEN (s.stakind3 = 2) THEN s.stavalues3 +
! | WHEN (s.stakind4 = 2) THEN s.stavalues4 +
! | WHEN (s.stakind5 = 2) THEN s.stavalues5 +
! | ELSE NULL::anyarray +
! | END AS histogram_bounds, +
! | CASE +
! | WHEN (s.stakind1 = 3) THEN s.stanumbers1[1] +
! | WHEN (s.stakind2 = 3) THEN s.stanumbers2[1] +
! | WHEN (s.stakind3 = 3) THEN s.stanumbers3[1] +
! | WHEN (s.stakind4 = 3) THEN s.stanumbers4[1] +
! | WHEN (s.stakind5 = 3) THEN s.stanumbers5[1] +
! | ELSE NULL::real +
! | END AS correlation, +
! | CASE +
! | WHEN (s.stakind1 = 4) THEN s.stavalues1 +
! | WHEN (s.stakind2 = 4) THEN s.stavalues2 +
! | WHEN (s.stakind3 = 4) THEN s.stavalues3 +
! | WHEN (s.stakind4 = 4) THEN s.stavalues4 +
! | WHEN (s.stakind5 = 4) THEN s.stavalues5 +
! | ELSE NULL::anyarray +
! | END AS most_common_elems, +
! | CASE +
! | WHEN (s.stakind1 = 4) THEN s.stanumbers1 +
! | WHEN (s.stakind2 = 4) THEN s.stanumbers2 +
! | WHEN (s.stakind3 = 4) THEN s.stanumbers3 +
! | WHEN (s.stakind4 = 4) THEN s.stanumbers4 +
! | WHEN (s.stakind5 = 4) THEN s.stanumbers5 +
! | ELSE NULL::real[] +
! | END AS most_common_elem_freqs, +
! | CASE +
! | WHEN (s.stakind1 = 5) THEN s.stanumbers1 +
! | WHEN (s.stakind2 = 5) THEN s.stanumbers2 +
! | WHEN (s.stakind3 = 5) THEN s.stanumbers3 +
! | WHEN (s.stakind4 = 5) THEN s.stanumbers4 +
! | WHEN (s.stakind5 = 5) THEN s.stanumbers5 +
! | ELSE NULL::real[] +
! | END AS elem_count_histogram +
! | FROM (((pg_statistic s +
! | JOIN pg_class c ON ((c.oid = s.starelid))) +
! | JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum)))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE ((NOT a.attisdropped) AND has_column_privilege(c.oid, a.attnum, 'select'::text));
! pg_tables | SELECT n.nspname AS schemaname, c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS tablespace, c.relhasindex AS hasindexes, c.relhasrules AS hasrules, c.relhastriggers AS hastriggers +
! | FROM ((pg_class c +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace))) +
! | WHERE (c.relkind = 'r'::"char");
! pg_timezone_abbrevs | SELECT pg_timezone_abbrevs.abbrev, pg_timezone_abbrevs.utc_offset, pg_timezone_abbrevs.is_dst +
! | FROM pg_timezone_abbrevs() pg_timezone_abbrevs(abbrev, utc_offset, is_dst);
! pg_timezone_names | SELECT pg_timezone_names.name, pg_timezone_names.abbrev, pg_timezone_names.utc_offset, pg_timezone_names.is_dst +
! | FROM pg_timezone_names() pg_timezone_names(name, abbrev, utc_offset, is_dst);
! pg_user | SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb, pg_shadow.usesuper, pg_shadow.usecatupd, pg_shadow.userepl, '********'::text AS passwd, pg_shadow.valuntil, pg_shadow.useconfig +
! | FROM pg_shadow;
! pg_user_mappings | SELECT u.oid AS umid, s.oid AS srvid, s.srvname, u.umuser, +
! | CASE +
! | WHEN (u.umuser = (0)::oid) THEN 'public'::name +
! | ELSE a.rolname +
! | END AS usename, +
! | CASE +
! | WHEN (pg_has_role(s.srvowner, 'USAGE'::text) OR has_server_privilege(s.oid, 'USAGE'::text)) THEN u.umoptions +
! | ELSE NULL::text[] +
! | END AS umoptions +
! | FROM ((pg_user_mapping u +
! | LEFT JOIN pg_authid a ON ((a.oid = u.umuser))) +
! | JOIN pg_foreign_server s ON ((u.umserver = s.oid)));
! pg_views | 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");
! rtest_v1 | SELECT rtest_t1.a, rtest_t1.b +
! | FROM rtest_t1;
! rtest_vcomp | SELECT x.part, (x.size * y.factor) AS size_in_cm +
! | FROM rtest_comp x, rtest_unitfact y +
! | WHERE (x.unit = y.unit);
! rtest_vview1 | SELECT x.a, x.b +
! | FROM rtest_view1 x +
! | WHERE (0 < ( SELECT count(*) AS count +
! | FROM rtest_view2 y +
! | WHERE (y.a = x.a)));
! rtest_vview2 | SELECT rtest_view1.a, rtest_view1.b +
! | FROM rtest_view1 +
! | WHERE rtest_view1.v;
! rtest_vview3 | SELECT x.a, x.b +
! | FROM rtest_vview2 x +
! | WHERE (0 < ( SELECT count(*) AS count +
! | FROM rtest_view2 y +
! | WHERE (y.a = x.a)));
! rtest_vview4 | SELECT x.a, x.b, count(y.a) AS refcount +
! | FROM rtest_view1 x, rtest_view2 y +
! | WHERE (x.a = y.a) +
! | GROUP BY x.a, x.b;
! rtest_vview5 | SELECT rtest_view1.a, rtest_view1.b, rtest_viewfunc1(rtest_view1.a) AS refcount +
! | FROM rtest_view1;
! shoe | SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit +
! | FROM shoe_data sh, unit un +
! | WHERE (sh.slunit = un.un_name);
! shoe_ready | SELECT rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail +
! | FROM shoe rsh, shoelace rsl +
! | WHERE (((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >= rsh.slminlen_cm)) AND (rsl.sl_len_cm <= rsh.slmaxlen_cm));
! shoelace | SELECT s.sl_name, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, (s.sl_len * u.un_fact) AS sl_len_cm +
! | FROM shoelace_data s, unit u +
! | WHERE (s.sl_unit = u.un_name);
! shoelace_candelete | SELECT shoelace_obsolete.sl_name, shoelace_obsolete.sl_avail, shoelace_obsolete.sl_color, shoelace_obsolete.sl_len, shoelace_obsolete.sl_unit, shoelace_obsolete.sl_len_cm +
! | FROM shoelace_obsolete +
! | WHERE (shoelace_obsolete.sl_avail = 0);
! shoelace_obsolete | SELECT shoelace.sl_name, shoelace.sl_avail, shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm +
! | FROM shoelace +
! | WHERE (NOT (EXISTS ( SELECT shoe.shoename +
! | FROM shoe +
! | WHERE (shoe.slcolor = shoelace.sl_color))));
! street | SELECT r.name, r.thepath, c.cname +
! | FROM ONLY road r, real_city c +
! | WHERE (c.outline ## r.thepath);
! toyemp | SELECT emp.name, emp.age, emp.location, (12 * emp.salary) AS annualsal +
! | FROM emp;
(60 rows)
SELECT tablename, rulename, definition FROM pg_rules
***************
*** 1584,1592 **** select * from only t1_2;
-- test various flavors of pg_get_viewdef()
select pg_get_viewdef('shoe'::regclass) as unpretty;
! unpretty
! -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit FROM shoe_data sh, unit un WHERE (sh.slunit = un.un_name);
(1 row)
select pg_get_viewdef('shoe'::regclass,true) as pretty;
--- 1883,1893 ----
-- test various flavors of pg_get_viewdef()
select pg_get_viewdef('shoe'::regclass) as unpretty;
! unpretty
! -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit+
! FROM shoe_data sh, unit un +
! WHERE (sh.slunit = un.un_name);
(1 row)
select pg_get_viewdef('shoe'::regclass,true) as pretty;
*** a/src/test/regress/expected/with.out
--- b/src/test/regress/expected/with.out
***************
*** 270,278 **** SELECT * FROM vsubdepartment ORDER BY name;
-- Check reverse listing
SELECT pg_get_viewdef('vsubdepartment'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! WITH RECURSIVE subdepartment AS (SELECT department.id, department.parent_department, department.name FROM department WHERE (department.name = 'A'::text) UNION ALL SELECT d.id, d.parent_department, d.name FROM department d, subdepartment sd WHERE (d.parent_department = sd.id)) SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name FROM subdepartment;
(1 row)
SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
--- 270,288 ----
-- Check reverse listing
SELECT pg_get_viewdef('vsubdepartment'::regclass);
! pg_get_viewdef
! --------------------------------------------------------------------------------------
! WITH RECURSIVE subdepartment AS ( +
! SELECT department.id, department.parent_department, department.name+
! FROM department +
! WHERE (department.name = 'A'::text) +
! UNION ALL +
! SELECT d.id, d.parent_department, d.name +
! FROM department d, subdepartment sd +
! WHERE (d.parent_department = sd.id) +
! ) +
! SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name +
! FROM subdepartment;
(1 row)
SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
*** a/src/test/regress/expected/xml.out
--- b/src/test/regress/expected/xml.out
***************
*** 3,82 **** CREATE TABLE xmltest (
data xml
);
INSERT INTO xmltest VALUES (1, '<value>one</value>');
INSERT INTO xmltest VALUES (2, '<value>two</value>');
INSERT INTO xmltest VALUES (3, '<wrong');
! ERROR: invalid XML content
LINE 1: INSERT INTO xmltest VALUES (3, '<wrong');
^
! DETAIL: line 1: Couldn't find end of Start Tag wrong line 1
! <wrong
! ^
SELECT * FROM xmltest;
! id | data
! ----+--------------------
! 1 | <value>one</value>
! 2 | <value>two</value>
! (2 rows)
SELECT xmlcomment('test');
! xmlcomment
! -------------
! <!--test-->
! (1 row)
!
SELECT xmlcomment('-test');
! xmlcomment
! --------------
! <!---test-->
! (1 row)
!
SELECT xmlcomment('test-');
! ERROR: invalid XML comment
SELECT xmlcomment('--test');
! ERROR: invalid XML comment
SELECT xmlcomment('te st');
! xmlcomment
! --------------
! <!--te st-->
! (1 row)
!
SELECT xmlconcat(xmlcomment('hello'),
xmlelement(NAME qux, 'foo'),
xmlcomment('world'));
! xmlconcat
! ----------------------------------------
! <!--hello--><qux>foo</qux><!--world-->
! (1 row)
!
SELECT xmlconcat('hello', 'you');
! xmlconcat
! -----------
! helloyou
! (1 row)
!
SELECT xmlconcat(1, 2);
ERROR: argument of XMLCONCAT must be type xml, not type integer
LINE 1: SELECT xmlconcat(1, 2);
^
SELECT xmlconcat('bad', '<syntax');
! ERROR: invalid XML content
LINE 1: SELECT xmlconcat('bad', '<syntax');
! ^
! DETAIL: line 1: Couldn't find end of Start Tag syntax line 1
! <syntax
! ^
SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
! xmlconcat
! --------------
! <foo/><bar/>
! (1 row)
!
SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
! xmlconcat
! -----------------------------------
! <?xml version="1.1"?><foo/><bar/>
! (1 row)
!
SELECT xmlconcat(NULL);
xmlconcat
-----------
--- 3,84 ----
data xml
);
INSERT INTO xmltest VALUES (1, '<value>one</value>');
+ ERROR: unsupported XML feature
+ LINE 1: INSERT INTO xmltest VALUES (1, '<value>one</value>');
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
INSERT INTO xmltest VALUES (2, '<value>two</value>');
+ ERROR: unsupported XML feature
+ LINE 1: INSERT INTO xmltest VALUES (2, '<value>two</value>');
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
INSERT INTO xmltest VALUES (3, '<wrong');
! ERROR: unsupported XML feature
LINE 1: INSERT INTO xmltest VALUES (3, '<wrong');
^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT * FROM xmltest;
! id | data
! ----+------
! (0 rows)
SELECT xmlcomment('test');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlcomment('-test');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlcomment('test-');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlcomment('--test');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlcomment('te st');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlconcat(xmlcomment('hello'),
xmlelement(NAME qux, 'foo'),
xmlcomment('world'));
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlconcat('hello', 'you');
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlconcat('hello', 'you');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlconcat(1, 2);
ERROR: argument of XMLCONCAT must be type xml, not type integer
LINE 1: SELECT xmlconcat(1, 2);
^
SELECT xmlconcat('bad', '<syntax');
! ERROR: unsupported XML feature
LINE 1: SELECT xmlconcat('bad', '<syntax');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlconcat('<foo/>', NULL, '<?xml version="1.1" standa...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml version="1.1" standalone="no"?><bar/>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlconcat('<?xml version="1.1"?><foo/>', NULL, '<?xml...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlconcat(NULL);
xmlconcat
-----------
***************
*** 92,408 **** SELECT xmlconcat(NULL, NULL);
SELECT xmlelement(name element,
xmlattributes (1 as one, 'deuce' as two),
'content');
! xmlelement
! ------------------------------------------------
! <element one="1" two="deuce">content</element>
! (1 row)
!
SELECT xmlelement(name element,
xmlattributes ('unnamed and wrong'));
! ERROR: unnamed XML attribute value must be a column reference
! LINE 2: xmlattributes ('unnamed and wrong'));
! ^
SELECT xmlelement(name element, xmlelement(name nested, 'stuff'));
! xmlelement
! -------------------------------------------
! <element><nested>stuff</nested></element>
! (1 row)
!
SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
! xmlelement
! ----------------------------------------------------------------------
! <employee><name>sharon</name><age>25</age><pay>1000</pay></employee>
! <employee><name>sam</name><age>30</age><pay>2000</pay></employee>
! <employee><name>bill</name><age>20</age><pay>1000</pay></employee>
! <employee><name>jeff</name><age>23</age><pay>600</pay></employee>
! <employee><name>cim</name><age>30</age><pay>400</pay></employee>
! <employee><name>linda</name><age>19</age><pay>100</pay></employee>
! (6 rows)
!
SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a));
! ERROR: XML attribute name "a" appears more than once
! LINE 1: ...ment(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a));
! ^
SELECT xmlelement(name num, 37);
! xmlelement
! ---------------
! <num>37</num>
! (1 row)
!
SELECT xmlelement(name foo, text 'bar');
! xmlelement
! ----------------
! <foo>bar</foo>
! (1 row)
!
SELECT xmlelement(name foo, xml 'bar');
! xmlelement
! ----------------
! <foo>bar</foo>
! (1 row)
!
SELECT xmlelement(name foo, text 'b<a/>r');
! xmlelement
! -------------------------
! <foo>b<a/>r</foo>
! (1 row)
!
SELECT xmlelement(name foo, xml 'b<a/>r');
! xmlelement
! -------------------
! <foo>b<a/>r</foo>
! (1 row)
!
SELECT xmlelement(name foo, array[1, 2, 3]);
! xmlelement
! -------------------------------------------------------------------------
! <foo><element>1</element><element>2</element><element>3</element></foo>
! (1 row)
!
SET xmlbinary TO base64;
SELECT xmlelement(name foo, bytea 'bar');
! xmlelement
! -----------------
! <foo>YmFy</foo>
! (1 row)
!
SET xmlbinary TO hex;
SELECT xmlelement(name foo, bytea 'bar');
! xmlelement
! -------------------
! <foo>626172</foo>
! (1 row)
!
SELECT xmlelement(name foo, xmlattributes(true as bar));
! xmlelement
! -------------------
! <foo bar="true"/>
! (1 row)
!
SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar));
! xmlelement
! ----------------------------------
! <foo bar="2009-04-09T00:24:37"/>
! (1 row)
!
SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar));
! ERROR: timestamp out of range
! DETAIL: XML does not support infinite timestamp values.
SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier));
! xmlelement
! ------------------------------------------------------------
! <foo funny="<>&"'" funnier="b<a/>r"/>
! (1 row)
!
SELECT xmlparse(content 'abc');
! xmlparse
! ----------
! abc
! (1 row)
!
SELECT xmlparse(content '<abc>x</abc>');
! xmlparse
! --------------
! <abc>x</abc>
! (1 row)
!
SELECT xmlparse(content '<invalidentity>&</invalidentity>');
! ERROR: invalid XML content
! DETAIL: line 1: xmlParseEntityRef: no name
! <invalidentity>&</invalidentity>
! ^
! line 1: chunk is not well balanced
! <invalidentity>&</invalidentity>
! ^
SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>');
! ERROR: invalid XML content
! DETAIL: line 1: Entity 'idontexist' not defined
! <undefinedentity>&idontexist;</undefinedentity>
! ^
! line 1: chunk is not well balanced
! <undefinedentity>&idontexist;</undefinedentity>
! ^
SELECT xmlparse(content '<invalidns xmlns=''<''/>');
! xmlparse
! ---------------------------
! <invalidns xmlns='<'/>
! (1 row)
!
SELECT xmlparse(content '<relativens xmlns=''relative''/>');
! xmlparse
! --------------------------------
! <relativens xmlns='relative'/>
! (1 row)
!
SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>');
! ERROR: invalid XML content
! DETAIL: line 1: Entity 'idontexist' not defined
! <twoerrors>&idontexist;</unbalanced>
! ^
! line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced
! <twoerrors>&idontexist;</unbalanced>
! ^
! line 1: chunk is not well balanced
! <twoerrors>&idontexist;</unbalanced>
! ^
SELECT xmlparse(content '<nosuchprefix:tag/>');
! xmlparse
! ---------------------
! <nosuchprefix:tag/>
! (1 row)
!
SELECT xmlparse(document 'abc');
! ERROR: invalid XML document
! DETAIL: line 1: Start tag expected, '<' not found
! abc
! ^
SELECT xmlparse(document '<abc>x</abc>');
! xmlparse
! --------------
! <abc>x</abc>
! (1 row)
!
SELECT xmlparse(document '<invalidentity>&</abc>');
! ERROR: invalid XML document
! DETAIL: line 1: xmlParseEntityRef: no name
! <invalidentity>&</abc>
! ^
! line 1: Opening and ending tag mismatch: invalidentity line 1 and abc
! <invalidentity>&</abc>
! ^
SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>');
! ERROR: invalid XML document
! DETAIL: line 1: Entity 'idontexist' not defined
! <undefinedentity>&idontexist;</abc>
! ^
! line 1: Opening and ending tag mismatch: undefinedentity line 1 and abc
! <undefinedentity>&idontexist;</abc>
! ^
SELECT xmlparse(document '<invalidns xmlns=''<''/>');
! xmlparse
! ---------------------------
! <invalidns xmlns='<'/>
! (1 row)
!
SELECT xmlparse(document '<relativens xmlns=''relative''/>');
! xmlparse
! --------------------------------
! <relativens xmlns='relative'/>
! (1 row)
!
SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>');
! ERROR: invalid XML document
! DETAIL: line 1: Entity 'idontexist' not defined
! <twoerrors>&idontexist;</unbalanced>
! ^
! line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced
! <twoerrors>&idontexist;</unbalanced>
! ^
SELECT xmlparse(document '<nosuchprefix:tag/>');
! xmlparse
! ---------------------
! <nosuchprefix:tag/>
! (1 row)
!
SELECT xmlpi(name foo);
! xmlpi
! ---------
! <?foo?>
! (1 row)
!
SELECT xmlpi(name xml);
! ERROR: invalid XML processing instruction
! DETAIL: XML processing instruction target name cannot be "xml".
SELECT xmlpi(name xmlstuff);
! xmlpi
! --------------
! <?xmlstuff?>
! (1 row)
!
SELECT xmlpi(name foo, 'bar');
! xmlpi
! -------------
! <?foo bar?>
! (1 row)
!
SELECT xmlpi(name foo, 'in?>valid');
! ERROR: invalid XML processing instruction
! DETAIL: XML processing instruction cannot contain "?>".
SELECT xmlpi(name foo, null);
! xmlpi
! -------
!
! (1 row)
!
SELECT xmlpi(name xml, null);
! ERROR: invalid XML processing instruction
! DETAIL: XML processing instruction target name cannot be "xml".
SELECT xmlpi(name xmlstuff, null);
! xmlpi
! -------
!
! (1 row)
!
SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"');
! xmlpi
! -------------------------------------------------------
! <?xml-stylesheet href="mystyle.css" type="text/css"?>
! (1 row)
!
SELECT xmlpi(name foo, ' bar');
! xmlpi
! -------------
! <?foo bar?>
! (1 row)
!
SELECT xmlroot(xml '<foo/>', version no value, standalone no value);
! xmlroot
! ---------
! <foo/>
! (1 row)
!
SELECT xmlroot(xml '<foo/>', version '2.0');
! xmlroot
! -----------------------------
! <?xml version="2.0"?><foo/>
! (1 row)
!
SELECT xmlroot(xml '<foo/>', version no value, standalone yes);
! xmlroot
! ----------------------------------------------
! <?xml version="1.0" standalone="yes"?><foo/>
! (1 row)
!
SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no value, standalone yes);
! xmlroot
! ----------------------------------------------
! <?xml version="1.0" standalone="yes"?><foo/>
! (1 row)
!
SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version '1.1', standalone no);
! xmlroot
! ---------------------------------------------
! <?xml version="1.1" standalone="no"?><foo/>
! (1 row)
!
SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no);
! xmlroot
! ---------------------------------------------
! <?xml version="1.0" standalone="no"?><foo/>
! (1 row)
!
SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no value);
! xmlroot
! ---------
! <foo/>
! (1 row)
!
SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value);
! xmlroot
! ----------------------------------------------
! <?xml version="1.0" standalone="yes"?><foo/>
! (1 row)
!
SELECT xmlroot (
xmlelement (
name gazonk,
--- 94,321 ----
SELECT xmlelement(name element,
xmlattributes (1 as one, 'deuce' as two),
'content');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name element,
xmlattributes ('unnamed and wrong'));
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name element, xmlelement(name nested, 'stuff'));
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name duplicate, xmlattributes(1 as a, 2 as b, 3 as a));
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name num, 37);
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name foo, text 'bar');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name foo, xml 'bar');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name foo, text 'b<a/>r');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name foo, xml 'b<a/>r');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name foo, array[1, 2, 3]);
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SET xmlbinary TO base64;
SELECT xmlelement(name foo, bytea 'bar');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SET xmlbinary TO hex;
SELECT xmlelement(name foo, bytea 'bar');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name foo, xmlattributes(true as bar));
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name foo, xmlattributes('2009-04-09 00:24:37'::timestamp as bar));
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name foo, xmlattributes('infinity'::timestamp as bar));
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlelement(name foo, xmlattributes('<>&"''' as funny, xml 'b<a/>r' as funnier));
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(content 'abc');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(content '<abc>x</abc>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(content '<invalidentity>&</invalidentity>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(content '<undefinedentity>&idontexist;</undefinedentity>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(content '<invalidns xmlns=''<''/>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(content '<relativens xmlns=''relative''/>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(content '<twoerrors>&idontexist;</unbalanced>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(content '<nosuchprefix:tag/>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(document 'abc');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(document '<abc>x</abc>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(document '<invalidentity>&</abc>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(document '<undefinedentity>&idontexist;</abc>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(document '<invalidns xmlns=''<''/>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(document '<relativens xmlns=''relative''/>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(document '<twoerrors>&idontexist;</unbalanced>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlparse(document '<nosuchprefix:tag/>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name foo);
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name xml);
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name xmlstuff);
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name foo, 'bar');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name foo, 'in?>valid');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name foo, null);
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name xml, null);
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name xmlstuff, null);
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name "xml-stylesheet", 'href="mystyle.css" type="text/css"');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name foo, ' bar');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlroot(xml '<foo/>', version no value, standalone no value);
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlroot(xml '<foo/>', version no value, standalone no...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlroot(xml '<foo/>', version '2.0');
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlroot(xml '<foo/>', version '2.0');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlroot(xml '<foo/>', version no value, standalone yes);
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlroot(xml '<foo/>', version no value, standalone ye...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no value, standalone yes);
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlroot(xml '<?xml version="1.1"?><foo/>', version no...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version '1.1', standalone no);
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlroot(xmlroot(xml '<foo/>', version '1.0'), version...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no);
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value, standalone no value);
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>', version no value);
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlroot('<?xml version="1.1" standalone="yes"?><foo/>...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlroot (
xmlelement (
name gazonk,
***************
*** 418,478 **** SELECT xmlroot (
version '1.0',
standalone yes
);
! xmlroot
! ------------------------------------------------------------------------------------------
! <?xml version="1.0" standalone="yes"?><gazonk name="val" num="2"><qux>foo</qux></gazonk>
! (1 row)
!
SELECT xmlserialize(content data as character varying(20)) FROM xmltest;
- xmlserialize
- --------------------
- <value>one</value>
- <value>two</value>
- (2 rows)
-
- SELECT xmlserialize(content 'good' as char(10));
xmlserialize
--------------
! good
! (1 row)
SELECT xmlserialize(document 'bad' as text);
! ERROR: not an XML document
SELECT xml '<foo>bar</foo>' IS DOCUMENT;
! ?column?
! ----------
! t
! (1 row)
!
SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT;
! ?column?
! ----------
! f
! (1 row)
!
SELECT xml '<abc/>' IS NOT DOCUMENT;
! ?column?
! ----------
! f
! (1 row)
!
SELECT xml 'abc' IS NOT DOCUMENT;
! ?column?
! ----------
! t
! (1 row)
!
SELECT '<>' IS NOT DOCUMENT;
! ERROR: invalid XML content
LINE 1: SELECT '<>' IS NOT DOCUMENT;
^
! DETAIL: line 1: StartTag: invalid element name
! <>
! ^
SELECT xmlagg(data) FROM xmltest;
! xmlagg
! --------------------------------------
! <value>one</value><value>two</value>
(1 row)
SELECT xmlagg(data) FROM xmltest WHERE id > 10;
--- 331,390 ----
version '1.0',
standalone yes
);
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlserialize(content data as character varying(20)) FROM xmltest;
xmlserialize
--------------
! (0 rows)
+ SELECT xmlserialize(content 'good' as char(10));
+ ERROR: unsupported XML feature
+ LINE 1: SELECT xmlserialize(content 'good' as char(10));
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlserialize(document 'bad' as text);
! ERROR: unsupported XML feature
! LINE 1: SELECT xmlserialize(document 'bad' as text);
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml '<foo>bar</foo>' IS DOCUMENT;
! ERROR: unsupported XML feature
! LINE 1: SELECT xml '<foo>bar</foo>' IS DOCUMENT;
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT;
! ERROR: unsupported XML feature
! LINE 1: SELECT xml '<foo>bar</foo><bar>foo</bar>' IS DOCUMENT;
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml '<abc/>' IS NOT DOCUMENT;
! ERROR: unsupported XML feature
! LINE 1: SELECT xml '<abc/>' IS NOT DOCUMENT;
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml 'abc' IS NOT DOCUMENT;
! ERROR: unsupported XML feature
! LINE 1: SELECT xml 'abc' IS NOT DOCUMENT;
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT '<>' IS NOT DOCUMENT;
! ERROR: unsupported XML feature
LINE 1: SELECT '<>' IS NOT DOCUMENT;
^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlagg(data) FROM xmltest;
! xmlagg
! --------
!
(1 row)
SELECT xmlagg(data) FROM xmltest WHERE id > 10;
***************
*** 482,683 **** SELECT xmlagg(data) FROM xmltest WHERE id > 10;
(1 row)
SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp;
! xmlelement
! --------------------------------------------------------------------------------------------------------------------------------
! <employees><name>sharon</name><name>sam</name><name>bill</name><name>jeff</name><name>cim</name><name>linda</name></employees>
! (1 row)
!
-- Check mapping SQL identifier to XML name
SELECT xmlpi(name ":::_xml_abc135.%-&_");
! xmlpi
! -------------------------------------------------
! <?_x003A_::_x005F_xml_abc135._x0025_-_x0026__?>
! (1 row)
!
SELECT xmlpi(name "123");
! xmlpi
! ---------------
! <?_x0031_23?>
! (1 row)
!
PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1);
SET XML OPTION DOCUMENT;
EXECUTE foo ('<bar/>');
! xmlconcat
! --------------
! <foo/><bar/>
! (1 row)
!
EXECUTE foo ('bad');
! ERROR: invalid XML document
! LINE 1: EXECUTE foo ('bad');
! ^
! DETAIL: line 1: Start tag expected, '<' not found
! bad
! ^
SET XML OPTION CONTENT;
EXECUTE foo ('<bar/>');
! xmlconcat
! --------------
! <foo/><bar/>
! (1 row)
!
EXECUTE foo ('good');
! xmlconcat
! ------------
! <foo/>good
! (1 row)
!
-- Test backwards parsing
CREATE VIEW xmlview1 AS SELECT xmlcomment('test');
CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you');
CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&');
CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>');
CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar');
CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes);
CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10));
CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text);
SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'xmlview%' ORDER BY 1;
! table_name | view_definition
! ------------+----------------------------------------------------------------------------------------------------------------------------
! xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment;
! xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat";
! xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement";
! xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(emp.name AS name, emp.age AS age, emp.salary AS pay)) AS "xmlelement" FROM emp;
! xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse";
! xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi";
! xmlview7 | SELECT XMLROOT('<foo/>'::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot";
! xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10)))::character(10) AS "xmlserialize";
! xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text) AS "xmlserialize";
! (9 rows)
-- Text XPath expressions evaluation
SELECT xpath('/value', data) FROM xmltest;
! xpath
! ----------------------
! {<value>one</value>}
! {<value>two</value>}
! (2 rows)
SELECT xpath(NULL, NULL) IS NULL FROM xmltest;
?column?
----------
! t
! t
! (2 rows)
SELECT xpath('', '<!-- error -->');
! ERROR: empty XPath expression
! CONTEXT: SQL function "xpath" statement 1
SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>');
! xpath
! ----------------
! {"number one"}
! (1 row)
!
SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]);
! xpath
! -------
! {1,2}
! (1 row)
!
SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>');
! xpath
! -------------------------
! {<b>two</b>,<b>etc</b>}
! (1 row)
!
SELECT xpath('//text()', '<root><</root>');
! xpath
! --------
! {<}
! (1 row)
!
SELECT xpath('//@value', '<root value="<"/>');
! xpath
! --------
! {<}
! (1 row)
!
SELECT xpath('''<<invalid>>''', '<root/>');
! xpath
! ---------------------------
! {<<invalid>>}
! (1 row)
!
SELECT xpath('count(//*)', '<root><sub/><sub/></root>');
! xpath
! -------
! {3}
! (1 row)
!
SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>');
! xpath
! ---------
! {false}
! (1 row)
!
SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>');
! xpath
! --------
! {true}
! (1 row)
!
SELECT xpath('name(/*)', '<root><sub/><sub/></root>');
! xpath
! --------
! {root}
! (1 row)
!
SELECT xpath('/nosuchtag', '<root/>');
! xpath
! -------
! {}
! (1 row)
!
-- Test xmlexists and xpath_exists
SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>');
! xmlexists
! -----------
! f
! (1 row)
!
SELECT xmlexists('//town[text() = ''Cwmbran'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>');
! xmlexists
! -----------
! t
! (1 row)
!
SELECT xmlexists('count(/nosuchtag)' PASSING BY REF '<root/>');
! xmlexists
! -----------
! t
! (1 row)
!
SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml);
! xpath_exists
! --------------
! f
! (1 row)
!
SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml);
! xpath_exists
! --------------
! t
! (1 row)
!
SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml);
! xpath_exists
! --------------
! t
! (1 row)
!
INSERT INTO xmltest VALUES (4, '<menu><beers><name>Budvar</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml);
INSERT INTO xmltest VALUES (5, '<menu><beers><name>Molson</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml);
INSERT INTO xmltest VALUES (6, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Budvar</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml);
INSERT INTO xmltest VALUES (7, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Molson</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml);
SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING data);
count
-------
--- 394,618 ----
(1 row)
SELECT xmlelement(name employees, xmlagg(xmlelement(name name, name))) FROM emp;
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
-- Check mapping SQL identifier to XML name
SELECT xmlpi(name ":::_xml_abc135.%-&_");
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlpi(name "123");
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1);
+ ERROR: unsupported XML feature
+ LINE 1: PREPARE foo (xml) AS SELECT xmlconcat('<foo/>', $1);
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
SET XML OPTION DOCUMENT;
EXECUTE foo ('<bar/>');
! ERROR: prepared statement "foo" does not exist
EXECUTE foo ('bad');
! ERROR: prepared statement "foo" does not exist
SET XML OPTION CONTENT;
EXECUTE foo ('<bar/>');
! ERROR: prepared statement "foo" does not exist
EXECUTE foo ('good');
! ERROR: prepared statement "foo" does not exist
-- Test backwards parsing
CREATE VIEW xmlview1 AS SELECT xmlcomment('test');
CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you');
+ ERROR: unsupported XML feature
+ LINE 1: CREATE VIEW xmlview2 AS SELECT xmlconcat('hello', 'you');
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
CREATE VIEW xmlview3 AS SELECT xmlelement(name element, xmlattributes (1 as ":one:", 'deuce' as two), 'content&');
+ ERROR: unsupported XML feature
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
CREATE VIEW xmlview4 AS SELECT xmlelement(name employee, xmlforest(name, age, salary as pay)) FROM emp;
+ ERROR: unsupported XML feature
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
CREATE VIEW xmlview5 AS SELECT xmlparse(content '<abc>x</abc>');
CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar');
+ ERROR: unsupported XML feature
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version no value, standalone yes);
+ ERROR: unsupported XML feature
+ LINE 1: CREATE VIEW xmlview7 AS SELECT xmlroot(xml '<foo/>', version...
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10));
+ ERROR: unsupported XML feature
+ LINE 1: ...EATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as ...
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text);
+ ERROR: unsupported XML feature
+ LINE 1: ...EATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as ...
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'xmlview%' ORDER BY 1;
! table_name | view_definition
! ------------+--------------------------------------------------------------------------------
! xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment;
! xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse";
! (2 rows)
-- Text XPath expressions evaluation
SELECT xpath('/value', data) FROM xmltest;
! xpath
! -------
! (0 rows)
SELECT xpath(NULL, NULL) IS NULL FROM xmltest;
?column?
----------
! (0 rows)
SELECT xpath('', '<!-- error -->');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('', '<!-- error -->');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('//text()', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('//text()', '<local:data xmlns:local="http://12...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>', ARRAY[ARRAY['loc', 'http://127.0.0.1']]);
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('//loc:piece/@id', '<local:data xmlns:local="ht...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('//b', '<a>one <b>two</b> three <b>etc</b></a>'...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('//text()', '<root><</root>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('//text()', '<root><</root>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('//@value', '<root value="<"/>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('//@value', '<root value="<"/>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('''<<invalid>>''', '<root/>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('''<<invalid>>''', '<root/>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('count(//*)', '<root><sub/><sub/></root>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('count(//*)', '<root><sub/><sub/></root>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('count(//*)=0', '<root><sub/><sub/></root>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('count(//*)=3', '<root><sub/><sub/></root>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('name(/*)', '<root><sub/><sub/></root>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('name(/*)', '<root><sub/><sub/></root>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath('/nosuchtag', '<root/>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('/nosuchtag', '<root/>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
-- Test xmlexists and xpath_exists
SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>');
! ERROR: unsupported XML feature
! LINE 1: ...sts('//town[text() = ''Toronto'']' PASSING BY REF '<towns><t...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlexists('//town[text() = ''Cwmbran'']' PASSING BY REF '<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>');
! ERROR: unsupported XML feature
! LINE 1: ...sts('//town[text() = ''Cwmbran'']' PASSING BY REF '<towns><t...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xmlexists('count(/nosuchtag)' PASSING BY REF '<root/>');
! ERROR: unsupported XML feature
! LINE 1: ...LECT xmlexists('count(/nosuchtag)' PASSING BY REF '<root/>')...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath_exists('//town[text() = ''Toronto'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml);
! ERROR: unsupported XML feature
! LINE 1: ...ELECT xpath_exists('//town[text() = ''Toronto'']','<towns><t...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><town>Bidford-on-Avon</town><town>Cwmbran</town><town>Bristol</town></towns>'::xml);
! ERROR: unsupported XML feature
! LINE 1: ...ELECT xpath_exists('//town[text() = ''Cwmbran'']','<towns><t...
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml);
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath_exists('count(/nosuchtag)', '<root/>'::xml);
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
INSERT INTO xmltest VALUES (4, '<menu><beers><name>Budvar</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml);
+ ERROR: unsupported XML feature
+ LINE 1: INSERT INTO xmltest VALUES (4, '<menu><beers><name>Budvar</n...
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
INSERT INTO xmltest VALUES (5, '<menu><beers><name>Molson</name><cost>free</cost><name>Carling</name><cost>lots</cost></beers></menu>'::xml);
+ ERROR: unsupported XML feature
+ LINE 1: INSERT INTO xmltest VALUES (5, '<menu><beers><name>Molson</n...
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
INSERT INTO xmltest VALUES (6, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Budvar</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml);
+ ERROR: unsupported XML feature
+ LINE 1: INSERT INTO xmltest VALUES (6, '<myns:menu xmlns:myns="http:...
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
INSERT INTO xmltest VALUES (7, '<myns:menu xmlns:myns="http://myns.com"><myns:beers><myns:name>Molson</myns:name><myns:cost>free</myns:cost><myns:name>Carling</myns:name><myns:cost>lots</myns:cost></myns:beers></myns:menu>'::xml);
+ ERROR: unsupported XML feature
+ LINE 1: INSERT INTO xmltest VALUES (7, '<myns:menu xmlns:myns="http:...
+ ^
+ DETAIL: This functionality requires the server to be built with libxml support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING data);
count
-------
***************
*** 693,705 **** SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beer' PASSING BY REF data B
SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers' PASSING BY REF data);
count
-------
! 2
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers/name[text() = ''Molson'']' PASSING BY REF data);
count
-------
! 1
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data);
--- 628,640 ----
SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers' PASSING BY REF data);
count
-------
! 0
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xmlexists('/menu/beers/name[text() = ''Molson'']' PASSING BY REF data);
count
-------
! 0
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data);
***************
*** 711,723 **** SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beer',data);
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data);
count
-------
! 2
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data);
count
-------
! 1
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARRAY[ARRAY['myns','http://myns.com']]);
--- 646,658 ----
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers',data);
count
-------
! 0
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/menu/beers/name[text() = ''Molson'']',data);
count
-------
! 0
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARRAY[ARRAY['myns','http://myns.com']]);
***************
*** 729,741 **** SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beer',data,ARR
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers',data,ARRAY[ARRAY['myns','http://myns.com']]);
count
-------
! 2
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers/myns:name[text() = ''Molson'']',data,ARRAY[ARRAY['myns','http://myns.com']]);
count
-------
! 1
(1 row)
CREATE TABLE query ( expr TEXT );
--- 664,676 ----
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers',data,ARRAY[ARRAY['myns','http://myns.com']]);
count
-------
! 0
(1 row)
SELECT COUNT(id) FROM xmltest WHERE xpath_exists('/myns:menu/myns:beers/myns:name[text() = ''Molson'']',data,ARRAY[ARRAY['myns','http://myns.com']]);
count
-------
! 0
(1 row)
CREATE TABLE query ( expr TEXT );
***************
*** 743,868 **** INSERT INTO query VALUES ('/menu/beers/cost[text() = ''lots'']');
SELECT COUNT(id) FROM xmltest, query WHERE xmlexists(expr PASSING BY REF data);
count
-------
! 2
(1 row)
-- Test xml_is_well_formed and variants
SELECT xml_is_well_formed_document('<foo>bar</foo>');
! xml_is_well_formed_document
! -----------------------------
! t
! (1 row)
!
SELECT xml_is_well_formed_document('abc');
! xml_is_well_formed_document
! -----------------------------
! f
! (1 row)
!
SELECT xml_is_well_formed_content('<foo>bar</foo>');
! xml_is_well_formed_content
! ----------------------------
! t
! (1 row)
!
SELECT xml_is_well_formed_content('abc');
! xml_is_well_formed_content
! ----------------------------
! t
! (1 row)
!
SET xmloption TO DOCUMENT;
SELECT xml_is_well_formed('abc');
! xml_is_well_formed
! --------------------
! f
! (1 row)
!
SELECT xml_is_well_formed('<>');
! xml_is_well_formed
! --------------------
! f
! (1 row)
!
SELECT xml_is_well_formed('<abc/>');
! xml_is_well_formed
! --------------------
! t
! (1 row)
!
SELECT xml_is_well_formed('<foo>bar</foo>');
! xml_is_well_formed
! --------------------
! t
! (1 row)
!
SELECT xml_is_well_formed('<foo>bar</foo');
! xml_is_well_formed
! --------------------
! f
! (1 row)
!
SELECT xml_is_well_formed('<foo><bar>baz</foo>');
! xml_is_well_formed
! --------------------
! f
! (1 row)
!
SELECT xml_is_well_formed('<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>');
! xml_is_well_formed
! --------------------
! t
! (1 row)
!
SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</my:foo>');
! xml_is_well_formed
! --------------------
! f
! (1 row)
!
SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>');
! xml_is_well_formed
! --------------------
! t
! (1 row)
!
SELECT xml_is_well_formed('<invalidentity>&</abc>');
! xml_is_well_formed
! --------------------
! f
! (1 row)
!
SELECT xml_is_well_formed('<undefinedentity>&idontexist;</abc>');
! xml_is_well_formed
! --------------------
! f
! (1 row)
!
SELECT xml_is_well_formed('<invalidns xmlns=''<''/>');
! xml_is_well_formed
! --------------------
! t
! (1 row)
!
SELECT xml_is_well_formed('<relativens xmlns=''relative''/>');
! xml_is_well_formed
! --------------------
! t
! (1 row)
!
SELECT xml_is_well_formed('<twoerrors>&idontexist;</unbalanced>');
! xml_is_well_formed
! --------------------
! f
! (1 row)
!
SET xmloption TO CONTENT;
SELECT xml_is_well_formed('abc');
! xml_is_well_formed
! --------------------
! t
! (1 row)
!
-- Since xpath() deals with namespaces, it's a bit stricter about
-- what's well-formed and what's not. If we don't obey these rules
-- (i.e. ignore namespace-related errors from libxml), xpath()
--- 678,765 ----
SELECT COUNT(id) FROM xmltest, query WHERE xmlexists(expr PASSING BY REF data);
count
-------
! 0
(1 row)
-- Test xml_is_well_formed and variants
SELECT xml_is_well_formed_document('<foo>bar</foo>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed_document('abc');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed_content('<foo>bar</foo>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed_content('abc');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SET xmloption TO DOCUMENT;
SELECT xml_is_well_formed('abc');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<abc/>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<foo>bar</foo>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<foo>bar</foo');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<foo><bar>baz</foo>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<local:data xmlns:local="http://127.0.0.1"><local:piece id="1">number one</local:piece><local:piece id="2" /></local:data>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</my:foo>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<pg:foo xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<invalidentity>&</abc>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<undefinedentity>&idontexist;</abc>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<invalidns xmlns=''<''/>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<relativens xmlns=''relative''/>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT xml_is_well_formed('<twoerrors>&idontexist;</unbalanced>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SET xmloption TO CONTENT;
SELECT xml_is_well_formed('abc');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
-- Since xpath() deals with namespaces, it's a bit stricter about
-- what's well-formed and what's not. If we don't obey these rules
-- (i.e. ignore namespace-related errors from libxml), xpath()
***************
*** 875,918 **** SELECT xml_is_well_formed('abc');
-- error messages, we suppress the DETAIL in this test.
\set VERBOSITY terse
SELECT xpath('/*', '<invalidns xmlns=''<''/>');
! ERROR: could not parse XML document
\set VERBOSITY default
-- Again, the XML isn't well-formed for namespace purposes
SELECT xpath('/*', '<nosuchprefix:tag/>');
! ERROR: could not parse XML document
! DETAIL: line 1: Namespace prefix nosuchprefix on tag is not defined
! <nosuchprefix:tag/>
! ^
! CONTEXT: SQL function "xpath" statement 1
-- XPath deprecates relative namespaces, but they're not supposed to
-- throw an error, only a warning.
SELECT xpath('/*', '<relativens xmlns=''relative''/>');
! WARNING: line 1: xmlns: URI relative is not absolute
! <relativens xmlns='relative'/>
! ^
! CONTEXT: SQL function "xpath" statement 1
! xpath
! --------------------------------------
! {"<relativens xmlns=\"relative\"/>"}
! (1 row)
!
-- External entity references should not leak filesystem information.
SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/passwd">]><foo>&c;</foo>');
! xmlparse
! -----------------------------------------------------------------
! <!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/passwd">]><foo>&c;</foo>
! (1 row)
!
SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>');
! xmlparse
! -----------------------------------------------------------------------
! <!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>
! (1 row)
!
-- This might or might not load the requested DTD, but it mustn't throw error.
SELECT XMLPARSE(DOCUMENT '<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"><chapter> </chapter>');
! xmlparse
! ------------------------------------------------------------------------------------------------------------------------------------------------------
! <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"><chapter> </chapter>
! (1 row)
!
--- 772,805 ----
-- error messages, we suppress the DETAIL in this test.
\set VERBOSITY terse
SELECT xpath('/*', '<invalidns xmlns=''<''/>');
! ERROR: unsupported XML feature at character 20
\set VERBOSITY default
-- Again, the XML isn't well-formed for namespace purposes
SELECT xpath('/*', '<nosuchprefix:tag/>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('/*', '<nosuchprefix:tag/>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
-- XPath deprecates relative namespaces, but they're not supposed to
-- throw an error, only a warning.
SELECT xpath('/*', '<relativens xmlns=''relative''/>');
! ERROR: unsupported XML feature
! LINE 1: SELECT xpath('/*', '<relativens xmlns=''relative''/>');
! ^
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
-- External entity references should not leak filesystem information.
SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/passwd">]><foo>&c;</foo>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT XMLPARSE(DOCUMENT '<!DOCTYPE foo [<!ENTITY c SYSTEM "/etc/no.such.file">]><foo>&c;</foo>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
-- This might or might not load the requested DTD, but it mustn't throw error.
SELECT XMLPARSE(DOCUMENT '<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"><chapter> </chapter>');
! ERROR: unsupported XML feature
! DETAIL: This functionality requires the server to be built with libxml support.
! HINT: You need to rebuild PostgreSQL using --with-libxml.
Hi Marko,
I could not apply the patch with git apply, but able to apply it by patch
-p1 command.
However, will you please justify the changes done in "xml.out" ? I guess
they are not needed.
You might need to configure your sources with libxml.
Also, I am not sure about putting "WRAP_COLUMN_DEFAULT" by default. I will
keep that in code committors plate. Rest of the code changes looks good to
me.
Thanks
On Sun, Jan 27, 2013 at 6:23 PM, Marko Tiikkaja <pgmail@joh.to> wrote:
On Fri, 18 Jan 2013 07:46:21 +0100, Jeevan Chalke <
jeevan.chalke@enterprisedb.**com <jeevan.chalke@enterprisedb.com>> wrote:Nice idea.
Marko, just hack ruleutils some thing like this:
Here's a patch attempting to do just that.
The actual code changes were trivial, the patch is mostly just regression
tests.As for the docs, I wasn't entirely happy with what they say about
pg_get_viewdef(), but it didn't look like they needed to be changed by this
either.Regards,
Marko Tiikkaja
--
Jeevan B Chalke
Senior Software Engineer, R&D
EnterpriseDB Corporation
The Enterprise PostgreSQL Company
Phone: +91 20 30589500
Website: www.enterprisedb.com
EnterpriseDB Blog: http://blogs.enterprisedb.com/
Follow us on Twitter: http://www.twitter.com/enterprisedb
This e-mail message (and any attachment) is intended for the use of the
individual or entity to whom it is addressed. This message contains
information from EnterpriseDB Corporation that may be privileged,
confidential, or exempt from disclosure under applicable law. If you are
not the intended recipient or authorized to receive this for the intended
recipient, any use, dissemination, distribution, retention, archiving, or
copying of this communication is strictly prohibited. If you have received
this e-mail in error, please notify the sender immediately by reply e-mail
and delete this message.
On 1/28/13 12:14 PM, Jeevan Chalke wrote:
I could not apply the patch with git apply, but able to apply it by patch
-p1 command.
IME that's normal for patches that went through filterdiff. I do: git
diff |filterdiff --format=context to re-format the patches to the
context diff preferred on the mailing list. Maybe if I somehow told git
to produce context diff it would work..
However, will you please justify the changes done in "xml.out" ? I guess
they are not needed.
You might need to configure your sources with libxml.
If you look very carefully, the pretty-printing version adds one space
at the very beginning of the output. :-)
Also, I am not sure about putting "WRAP_COLUMN_DEFAULT" by default. I will
keep that in code committors plate. Rest of the code changes looks good to
me.
Thanks for reviewing!
Regards,
Marko Tiikkaja
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 28/01/13 12:31, Marko Tiikkaja wrote:
On 1/28/13 12:14 PM, Jeevan Chalke wrote:
I could not apply the patch with git apply, but able to apply it by patch
-p1 command.IME that's normal for patches that went through filterdiff. I do: git
diff |filterdiff --format=context to re-format the patches to the
context diff preferred on the mailing list. Maybe if I somehow told git
to produce context diff it would work..
Try this, worked for me:
http://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git
Cheers,
Jan
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Hi Marko,
On Mon, Jan 28, 2013 at 5:01 PM, Marko Tiikkaja <pgmail@joh.to> wrote:
On 1/28/13 12:14 PM, Jeevan Chalke wrote:
I could not apply the patch with git apply, but able to apply it by patch
-p1 command.IME that's normal for patches that went through filterdiff. I do: git
diff |filterdiff --format=context to re-format the patches to the context
diff preferred on the mailing list. Maybe if I somehow told git to produce
context diff it would work..However, will you please justify the changes done in "xml.out" ? I guess
they are not needed.
You might need to configure your sources with libxml.If you look very carefully, the pretty-printing version adds one space at
the very beginning of the output. :-)
That's fine. I am not at all pointing that to you. Have a look at this:
*** a/src/test/regress/expected/xml.out
--- b/src/test/regress/expected/xml.out
***************
*** 3,82 **** CREATE TABLE xmltest (
data xml
);
INSERT INTO xmltest VALUES (1, '<value>one</value>');
INSERT INTO xmltest VALUES (2, '<value>two</value>');
INSERT INTO xmltest VALUES (3, '<wrong');
! ERROR: invalid XML content
LINE 1: INSERT INTO xmltest VALUES (3, '<wrong');
^
! DETAIL: line 1: Couldn't find end of Start Tag wrong line 1
! <wrong
! ^
.
.
.
--- 3,84 ----
data xml
);
INSERT INTO xmltest VALUES (1, '<value>one</value>');
+ ERROR: unsupported XML feature
+ LINE 1: INSERT INTO xmltest VALUES (1, '<value>one</value>');
+ ^
+ DETAIL: This functionality requires the server to be built with libxml
support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
INSERT INTO xmltest VALUES (2, '<value>two</value>');
+ ERROR: unsupported XML feature
+ LINE 1: INSERT INTO xmltest VALUES (2, '<value>two</value>');
+ ^
+ DETAIL: This functionality requires the server to be built with libxml
support.
+ HINT: You need to rebuild PostgreSQL using --with-libxml.
These changes are not at all required.
Follow the hint.
In other way, if I apply your patch and run make check I get regression
failure for xml.out.
Please check.
Thanks
Also, I am not sure about putting "WRAP_COLUMN_DEFAULT" by default. I will
keep that in code committors plate. Rest of the code changes looks good to
me.Thanks for reviewing!
Regards,
Marko Tiikkaja
--
Jeevan B Chalke
Senior Software Engineer, R&D
EnterpriseDB Corporation
The Enterprise PostgreSQL Company
Phone: +91 20 30589500
Website: www.enterprisedb.com
EnterpriseDB Blog: http://blogs.enterprisedb.com/
Follow us on Twitter: http://www.twitter.com/enterprisedb
This e-mail message (and any attachment) is intended for the use of the
individual or entity to whom it is addressed. This message contains
information from EnterpriseDB Corporation that may be privileged,
confidential, or exempt from disclosure under applicable law. If you are
not the intended recipient or authorized to receive this for the intended
recipient, any use, dissemination, distribution, retention, archiving, or
copying of this communication is strictly prohibited. If you have received
this e-mail in error, please notify the sender immediately by reply e-mail
and delete this message.
On 1/29/13 10:18 AM, Jeevan Chalke wrote:
That's fine. I am not at all pointing that to you. Have a look at this:
Ugh.. I'm sorry, I don't understand how this happened. I manually
looked through all the changes, but somehow this slipped through. Will
have a look this evening.
Regards,
Marko Tiikkaja
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Tue, 29 Jan 2013 10:18:51 +0100, Jeevan Chalke
<jeevan.chalke@enterprisedb.com> wrote:
That's fine. I am not at all pointing that to you. Have a look at this:
Here's the third version of this patch, hopefully this time without any
problems. I looked through the patch and it looked OK, but I did that
last time too so I wouldn't trust myself on that one.
Regards,
Marko Tiikkaja
Attachments:
prettyprint_v3.patchapplication/octet-stream; name=prettyprint_v3.patchDownload
*** a/src/backend/utils/adt/ruleutils.c
--- b/src/backend/utils/adt/ruleutils.c
***************
*** 512,519 **** pg_get_viewdef(PG_FUNCTION_ARGS)
{
/* By OID */
Oid viewoid = PG_GETARG_OID(0);
! PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, 0, -1)));
}
--- 512,520 ----
{
/* By OID */
Oid viewoid = PG_GETARG_OID(0);
+ int prettyFlags = PRETTYFLAG_INDENT;
! PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, -1)));
}
***************
*** 525,531 **** pg_get_viewdef_ext(PG_FUNCTION_ARGS)
bool pretty = PG_GETARG_BOOL(1);
int prettyFlags;
! prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0;
PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT)));
}
--- 526,532 ----
bool pretty = PG_GETARG_BOOL(1);
int prettyFlags;
! prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT)));
}
*** a/src/test/regress/expected/aggregates.out
--- b/src/test/regress/expected/aggregates.out
***************
*** 943,951 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! --------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
--- 943,952 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
***************
*** 959,967 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
(1 row)
create or replace view agg_view1 as
--- 960,969 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! -------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
(1 row)
create or replace view agg_view1 as
***************
*** 975,983 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.b) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
(1 row)
create or replace view agg_view1 as
--- 977,986 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! -------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.b) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 3) i(i);
(1 row)
create or replace view agg_view1 as
***************
*** 990,998 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c ORDER BY (v.b + 1)) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
--- 993,1002 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c ORDER BY (v.b + 1)) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
***************
*** 1005,1013 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.a, v.c ORDER BY v.b) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
--- 1009,1018 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.a, v.c ORDER BY v.b) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
***************
*** 1020,1028 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c ORDER BY v.c USING ~<~ NULLS LAST) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
--- 1025,1034 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(v.a, v.b, v.c ORDER BY v.c USING ~<~ NULLS LAST) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c);
(1 row)
create or replace view agg_view1 as
***************
*** 1036,1044 **** select * from agg_view1;
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.a, v.c USING ~<~ NULLS LAST, v.b) AS aggfns FROM (VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 2) i(i);
(1 row)
drop view agg_view1;
--- 1042,1051 ----
(1 row)
select pg_get_viewdef('agg_view1'::regclass);
! pg_get_viewdef
! -------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT aggfns(DISTINCT v.a, v.b, v.c ORDER BY v.a, v.c USING ~<~ NULLS LAST, v.b) AS aggfns +
! FROM ( VALUES (1,3,'foo'::text), (0,NULL::integer,NULL::text), (2,2,'bar'::text), (3,1,'baz'::text)) v(a, b, c), generate_series(1, 2) i(i);
(1 row)
drop view agg_view1;
*** a/src/test/regress/expected/collate.out
--- b/src/test/regress/expected/collate.out
***************
*** 194,204 **** CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C";
CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "POSIX") FROM collate_test10;
SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'collview%' ORDER BY 1;
! table_name | view_definition
! ------------+------------------------------------------------------------------------------------------------------------------------
! collview1 | SELECT collate_test1.a, collate_test1.b FROM collate_test1 WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text);
! collview2 | SELECT collate_test1.a, collate_test1.b FROM collate_test1 ORDER BY (collate_test1.b COLLATE "C");
! collview3 | SELECT collate_test10.a, lower(((collate_test10.x || collate_test10.x) COLLATE "POSIX")) AS lower FROM collate_test10;
(3 rows)
-- collation propagation in various expression types
--- 194,209 ----
CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "POSIX") FROM collate_test10;
SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'collview%' ORDER BY 1;
! table_name | view_definition
! ------------+----------------------------------------------------------------------------------------------------
! collview1 | SELECT collate_test1.a, collate_test1.b +
! | FROM collate_test1 +
! | WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text);
! collview2 | SELECT collate_test1.a, collate_test1.b +
! | FROM collate_test1 +
! | ORDER BY (collate_test1.b COLLATE "C");
! collview3 | SELECT collate_test10.a, lower(((collate_test10.x || collate_test10.x) COLLATE "POSIX")) AS lower+
! | FROM collate_test10;
(3 rows)
-- collation propagation in various expression types
*** a/src/test/regress/expected/rules.out
--- b/src/test/regress/expected/rules.out
***************
*** 1277,1344 **** drop table cchild;
-- Check that ruleutils are working
--
SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schema' ORDER BY viewname;
! viewname | definition
! ---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r WHERE (ih.thepath ## r.thepath);
! pg_available_extension_versions | SELECT e.name, e.version, (x.extname IS NOT NULL) AS installed, e.superuser, e.relocatable, e.schema, e.requires, e.comment FROM (pg_available_extension_versions() e(name, version, superuser, relocatable, schema, requires, comment) LEFT JOIN pg_extension x ON (((e.name = x.extname) AND (e.version = x.extversion))));
! pg_available_extensions | SELECT e.name, e.default_version, x.extversion AS installed_version, e.comment FROM (pg_available_extensions() e(name, default_version, comment) LEFT JOIN pg_extension x ON ((e.name = x.extname)));
! pg_cursors | SELECT c.name, c.statement, c.is_holdable, c.is_binary, c.is_scrollable, c.creation_time FROM pg_cursor() c(name, statement, is_holdable, is_binary, is_scrollable, creation_time);
! pg_group | SELECT pg_authid.rolname AS groname, pg_authid.oid AS grosysid, ARRAY(SELECT pg_auth_members.member FROM pg_auth_members WHERE (pg_auth_members.roleid = pg_authid.oid)) AS grolist FROM pg_authid WHERE (NOT pg_authid.rolcanlogin);
! pg_indexes | SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, t.spcname AS tablespace, pg_get_indexdef(i.oid) AS indexdef FROM ((((pg_index x JOIN pg_class c ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace))) WHERE ((c.relkind = 'r'::"char") AND (i.relkind = 'i'::"char"));
! pg_locks | SELECT l.locktype, l.database, l.relation, l.page, l.tuple, l.virtualxid, l.transactionid, l.classid, l.objid, l.objsubid, l.virtualtransaction, l.pid, l.mode, l.granted, l.fastpath FROM pg_lock_status() l(locktype, database, relation, page, tuple, virtualxid, transactionid, classid, objid, objsubid, virtualtransaction, pid, mode, granted, fastpath);
! pg_prepared_statements | SELECT p.name, p.statement, p.prepare_time, p.parameter_types, p.from_sql FROM pg_prepared_statement() p(name, statement, prepare_time, parameter_types, from_sql);
! pg_prepared_xacts | SELECT p.transaction, p.gid, p.prepared, u.rolname AS owner, d.datname AS database FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) LEFT JOIN pg_database d ON ((p.dbid = d.oid)));
! pg_roles | SELECT pg_authid.rolname, pg_authid.rolsuper, pg_authid.rolinherit, pg_authid.rolcreaterole, pg_authid.rolcreatedb, pg_authid.rolcatupdate, pg_authid.rolcanlogin, pg_authid.rolreplication, pg_authid.rolconnlimit, '********'::text AS rolpassword, pg_authid.rolvaliduntil, s.setconfig AS rolconfig, pg_authid.oid FROM (pg_authid LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid))));
! pg_rules | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition FROM ((pg_rewrite r JOIN pg_class c ON ((c.oid = r.ev_class))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name);
! pg_seclabels | (((((((((SELECT l.objoid, l.classoid, l.objsubid, CASE WHEN (rel.relkind = 'r'::"char") THEN 'table'::text WHEN (rel.relkind = 'v'::"char") THEN 'view'::text WHEN (rel.relkind = 'S'::"char") THEN 'sequence'::text WHEN (rel.relkind = 'f'::"char") THEN 'foreign table'::text ELSE NULL::text END AS objtype, rel.relnamespace AS objnamespace, CASE WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) END AS objname, l.provider, l.label FROM ((pg_seclabel l JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) WHERE (l.objsubid = 0) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'column'::text AS objtype, rel.relnamespace AS objnamespace, ((CASE WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) END || '.'::text) || (att.attname)::text) AS objname, l.provider, l.label FROM (((pg_seclabel l JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum)))) JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) WHERE (l.objsubid <> 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, CASE WHEN (pro.proisagg = true) THEN 'aggregate'::text WHEN (pro.proisagg = false) THEN 'function'::text ELSE NULL::text END AS objtype, pro.pronamespace AS objnamespace, (((CASE WHEN pg_function_is_visible(pro.oid) THEN quote_ident((pro.proname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((pro.proname)::text)) END || '('::text) || pg_get_function_arguments(pro.oid)) || ')'::text) AS objname, l.provider, l.label FROM ((pg_seclabel l JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid)))) JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, CASE WHEN (typ.typtype = 'd'::"char") THEN 'domain'::text ELSE 'type'::text END AS objtype, typ.typnamespace AS objnamespace, CASE WHEN pg_type_is_visible(typ.oid) THEN quote_ident((typ.typname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((typ.typname)::text)) END AS objname, l.provider, l.label FROM ((pg_seclabel l JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid)))) JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'large object'::text AS objtype, NULL::oid AS objnamespace, (l.objoid)::text AS objname, l.provider, l.label FROM (pg_seclabel l JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid))) WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0))) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'language'::text AS objtype, NULL::oid AS objnamespace, quote_ident((lan.lanname)::text) AS objname, l.provider, l.label FROM (pg_seclabel l JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid)))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'schema'::text AS objtype, nsp.oid AS objnamespace, quote_ident((nsp.nspname)::text) AS objname, l.provider, l.label FROM (pg_seclabel l JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid)))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, l.objsubid, 'event trigger'::text AS objtype, NULL::oid AS objnamespace, quote_ident((evt.evtname)::text) AS objname, l.provider, l.label FROM (pg_seclabel l JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid)))) WHERE (l.objsubid = 0)) UNION ALL SELECT l.objoid, l.classoid, 0 AS objsubid, 'database'::text AS objtype, NULL::oid AS objnamespace, quote_ident((dat.datname)::text) AS objname, l.provider, l.label FROM (pg_shseclabel l JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid))))) UNION ALL SELECT l.objoid, l.classoid, 0 AS objsubid, 'tablespace'::text AS objtype, NULL::oid AS objnamespace, quote_ident((spc.spcname)::text) AS objname, l.provider, l.label FROM (pg_shseclabel l JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid))))) UNION ALL SELECT l.objoid, l.classoid, 0 AS objsubid, 'role'::text AS objtype, NULL::oid AS objnamespace, quote_ident((rol.rolname)::text) AS objname, l.provider, l.label FROM (pg_shseclabel l JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
! pg_settings | SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val, a.enumvals, a.boot_val, a.reset_val, a.sourcefile, a.sourceline FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, sourcefile, sourceline);
! pg_shadow | SELECT pg_authid.rolname AS usename, pg_authid.oid AS usesysid, pg_authid.rolcreatedb AS usecreatedb, pg_authid.rolsuper AS usesuper, pg_authid.rolcatupdate AS usecatupd, pg_authid.rolreplication AS userepl, pg_authid.rolpassword AS passwd, (pg_authid.rolvaliduntil)::abstime AS valuntil, s.setconfig AS useconfig FROM (pg_authid LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid)))) WHERE pg_authid.rolcanlogin;
! pg_stat_activity | SELECT s.datid, d.datname, s.pid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_hostname, s.client_port, s.backend_start, s.xact_start, s.query_start, s.state_change, s.waiting, s.state, s.query FROM pg_database d, pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, waiting, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port), pg_authid u WHERE ((s.datid = d.oid) AND (s.usesysid = u.oid));
! pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch FROM (((pg_class c JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
! pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_numscans(c.oid) AS seq_scan, pg_stat_get_tuples_returned(c.oid) AS seq_tup_read, (sum(pg_stat_get_numscans(i.indexrelid)))::bigint AS idx_scan, ((sum(pg_stat_get_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_tuples_fetched(c.oid)) AS idx_tup_fetch, pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_tuples_deleted(c.oid) AS n_tup_del, pg_stat_get_tuples_hot_updated(c.oid) AS n_tup_hot_upd, pg_stat_get_live_tuples(c.oid) AS n_live_tup, pg_stat_get_dead_tuples(c.oid) AS n_dead_tup, pg_stat_get_last_vacuum_time(c.oid) AS last_vacuum, pg_stat_get_last_autovacuum_time(c.oid) AS last_autovacuum, pg_stat_get_last_analyze_time(c.oid) AS last_analyze, pg_stat_get_last_autoanalyze_time(c.oid) AS last_autoanalyze, pg_stat_get_vacuum_count(c.oid) AS vacuum_count, pg_stat_get_autovacuum_count(c.oid) AS autovacuum_count, pg_stat_get_analyze_count(c.oid) AS analyze_count, pg_stat_get_autoanalyze_count(c.oid) AS autoanalyze_count FROM ((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) GROUP BY c.oid, n.nspname, c.relname;
! pg_stat_bgwriter | SELECT pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, pg_stat_get_checkpoint_write_time() AS checkpoint_write_time, pg_stat_get_checkpoint_sync_time() AS checkpoint_sync_time, pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint, pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, pg_stat_get_buf_written_backend() AS buffers_backend, pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync, pg_stat_get_buf_alloc() AS buffers_alloc, pg_stat_get_bgwriter_stat_reset_time() AS stats_reset;
! pg_stat_database | SELECT d.oid AS datid, d.datname, pg_stat_get_db_numbackends(d.oid) AS numbackends, pg_stat_get_db_xact_commit(d.oid) AS xact_commit, pg_stat_get_db_xact_rollback(d.oid) AS xact_rollback, (pg_stat_get_db_blocks_fetched(d.oid) - pg_stat_get_db_blocks_hit(d.oid)) AS blks_read, pg_stat_get_db_blocks_hit(d.oid) AS blks_hit, pg_stat_get_db_tuples_returned(d.oid) AS tup_returned, pg_stat_get_db_tuples_fetched(d.oid) AS tup_fetched, pg_stat_get_db_tuples_inserted(d.oid) AS tup_inserted, pg_stat_get_db_tuples_updated(d.oid) AS tup_updated, pg_stat_get_db_tuples_deleted(d.oid) AS tup_deleted, pg_stat_get_db_conflict_all(d.oid) AS conflicts, pg_stat_get_db_temp_files(d.oid) AS temp_files, pg_stat_get_db_temp_bytes(d.oid) AS temp_bytes, pg_stat_get_db_deadlocks(d.oid) AS deadlocks, pg_stat_get_db_blk_read_time(d.oid) AS blk_read_time, pg_stat_get_db_blk_write_time(d.oid) AS blk_write_time, pg_stat_get_db_stat_reset_time(d.oid) AS stats_reset FROM pg_database d;
! pg_stat_database_conflicts | SELECT d.oid AS datid, d.datname, pg_stat_get_db_conflict_tablespace(d.oid) AS confl_tablespace, pg_stat_get_db_conflict_lock(d.oid) AS confl_lock, pg_stat_get_db_conflict_snapshot(d.oid) AS confl_snapshot, pg_stat_get_db_conflict_bufferpin(d.oid) AS confl_bufferpin, pg_stat_get_db_conflict_startup_deadlock(d.oid) AS confl_deadlock FROM pg_database d;
! pg_stat_replication | SELECT s.pid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_hostname, s.client_port, s.backend_start, w.state, w.sent_location, w.write_location, w.flush_location, w.replay_location, w.sync_priority, w.sync_state FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, waiting, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port), pg_authid u, pg_stat_get_wal_senders() w(pid, state, sent_location, write_location, flush_location, replay_location, sync_priority, sync_state) WHERE ((s.usesysid = u.oid) AND (s.pid = w.pid));
! pg_stat_sys_indexes | SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, pg_stat_all_indexes.relname, pg_stat_all_indexes.indexrelname, pg_stat_all_indexes.idx_scan, pg_stat_all_indexes.idx_tup_read, pg_stat_all_indexes.idx_tup_fetch FROM pg_stat_all_indexes WHERE ((pg_stat_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_indexes.schemaname ~ '^pg_toast'::text));
! pg_stat_sys_tables | SELECT pg_stat_all_tables.relid, pg_stat_all_tables.schemaname, pg_stat_all_tables.relname, pg_stat_all_tables.seq_scan, pg_stat_all_tables.seq_tup_read, pg_stat_all_tables.idx_scan, pg_stat_all_tables.idx_tup_fetch, pg_stat_all_tables.n_tup_ins, pg_stat_all_tables.n_tup_upd, pg_stat_all_tables.n_tup_del, pg_stat_all_tables.n_tup_hot_upd, pg_stat_all_tables.n_live_tup, pg_stat_all_tables.n_dead_tup, pg_stat_all_tables.last_vacuum, pg_stat_all_tables.last_autovacuum, pg_stat_all_tables.last_analyze, pg_stat_all_tables.last_autoanalyze, pg_stat_all_tables.vacuum_count, pg_stat_all_tables.autovacuum_count, pg_stat_all_tables.analyze_count, pg_stat_all_tables.autoanalyze_count FROM pg_stat_all_tables WHERE ((pg_stat_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_tables.schemaname ~ '^pg_toast'::text));
! pg_stat_user_functions | SELECT p.oid AS funcid, n.nspname AS schemaname, p.proname AS funcname, pg_stat_get_function_calls(p.oid) AS calls, pg_stat_get_function_total_time(p.oid) AS total_time, pg_stat_get_function_self_time(p.oid) AS self_time FROM (pg_proc p LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_function_calls(p.oid) IS NOT NULL));
! pg_stat_user_indexes | SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, pg_stat_all_indexes.relname, pg_stat_all_indexes.indexrelname, pg_stat_all_indexes.idx_scan, pg_stat_all_indexes.idx_tup_read, pg_stat_all_indexes.idx_tup_fetch FROM pg_stat_all_indexes WHERE ((pg_stat_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_indexes.schemaname !~ '^pg_toast'::text));
! pg_stat_user_tables | SELECT pg_stat_all_tables.relid, pg_stat_all_tables.schemaname, pg_stat_all_tables.relname, pg_stat_all_tables.seq_scan, pg_stat_all_tables.seq_tup_read, pg_stat_all_tables.idx_scan, pg_stat_all_tables.idx_tup_fetch, pg_stat_all_tables.n_tup_ins, pg_stat_all_tables.n_tup_upd, pg_stat_all_tables.n_tup_del, pg_stat_all_tables.n_tup_hot_upd, pg_stat_all_tables.n_live_tup, pg_stat_all_tables.n_dead_tup, pg_stat_all_tables.last_vacuum, pg_stat_all_tables.last_autovacuum, pg_stat_all_tables.last_analyze, pg_stat_all_tables.last_autoanalyze, pg_stat_all_tables.vacuum_count, pg_stat_all_tables.autovacuum_count, pg_stat_all_tables.analyze_count, pg_stat_all_tables.autoanalyze_count FROM pg_stat_all_tables WHERE ((pg_stat_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_tables.schemaname !~ '^pg_toast'::text));
! pg_stat_xact_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_xact_numscans(c.oid) AS seq_scan, pg_stat_get_xact_tuples_returned(c.oid) AS seq_tup_read, (sum(pg_stat_get_xact_numscans(i.indexrelid)))::bigint AS idx_scan, ((sum(pg_stat_get_xact_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_xact_tuples_fetched(c.oid)) AS idx_tup_fetch, pg_stat_get_xact_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_xact_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_xact_tuples_deleted(c.oid) AS n_tup_del, pg_stat_get_xact_tuples_hot_updated(c.oid) AS n_tup_hot_upd FROM ((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) GROUP BY c.oid, n.nspname, c.relname;
! pg_stat_xact_sys_tables | SELECT pg_stat_xact_all_tables.relid, pg_stat_xact_all_tables.schemaname, pg_stat_xact_all_tables.relname, pg_stat_xact_all_tables.seq_scan, pg_stat_xact_all_tables.seq_tup_read, pg_stat_xact_all_tables.idx_scan, pg_stat_xact_all_tables.idx_tup_fetch, pg_stat_xact_all_tables.n_tup_ins, pg_stat_xact_all_tables.n_tup_upd, pg_stat_xact_all_tables.n_tup_del, pg_stat_xact_all_tables.n_tup_hot_upd FROM pg_stat_xact_all_tables WHERE ((pg_stat_xact_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_xact_all_tables.schemaname ~ '^pg_toast'::text));
! pg_stat_xact_user_functions | SELECT p.oid AS funcid, n.nspname AS schemaname, p.proname AS funcname, pg_stat_get_xact_function_calls(p.oid) AS calls, pg_stat_get_xact_function_total_time(p.oid) AS total_time, pg_stat_get_xact_function_self_time(p.oid) AS self_time FROM (pg_proc p LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_xact_function_calls(p.oid) IS NOT NULL));
! pg_stat_xact_user_tables | SELECT pg_stat_xact_all_tables.relid, pg_stat_xact_all_tables.schemaname, pg_stat_xact_all_tables.relname, pg_stat_xact_all_tables.seq_scan, pg_stat_xact_all_tables.seq_tup_read, pg_stat_xact_all_tables.idx_scan, pg_stat_xact_all_tables.idx_tup_fetch, pg_stat_xact_all_tables.n_tup_ins, pg_stat_xact_all_tables.n_tup_upd, pg_stat_xact_all_tables.n_tup_del, pg_stat_xact_all_tables.n_tup_hot_upd FROM pg_stat_xact_all_tables WHERE ((pg_stat_xact_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_xact_all_tables.schemaname !~ '^pg_toast'::text));
! pg_statio_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, (pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read, pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit FROM (((pg_class c JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
! pg_statio_all_sequences | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS blks_read, pg_stat_get_blocks_hit(c.oid) AS blks_hit FROM (pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'S'::"char");
! pg_statio_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS heap_blks_read, pg_stat_get_blocks_hit(c.oid) AS heap_blks_hit, (sum((pg_stat_get_blocks_fetched(i.indexrelid) - pg_stat_get_blocks_hit(i.indexrelid))))::bigint AS idx_blks_read, (sum(pg_stat_get_blocks_hit(i.indexrelid)))::bigint AS idx_blks_hit, (pg_stat_get_blocks_fetched(t.oid) - pg_stat_get_blocks_hit(t.oid)) AS toast_blks_read, pg_stat_get_blocks_hit(t.oid) AS toast_blks_hit, (pg_stat_get_blocks_fetched(x.oid) - pg_stat_get_blocks_hit(x.oid)) AS tidx_blks_read, pg_stat_get_blocks_hit(x.oid) AS tidx_blks_hit FROM ((((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid))) LEFT JOIN pg_class x ON ((t.reltoastidxid = x.oid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) GROUP BY c.oid, n.nspname, c.relname, t.oid, x.oid;
! pg_statio_sys_indexes | SELECT pg_statio_all_indexes.relid, pg_statio_all_indexes.indexrelid, pg_statio_all_indexes.schemaname, pg_statio_all_indexes.relname, pg_statio_all_indexes.indexrelname, pg_statio_all_indexes.idx_blks_read, pg_statio_all_indexes.idx_blks_hit FROM pg_statio_all_indexes WHERE ((pg_statio_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_indexes.schemaname ~ '^pg_toast'::text));
! pg_statio_sys_sequences | SELECT pg_statio_all_sequences.relid, pg_statio_all_sequences.schemaname, pg_statio_all_sequences.relname, pg_statio_all_sequences.blks_read, pg_statio_all_sequences.blks_hit FROM pg_statio_all_sequences WHERE ((pg_statio_all_sequences.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_sequences.schemaname ~ '^pg_toast'::text));
! pg_statio_sys_tables | SELECT pg_statio_all_tables.relid, pg_statio_all_tables.schemaname, pg_statio_all_tables.relname, pg_statio_all_tables.heap_blks_read, pg_statio_all_tables.heap_blks_hit, pg_statio_all_tables.idx_blks_read, pg_statio_all_tables.idx_blks_hit, pg_statio_all_tables.toast_blks_read, pg_statio_all_tables.toast_blks_hit, pg_statio_all_tables.tidx_blks_read, pg_statio_all_tables.tidx_blks_hit FROM pg_statio_all_tables WHERE ((pg_statio_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_tables.schemaname ~ '^pg_toast'::text));
! pg_statio_user_indexes | SELECT pg_statio_all_indexes.relid, pg_statio_all_indexes.indexrelid, pg_statio_all_indexes.schemaname, pg_statio_all_indexes.relname, pg_statio_all_indexes.indexrelname, pg_statio_all_indexes.idx_blks_read, pg_statio_all_indexes.idx_blks_hit FROM pg_statio_all_indexes WHERE ((pg_statio_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_indexes.schemaname !~ '^pg_toast'::text));
! pg_statio_user_sequences | SELECT pg_statio_all_sequences.relid, pg_statio_all_sequences.schemaname, pg_statio_all_sequences.relname, pg_statio_all_sequences.blks_read, pg_statio_all_sequences.blks_hit FROM pg_statio_all_sequences WHERE ((pg_statio_all_sequences.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_sequences.schemaname !~ '^pg_toast'::text));
! pg_statio_user_tables | SELECT pg_statio_all_tables.relid, pg_statio_all_tables.schemaname, pg_statio_all_tables.relname, pg_statio_all_tables.heap_blks_read, pg_statio_all_tables.heap_blks_hit, pg_statio_all_tables.idx_blks_read, pg_statio_all_tables.idx_blks_hit, pg_statio_all_tables.toast_blks_read, pg_statio_all_tables.toast_blks_hit, pg_statio_all_tables.tidx_blks_read, pg_statio_all_tables.tidx_blks_hit FROM pg_statio_all_tables WHERE ((pg_statio_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_tables.schemaname !~ '^pg_toast'::text));
! pg_stats | SELECT n.nspname AS schemaname, c.relname AS tablename, a.attname, s.stainherit AS inherited, s.stanullfrac AS null_frac, s.stawidth AS avg_width, s.stadistinct AS n_distinct, CASE WHEN (s.stakind1 = 1) THEN s.stavalues1 WHEN (s.stakind2 = 1) THEN s.stavalues2 WHEN (s.stakind3 = 1) THEN s.stavalues3 WHEN (s.stakind4 = 1) THEN s.stavalues4 WHEN (s.stakind5 = 1) THEN s.stavalues5 ELSE NULL::anyarray END AS most_common_vals, CASE WHEN (s.stakind1 = 1) THEN s.stanumbers1 WHEN (s.stakind2 = 1) THEN s.stanumbers2 WHEN (s.stakind3 = 1) THEN s.stanumbers3 WHEN (s.stakind4 = 1) THEN s.stanumbers4 WHEN (s.stakind5 = 1) THEN s.stanumbers5 ELSE NULL::real[] END AS most_common_freqs, CASE WHEN (s.stakind1 = 2) THEN s.stavalues1 WHEN (s.stakind2 = 2) THEN s.stavalues2 WHEN (s.stakind3 = 2) THEN s.stavalues3 WHEN (s.stakind4 = 2) THEN s.stavalues4 WHEN (s.stakind5 = 2) THEN s.stavalues5 ELSE NULL::anyarray END AS histogram_bounds, CASE WHEN (s.stakind1 = 3) THEN s.stanumbers1[1] WHEN (s.stakind2 = 3) THEN s.stanumbers2[1] WHEN (s.stakind3 = 3) THEN s.stanumbers3[1] WHEN (s.stakind4 = 3) THEN s.stanumbers4[1] WHEN (s.stakind5 = 3) THEN s.stanumbers5[1] ELSE NULL::real END AS correlation, CASE WHEN (s.stakind1 = 4) THEN s.stavalues1 WHEN (s.stakind2 = 4) THEN s.stavalues2 WHEN (s.stakind3 = 4) THEN s.stavalues3 WHEN (s.stakind4 = 4) THEN s.stavalues4 WHEN (s.stakind5 = 4) THEN s.stavalues5 ELSE NULL::anyarray END AS most_common_elems, CASE WHEN (s.stakind1 = 4) THEN s.stanumbers1 WHEN (s.stakind2 = 4) THEN s.stanumbers2 WHEN (s.stakind3 = 4) THEN s.stanumbers3 WHEN (s.stakind4 = 4) THEN s.stanumbers4 WHEN (s.stakind5 = 4) THEN s.stanumbers5 ELSE NULL::real[] END AS most_common_elem_freqs, CASE WHEN (s.stakind1 = 5) THEN s.stanumbers1 WHEN (s.stakind2 = 5) THEN s.stanumbers2 WHEN (s.stakind3 = 5) THEN s.stanumbers3 WHEN (s.stakind4 = 5) THEN s.stanumbers4 WHEN (s.stakind5 = 5) THEN s.stanumbers5 ELSE NULL::real[] END AS elem_count_histogram FROM (((pg_statistic s JOIN pg_class c ON ((c.oid = s.starelid))) JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum)))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE ((NOT a.attisdropped) AND has_column_privilege(c.oid, a.attnum, 'select'::text));
! pg_tables | SELECT n.nspname AS schemaname, c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS tablespace, c.relhasindex AS hasindexes, c.relhasrules AS hasrules, c.relhastriggers AS hastriggers FROM ((pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace))) WHERE (c.relkind = 'r'::"char");
! pg_timezone_abbrevs | SELECT pg_timezone_abbrevs.abbrev, pg_timezone_abbrevs.utc_offset, pg_timezone_abbrevs.is_dst FROM pg_timezone_abbrevs() pg_timezone_abbrevs(abbrev, utc_offset, is_dst);
! pg_timezone_names | SELECT pg_timezone_names.name, pg_timezone_names.abbrev, pg_timezone_names.utc_offset, pg_timezone_names.is_dst FROM pg_timezone_names() pg_timezone_names(name, abbrev, utc_offset, is_dst);
! pg_user | SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb, pg_shadow.usesuper, pg_shadow.usecatupd, pg_shadow.userepl, '********'::text AS passwd, pg_shadow.valuntil, pg_shadow.useconfig FROM pg_shadow;
! pg_user_mappings | SELECT u.oid AS umid, s.oid AS srvid, s.srvname, u.umuser, CASE WHEN (u.umuser = (0)::oid) THEN 'public'::name ELSE a.rolname END AS usename, CASE WHEN (pg_has_role(s.srvowner, 'USAGE'::text) OR has_server_privilege(s.oid, 'USAGE'::text)) THEN u.umoptions ELSE NULL::text[] END AS umoptions FROM ((pg_user_mapping u LEFT JOIN pg_authid a ON ((a.oid = u.umuser))) JOIN pg_foreign_server s ON ((u.umserver = s.oid)));
! pg_views | 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");
! rtest_v1 | SELECT rtest_t1.a, rtest_t1.b FROM rtest_t1;
! rtest_vcomp | SELECT x.part, (x.size * y.factor) AS size_in_cm FROM rtest_comp x, rtest_unitfact y WHERE (x.unit = y.unit);
! rtest_vview1 | SELECT x.a, x.b FROM rtest_view1 x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y WHERE (y.a = x.a)));
! rtest_vview2 | SELECT rtest_view1.a, rtest_view1.b FROM rtest_view1 WHERE rtest_view1.v;
! rtest_vview3 | SELECT x.a, x.b FROM rtest_vview2 x WHERE (0 < (SELECT count(*) AS count FROM rtest_view2 y WHERE (y.a = x.a)));
! rtest_vview4 | SELECT x.a, x.b, count(y.a) AS refcount FROM rtest_view1 x, rtest_view2 y WHERE (x.a = y.a) GROUP BY x.a, x.b;
! rtest_vview5 | SELECT rtest_view1.a, rtest_view1.b, rtest_viewfunc1(rtest_view1.a) AS refcount FROM rtest_view1;
! shoe | SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit FROM shoe_data sh, unit un WHERE (sh.slunit = un.un_name);
! shoe_ready | SELECT rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail FROM shoe rsh, shoelace rsl WHERE (((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >= rsh.slminlen_cm)) AND (rsl.sl_len_cm <= rsh.slmaxlen_cm));
! shoelace | SELECT s.sl_name, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, (s.sl_len * u.un_fact) AS sl_len_cm FROM shoelace_data s, unit u WHERE (s.sl_unit = u.un_name);
! shoelace_candelete | SELECT shoelace_obsolete.sl_name, shoelace_obsolete.sl_avail, shoelace_obsolete.sl_color, shoelace_obsolete.sl_len, shoelace_obsolete.sl_unit, shoelace_obsolete.sl_len_cm FROM shoelace_obsolete WHERE (shoelace_obsolete.sl_avail = 0);
! shoelace_obsolete | SELECT shoelace.sl_name, shoelace.sl_avail, shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm FROM shoelace WHERE (NOT (EXISTS (SELECT shoe.shoename FROM shoe WHERE (shoe.slcolor = shoelace.sl_color))));
! street | SELECT r.name, r.thepath, c.cname FROM ONLY road r, real_city c WHERE (c.outline ## r.thepath);
! toyemp | SELECT emp.name, emp.age, emp.location, (12 * emp.salary) AS annualsal FROM emp;
(60 rows)
SELECT tablename, rulename, definition FROM pg_rules
--- 1277,1643 ----
-- Check that ruleutils are working
--
SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schema' ORDER BY viewname;
! viewname | definition
! ---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit +
! | FROM ihighway ih, ramp r +
! | WHERE (ih.thepath ## r.thepath);
! pg_available_extension_versions | SELECT e.name, e.version, (x.extname IS NOT NULL) AS installed, e.superuser, e.relocatable, e.schema, e.requires, e.comment +
! | FROM (pg_available_extension_versions() e(name, version, superuser, relocatable, schema, requires, comment) +
! | LEFT JOIN pg_extension x ON (((e.name = x.extname) AND (e.version = x.extversion))));
! pg_available_extensions | SELECT e.name, e.default_version, x.extversion AS installed_version, e.comment +
! | FROM (pg_available_extensions() e(name, default_version, comment) +
! | LEFT JOIN pg_extension x ON ((e.name = x.extname)));
! pg_cursors | SELECT c.name, c.statement, c.is_holdable, c.is_binary, c.is_scrollable, c.creation_time +
! | FROM pg_cursor() c(name, statement, is_holdable, is_binary, is_scrollable, creation_time);
! pg_group | SELECT pg_authid.rolname AS groname, pg_authid.oid AS grosysid, ARRAY( SELECT pg_auth_members.member +
! | FROM pg_auth_members +
! | WHERE (pg_auth_members.roleid = pg_authid.oid)) AS grolist +
! | FROM pg_authid +
! | WHERE (NOT pg_authid.rolcanlogin);
! pg_indexes | SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, t.spcname AS tablespace, pg_get_indexdef(i.oid) AS indexdef +
! | FROM ((((pg_index x +
! | JOIN pg_class c ON ((c.oid = x.indrelid))) +
! | JOIN pg_class i ON ((i.oid = x.indexrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace))) +
! | WHERE ((c.relkind = 'r'::"char") AND (i.relkind = 'i'::"char"));
! pg_locks | SELECT l.locktype, l.database, l.relation, l.page, l.tuple, l.virtualxid, l.transactionid, l.classid, l.objid, l.objsubid, l.virtualtransaction, l.pid, l.mode, l.granted, l.fastpath +
! | FROM pg_lock_status() l(locktype, database, relation, page, tuple, virtualxid, transactionid, classid, objid, objsubid, virtualtransaction, pid, mode, granted, fastpath);
! pg_prepared_statements | SELECT p.name, p.statement, p.prepare_time, p.parameter_types, p.from_sql +
! | FROM pg_prepared_statement() p(name, statement, prepare_time, parameter_types, from_sql);
! pg_prepared_xacts | SELECT p.transaction, p.gid, p.prepared, u.rolname AS owner, d.datname AS database +
! | FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid) +
! | LEFT JOIN pg_authid u ON ((p.ownerid = u.oid))) +
! | LEFT JOIN pg_database d ON ((p.dbid = d.oid)));
! pg_roles | SELECT pg_authid.rolname, pg_authid.rolsuper, pg_authid.rolinherit, pg_authid.rolcreaterole, pg_authid.rolcreatedb, pg_authid.rolcatupdate, pg_authid.rolcanlogin, pg_authid.rolreplication, pg_authid.rolconnlimit, '********'::text AS rolpassword, pg_authid.rolvaliduntil, s.setconfig AS rolconfig, pg_authid.oid +
! | FROM (pg_authid +
! | LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid))));
! pg_rules | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition +
! | FROM ((pg_rewrite r +
! | JOIN pg_class c ON ((c.oid = r.ev_class))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (r.rulename <> '_RETURN'::name);
! pg_seclabels | ( ( ( ( ( ( ( ( ( SELECT l.objoid, l.classoid, l.objsubid, +
! | CASE +
! | WHEN (rel.relkind = 'r'::"char") THEN 'table'::text +
! | WHEN (rel.relkind = 'v'::"char") THEN 'view'::text +
! | WHEN (rel.relkind = 'S'::"char") THEN 'sequence'::text +
! | WHEN (rel.relkind = 'f'::"char") THEN 'foreign table'::text +
! | ELSE NULL::text +
! | END AS objtype, rel.relnamespace AS objnamespace, +
! | CASE +
! | WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) +
! | ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) +
! | END AS objname, l.provider, l.label +
! | FROM ((pg_seclabel l +
! | JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) +
! | JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) +
! | WHERE (l.objsubid = 0) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'column'::text AS objtype, rel.relnamespace AS objnamespace, (( +
! | CASE +
! | WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text) +
! | ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text)) +
! | END || '.'::text) || (att.attname)::text) AS objname, l.provider, l.label +
! | FROM (((pg_seclabel l +
! | JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid)))) +
! | JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum)))) +
! | JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) +
! | WHERE (l.objsubid <> 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, +
! | CASE +
! | WHEN (pro.proisagg = true) THEN 'aggregate'::text +
! | WHEN (pro.proisagg = false) THEN 'function'::text +
! | ELSE NULL::text +
! | END AS objtype, pro.pronamespace AS objnamespace, ((( +
! | CASE +
! | WHEN pg_function_is_visible(pro.oid) THEN quote_ident((pro.proname)::text) +
! | ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((pro.proname)::text)) +
! | END || '('::text) || pg_get_function_arguments(pro.oid)) || ')'::text) AS objname, l.provider, l.label +
! | FROM ((pg_seclabel l +
! | JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid)))) +
! | JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, +
! | CASE +
! | WHEN (typ.typtype = 'd'::"char") THEN 'domain'::text +
! | ELSE 'type'::text +
! | END AS objtype, typ.typnamespace AS objnamespace, +
! | CASE +
! | WHEN pg_type_is_visible(typ.oid) THEN quote_ident((typ.typname)::text) +
! | ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((typ.typname)::text)) +
! | END AS objname, l.provider, l.label +
! | FROM ((pg_seclabel l +
! | JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid)))) +
! | JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'large object'::text AS objtype, NULL::oid AS objnamespace, (l.objoid)::text AS objname, l.provider, l.label +
! | FROM (pg_seclabel l +
! | JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid))) +
! | WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0))) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'language'::text AS objtype, NULL::oid AS objnamespace, quote_ident((lan.lanname)::text) AS objname, l.provider, l.label +
! | FROM (pg_seclabel l +
! | JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid)))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'schema'::text AS objtype, nsp.oid AS objnamespace, quote_ident((nsp.nspname)::text) AS objname, l.provider, l.label +
! | FROM (pg_seclabel l +
! | JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid)))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, l.objsubid, 'event trigger'::text AS objtype, NULL::oid AS objnamespace, quote_ident((evt.evtname)::text) AS objname, l.provider, l.label +
! | FROM (pg_seclabel l +
! | JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid)))) +
! | WHERE (l.objsubid = 0)) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, 0 AS objsubid, 'database'::text AS objtype, NULL::oid AS objnamespace, quote_ident((dat.datname)::text) AS objname, l.provider, l.label +
! | FROM (pg_shseclabel l +
! | JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid))))) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, 0 AS objsubid, 'tablespace'::text AS objtype, NULL::oid AS objnamespace, quote_ident((spc.spcname)::text) AS objname, l.provider, l.label +
! | FROM (pg_shseclabel l +
! | JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid))))) +
! | UNION ALL +
! | SELECT l.objoid, l.classoid, 0 AS objsubid, 'role'::text AS objtype, NULL::oid AS objnamespace, quote_ident((rol.rolname)::text) AS objname, l.provider, l.label +
! | FROM (pg_shseclabel l +
! | JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
! pg_settings | SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val, a.enumvals, a.boot_val, a.reset_val, a.sourcefile, a.sourceline +
! | FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, sourcefile, sourceline);
! pg_shadow | SELECT pg_authid.rolname AS usename, pg_authid.oid AS usesysid, pg_authid.rolcreatedb AS usecreatedb, pg_authid.rolsuper AS usesuper, pg_authid.rolcatupdate AS usecatupd, pg_authid.rolreplication AS userepl, pg_authid.rolpassword AS passwd, (pg_authid.rolvaliduntil)::abstime AS valuntil, s.setconfig AS useconfig +
! | FROM (pg_authid +
! | LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid)))) +
! | WHERE pg_authid.rolcanlogin;
! pg_stat_activity | SELECT s.datid, d.datname, s.pid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_hostname, s.client_port, s.backend_start, s.xact_start, s.query_start, s.state_change, s.waiting, s.state, s.query +
! | FROM pg_database d, pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, waiting, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port), pg_authid u +
! | WHERE ((s.datid = d.oid) AND (s.usesysid = u.oid));
! pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch +
! | FROM (((pg_class c +
! | JOIN pg_index x ON ((c.oid = x.indrelid))) +
! | JOIN pg_class i ON ((i.oid = x.indexrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
! pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_numscans(c.oid) AS seq_scan, pg_stat_get_tuples_returned(c.oid) AS seq_tup_read, (sum(pg_stat_get_numscans(i.indexrelid)))::bigint AS idx_scan, ((sum(pg_stat_get_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_tuples_fetched(c.oid)) AS idx_tup_fetch, pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_tuples_deleted(c.oid) AS n_tup_del, pg_stat_get_tuples_hot_updated(c.oid) AS n_tup_hot_upd, pg_stat_get_live_tuples(c.oid) AS n_live_tup, pg_stat_get_dead_tuples(c.oid) AS n_dead_tup, pg_stat_get_last_vacuum_time(c.oid) AS last_vacuum, pg_stat_get_last_autovacuum_time(c.oid) AS last_autovacuum, pg_stat_get_last_analyze_time(c.oid) AS last_analyze, pg_stat_get_last_autoanalyze_time(c.oid) AS last_autoanalyze, pg_stat_get_vacuum_count(c.oid) AS vacuum_count, pg_stat_get_autovacuum_count(c.oid) AS autovacuum_count, pg_stat_get_analyze_count(c.oid) AS analyze_count, pg_stat_get_autoanalyze_count(c.oid) AS autoanalyze_count+
! | FROM ((pg_class c +
! | LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) +
! | GROUP BY c.oid, n.nspname, c.relname;
! pg_stat_bgwriter | SELECT pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, pg_stat_get_checkpoint_write_time() AS checkpoint_write_time, pg_stat_get_checkpoint_sync_time() AS checkpoint_sync_time, pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint, pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, pg_stat_get_buf_written_backend() AS buffers_backend, pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync, pg_stat_get_buf_alloc() AS buffers_alloc, pg_stat_get_bgwriter_stat_reset_time() AS stats_reset;
! pg_stat_database | SELECT d.oid AS datid, d.datname, pg_stat_get_db_numbackends(d.oid) AS numbackends, pg_stat_get_db_xact_commit(d.oid) AS xact_commit, pg_stat_get_db_xact_rollback(d.oid) AS xact_rollback, (pg_stat_get_db_blocks_fetched(d.oid) - pg_stat_get_db_blocks_hit(d.oid)) AS blks_read, pg_stat_get_db_blocks_hit(d.oid) AS blks_hit, pg_stat_get_db_tuples_returned(d.oid) AS tup_returned, pg_stat_get_db_tuples_fetched(d.oid) AS tup_fetched, pg_stat_get_db_tuples_inserted(d.oid) AS tup_inserted, pg_stat_get_db_tuples_updated(d.oid) AS tup_updated, pg_stat_get_db_tuples_deleted(d.oid) AS tup_deleted, pg_stat_get_db_conflict_all(d.oid) AS conflicts, pg_stat_get_db_temp_files(d.oid) AS temp_files, pg_stat_get_db_temp_bytes(d.oid) AS temp_bytes, pg_stat_get_db_deadlocks(d.oid) AS deadlocks, pg_stat_get_db_blk_read_time(d.oid) AS blk_read_time, pg_stat_get_db_blk_write_time(d.oid) AS blk_write_time, pg_stat_get_db_stat_reset_time(d.oid) AS stats_reset +
! | FROM pg_database d;
! pg_stat_database_conflicts | SELECT d.oid AS datid, d.datname, pg_stat_get_db_conflict_tablespace(d.oid) AS confl_tablespace, pg_stat_get_db_conflict_lock(d.oid) AS confl_lock, pg_stat_get_db_conflict_snapshot(d.oid) AS confl_snapshot, pg_stat_get_db_conflict_bufferpin(d.oid) AS confl_bufferpin, pg_stat_get_db_conflict_startup_deadlock(d.oid) AS confl_deadlock +
! | FROM pg_database d;
! pg_stat_replication | SELECT s.pid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_hostname, s.client_port, s.backend_start, w.state, w.sent_location, w.write_location, w.flush_location, w.replay_location, w.sync_priority, w.sync_state +
! | FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, waiting, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port), pg_authid u, pg_stat_get_wal_senders() w(pid, state, sent_location, write_location, flush_location, replay_location, sync_priority, sync_state) +
! | WHERE ((s.usesysid = u.oid) AND (s.pid = w.pid));
! pg_stat_sys_indexes | SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, pg_stat_all_indexes.relname, pg_stat_all_indexes.indexrelname, pg_stat_all_indexes.idx_scan, pg_stat_all_indexes.idx_tup_read, pg_stat_all_indexes.idx_tup_fetch +
! | FROM pg_stat_all_indexes +
! | WHERE ((pg_stat_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_indexes.schemaname ~ '^pg_toast'::text));
! pg_stat_sys_tables | SELECT pg_stat_all_tables.relid, pg_stat_all_tables.schemaname, pg_stat_all_tables.relname, pg_stat_all_tables.seq_scan, pg_stat_all_tables.seq_tup_read, pg_stat_all_tables.idx_scan, pg_stat_all_tables.idx_tup_fetch, pg_stat_all_tables.n_tup_ins, pg_stat_all_tables.n_tup_upd, pg_stat_all_tables.n_tup_del, pg_stat_all_tables.n_tup_hot_upd, pg_stat_all_tables.n_live_tup, pg_stat_all_tables.n_dead_tup, pg_stat_all_tables.last_vacuum, pg_stat_all_tables.last_autovacuum, pg_stat_all_tables.last_analyze, pg_stat_all_tables.last_autoanalyze, pg_stat_all_tables.vacuum_count, pg_stat_all_tables.autovacuum_count, pg_stat_all_tables.analyze_count, pg_stat_all_tables.autoanalyze_count +
! | FROM pg_stat_all_tables +
! | WHERE ((pg_stat_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_all_tables.schemaname ~ '^pg_toast'::text));
! pg_stat_user_functions | SELECT p.oid AS funcid, n.nspname AS schemaname, p.proname AS funcname, pg_stat_get_function_calls(p.oid) AS calls, pg_stat_get_function_total_time(p.oid) AS total_time, pg_stat_get_function_self_time(p.oid) AS self_time +
! | FROM (pg_proc p +
! | LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) +
! | WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_function_calls(p.oid) IS NOT NULL));
! pg_stat_user_indexes | SELECT pg_stat_all_indexes.relid, pg_stat_all_indexes.indexrelid, pg_stat_all_indexes.schemaname, pg_stat_all_indexes.relname, pg_stat_all_indexes.indexrelname, pg_stat_all_indexes.idx_scan, pg_stat_all_indexes.idx_tup_read, pg_stat_all_indexes.idx_tup_fetch +
! | FROM pg_stat_all_indexes +
! | WHERE ((pg_stat_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_indexes.schemaname !~ '^pg_toast'::text));
! pg_stat_user_tables | SELECT pg_stat_all_tables.relid, pg_stat_all_tables.schemaname, pg_stat_all_tables.relname, pg_stat_all_tables.seq_scan, pg_stat_all_tables.seq_tup_read, pg_stat_all_tables.idx_scan, pg_stat_all_tables.idx_tup_fetch, pg_stat_all_tables.n_tup_ins, pg_stat_all_tables.n_tup_upd, pg_stat_all_tables.n_tup_del, pg_stat_all_tables.n_tup_hot_upd, pg_stat_all_tables.n_live_tup, pg_stat_all_tables.n_dead_tup, pg_stat_all_tables.last_vacuum, pg_stat_all_tables.last_autovacuum, pg_stat_all_tables.last_analyze, pg_stat_all_tables.last_autoanalyze, pg_stat_all_tables.vacuum_count, pg_stat_all_tables.autovacuum_count, pg_stat_all_tables.analyze_count, pg_stat_all_tables.autoanalyze_count +
! | FROM pg_stat_all_tables +
! | WHERE ((pg_stat_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_all_tables.schemaname !~ '^pg_toast'::text));
! pg_stat_xact_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_xact_numscans(c.oid) AS seq_scan, pg_stat_get_xact_tuples_returned(c.oid) AS seq_tup_read, (sum(pg_stat_get_xact_numscans(i.indexrelid)))::bigint AS idx_scan, ((sum(pg_stat_get_xact_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_xact_tuples_fetched(c.oid)) AS idx_tup_fetch, pg_stat_get_xact_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_xact_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_xact_tuples_deleted(c.oid) AS n_tup_del, pg_stat_get_xact_tuples_hot_updated(c.oid) AS n_tup_hot_upd +
! | FROM ((pg_class c +
! | LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) +
! | GROUP BY c.oid, n.nspname, c.relname;
! pg_stat_xact_sys_tables | SELECT pg_stat_xact_all_tables.relid, pg_stat_xact_all_tables.schemaname, pg_stat_xact_all_tables.relname, pg_stat_xact_all_tables.seq_scan, pg_stat_xact_all_tables.seq_tup_read, pg_stat_xact_all_tables.idx_scan, pg_stat_xact_all_tables.idx_tup_fetch, pg_stat_xact_all_tables.n_tup_ins, pg_stat_xact_all_tables.n_tup_upd, pg_stat_xact_all_tables.n_tup_del, pg_stat_xact_all_tables.n_tup_hot_upd +
! | FROM pg_stat_xact_all_tables +
! | WHERE ((pg_stat_xact_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_stat_xact_all_tables.schemaname ~ '^pg_toast'::text));
! pg_stat_xact_user_functions | SELECT p.oid AS funcid, n.nspname AS schemaname, p.proname AS funcname, pg_stat_get_xact_function_calls(p.oid) AS calls, pg_stat_get_xact_function_total_time(p.oid) AS total_time, pg_stat_get_xact_function_self_time(p.oid) AS self_time +
! | FROM (pg_proc p +
! | LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace))) +
! | WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_xact_function_calls(p.oid) IS NOT NULL));
! pg_stat_xact_user_tables | SELECT pg_stat_xact_all_tables.relid, pg_stat_xact_all_tables.schemaname, pg_stat_xact_all_tables.relname, pg_stat_xact_all_tables.seq_scan, pg_stat_xact_all_tables.seq_tup_read, pg_stat_xact_all_tables.idx_scan, pg_stat_xact_all_tables.idx_tup_fetch, pg_stat_xact_all_tables.n_tup_ins, pg_stat_xact_all_tables.n_tup_upd, pg_stat_xact_all_tables.n_tup_del, pg_stat_xact_all_tables.n_tup_hot_upd +
! | FROM pg_stat_xact_all_tables +
! | WHERE ((pg_stat_xact_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_stat_xact_all_tables.schemaname !~ '^pg_toast'::text));
! pg_statio_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, (pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read, pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit +
! | FROM (((pg_class c +
! | JOIN pg_index x ON ((c.oid = x.indrelid))) +
! | JOIN pg_class i ON ((i.oid = x.indexrelid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"]));
! pg_statio_all_sequences | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS blks_read, pg_stat_get_blocks_hit(c.oid) AS blks_hit +
! | FROM (pg_class c +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = 'S'::"char");
! pg_statio_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS heap_blks_read, pg_stat_get_blocks_hit(c.oid) AS heap_blks_hit, (sum((pg_stat_get_blocks_fetched(i.indexrelid) - pg_stat_get_blocks_hit(i.indexrelid))))::bigint AS idx_blks_read, (sum(pg_stat_get_blocks_hit(i.indexrelid)))::bigint AS idx_blks_hit, (pg_stat_get_blocks_fetched(t.oid) - pg_stat_get_blocks_hit(t.oid)) AS toast_blks_read, pg_stat_get_blocks_hit(t.oid) AS toast_blks_hit, (pg_stat_get_blocks_fetched(x.oid) - pg_stat_get_blocks_hit(x.oid)) AS tidx_blks_read, pg_stat_get_blocks_hit(x.oid) AS tidx_blks_hit +
! | FROM ((((pg_class c +
! | LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) +
! | LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid))) +
! | LEFT JOIN pg_class x ON ((t.reltoastidxid = x.oid))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char"])) +
! | GROUP BY c.oid, n.nspname, c.relname, t.oid, x.oid;
! pg_statio_sys_indexes | SELECT pg_statio_all_indexes.relid, pg_statio_all_indexes.indexrelid, pg_statio_all_indexes.schemaname, pg_statio_all_indexes.relname, pg_statio_all_indexes.indexrelname, pg_statio_all_indexes.idx_blks_read, pg_statio_all_indexes.idx_blks_hit +
! | FROM pg_statio_all_indexes +
! | WHERE ((pg_statio_all_indexes.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_indexes.schemaname ~ '^pg_toast'::text));
! pg_statio_sys_sequences | SELECT pg_statio_all_sequences.relid, pg_statio_all_sequences.schemaname, pg_statio_all_sequences.relname, pg_statio_all_sequences.blks_read, pg_statio_all_sequences.blks_hit +
! | FROM pg_statio_all_sequences +
! | WHERE ((pg_statio_all_sequences.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_sequences.schemaname ~ '^pg_toast'::text));
! pg_statio_sys_tables | SELECT pg_statio_all_tables.relid, pg_statio_all_tables.schemaname, pg_statio_all_tables.relname, pg_statio_all_tables.heap_blks_read, pg_statio_all_tables.heap_blks_hit, pg_statio_all_tables.idx_blks_read, pg_statio_all_tables.idx_blks_hit, pg_statio_all_tables.toast_blks_read, pg_statio_all_tables.toast_blks_hit, pg_statio_all_tables.tidx_blks_read, pg_statio_all_tables.tidx_blks_hit +
! | FROM pg_statio_all_tables +
! | WHERE ((pg_statio_all_tables.schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (pg_statio_all_tables.schemaname ~ '^pg_toast'::text));
! pg_statio_user_indexes | SELECT pg_statio_all_indexes.relid, pg_statio_all_indexes.indexrelid, pg_statio_all_indexes.schemaname, pg_statio_all_indexes.relname, pg_statio_all_indexes.indexrelname, pg_statio_all_indexes.idx_blks_read, pg_statio_all_indexes.idx_blks_hit +
! | FROM pg_statio_all_indexes +
! | WHERE ((pg_statio_all_indexes.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_indexes.schemaname !~ '^pg_toast'::text));
! pg_statio_user_sequences | SELECT pg_statio_all_sequences.relid, pg_statio_all_sequences.schemaname, pg_statio_all_sequences.relname, pg_statio_all_sequences.blks_read, pg_statio_all_sequences.blks_hit +
! | FROM pg_statio_all_sequences +
! | WHERE ((pg_statio_all_sequences.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_sequences.schemaname !~ '^pg_toast'::text));
! pg_statio_user_tables | SELECT pg_statio_all_tables.relid, pg_statio_all_tables.schemaname, pg_statio_all_tables.relname, pg_statio_all_tables.heap_blks_read, pg_statio_all_tables.heap_blks_hit, pg_statio_all_tables.idx_blks_read, pg_statio_all_tables.idx_blks_hit, pg_statio_all_tables.toast_blks_read, pg_statio_all_tables.toast_blks_hit, pg_statio_all_tables.tidx_blks_read, pg_statio_all_tables.tidx_blks_hit +
! | FROM pg_statio_all_tables +
! | WHERE ((pg_statio_all_tables.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (pg_statio_all_tables.schemaname !~ '^pg_toast'::text));
! pg_stats | SELECT n.nspname AS schemaname, c.relname AS tablename, a.attname, s.stainherit AS inherited, s.stanullfrac AS null_frac, s.stawidth AS avg_width, s.stadistinct AS n_distinct, +
! | CASE +
! | WHEN (s.stakind1 = 1) THEN s.stavalues1 +
! | WHEN (s.stakind2 = 1) THEN s.stavalues2 +
! | WHEN (s.stakind3 = 1) THEN s.stavalues3 +
! | WHEN (s.stakind4 = 1) THEN s.stavalues4 +
! | WHEN (s.stakind5 = 1) THEN s.stavalues5 +
! | ELSE NULL::anyarray +
! | END AS most_common_vals, +
! | CASE +
! | WHEN (s.stakind1 = 1) THEN s.stanumbers1 +
! | WHEN (s.stakind2 = 1) THEN s.stanumbers2 +
! | WHEN (s.stakind3 = 1) THEN s.stanumbers3 +
! | WHEN (s.stakind4 = 1) THEN s.stanumbers4 +
! | WHEN (s.stakind5 = 1) THEN s.stanumbers5 +
! | ELSE NULL::real[] +
! | END AS most_common_freqs, +
! | CASE +
! | WHEN (s.stakind1 = 2) THEN s.stavalues1 +
! | WHEN (s.stakind2 = 2) THEN s.stavalues2 +
! | WHEN (s.stakind3 = 2) THEN s.stavalues3 +
! | WHEN (s.stakind4 = 2) THEN s.stavalues4 +
! | WHEN (s.stakind5 = 2) THEN s.stavalues5 +
! | ELSE NULL::anyarray +
! | END AS histogram_bounds, +
! | CASE +
! | WHEN (s.stakind1 = 3) THEN s.stanumbers1[1] +
! | WHEN (s.stakind2 = 3) THEN s.stanumbers2[1] +
! | WHEN (s.stakind3 = 3) THEN s.stanumbers3[1] +
! | WHEN (s.stakind4 = 3) THEN s.stanumbers4[1] +
! | WHEN (s.stakind5 = 3) THEN s.stanumbers5[1] +
! | ELSE NULL::real +
! | END AS correlation, +
! | CASE +
! | WHEN (s.stakind1 = 4) THEN s.stavalues1 +
! | WHEN (s.stakind2 = 4) THEN s.stavalues2 +
! | WHEN (s.stakind3 = 4) THEN s.stavalues3 +
! | WHEN (s.stakind4 = 4) THEN s.stavalues4 +
! | WHEN (s.stakind5 = 4) THEN s.stavalues5 +
! | ELSE NULL::anyarray +
! | END AS most_common_elems, +
! | CASE +
! | WHEN (s.stakind1 = 4) THEN s.stanumbers1 +
! | WHEN (s.stakind2 = 4) THEN s.stanumbers2 +
! | WHEN (s.stakind3 = 4) THEN s.stanumbers3 +
! | WHEN (s.stakind4 = 4) THEN s.stanumbers4 +
! | WHEN (s.stakind5 = 4) THEN s.stanumbers5 +
! | ELSE NULL::real[] +
! | END AS most_common_elem_freqs, +
! | CASE +
! | WHEN (s.stakind1 = 5) THEN s.stanumbers1 +
! | WHEN (s.stakind2 = 5) THEN s.stanumbers2 +
! | WHEN (s.stakind3 = 5) THEN s.stanumbers3 +
! | WHEN (s.stakind4 = 5) THEN s.stanumbers4 +
! | WHEN (s.stakind5 = 5) THEN s.stanumbers5 +
! | ELSE NULL::real[] +
! | END AS elem_count_histogram +
! | FROM (((pg_statistic s +
! | JOIN pg_class c ON ((c.oid = s.starelid))) +
! | JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum)))) +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | WHERE ((NOT a.attisdropped) AND has_column_privilege(c.oid, a.attnum, 'select'::text));
! pg_tables | SELECT n.nspname AS schemaname, c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS tablespace, c.relhasindex AS hasindexes, c.relhasrules AS hasrules, c.relhastriggers AS hastriggers +
! | FROM ((pg_class c +
! | LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) +
! | LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace))) +
! | WHERE (c.relkind = 'r'::"char");
! pg_timezone_abbrevs | SELECT pg_timezone_abbrevs.abbrev, pg_timezone_abbrevs.utc_offset, pg_timezone_abbrevs.is_dst +
! | FROM pg_timezone_abbrevs() pg_timezone_abbrevs(abbrev, utc_offset, is_dst);
! pg_timezone_names | SELECT pg_timezone_names.name, pg_timezone_names.abbrev, pg_timezone_names.utc_offset, pg_timezone_names.is_dst +
! | FROM pg_timezone_names() pg_timezone_names(name, abbrev, utc_offset, is_dst);
! pg_user | SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb, pg_shadow.usesuper, pg_shadow.usecatupd, pg_shadow.userepl, '********'::text AS passwd, pg_shadow.valuntil, pg_shadow.useconfig +
! | FROM pg_shadow;
! pg_user_mappings | SELECT u.oid AS umid, s.oid AS srvid, s.srvname, u.umuser, +
! | CASE +
! | WHEN (u.umuser = (0)::oid) THEN 'public'::name +
! | ELSE a.rolname +
! | END AS usename, +
! | CASE +
! | WHEN (pg_has_role(s.srvowner, 'USAGE'::text) OR has_server_privilege(s.oid, 'USAGE'::text)) THEN u.umoptions +
! | ELSE NULL::text[] +
! | END AS umoptions +
! | FROM ((pg_user_mapping u +
! | LEFT JOIN pg_authid a ON ((a.oid = u.umuser))) +
! | JOIN pg_foreign_server s ON ((u.umserver = s.oid)));
! pg_views | 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");
! rtest_v1 | SELECT rtest_t1.a, rtest_t1.b +
! | FROM rtest_t1;
! rtest_vcomp | SELECT x.part, (x.size * y.factor) AS size_in_cm +
! | FROM rtest_comp x, rtest_unitfact y +
! | WHERE (x.unit = y.unit);
! rtest_vview1 | SELECT x.a, x.b +
! | FROM rtest_view1 x +
! | WHERE (0 < ( SELECT count(*) AS count +
! | FROM rtest_view2 y +
! | WHERE (y.a = x.a)));
! rtest_vview2 | SELECT rtest_view1.a, rtest_view1.b +
! | FROM rtest_view1 +
! | WHERE rtest_view1.v;
! rtest_vview3 | SELECT x.a, x.b +
! | FROM rtest_vview2 x +
! | WHERE (0 < ( SELECT count(*) AS count +
! | FROM rtest_view2 y +
! | WHERE (y.a = x.a)));
! rtest_vview4 | SELECT x.a, x.b, count(y.a) AS refcount +
! | FROM rtest_view1 x, rtest_view2 y +
! | WHERE (x.a = y.a) +
! | GROUP BY x.a, x.b;
! rtest_vview5 | SELECT rtest_view1.a, rtest_view1.b, rtest_viewfunc1(rtest_view1.a) AS refcount +
! | FROM rtest_view1;
! shoe | SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit +
! | FROM shoe_data sh, unit un +
! | WHERE (sh.slunit = un.un_name);
! shoe_ready | SELECT rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail +
! | FROM shoe rsh, shoelace rsl +
! | WHERE (((rsl.sl_color = rsh.slcolor) AND (rsl.sl_len_cm >= rsh.slminlen_cm)) AND (rsl.sl_len_cm <= rsh.slmaxlen_cm));
! shoelace | SELECT s.sl_name, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, (s.sl_len * u.un_fact) AS sl_len_cm +
! | FROM shoelace_data s, unit u +
! | WHERE (s.sl_unit = u.un_name);
! shoelace_candelete | SELECT shoelace_obsolete.sl_name, shoelace_obsolete.sl_avail, shoelace_obsolete.sl_color, shoelace_obsolete.sl_len, shoelace_obsolete.sl_unit, shoelace_obsolete.sl_len_cm +
! | FROM shoelace_obsolete +
! | WHERE (shoelace_obsolete.sl_avail = 0);
! shoelace_obsolete | SELECT shoelace.sl_name, shoelace.sl_avail, shoelace.sl_color, shoelace.sl_len, shoelace.sl_unit, shoelace.sl_len_cm +
! | FROM shoelace +
! | WHERE (NOT (EXISTS ( SELECT shoe.shoename +
! | FROM shoe +
! | WHERE (shoe.slcolor = shoelace.sl_color))));
! street | SELECT r.name, r.thepath, c.cname +
! | FROM ONLY road r, real_city c +
! | WHERE (c.outline ## r.thepath);
! toyemp | SELECT emp.name, emp.age, emp.location, (12 * emp.salary) AS annualsal +
! | FROM emp;
(60 rows)
SELECT tablename, rulename, definition FROM pg_rules
***************
*** 1584,1592 **** select * from only t1_2;
-- test various flavors of pg_get_viewdef()
select pg_get_viewdef('shoe'::regclass) as unpretty;
! unpretty
! -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit FROM shoe_data sh, unit un WHERE (sh.slunit = un.un_name);
(1 row)
select pg_get_viewdef('shoe'::regclass,true) as pretty;
--- 1883,1893 ----
-- test various flavors of pg_get_viewdef()
select pg_get_viewdef('shoe'::regclass) as unpretty;
! unpretty
! -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, (sh.slminlen * un.un_fact) AS slminlen_cm, sh.slmaxlen, (sh.slmaxlen * un.un_fact) AS slmaxlen_cm, sh.slunit+
! FROM shoe_data sh, unit un +
! WHERE (sh.slunit = un.un_name);
(1 row)
select pg_get_viewdef('shoe'::regclass,true) as pretty;
*** a/src/test/regress/expected/with.out
--- b/src/test/regress/expected/with.out
***************
*** 270,278 **** SELECT * FROM vsubdepartment ORDER BY name;
-- Check reverse listing
SELECT pg_get_viewdef('vsubdepartment'::regclass);
! pg_get_viewdef
! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
! WITH RECURSIVE subdepartment AS (SELECT department.id, department.parent_department, department.name FROM department WHERE (department.name = 'A'::text) UNION ALL SELECT d.id, d.parent_department, d.name FROM department d, subdepartment sd WHERE (d.parent_department = sd.id)) SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name FROM subdepartment;
(1 row)
SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
--- 270,288 ----
-- Check reverse listing
SELECT pg_get_viewdef('vsubdepartment'::regclass);
! pg_get_viewdef
! --------------------------------------------------------------------------------------
! WITH RECURSIVE subdepartment AS ( +
! SELECT department.id, department.parent_department, department.name+
! FROM department +
! WHERE (department.name = 'A'::text) +
! UNION ALL +
! SELECT d.id, d.parent_department, d.name +
! FROM department d, subdepartment sd +
! WHERE (d.parent_department = sd.id) +
! ) +
! SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name +
! FROM subdepartment;
(1 row)
SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
*** a/src/test/regress/expected/xml.out
--- b/src/test/regress/expected/xml.out
***************
*** 540,556 **** CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10));
CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text);
SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'xmlview%' ORDER BY 1;
! table_name | view_definition
! ------------+----------------------------------------------------------------------------------------------------------------------------
! xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment;
! xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat";
! xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement";
! xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(emp.name AS name, emp.age AS age, emp.salary AS pay)) AS "xmlelement" FROM emp;
! xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse";
! xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi";
! xmlview7 | SELECT XMLROOT('<foo/>'::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot";
! xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10)))::character(10) AS "xmlserialize";
! xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text) AS "xmlserialize";
(9 rows)
-- Text XPath expressions evaluation
--- 540,557 ----
CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text);
SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'xmlview%' ORDER BY 1;
! table_name | view_definition
! ------------+-------------------------------------------------------------------------------------------------------------------
! xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment;
! xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat";
! xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement";
! xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(emp.name AS name, emp.age AS age, emp.salary AS pay)) AS "xmlelement"+
! | FROM emp;
! xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse";
! xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi";
! xmlview7 | SELECT XMLROOT('<foo/>'::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot";
! xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10)))::character(10) AS "xmlserialize";
! xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text) AS "xmlserialize";
(9 rows)
-- Text XPath expressions evaluation
Hi Marko,
On Wed, Jan 30, 2013 at 2:07 AM, Marko Tiikkaja <pgmail@joh.to> wrote:
On Tue, 29 Jan 2013 10:18:51 +0100, Jeevan Chalke <
jeevan.chalke@enterprisedb.**com <jeevan.chalke@enterprisedb.com>> wrote:That's fine. I am not at all pointing that to you. Have a look at this:
Here's the third version of this patch, hopefully this time without any
problems. I looked through the patch and it looked OK, but I did that last
time too so I wouldn't trust myself on that one.
Looks good this time.
Will mark "Ready for committor"
However, I am not sure about putting "WRAP_COLUMN_DEFAULT" by default. In
my opinion we should put that by default but other people may object so I
will keep that in code committors plate.
Thanks
Regards,
Marko Tiikkaja
--
Jeevan B Chalke
Senior Software Engineer, R&D
EnterpriseDB Corporation
The Enterprise PostgreSQL Company
Phone: +91 20 30589500
Website: www.enterprisedb.com
EnterpriseDB Blog: http://blogs.enterprisedb.com/
Follow us on Twitter: http://www.twitter.com/enterprisedb
This e-mail message (and any attachment) is intended for the use of the
individual or entity to whom it is addressed. This message contains
information from EnterpriseDB Corporation that may be privileged,
confidential, or exempt from disclosure under applicable law. If you are
not the intended recipient or authorized to receive this for the intended
recipient, any use, dissemination, distribution, retention, archiving, or
copying of this communication is strictly prohibited. If you have received
this e-mail in error, please notify the sender immediately by reply e-mail
and delete this message.
On 1/30/13 7:52 AM, Jeevan Chalke wrote:
Looks good this time.
Will mark "Ready for committor"
Thanks for reviewing it more carefully than I did! :-) And my apologies
for the confusion earlier.
However, I am not sure about putting "WRAP_COLUMN_DEFAULT" by default. In
my opinion we should put that by default but other people may object so I
will keep that in code committors plate.
I have no opinion on this to one way or the other, so I'm fine with
waiting for someone else (possibly the committer) to decide this.
Regards,
Marko Tiikkaja
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Marko Tiikkaja <pgmail@joh.to> writes:
On 1/30/13 7:52 AM, Jeevan Chalke wrote:
However, I am not sure about putting "WRAP_COLUMN_DEFAULT" by default. In
my opinion we should put that by default but other people may object so I
will keep that in code committors plate.
I have no opinion on this to one way or the other, so I'm fine with
waiting for someone else (possibly the committer) to decide this.
FWIW, I'd vote for not enabling that by default --- it's basically an
unwarranted assumption about how wide people's terminal windows are.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 01/30/2013 09:58 AM, Tom Lane wrote:
Marko Tiikkaja <pgmail@joh.to> writes:
On 1/30/13 7:52 AM, Jeevan Chalke wrote:
However, I am not sure about putting "WRAP_COLUMN_DEFAULT" by default. In
my opinion we should put that by default but other people may object so I
will keep that in code committors plate.I have no opinion on this to one way or the other, so I'm fine with
waiting for someone else (possibly the committer) to decide this.FWIW, I'd vote for not enabling that by default --- it's basically an
unwarranted assumption about how wide people's terminal windows are.
I'm not exactly sure what you're arguing for.
cheers
andrew
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Andrew Dunstan <andrew@dunslane.net> writes:
On 01/30/2013 09:58 AM, Tom Lane wrote:
Marko Tiikkaja <pgmail@joh.to> writes:
On 1/30/13 7:52 AM, Jeevan Chalke wrote:
However, I am not sure about putting "WRAP_COLUMN_DEFAULT" by default. In
my opinion we should put that by default but other people may object so I
will keep that in code committors plate.
FWIW, I'd vote for not enabling that by default --- it's basically an
unwarranted assumption about how wide people's terminal windows are.
I'm not exactly sure what you're arguing for.
Maybe I'm confused - I thought the alternative Jeevan was talking about
was that we enable PRETTY_INDENT processing by default, but not
wrapColumn processing.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 01/30/2013 11:03 AM, Tom Lane wrote:
Andrew Dunstan <andrew@dunslane.net> writes:
On 01/30/2013 09:58 AM, Tom Lane wrote:
Marko Tiikkaja <pgmail@joh.to> writes:
On 1/30/13 7:52 AM, Jeevan Chalke wrote:
However, I am not sure about putting "WRAP_COLUMN_DEFAULT" by default. In
my opinion we should put that by default but other people may object so I
will keep that in code committors plate.FWIW, I'd vote for not enabling that by default --- it's basically an
unwarranted assumption about how wide people's terminal windows are.I'm not exactly sure what you're arguing for.
Maybe I'm confused - I thought the alternative Jeevan was talking about
was that we enable PRETTY_INDENT processing by default, but not
wrapColumn processing.
Well, we could actually set the wrap value to 0, which would mean always
wrap. That wouldn't be making any assumption about the user's terminal
window size ;-)
Here are two examples, one of which is with exactly Marko's patch which
doesn't change the wrap value (i.e. leaves it at -1, meaning no wrap) ,
the other sets it at 0. The example is a view that is the same as
information_schema.columns.
Personally I find the wrapped case MUCH more readable. I guess anything
is an advance, but turning on PRETTY_INDENT without turning on some
level of target wrapping seems like a half-done job.
cheers
andrew
Andrew Dunstan <andrew@dunslane.net> writes:
On 01/30/2013 11:03 AM, Tom Lane wrote:
FWIW, I'd vote for not enabling that by default --- it's basically an
unwarranted assumption about how wide people's terminal windows are.
Well, we could actually set the wrap value to 0, which would mean always
wrap. That wouldn't be making any assumption about the user's terminal
window size ;-)
I could live with that. I rather wonder actually if WRAP_COLUMN_DEFAULT
shouldn't be removed in favor of using 0 as the default. 80-column
windows may be our coding standard for Postgres, but that doesn't mean
they're not pretty passe elsewhere.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Andrew Dunstan <andrew@dunslane.net> writes:
Well, we could actually set the wrap value to 0, which would mean always
wrap. That wouldn't be making any assumption about the user's terminal
window size ;-)
+1
Personally I find the wrapped case MUCH more readable. I guess anything is
an advance, but turning on PRETTY_INDENT without turning on some level of
target wrapping seems like a half-done job.
Minor gripe: the CASE WHEN THEN indenting is not ideal:
CASE
WHEN (a.attnotnull OR ((t.typtype = 'd'::"char") AND t.typnotnull)) THEN 'NO'::text
ELSE 'YES'::text
END)::information_schema.yes_or_no AS is_nullable,
I think the following is easier to read:
CASE
WHEN (a.attnotnull OR ((t.typtype = 'd'::"char") AND t.typnotnull))
THEN 'NO'::text
ELSE 'YES'::text
END)::information_schema.yes_or_no AS is_nullable,
But I realise it's not exactly what's being talked about in this thread…
Regards,
--
Dimitri Fontaine
http://2ndQuadrant.fr PostgreSQL : Expertise, Formation et Support
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Thu, Jan 31, 2013 at 4:40 PM, Dimitri Fontaine <dimitri@2ndquadrant.fr>wrote:
Andrew Dunstan <andrew@dunslane.net> writes:
Well, we could actually set the wrap value to 0, which would mean always
wrap. That wouldn't be making any assumption about the user's terminal
window size ;-)+1
+1
After looking at both the SQL, I too like wrapped case.
Personally I find the wrapped case MUCH more readable. I guess anything
is
an advance, but turning on PRETTY_INDENT without turning on some level of
target wrapping seems like a half-done job.Minor gripe: the CASE WHEN THEN indenting is not ideal:
CASE
WHEN (a.attnotnull OR ((t.typtype = 'd'::"char") AND t.typnotnull))
THEN 'NO'::text
ELSE 'YES'::text
END)::information_schema.yes_or_no AS is_nullable,I think the following is easier to read:
CASE
WHEN (a.attnotnull OR ((t.typtype = 'd'::"char") AND t.typnotnull))
THEN 'NO'::text
ELSE 'YES'::text
END)::information_schema.yes_or_no AS is_nullable,But I realise it's not exactly what's being talked about in this thread…
Regards,
--
Dimitri Fontaine
http://2ndQuadrant.fr PostgreSQL : Expertise, Formation et Support
--
Jeevan B Chalke
Senior Software Engineer, R&D
EnterpriseDB Corporation
The Enterprise PostgreSQL Company
Phone: +91 20 30589500
Website: www.enterprisedb.com
EnterpriseDB Blog: http://blogs.enterprisedb.com/
Follow us on Twitter: http://www.twitter.com/enterprisedb
This e-mail message (and any attachment) is intended for the use of the
individual or entity to whom it is addressed. This message contains
information from EnterpriseDB Corporation that may be privileged,
confidential, or exempt from disclosure under applicable law. If you are
not the intended recipient or authorized to receive this for the intended
recipient, any use, dissemination, distribution, retention, archiving, or
copying of this communication is strictly prohibited. If you have received
this e-mail in error, please notify the sender immediately by reply e-mail
and delete this message.
"Marko Tiikkaja" <pgmail@joh.to> writes:
Here's the third version of this patch, hopefully this time without any
problems. I looked through the patch and it looked OK, but I did that
last time too so I wouldn't trust myself on that one.
Applied with corrections.
The xml expected output was still wrong - to do that part right, you
need to update xml.out with an xml-enabled build and xml_1.out with a
non-xml-enabled build.
Also, it seemed to me that the patch didn't go far enough, in that it
only touched pg_get_viewdef and not the sister functions. pg_dump would
certainly want pg_get_ruledef to have the same behavior, and in general
the documentation seems to me to be clear that all these functions have
similar pretty-print-vs-not behavior. As committed, the pretty_bool
argument only affects PRETTY_PAREN processing for all of them.
I also went ahead and set the default wrap column to zero rather than
the former 79, since it seemed clear that people like that behavior
better.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On 2/3/13 10:06 PM, Tom Lane wrote:
Applied with corrections.
Thank you.
The xml expected output was still wrong - to do that part right, you
need to update xml.out with an xml-enabled build and xml_1.out with a
non-xml-enabled build.
Ahh. That explains a lot.
Regards,
Marko Tiikkaja
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Sun, Feb 3, 2013 at 4:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
"Marko Tiikkaja" <pgmail@joh.to> writes:
Here's the third version of this patch, hopefully this time without any
problems. I looked through the patch and it looked OK, but I did that
last time too so I wouldn't trust myself on that one.Applied with corrections.
The xml expected output was still wrong - to do that part right, you
need to update xml.out with an xml-enabled build and xml_1.out with a
non-xml-enabled build.Also, it seemed to me that the patch didn't go far enough, in that it
only touched pg_get_viewdef and not the sister functions. pg_dump would
certainly want pg_get_ruledef to have the same behavior, and in general
the documentation seems to me to be clear that all these functions have
similar pretty-print-vs-not behavior. As committed, the pretty_bool
argument only affects PRETTY_PAREN processing for all of them.I also went ahead and set the default wrap column to zero rather than
the former 79, since it seemed clear that people like that behavior
better.regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Was this ever committed into core? Apologies, I'm not very familiar with
looking through the commit history of the source code and I don't see
anything about this option or pretty-print outputs in the pg_dump/restore
docs for 9.3. Had someone asking me about this feature for pg_extractor
https://github.com/omniti-labs/pg_extractor/issues/28
--
Keith Fiske
Database Administrator
OmniTI Computer Consulting, Inc.
http://www.keithf4.com
On 4/29/14 4:29 PM, Keith Fiske wrote:
Was this ever committed into core? Apologies, I'm not very familiar with
looking through the commit history of the source code and I don't see
anything about this option or pretty-print outputs in the pg_dump/restore
docs for 9.3. Had someone asking me about this feature for pg_extractor
No, the idea was rejected.
Regards,
Marko Tiikkaja
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Keith Fiske <keith@omniti.com> writes:
On Sun, Feb 3, 2013 at 4:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Applied with corrections.
Was this ever committed into core? Apologies, I'm not very familiar with
looking through the commit history of the source code and I don't see
anything about this option or pretty-print outputs in the pg_dump/restore
docs for 9.3. Had someone asking me about this feature for pg_extractor
Yeah, if I say "applied" that means I committed it. Here's the commit
log entry:
Author: Tom Lane <tgl@sss.pgh.pa.us>
Branch: master Release: REL9_3_BR [62e666400] 2013-02-03 15:56:45 -0500
Perform line wrapping and indenting by default in ruleutils.c.
This patch changes pg_get_viewdef() and allied functions so that
PRETTY_INDENT processing is always enabled. Per discussion, only the
PRETTY_PAREN processing (that is, stripping of "unnecessary" parentheses)
poses any real forward-compatibility risk, so we may as well make dump
output look as nice as we safely can.
Also, set the default wrap length to zero (i.e, wrap after each SELECT
or FROM list item), since there's no very principled argument for the
former default of 80-column wrapping, and most people seem to agree this
way looks better.
Marko Tiikkaja, reviewed by Jeevan Chalke, further hacking by Tom Lane
As per the branch annotation, this is in 9.3 and up.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
On Tue, Apr 29, 2014 at 11:14 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Keith Fiske <keith@omniti.com> writes:
On Sun, Feb 3, 2013 at 4:06 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Applied with corrections.
Was this ever committed into core? Apologies, I'm not very familiar with
looking through the commit history of the source code and I don't see
anything about this option or pretty-print outputs in the pg_dump/restore
docs for 9.3. Had someone asking me about this feature for pg_extractorYeah, if I say "applied" that means I committed it. Here's the commit
log entry:Author: Tom Lane <tgl@sss.pgh.pa.us>
Branch: master Release: REL9_3_BR [62e666400] 2013-02-03 15:56:45 -0500Perform line wrapping and indenting by default in ruleutils.c.
This patch changes pg_get_viewdef() and allied functions so that
PRETTY_INDENT processing is always enabled. Per discussion, only the
PRETTY_PAREN processing (that is, stripping of "unnecessary"
parentheses)
poses any real forward-compatibility risk, so we may as well make dump
output look as nice as we safely can.Also, set the default wrap length to zero (i.e, wrap after each SELECT
or FROM list item), since there's no very principled argument for the
former default of 80-column wrapping, and most people seem to agree
this
way looks better.Marko Tiikkaja, reviewed by Jeevan Chalke, further hacking by Tom Lane
As per the branch annotation, this is in 9.3 and up.
regards, tom lane
Great! Thanks, Tom
--
Keith Fiske
Database Administrator
OmniTI Computer Consulting, Inc.
http://www.keithf4.com
Huh, I had assumed this was old behaviour. I didn't realize this was
new with 9.3.
Considering the thread "pg_get_viewdefs() indentation considered
harmful" I'm beginning to think this was a regression. It results in
some dump files being unnecessarily large and the pg_dump consuming
too much memory and crashing.
Tom liked my suggestion of doing the indentation modulo 40. There are
plenty of other suggestions that can work too, giving up on
indentation after an indent of 40, switching to an indent distance of
1 if it's more than 10 levels deep, and so on. I think it doesn't
really matter which we choose but we have to do something. And given
this is new behaviour in 9.3 perhaps it should be backported too.
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
Greg Stark <stark@mit.edu> writes:
Huh, I had assumed this was old behaviour. I didn't realize this was
new with 9.3.
Considering the thread "pg_get_viewdefs() indentation considered
harmful" I'm beginning to think this was a regression. It results in
some dump files being unnecessarily large and the pg_dump consuming
too much memory and crashing.
Tom liked my suggestion of doing the indentation modulo 40. There are
plenty of other suggestions that can work too, giving up on
indentation after an indent of 40, switching to an indent distance of
1 if it's more than 10 levels deep, and so on. I think it doesn't
really matter which we choose but we have to do something. And given
this is new behaviour in 9.3 perhaps it should be backported too.
I'm still a bit skeptical about this being a catastrophic problem in
practice ... but anyway, I thought there were two somewhat different
proposals on the table in that thread:
1. Arrange for "x UNION y UNION z ..." to put all the UNION arms at
the same indentation level.
2. Change the indentation rules globally, in one or another fashion
as Greg mentions above, to prevent ruleutils from ever prepending
silly amounts of whitespace.
These are not mutually exclusive, and I think we should do both.
But it seems we're hung up on exactly which flavor of #2 to do.
I would argue that rules such as "reduce the indent step once we're too
far over" don't fix the problem, just postpone it. If we're taking this
complaint seriously at all then there needs to be a guaranteed maximum
indent distance, one way or another. So I'd go for either a modulo-N
rule or a hard limit, with some preference for the modulo-N approach.
Yeah, it does sound silly at first, but I think it'd preserve
readability better than just capping the indent.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers
I wrote:
I'm still a bit skeptical about this being a catastrophic problem in
practice ... but anyway, I thought there were two somewhat different
proposals on the table in that thread:
1. Arrange for "x UNION y UNION z ..." to put all the UNION arms at
the same indentation level.
2. Change the indentation rules globally, in one or another fashion
as Greg mentions above, to prevent ruleutils from ever prepending
silly amounts of whitespace.
These are not mutually exclusive, and I think we should do both.
Here's a draft patch tackling point 1. This gets rid of a whole lot
of parenthesization, as well as indentation, for simple UNION lists.
You can see the results in the changed regression test outputs.
There are still a few oddities in the printout format, such as the
forced space between ( and SELECT at the start of a subquery;
but changing that would require touching more than just
get_setop_query(), and I'm not too sure what else would be affected,
so I let it be.
While I was testing this I noticed that there's something thoroughly
busted about the indentation of outer JOIN constructs, too --- you
can see this in some of the regression test queries that are touched
by this patch, where the JOINs are actually outdented to the left of
their FROM clause in the unpatched output. (They'd be outdented in
the new output, too, if negative indentation were possible...)
That seems like material for a separate patch though.
Comments?
regards, tom lane
Attachments:
union-indentation-fix-1.patchtext/x-diff; charset=us-ascii; name=union-indentation-fix-1.patchDownload
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index ea7b8c5..73e09ae 100644
*** a/src/backend/utils/adt/ruleutils.c
--- b/src/backend/utils/adt/ruleutils.c
*************** get_setop_query(Node *setOp, Query *quer
*** 4713,4754 ****
else if (IsA(setOp, SetOperationStmt))
{
SetOperationStmt *op = (SetOperationStmt *) setOp;
!
! if (PRETTY_INDENT(context))
! {
! context->indentLevel += PRETTYINDENT_STD;
! appendStringInfoSpaces(buf, PRETTYINDENT_STD);
! }
/*
! * We force parens whenever nesting two SetOperationStmts. There are
! * some cases in which parens are needed around a leaf query too, but
! * those are more easily handled at the next level down (see code
! * above).
*/
! need_paren = !IsA(op->larg, RangeTblRef);
if (need_paren)
appendStringInfoChar(buf, '(');
get_setop_query(op->larg, query, context, resultDesc);
- if (need_paren)
- appendStringInfoChar(buf, ')');
! if (!PRETTY_INDENT(context))
appendStringInfoChar(buf, ' ');
switch (op->op)
{
case SETOP_UNION:
! appendContextKeyword(context, "UNION ",
! -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
break;
case SETOP_INTERSECT:
! appendContextKeyword(context, "INTERSECT ",
! -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
break;
case SETOP_EXCEPT:
! appendContextKeyword(context, "EXCEPT ",
! -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
break;
default:
elog(ERROR, "unrecognized set op: %d",
--- 4713,4767 ----
else if (IsA(setOp, SetOperationStmt))
{
SetOperationStmt *op = (SetOperationStmt *) setOp;
! int subindent;
/*
! * We force parens when nesting two SetOperationStmts, except when the
! * lefthand input is another setop of the same kind. Syntactically,
! * we could omit parens in rather more cases, but it seems best to use
! * parens to flag cases where the setop operator changes.
! *
! * There are some cases in which parens are needed around a leaf query
! * too, but those are more easily handled at the next level down (see
! * code above).
*/
! if (IsA(op->larg, SetOperationStmt))
! {
! SetOperationStmt *lop = (SetOperationStmt *) op->larg;
!
! if (op->op == lop->op && op->all == lop->all)
! need_paren = false;
! else
! need_paren = true;
! }
! else
! need_paren = false;
if (need_paren)
+ {
appendStringInfoChar(buf, '(');
+ appendContextKeyword(context, "", PRETTYINDENT_STD, 0, 0);
+ }
+
get_setop_query(op->larg, query, context, resultDesc);
! if (need_paren)
! appendContextKeyword(context, ") ", -PRETTYINDENT_STD, 0, 0);
! else if (PRETTY_INDENT(context))
! appendContextKeyword(context, "", 0, 0, 0);
! else
appendStringInfoChar(buf, ' ');
+
switch (op->op)
{
case SETOP_UNION:
! appendStringInfoString(buf, "UNION ");
break;
case SETOP_INTERSECT:
! appendStringInfoString(buf, "INTERSECT ");
break;
case SETOP_EXCEPT:
! appendStringInfoString(buf, "EXCEPT ");
break;
default:
elog(ERROR, "unrecognized set op: %d",
*************** get_setop_query(Node *setOp, Query *quer
*** 4757,4775 ****
if (op->all)
appendStringInfoString(buf, "ALL ");
- if (PRETTY_INDENT(context))
- appendContextKeyword(context, "", 0, 0, 0);
-
need_paren = !IsA(op->rarg, RangeTblRef);
if (need_paren)
appendStringInfoChar(buf, '(');
get_setop_query(op->rarg, query, context, resultDesc);
- if (need_paren)
- appendStringInfoChar(buf, ')');
-
if (PRETTY_INDENT(context))
! context->indentLevel -= PRETTYINDENT_STD;
}
else
{
--- 4770,4791 ----
if (op->all)
appendStringInfoString(buf, "ALL ");
need_paren = !IsA(op->rarg, RangeTblRef);
if (need_paren)
+ {
appendStringInfoChar(buf, '(');
+ subindent = PRETTYINDENT_STD;
+ }
+ else
+ subindent = 0;
+ if (PRETTY_INDENT(context))
+ appendContextKeyword(context, "", subindent, 0, 0);
get_setop_query(op->rarg, query, context, resultDesc);
if (PRETTY_INDENT(context))
! context->indentLevel -= subindent;
! if (need_paren)
! appendContextKeyword(context, ")", 0, 0, 0);
}
else
{
diff --git a/src/test/regress/expected/create_view.out b/src/test/regress/expected/create_view.out
index f6db582..bf3c187 100644
*** a/src/test/regress/expected/create_view.out
--- b/src/test/regress/expected/create_view.out
*************** select * from (values(1,2,3,4,5)) v(a,b,
*** 1090,1112 ****
union all
select * from tt7 full join tt8 using (x), tt8 tt8x;
select pg_get_viewdef('vv2', true);
! pg_get_viewdef
! --------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.d, +
! v.e +
! FROM ( VALUES (1,2,3,4,5)) v(a, b, c, d, e)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! tt8x.x_1 AS d, +
! tt8x.z AS e +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z);
(1 row)
create view vv3 as
--- 1090,1112 ----
union all
select * from tt7 full join tt8 using (x), tt8 tt8x;
select pg_get_viewdef('vv2', true);
! pg_get_viewdef
! ------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.d, +
! v.e +
! FROM ( VALUES (1,2,3,4,5)) v(a, b, c, d, e)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! tt8x.x_1 AS d, +
! tt8x.z AS e +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z);
(1 row)
create view vv3 as
*************** select * from
*** 1116,1140 ****
tt7 full join tt8 using (x),
tt7 tt7x full join tt8 tt8x using (x);
select pg_get_viewdef('vv3', true);
! pg_get_viewdef
! -------------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.x, +
! v.e, +
! v.f +
! FROM ( VALUES (1,2,3,4,5,6)) v(a, b, c, x, e, f)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! x_1 AS x, +
! tt7x.y AS e, +
! tt8x.z AS f +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
FULL JOIN tt8 tt8x(x_1, z) USING (x_1);
(1 row)
--- 1116,1140 ----
tt7 full join tt8 using (x),
tt7 tt7x full join tt8 tt8x using (x);
select pg_get_viewdef('vv3', true);
! pg_get_viewdef
! -----------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.x, +
! v.e, +
! v.f +
! FROM ( VALUES (1,2,3,4,5,6)) v(a, b, c, x, e, f)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! x_1 AS x, +
! tt7x.y AS e, +
! tt8x.z AS f +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
FULL JOIN tt8 tt8x(x_1, z) USING (x_1);
(1 row)
*************** select * from
*** 1145,1172 ****
tt7 full join tt8 using (x),
tt7 tt7x full join tt8 tt8x using (x) full join tt8 tt8y using (x);
select pg_get_viewdef('vv4', true);
! pg_get_viewdef
! ------------------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.x, +
! v.e, +
! v.f, +
! v.g +
! FROM ( VALUES (1,2,3,4,5,6,7)) v(a, b, c, x, e, f, g)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! x_1 AS x, +
! tt7x.y AS e, +
! tt8x.z AS f, +
! tt8y.z AS g +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1) +
FULL JOIN tt8 tt8y(x_1, z) USING (x_1);
(1 row)
--- 1145,1172 ----
tt7 full join tt8 using (x),
tt7 tt7x full join tt8 tt8x using (x) full join tt8 tt8y using (x);
select pg_get_viewdef('vv4', true);
! pg_get_viewdef
! ----------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.x, +
! v.e, +
! v.f, +
! v.g +
! FROM ( VALUES (1,2,3,4,5,6,7)) v(a, b, c, x, e, f, g)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! x_1 AS x, +
! tt7x.y AS e, +
! tt8x.z AS f, +
! tt8y.z AS g +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1) +
FULL JOIN tt8 tt8y(x_1, z) USING (x_1);
(1 row)
*************** alter table tt7 add column z int;
*** 1175,1245 ****
alter table tt7 drop column zz;
alter table tt8 add column z2 int;
select pg_get_viewdef('vv2', true);
! pg_get_viewdef
! --------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.d, +
! v.e +
! FROM ( VALUES (1,2,3,4,5)) v(a, b, c, d, e)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! tt8x.x_1 AS d, +
! tt8x.z AS e +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z, z2);
(1 row)
select pg_get_viewdef('vv3', true);
! pg_get_viewdef
! -------------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.x, +
! v.e, +
! v.f +
! FROM ( VALUES (1,2,3,4,5,6)) v(a, b, c, x, e, f)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! x_1 AS x, +
! tt7x.y AS e, +
! tt8x.z AS f +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1);
(1 row)
select pg_get_viewdef('vv4', true);
! pg_get_viewdef
! ------------------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.x, +
! v.e, +
! v.f, +
! v.g +
! FROM ( VALUES (1,2,3,4,5,6,7)) v(a, b, c, x, e, f, g)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! x_1 AS x, +
! tt7x.y AS e, +
! tt8x.z AS f, +
! tt8y.z AS g +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1) +
FULL JOIN tt8 tt8y(x_1, z, z2) USING (x_1);
(1 row)
--- 1175,1245 ----
alter table tt7 drop column zz;
alter table tt8 add column z2 int;
select pg_get_viewdef('vv2', true);
! pg_get_viewdef
! ------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.d, +
! v.e +
! FROM ( VALUES (1,2,3,4,5)) v(a, b, c, d, e)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! tt8x.x_1 AS d, +
! tt8x.z AS e +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z, z2);
(1 row)
select pg_get_viewdef('vv3', true);
! pg_get_viewdef
! -----------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.x, +
! v.e, +
! v.f +
! FROM ( VALUES (1,2,3,4,5,6)) v(a, b, c, x, e, f)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! x_1 AS x, +
! tt7x.y AS e, +
! tt8x.z AS f +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1);
(1 row)
select pg_get_viewdef('vv4', true);
! pg_get_viewdef
! ----------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.x, +
! v.e, +
! v.f, +
! v.g +
! FROM ( VALUES (1,2,3,4,5,6,7)) v(a, b, c, x, e, f, g)+
! UNION ALL +
! SELECT x AS a, +
! tt7.y AS b, +
! tt8.z AS c, +
! x_1 AS x, +
! tt7x.y AS e, +
! tt8x.z AS f, +
! tt8y.z AS g +
! FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1) +
FULL JOIN tt8 tt8y(x_1, z, z2) USING (x_1);
(1 row)
*************** select * from (values(now(),2,3,now(),5)
*** 1252,1274 ****
union all
select * from tt7a left join tt8a using (x), tt8a tt8ax;
select pg_get_viewdef('vv2a', true);
! pg_get_viewdef
! ----------------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.d, +
! v.e +
! FROM ( VALUES (now(),2,3,now(),5)) v(a, b, c, d, e)+
! UNION ALL +
! SELECT x AS a, +
! tt7a.y AS b, +
! tt8a.z AS c, +
! tt8ax.x_1 AS d, +
! tt8ax.z AS e +
! FROM tt7a +
! LEFT JOIN tt8a USING (x), +
! tt8a tt8ax(x_1, z);
(1 row)
--
--- 1252,1274 ----
union all
select * from tt7a left join tt8a using (x), tt8a tt8ax;
select pg_get_viewdef('vv2a', true);
! pg_get_viewdef
! --------------------------------------------------------
! SELECT v.a, +
! v.b, +
! v.c, +
! v.d, +
! v.e +
! FROM ( VALUES (now(),2,3,now(),5)) v(a, b, c, d, e)+
! UNION ALL +
! SELECT x AS a, +
! tt7a.y AS b, +
! tt8a.z AS c, +
! tt8ax.x_1 AS d, +
! tt8ax.z AS e +
! FROM tt7a +
! LEFT JOIN tt8a USING (x), +
! tt8a tt8ax(x_1, z);
(1 row)
--
diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out
index daf3b9e..ddac97b 100644
*** a/src/test/regress/expected/matview.out
--- b/src/test/regress/expected/matview.out
*************** CREATE VIEW v_test2 AS SELECT moo, 2*moo
*** 346,358 ****
moo | integer | | plain |
?column? | integer | | plain |
View definition:
! SELECT v_test1.moo,
! 2 * v_test1.moo
! FROM v_test1
UNION ALL
! SELECT v_test1.moo,
! 3 * v_test1.moo
! FROM v_test1;
CREATE MATERIALIZED VIEW mv_test2 AS SELECT moo, 2*moo FROM v_test2 UNION ALL SELECT moo, 3*moo FROM v_test2;
\d+ mv_test2
--- 346,358 ----
moo | integer | | plain |
?column? | integer | | plain |
View definition:
! SELECT v_test1.moo,
! 2 * v_test1.moo
! FROM v_test1
UNION ALL
! SELECT v_test1.moo,
! 3 * v_test1.moo
! FROM v_test1;
CREATE MATERIALIZED VIEW mv_test2 AS SELECT moo, 2*moo FROM v_test2 UNION ALL SELECT moo, 3*moo FROM v_test2;
\d+ mv_test2
*************** CREATE MATERIALIZED VIEW mv_test2 AS SEL
*** 362,374 ****
moo | integer | | plain | |
?column? | integer | | plain | |
View definition:
! SELECT v_test2.moo,
! 2 * v_test2.moo
! FROM v_test2
UNION ALL
! SELECT v_test2.moo,
! 3 * v_test2.moo
! FROM v_test2;
CREATE MATERIALIZED VIEW mv_test3 AS SELECT * FROM mv_test2 WHERE moo = 12345;
SELECT relispopulated FROM pg_class WHERE oid = 'mv_test3'::regclass;
--- 362,374 ----
moo | integer | | plain | |
?column? | integer | | plain | |
View definition:
! SELECT v_test2.moo,
! 2 * v_test2.moo
! FROM v_test2
UNION ALL
! SELECT v_test2.moo,
! 3 * v_test2.moo
! FROM v_test2;
CREATE MATERIALIZED VIEW mv_test3 AS SELECT * FROM mv_test2 WHERE moo = 12345;
SELECT relispopulated FROM pg_class WHERE oid = 'mv_test3'::regclass;
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 6c51d0d..eb6066c 100644
*** a/src/test/regress/expected/rules.out
--- b/src/test/regress/expected/rules.out
*************** pg_rules| SELECT n.nspname AS schemaname
*** 1401,1567 ****
JOIN pg_class c ON ((c.oid = r.ev_class)))
LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (r.rulename <> '_RETURN'::name);
! pg_seclabels| ( ( ( ( ( ( ( ( ( SELECT l.objoid,
! l.classoid,
! l.objsubid,
! CASE
! WHEN (rel.relkind = 'r'::"char") THEN 'table'::text
! WHEN (rel.relkind = 'v'::"char") THEN 'view'::text
! WHEN (rel.relkind = 'm'::"char") THEN 'materialized view'::text
! WHEN (rel.relkind = 'S'::"char") THEN 'sequence'::text
! WHEN (rel.relkind = 'f'::"char") THEN 'foreign table'::text
! ELSE NULL::text
! END AS objtype,
! rel.relnamespace AS objnamespace,
! CASE
! WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text)
! ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text))
! END AS objname,
! l.provider,
! l.label
! FROM ((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid = 0)
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'column'::text AS objtype,
! rel.relnamespace AS objnamespace,
! ((
! CASE
! WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text)
! ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text))
! END || '.'::text) || (att.attname)::text) AS objname,
! l.provider,
! l.label
! FROM (((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid <> 0))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! CASE
! WHEN (pro.proisagg = true) THEN 'aggregate'::text
! WHEN (pro.proisagg = false) THEN 'function'::text
! ELSE NULL::text
! END AS objtype,
! pro.pronamespace AS objnamespace,
! (((
! CASE
! WHEN pg_function_is_visible(pro.oid) THEN quote_ident((pro.proname)::text)
! ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((pro.proname)::text))
! END || '('::text) || pg_get_function_arguments(pro.oid)) || ')'::text) AS objname,
! l.provider,
! l.label
! FROM ((pg_seclabel l
! JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid))))
! JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! CASE
! WHEN (typ.typtype = 'd'::"char") THEN 'domain'::text
! ELSE 'type'::text
! END AS objtype,
! typ.typnamespace AS objnamespace,
! CASE
! WHEN pg_type_is_visible(typ.oid) THEN quote_ident((typ.typname)::text)
! ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((typ.typname)::text))
! END AS objname,
! l.provider,
! l.label
! FROM ((pg_seclabel l
! JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid))))
! JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'large object'::text AS objtype,
! NULL::oid AS objnamespace,
! (l.objoid)::text AS objname,
! l.provider,
! l.label
! FROM (pg_seclabel l
! JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid)))
! WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0)))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'language'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((lan.lanname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_seclabel l
! JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid))))
! WHERE (l.objsubid = 0))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'schema'::text AS objtype,
! nsp.oid AS objnamespace,
! quote_ident((nsp.nspname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_seclabel l
! JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid))))
! WHERE (l.objsubid = 0))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'event trigger'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((evt.evtname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_seclabel l
! JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid))))
! WHERE (l.objsubid = 0))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! 0 AS objsubid,
! 'database'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((dat.datname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_shseclabel l
! JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid)))))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! 0 AS objsubid,
! 'tablespace'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((spc.spcname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_shseclabel l
! JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid)))))
UNION ALL
! SELECT l.objoid,
! l.classoid,
! 0 AS objsubid,
! 'role'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((rol.rolname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_shseclabel l
! JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
pg_settings| SELECT a.name,
a.setting,
a.unit,
--- 1401,1567 ----
JOIN pg_class c ON ((c.oid = r.ev_class)))
LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (r.rulename <> '_RETURN'::name);
! pg_seclabels| SELECT l.objoid,
! l.classoid,
! l.objsubid,
! CASE
! WHEN (rel.relkind = 'r'::"char") THEN 'table'::text
! WHEN (rel.relkind = 'v'::"char") THEN 'view'::text
! WHEN (rel.relkind = 'm'::"char") THEN 'materialized view'::text
! WHEN (rel.relkind = 'S'::"char") THEN 'sequence'::text
! WHEN (rel.relkind = 'f'::"char") THEN 'foreign table'::text
! ELSE NULL::text
! END AS objtype,
! rel.relnamespace AS objnamespace,
! CASE
! WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text)
! ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text))
! END AS objname,
! l.provider,
! l.label
! FROM ((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid = 0)
UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'column'::text AS objtype,
! rel.relnamespace AS objnamespace,
! ((
! CASE
! WHEN pg_table_is_visible(rel.oid) THEN quote_ident((rel.relname)::text)
! ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((rel.relname)::text))
! END || '.'::text) || (att.attname)::text) AS objname,
! l.provider,
! l.label
! FROM (((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid <> 0)
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! CASE
! WHEN (pro.proisagg = true) THEN 'aggregate'::text
! WHEN (pro.proisagg = false) THEN 'function'::text
! ELSE NULL::text
! END AS objtype,
! pro.pronamespace AS objnamespace,
! (((
! CASE
! WHEN pg_function_is_visible(pro.oid) THEN quote_ident((pro.proname)::text)
! ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((pro.proname)::text))
! END || '('::text) || pg_get_function_arguments(pro.oid)) || ')'::text) AS objname,
! l.provider,
! l.label
! FROM ((pg_seclabel l
! JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid))))
! JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid)))
! WHERE (l.objsubid = 0)
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! CASE
! WHEN (typ.typtype = 'd'::"char") THEN 'domain'::text
! ELSE 'type'::text
! END AS objtype,
! typ.typnamespace AS objnamespace,
! CASE
! WHEN pg_type_is_visible(typ.oid) THEN quote_ident((typ.typname)::text)
! ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((typ.typname)::text))
! END AS objname,
! l.provider,
! l.label
! FROM ((pg_seclabel l
! JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid))))
! JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid)))
! WHERE (l.objsubid = 0)
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'large object'::text AS objtype,
! NULL::oid AS objnamespace,
! (l.objoid)::text AS objname,
! l.provider,
! l.label
! FROM (pg_seclabel l
! JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid)))
! WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'language'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((lan.lanname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_seclabel l
! JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid))))
! WHERE (l.objsubid = 0)
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'schema'::text AS objtype,
! nsp.oid AS objnamespace,
! quote_ident((nsp.nspname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_seclabel l
! JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid))))
! WHERE (l.objsubid = 0)
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! l.objsubid,
! 'event trigger'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((evt.evtname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_seclabel l
! JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid))))
! WHERE (l.objsubid = 0)
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! 0 AS objsubid,
! 'database'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((dat.datname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_shseclabel l
! JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid))))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! 0 AS objsubid,
! 'tablespace'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((spc.spcname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_shseclabel l
! JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid))))
! UNION ALL
! SELECT l.objoid,
! l.classoid,
! 0 AS objsubid,
! 'role'::text AS objtype,
! NULL::oid AS objnamespace,
! quote_ident((rol.rolname)::text) AS objname,
! l.provider,
! l.label
! FROM (pg_shseclabel l
! JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
pg_settings| SELECT a.name,
a.setting,
a.unit,
diff --git a/src/test/regress/expected/with.out b/src/test/regress/expected/with.out
index d76ef4e..06b372b 100644
*** a/src/test/regress/expected/with.out
--- b/src/test/regress/expected/with.out
*************** SELECT * FROM vsubdepartment ORDER BY na
*** 300,347 ****
-- Check reverse listing
SELECT pg_get_viewdef('vsubdepartment'::regclass);
! pg_get_viewdef
! -------------------------------------------------------
! WITH RECURSIVE subdepartment AS ( +
! SELECT department.id, +
! department.parent_department, +
! department.name +
! FROM department +
! WHERE (department.name = 'A'::text)+
! UNION ALL +
! SELECT d.id, +
! d.parent_department, +
! d.name +
! FROM department d, +
! subdepartment sd +
! WHERE (d.parent_department = sd.id)+
! ) +
! SELECT subdepartment.id, +
! subdepartment.parent_department, +
! subdepartment.name +
FROM subdepartment;
(1 row)
SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
! pg_get_viewdef
! -----------------------------------------------------
! WITH RECURSIVE subdepartment AS ( +
! SELECT department.id, +
! department.parent_department, +
! department.name +
! FROM department +
! WHERE department.name = 'A'::text+
! UNION ALL +
! SELECT d.id, +
! d.parent_department, +
! d.name +
! FROM department d, +
! subdepartment sd +
! WHERE d.parent_department = sd.id+
! ) +
! SELECT subdepartment.id, +
! subdepartment.parent_department, +
! subdepartment.name +
FROM subdepartment;
(1 row)
--- 300,347 ----
-- Check reverse listing
SELECT pg_get_viewdef('vsubdepartment'::regclass);
! pg_get_viewdef
! -----------------------------------------------
! WITH RECURSIVE subdepartment AS ( +
! SELECT department.id, +
! department.parent_department, +
! department.name +
! FROM department +
! WHERE (department.name = 'A'::text)+
! UNION ALL +
! SELECT d.id, +
! d.parent_department, +
! d.name +
! FROM department d, +
! subdepartment sd +
! WHERE (d.parent_department = sd.id)+
! ) +
! SELECT subdepartment.id, +
! subdepartment.parent_department, +
! subdepartment.name +
FROM subdepartment;
(1 row)
SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
! pg_get_viewdef
! ---------------------------------------------
! WITH RECURSIVE subdepartment AS ( +
! SELECT department.id, +
! department.parent_department, +
! department.name +
! FROM department +
! WHERE department.name = 'A'::text+
! UNION ALL +
! SELECT d.id, +
! d.parent_department, +
! d.name +
! FROM department d, +
! subdepartment sd +
! WHERE d.parent_department = sd.id+
! ) +
! SELECT subdepartment.id, +
! subdepartment.parent_department, +
! subdepartment.name +
FROM subdepartment;
(1 row)
*************** SELECT sum(n) FROM t;
*** 360,370 ****
sum | bigint | | plain |
View definition:
WITH RECURSIVE t(n) AS (
! VALUES (1)
UNION ALL
! SELECT t_1.n + 1
! FROM t t_1
! WHERE t_1.n < 100
)
SELECT sum(t.n) AS sum
FROM t;
--- 360,370 ----
sum | bigint | | plain |
View definition:
WITH RECURSIVE t(n) AS (
! VALUES (1)
UNION ALL
! SELECT t_1.n + 1
! FROM t t_1
! WHERE t_1.n < 100
)
SELECT sum(t.n) AS sum
FROM t;
* Tom Lane (tgl@sss.pgh.pa.us) wrote:
Here's a draft patch tackling point 1. This gets rid of a whole lot
of parenthesization, as well as indentation, for simple UNION lists.
You can see the results in the changed regression test outputs.
[...]
Comments?
+10000.
Thanks,
Stephen
I wrote:
While I was testing this I noticed that there's something thoroughly
busted about the indentation of outer JOIN constructs, too --- you
can see this in some of the regression test queries that are touched
by this patch, where the JOINs are actually outdented to the left of
their FROM clause in the unpatched output. (They'd be outdented in
the new output, too, if negative indentation were possible...)
That seems like material for a separate patch though.
I poked into that too, and found that it seems to have been busted from
the very beginning. There's a unmatched subtraction of
PRETTYINDENT_JOIN_ON from the indentLevel, which I suppose must be an
accidental leftover from some previous version of the logic. And the code
is also trying to outdent JOIN clauses further than the corresponding
FROM, which seems unintuitive to me, even when the FROM is indented far
enough to make it possible (which it generally isn't in simple views).
Attached are two separate versions of a repair patch. The first one
causes JOIN clauses to be indented the same as their parent FROM.
The second one moves them over an additional 5 spaces. I find the
second layout more sensible, but it does result in significantly
more changes in the regression test outputs, as you can see.
Comments?
regards, tom lane
Attachments:
join-indentation-fix-1.patchtext/x-diff; charset=us-ascii; name=join-indentation-fix-1.patchDownload
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index ea7b8c5..f6bf2c3 100644
*** a/src/backend/utils/adt/ruleutils.c
--- b/src/backend/utils/adt/ruleutils.c
***************
*** 68,75 ****
/* Indent counts */
#define PRETTYINDENT_STD 8
! #define PRETTYINDENT_JOIN 13
! #define PRETTYINDENT_JOIN_ON (PRETTYINDENT_JOIN-PRETTYINDENT_STD)
#define PRETTYINDENT_VAR 4
/* Pretty flags */
--- 68,74 ----
/* Indent counts */
#define PRETTYINDENT_STD 8
! #define PRETTYINDENT_JOIN 2
#define PRETTYINDENT_VAR 4
/* Pretty flags */
*************** get_from_clause_item(Node *jtnode, Query
*** 8378,8404 ****
case JOIN_INNER:
if (j->quals)
appendContextKeyword(context, " JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 2);
else
appendContextKeyword(context, " CROSS JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 1);
break;
case JOIN_LEFT:
appendContextKeyword(context, " LEFT JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 2);
break;
case JOIN_FULL:
appendContextKeyword(context, " FULL JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 2);
break;
case JOIN_RIGHT:
appendContextKeyword(context, " RIGHT JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 2);
break;
default:
elog(ERROR, "unrecognized join type: %d",
--- 8377,8408 ----
case JOIN_INNER:
if (j->quals)
appendContextKeyword(context, " JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
else
appendContextKeyword(context, " CROSS JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
break;
case JOIN_LEFT:
appendContextKeyword(context, " LEFT JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
break;
case JOIN_FULL:
appendContextKeyword(context, " FULL JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
break;
case JOIN_RIGHT:
appendContextKeyword(context, " RIGHT JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
break;
default:
elog(ERROR, "unrecognized join type: %d",
*************** get_from_clause_item(Node *jtnode, Query
*** 8411,8418 ****
if (need_paren_on_right)
appendStringInfoChar(buf, ')');
- context->indentLevel -= PRETTYINDENT_JOIN_ON;
-
if (j->usingClause)
{
ListCell *lc;
--- 8415,8420 ----
diff --git a/src/test/regress/expected/create_view.out b/src/test/regress/expected/create_view.out
index f6db582..3835f12 100644
*** a/src/test/regress/expected/create_view.out
--- b/src/test/regress/expected/create_view.out
*************** create table tt5 (a int, b int);
*** 1035,1084 ****
create table tt6 (c int, d int);
create view vv1 as select * from (tt5 cross join tt6) j(aa,bb,cc,dd);
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! --------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, cc, dd);
(1 row)
alter table tt5 add column c int;
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! -----------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, c, cc, dd);
(1 row)
alter table tt5 add column cc int;
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! -----------------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, c, cc_1, cc, dd);
(1 row)
alter table tt5 drop column c;
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! --------------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, cc_1, cc, dd);
(1 row)
-- Unnamed FULL JOIN USING is lots of fun too
--- 1035,1084 ----
create table tt6 (c int, d int);
create view vv1 as select * from (tt5 cross join tt6) j(aa,bb,cc,dd);
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! ---------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, cc, dd);
(1 row)
alter table tt5 add column c int;
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! ------------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, c, cc, dd);
(1 row)
alter table tt5 add column cc int;
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! ------------------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, c, cc_1, cc, dd);
(1 row)
alter table tt5 drop column c;
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! ---------------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, cc_1, cc, dd);
(1 row)
-- Unnamed FULL JOIN USING is lots of fun too
*************** select pg_get_viewdef('vv2', true);
*** 1105,1112 ****
tt8x.x_1 AS d, +
tt8x.z AS e +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z);
(1 row)
create view vv3 as
--- 1105,1112 ----
tt8x.x_1 AS d, +
tt8x.z AS e +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z);
(1 row)
create view vv3 as
*************** select pg_get_viewdef('vv3', true);
*** 1133,1141 ****
tt7x.y AS e, +
tt8x.z AS f +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1);
(1 row)
create view vv4 as
--- 1133,1141 ----
tt7x.y AS e, +
tt8x.z AS f +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1);
(1 row)
create view vv4 as
*************** select pg_get_viewdef('vv4', true);
*** 1164,1173 ****
tt8x.z AS f, +
tt8y.z AS g +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1) +
! FULL JOIN tt8 tt8y(x_1, z) USING (x_1);
(1 row)
alter table tt7 add column zz int;
--- 1164,1173 ----
tt8x.z AS f, +
tt8y.z AS g +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1) +
! FULL JOIN tt8 tt8y(x_1, z) USING (x_1);
(1 row)
alter table tt7 add column zz int;
*************** select pg_get_viewdef('vv2', true);
*** 1190,1197 ****
tt8x.x_1 AS d, +
tt8x.z AS e +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z, z2);
(1 row)
select pg_get_viewdef('vv3', true);
--- 1190,1197 ----
tt8x.x_1 AS d, +
tt8x.z AS e +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z, z2);
(1 row)
select pg_get_viewdef('vv3', true);
*************** select pg_get_viewdef('vv3', true);
*** 1212,1220 ****
tt7x.y AS e, +
tt8x.z AS f +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1);
(1 row)
select pg_get_viewdef('vv4', true);
--- 1212,1220 ----
tt7x.y AS e, +
tt8x.z AS f +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1);
(1 row)
select pg_get_viewdef('vv4', true);
*************** select pg_get_viewdef('vv4', true);
*** 1237,1246 ****
tt8x.z AS f, +
tt8y.z AS g +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1) +
! FULL JOIN tt8 tt8y(x_1, z, z2) USING (x_1);
(1 row)
-- Implicit coercions in a JOIN USING create issues similar to FULL JOIN
--- 1237,1246 ----
tt8x.z AS f, +
tt8y.z AS g +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1) +
! FULL JOIN tt8 tt8y(x_1, z, z2) USING (x_1);
(1 row)
-- Implicit coercions in a JOIN USING create issues similar to FULL JOIN
*************** select pg_get_viewdef('vv2a', true);
*** 1267,1274 ****
tt8ax.x_1 AS d, +
tt8ax.z AS e +
FROM tt7a +
! LEFT JOIN tt8a USING (x), +
! tt8a tt8ax(x_1, z);
(1 row)
--
--- 1267,1274 ----
tt8ax.x_1 AS d, +
tt8ax.z AS e +
FROM tt7a +
! LEFT JOIN tt8a USING (x), +
! tt8a tt8ax(x_1, z);
(1 row)
--
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 6c51d0d..976a7b2 100644
*** a/src/test/regress/expected/rules.out
--- b/src/test/regress/expected/rules.out
*************** pg_seclabels| ( ( (
*** 1420,1428 ****
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid = 0)
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1420,1428 ----
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid = 0)
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1437,1446 ****
l.provider,
l.label
FROM (((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid <> 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1437,1446 ----
l.provider,
l.label
FROM (((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid <> 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1459,1467 ****
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid))))
! JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1459,1467 ----
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid))))
! JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1478,1486 ****
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid))))
! JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1478,1486 ----
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid))))
! JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1491,1498 ****
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid)))
! WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0)))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1491,1498 ----
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid)))
! WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0)))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1503,1510 ****
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1503,1510 ----
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1515,1522 ****
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1515,1522 ----
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1527,1534 ****
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1527,1534 ----
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1539,1545 ****
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid)))))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1539,1545 ----
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid)))))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1550,1556 ****
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid)))))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1550,1556 ----
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid)))))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** UNION ALL
*** 1561,1567 ****
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
pg_settings| SELECT a.name,
a.setting,
a.unit,
--- 1561,1567 ----
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
pg_settings| SELECT a.name,
a.setting,
a.unit,
join-indentation-fix-2.patchtext/x-diff; charset=us-ascii; name=join-indentation-fix-2.patchDownload
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index ea7b8c5..27db21e 100644
*** a/src/backend/utils/adt/ruleutils.c
--- b/src/backend/utils/adt/ruleutils.c
***************
*** 68,75 ****
/* Indent counts */
#define PRETTYINDENT_STD 8
! #define PRETTYINDENT_JOIN 13
! #define PRETTYINDENT_JOIN_ON (PRETTYINDENT_JOIN-PRETTYINDENT_STD)
#define PRETTYINDENT_VAR 4
/* Pretty flags */
--- 68,74 ----
/* Indent counts */
#define PRETTYINDENT_STD 8
! #define PRETTYINDENT_JOIN 7
#define PRETTYINDENT_VAR 4
/* Pretty flags */
*************** get_from_clause_item(Node *jtnode, Query
*** 8378,8404 ****
case JOIN_INNER:
if (j->quals)
appendContextKeyword(context, " JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 2);
else
appendContextKeyword(context, " CROSS JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 1);
break;
case JOIN_LEFT:
appendContextKeyword(context, " LEFT JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 2);
break;
case JOIN_FULL:
appendContextKeyword(context, " FULL JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 2);
break;
case JOIN_RIGHT:
appendContextKeyword(context, " RIGHT JOIN ",
! -PRETTYINDENT_JOIN,
! PRETTYINDENT_JOIN, 2);
break;
default:
elog(ERROR, "unrecognized join type: %d",
--- 8377,8408 ----
case JOIN_INNER:
if (j->quals)
appendContextKeyword(context, " JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
else
appendContextKeyword(context, " CROSS JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
break;
case JOIN_LEFT:
appendContextKeyword(context, " LEFT JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
break;
case JOIN_FULL:
appendContextKeyword(context, " FULL JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
break;
case JOIN_RIGHT:
appendContextKeyword(context, " RIGHT JOIN ",
! -PRETTYINDENT_STD,
! PRETTYINDENT_STD,
! PRETTYINDENT_JOIN);
break;
default:
elog(ERROR, "unrecognized join type: %d",
*************** get_from_clause_item(Node *jtnode, Query
*** 8411,8418 ****
if (need_paren_on_right)
appendStringInfoChar(buf, ')');
- context->indentLevel -= PRETTYINDENT_JOIN_ON;
-
if (j->usingClause)
{
ListCell *lc;
--- 8415,8420 ----
diff --git a/src/test/regress/expected/create_view.out b/src/test/regress/expected/create_view.out
index f6db582..d29d0c1 100644
*** a/src/test/regress/expected/create_view.out
--- b/src/test/regress/expected/create_view.out
*************** create view v2 as select * from tt2 join
*** 706,1064 ****
create view v2a as select * from (tt2 join tt3 using (b,c) join tt4 using (b)) j;
create view v3 as select * from tt2 join tt3 using (b,c) full join tt4 using (b);
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! ---------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! ------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 USING (b, c)) j;
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! --------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! ---------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 USING (b, c) +
! JOIN tt4 USING (b)) j;
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! -----------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 USING (b, c) +
! FULL JOIN tt4 USING (b);
(1 row)
alter table tt2 add column d int;
alter table tt2 add column e int;
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! ---------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! ------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 USING (b, c)) j;
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! --------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! ---------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 USING (b, c) +
! JOIN tt4 USING (b)) j;
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! -----------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 USING (b, c) +
! FULL JOIN tt4 USING (b);
(1 row)
alter table tt3 rename c to d;
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! -----------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! --------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c)) j;
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! ----------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! ----------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c)+
! JOIN tt4 USING (b)) j;
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! ----------------------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c)+
! FULL JOIN tt4 USING (b);
(1 row)
alter table tt3 add column c int;
alter table tt3 add column e int;
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! -------------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! ---------------------------------------------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)) j(b, c, a, d, e, ax, c_1, e_1);
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! ------------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! ---------------------------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c) +
! JOIN tt4 USING (b)) j(b, c, a, d, e, ax, c_1, e_1, ay, q);
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! ------------------------------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
! FULL JOIN tt4 USING (b);
(1 row)
alter table tt2 drop column d;
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! -------------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! ------------------------------------------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)) j(b, c, a, e, ax, c_1, e_1);
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! ------------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! ------------------------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c) +
! JOIN tt4 USING (b)) j(b, c, a, e, ax, c_1, e_1, ay, q);
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! ------------------------------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
! FULL JOIN tt4 USING (b);
(1 row)
create table tt5 (a int, b int);
create table tt6 (c int, d int);
create view vv1 as select * from (tt5 cross join tt6) j(aa,bb,cc,dd);
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! --------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, cc, dd);
(1 row)
alter table tt5 add column c int;
select pg_get_viewdef('vv1', true);
- pg_get_viewdef
- -----------------------------------------
- SELECT j.aa, +
- j.bb, +
- j.cc, +
- j.dd +
- FROM (tt5 +
- CROSS JOIN tt6) j(aa, bb, c, cc, dd);
- (1 row)
-
- alter table tt5 add column cc int;
- select pg_get_viewdef('vv1', true);
pg_get_viewdef
-----------------------------------------------
SELECT j.aa, +
--- 706,1052 ----
create view v2a as select * from (tt2 join tt3 using (b,c) join tt4 using (b)) j;
create view v3 as select * from tt2 join tt3 using (b,c) full join tt4 using (b);
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! --------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! -----------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 USING (b, c)) j;
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! -------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! --------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 USING (b, c) +
! JOIN tt4 USING (b)) j;
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! ----------------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 USING (b, c) +
! FULL JOIN tt4 USING (b);
(1 row)
alter table tt2 add column d int;
alter table tt2 add column e int;
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! --------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! -----------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 USING (b, c)) j;
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! -------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! --------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 USING (b, c) +
! JOIN tt4 USING (b)) j;
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! ----------------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 USING (b, c) +
! FULL JOIN tt4 USING (b);
(1 row)
alter table tt3 rename c to d;
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! ----------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! -------------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c)) j;
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! ---------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! ---------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c)+
! JOIN tt4 USING (b)) j;
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! ---------------------------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c) USING (b, c)+
! FULL JOIN tt4 USING (b);
(1 row)
alter table tt3 add column c int;
alter table tt3 add column e int;
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! ------------------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! --------------------------------------------------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)) j(b, c, a, d, e, ax, c_1, e_1);
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! -----------------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! --------------------------------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c) +
! JOIN tt4 USING (b)) j(b, c, a, d, e, ax, c_1, e_1, ay, q);
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! -----------------------------------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
! FULL JOIN tt4 USING (b);
(1 row)
alter table tt2 drop column d;
select pg_get_viewdef('v1', true);
! pg_get_viewdef
! ------------------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c);
(1 row)
select pg_get_viewdef('v1a', true);
! pg_get_viewdef
! -----------------------------------------------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)) j(b, c, a, e, ax, c_1, e_1);
(1 row)
select pg_get_viewdef('v2', true);
! pg_get_viewdef
! -----------------------------------------------------
! SELECT tt2.b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
! JOIN tt4 USING (b);
(1 row)
select pg_get_viewdef('v2a', true);
! pg_get_viewdef
! -----------------------------------------------------------------
! SELECT j.b, +
! j.c, +
! j.a, +
! j.ax, +
! j.ay, +
! j.q +
! FROM (tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c) +
! JOIN tt4 USING (b)) j(b, c, a, e, ax, c_1, e_1, ay, q);
(1 row)
select pg_get_viewdef('v3', true);
! pg_get_viewdef
! -----------------------------------------------------
! SELECT b, +
! tt3.c, +
! tt2.a, +
! tt3.ax, +
! tt4.ay, +
! tt4.q +
! FROM tt2 +
! JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
! FULL JOIN tt4 USING (b);
(1 row)
create table tt5 (a int, b int);
create table tt6 (c int, d int);
create view vv1 as select * from (tt5 cross join tt6) j(aa,bb,cc,dd);
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! --------------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, cc, dd);
(1 row)
alter table tt5 add column c int;
select pg_get_viewdef('vv1', true);
pg_get_viewdef
-----------------------------------------------
SELECT j.aa, +
*************** select pg_get_viewdef('vv1', true);
*** 1066,1084 ****
j.cc, +
j.dd +
FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, c, cc_1, cc, dd);
(1 row)
alter table tt5 drop column c;
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! --------------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, cc_1, cc, dd);
(1 row)
-- Unnamed FULL JOIN USING is lots of fun too
--- 1054,1084 ----
j.cc, +
j.dd +
FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, c, cc, dd);
! (1 row)
!
! alter table tt5 add column cc int;
! select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! -----------------------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, c, cc_1, cc, dd);
(1 row)
alter table tt5 drop column c;
select pg_get_viewdef('vv1', true);
! pg_get_viewdef
! --------------------------------------------------
! SELECT j.aa, +
! j.bb, +
! j.cc, +
! j.dd +
! FROM (tt5 +
! CROSS JOIN tt6) j(aa, bb, cc_1, cc, dd);
(1 row)
-- Unnamed FULL JOIN USING is lots of fun too
*************** select pg_get_viewdef('vv2', true);
*** 1105,1112 ****
tt8x.x_1 AS d, +
tt8x.z AS e +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z);
(1 row)
create view vv3 as
--- 1105,1112 ----
tt8x.x_1 AS d, +
tt8x.z AS e +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z);
(1 row)
create view vv3 as
*************** select pg_get_viewdef('vv3', true);
*** 1133,1141 ****
tt7x.y AS e, +
tt8x.z AS f +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1);
(1 row)
create view vv4 as
--- 1133,1141 ----
tt7x.y AS e, +
tt8x.z AS f +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1);
(1 row)
create view vv4 as
*************** select pg_get_viewdef('vv4', true);
*** 1164,1173 ****
tt8x.z AS f, +
tt8y.z AS g +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1) +
! FULL JOIN tt8 tt8y(x_1, z) USING (x_1);
(1 row)
alter table tt7 add column zz int;
--- 1164,1173 ----
tt8x.z AS f, +
tt8y.z AS g +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y) +
! FULL JOIN tt8 tt8x(x_1, z) USING (x_1) +
! FULL JOIN tt8 tt8y(x_1, z) USING (x_1);
(1 row)
alter table tt7 add column zz int;
*************** select pg_get_viewdef('vv2', true);
*** 1190,1197 ****
tt8x.x_1 AS d, +
tt8x.z AS e +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z, z2);
(1 row)
select pg_get_viewdef('vv3', true);
--- 1190,1197 ----
tt8x.x_1 AS d, +
tt8x.z AS e +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt8 tt8x(x_1, z, z2);
(1 row)
select pg_get_viewdef('vv3', true);
*************** select pg_get_viewdef('vv3', true);
*** 1212,1220 ****
tt7x.y AS e, +
tt8x.z AS f +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1);
(1 row)
select pg_get_viewdef('vv4', true);
--- 1212,1220 ----
tt7x.y AS e, +
tt8x.z AS f +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1);
(1 row)
select pg_get_viewdef('vv4', true);
*************** select pg_get_viewdef('vv4', true);
*** 1237,1246 ****
tt8x.z AS f, +
tt8y.z AS g +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1) +
! FULL JOIN tt8 tt8y(x_1, z, z2) USING (x_1);
(1 row)
-- Implicit coercions in a JOIN USING create issues similar to FULL JOIN
--- 1237,1246 ----
tt8x.z AS f, +
tt8y.z AS g +
FROM tt7 +
! FULL JOIN tt8 USING (x), +
! tt7 tt7x(x_1, y, z) +
! FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1) +
! FULL JOIN tt8 tt8y(x_1, z, z2) USING (x_1);
(1 row)
-- Implicit coercions in a JOIN USING create issues similar to FULL JOIN
*************** select pg_get_viewdef('vv2a', true);
*** 1267,1274 ****
tt8ax.x_1 AS d, +
tt8ax.z AS e +
FROM tt7a +
! LEFT JOIN tt8a USING (x), +
! tt8a tt8ax(x_1, z);
(1 row)
--
--- 1267,1274 ----
tt8ax.x_1 AS d, +
tt8ax.z AS e +
FROM tt7a +
! LEFT JOIN tt8a USING (x), +
! tt8a tt8ax(x_1, z);
(1 row)
--
*************** create table tt9 (x int, xx int, y int);
*** 1278,1301 ****
create table tt10 (x int, z int);
create view vv5 as select x,y,z from tt9 join tt10 using(x);
select pg_get_viewdef('vv5', true);
! pg_get_viewdef
! -------------------------
! SELECT tt9.x, +
! tt9.y, +
! tt10.z +
! FROM tt9 +
! JOIN tt10 USING (x);
(1 row)
alter table tt9 drop column xx;
select pg_get_viewdef('vv5', true);
! pg_get_viewdef
! -------------------------
! SELECT tt9.x, +
! tt9.y, +
! tt10.z +
! FROM tt9 +
! JOIN tt10 USING (x);
(1 row)
-- clean up all the random objects we made above
--- 1278,1301 ----
create table tt10 (x int, z int);
create view vv5 as select x,y,z from tt9 join tt10 using(x);
select pg_get_viewdef('vv5', true);
! pg_get_viewdef
! ------------------------------
! SELECT tt9.x, +
! tt9.y, +
! tt10.z +
! FROM tt9 +
! JOIN tt10 USING (x);
(1 row)
alter table tt9 drop column xx;
select pg_get_viewdef('vv5', true);
! pg_get_viewdef
! ------------------------------
! SELECT tt9.x, +
! tt9.y, +
! tt10.z +
! FROM tt9 +
! JOIN tt10 USING (x);
(1 row)
-- clean up all the random objects we made above
diff --git a/src/test/regress/expected/rangefuncs.out b/src/test/regress/expected/rangefuncs.out
index 9d40510..cb20b6b 100644
*** a/src/test/regress/expected/rangefuncs.out
--- b/src/test/regress/expected/rangefuncs.out
*************** select * from vw_ord;
*** 85,98 ****
(1 row)
select definition from pg_views where viewname='vw_ord';
! definition
! -------------------------------------------------------------------
! SELECT v.n, +
! z.a, +
! z.b, +
! z.ord +
! FROM (( VALUES (1)) v(n) +
! JOIN foot(1) WITH ORDINALITY z(a, b, ord) ON ((v.n = z.ord)));
(1 row)
drop view vw_ord;
--- 85,98 ----
(1 row)
select definition from pg_views where viewname='vw_ord';
! definition
! ------------------------------------------------------------------------
! SELECT v.n, +
! z.a, +
! z.b, +
! z.ord +
! FROM (( VALUES (1)) v(n) +
! JOIN foot(1) WITH ORDINALITY z(a, b, ord) ON ((v.n = z.ord)));
(1 row)
drop view vw_ord;
*************** select * from vw_ord;
*** 112,127 ****
(1 row)
select definition from pg_views where viewname='vw_ord';
! definition
! ---------------------------------------------------------------------------------------------
! SELECT v.n, +
! z.a, +
! z.b, +
! z.c, +
! z.d, +
! z.ord +
! FROM (( VALUES (1)) v(n) +
! JOIN ROWS FROM(foot(1), foot(2)) WITH ORDINALITY z(a, b, c, d, ord) ON ((v.n = z.ord)));
(1 row)
drop view vw_ord;
--- 112,127 ----
(1 row)
select definition from pg_views where viewname='vw_ord';
! definition
! --------------------------------------------------------------------------------------------------
! SELECT v.n, +
! z.a, +
! z.b, +
! z.c, +
! z.d, +
! z.ord +
! FROM (( VALUES (1)) v(n) +
! JOIN ROWS FROM(foot(1), foot(2)) WITH ORDINALITY z(a, b, c, d, ord) ON ((v.n = z.ord)));
(1 row)
drop view vw_ord;
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 6c51d0d..da5c836 100644
*** a/src/test/regress/expected/rules.out
--- b/src/test/regress/expected/rules.out
*************** pg_available_extension_versions| SELECT
*** 1294,1306 ****
e.requires,
e.comment
FROM (pg_available_extension_versions() e(name, version, superuser, relocatable, schema, requires, comment)
! LEFT JOIN pg_extension x ON (((e.name = x.extname) AND (e.version = x.extversion))));
pg_available_extensions| SELECT e.name,
e.default_version,
x.extversion AS installed_version,
e.comment
FROM (pg_available_extensions() e(name, default_version, comment)
! LEFT JOIN pg_extension x ON ((e.name = x.extname)));
pg_cursors| SELECT c.name,
c.statement,
c.is_holdable,
--- 1294,1306 ----
e.requires,
e.comment
FROM (pg_available_extension_versions() e(name, version, superuser, relocatable, schema, requires, comment)
! LEFT JOIN pg_extension x ON (((e.name = x.extname) AND (e.version = x.extversion))));
pg_available_extensions| SELECT e.name,
e.default_version,
x.extversion AS installed_version,
e.comment
FROM (pg_available_extensions() e(name, default_version, comment)
! LEFT JOIN pg_extension x ON ((e.name = x.extname)));
pg_cursors| SELECT c.name,
c.statement,
c.is_holdable,
*************** pg_indexes| SELECT n.nspname AS schemana
*** 1321,1330 ****
t.spcname AS tablespace,
pg_get_indexdef(i.oid) AS indexdef
FROM ((((pg_index x
! JOIN pg_class c ON ((c.oid = x.indrelid)))
! JOIN pg_class i ON ((i.oid = x.indexrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
! LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace)))
WHERE ((c.relkind = ANY (ARRAY['r'::"char", 'm'::"char"])) AND (i.relkind = 'i'::"char"));
pg_locks| SELECT l.locktype,
l.database,
--- 1321,1330 ----
t.spcname AS tablespace,
pg_get_indexdef(i.oid) AS indexdef
FROM ((((pg_index x
! JOIN pg_class c ON ((c.oid = x.indrelid)))
! JOIN pg_class i ON ((i.oid = x.indexrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
! LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace)))
WHERE ((c.relkind = ANY (ARRAY['r'::"char", 'm'::"char"])) AND (i.relkind = 'i'::"char"));
pg_locks| SELECT l.locktype,
l.database,
*************** pg_matviews| SELECT n.nspname AS scheman
*** 1350,1357 ****
c.relispopulated AS ispopulated,
pg_get_viewdef(c.oid) AS definition
FROM ((pg_class c
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
! LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace)))
WHERE (c.relkind = 'm'::"char");
pg_prepared_statements| SELECT p.name,
p.statement,
--- 1350,1357 ----
c.relispopulated AS ispopulated,
pg_get_viewdef(c.oid) AS definition
FROM ((pg_class c
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
! LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace)))
WHERE (c.relkind = 'm'::"char");
pg_prepared_statements| SELECT p.name,
p.statement,
*************** pg_prepared_xacts| SELECT p.transaction,
*** 1365,1372 ****
u.rolname AS owner,
d.datname AS database
FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid)
! LEFT JOIN pg_authid u ON ((p.ownerid = u.oid)))
! LEFT JOIN pg_database d ON ((p.dbid = d.oid)));
pg_replication_slots| SELECT l.slot_name,
l.plugin,
l.slot_type,
--- 1365,1372 ----
u.rolname AS owner,
d.datname AS database
FROM ((pg_prepared_xact() p(transaction, gid, prepared, ownerid, dbid)
! LEFT JOIN pg_authid u ON ((p.ownerid = u.oid)))
! LEFT JOIN pg_database d ON ((p.dbid = d.oid)));
pg_replication_slots| SELECT l.slot_name,
l.plugin,
l.slot_type,
*************** pg_replication_slots| SELECT l.slot_name
*** 1377,1383 ****
l.catalog_xmin,
l.restart_lsn
FROM (pg_get_replication_slots() l(slot_name, plugin, slot_type, datoid, active, xmin, catalog_xmin, restart_lsn)
! LEFT JOIN pg_database d ON ((l.datoid = d.oid)));
pg_roles| SELECT pg_authid.rolname,
pg_authid.rolsuper,
pg_authid.rolinherit,
--- 1377,1383 ----
l.catalog_xmin,
l.restart_lsn
FROM (pg_get_replication_slots() l(slot_name, plugin, slot_type, datoid, active, xmin, catalog_xmin, restart_lsn)
! LEFT JOIN pg_database d ON ((l.datoid = d.oid)));
pg_roles| SELECT pg_authid.rolname,
pg_authid.rolsuper,
pg_authid.rolinherit,
*************** pg_roles| SELECT pg_authid.rolname,
*** 1392,1405 ****
s.setconfig AS rolconfig,
pg_authid.oid
FROM (pg_authid
! LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid))));
pg_rules| SELECT n.nspname AS schemaname,
c.relname AS tablename,
r.rulename,
pg_get_ruledef(r.oid) AS definition
FROM ((pg_rewrite r
! JOIN pg_class c ON ((c.oid = r.ev_class)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (r.rulename <> '_RETURN'::name);
pg_seclabels| ( ( ( ( ( ( ( ( ( SELECT l.objoid,
l.classoid,
--- 1392,1405 ----
s.setconfig AS rolconfig,
pg_authid.oid
FROM (pg_authid
! LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid))));
pg_rules| SELECT n.nspname AS schemaname,
c.relname AS tablename,
r.rulename,
pg_get_ruledef(r.oid) AS definition
FROM ((pg_rewrite r
! JOIN pg_class c ON ((c.oid = r.ev_class)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (r.rulename <> '_RETURN'::name);
pg_seclabels| ( ( ( ( ( ( ( ( ( SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1420,1428 ****
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid = 0)
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1420,1428 ----
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid = 0)
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1437,1446 ****
l.provider,
l.label
FROM (((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid <> 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1437,1446 ----
l.provider,
l.label
FROM (((pg_seclabel l
! JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
! JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum))))
! JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
! WHERE (l.objsubid <> 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1459,1467 ****
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid))))
! JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1459,1467 ----
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid))))
! JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1478,1486 ****
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid))))
! JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1478,1486 ----
l.provider,
l.label
FROM ((pg_seclabel l
! JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid))))
! JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid)))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1491,1498 ****
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid)))
! WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0)))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1491,1498 ----
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid)))
! WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0)))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1503,1510 ****
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1503,1510 ----
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1515,1522 ****
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1515,1522 ----
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1527,1534 ****
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1527,1534 ----
l.provider,
l.label
FROM (pg_seclabel l
! JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid))))
! WHERE (l.objsubid = 0))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1539,1545 ****
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid)))))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1539,1545 ----
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_database dat ON (((l.classoid = dat.tableoid) AND (l.objoid = dat.oid)))))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** pg_seclabels| ( ( (
*** 1550,1556 ****
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid)))))
UNION ALL
SELECT l.objoid,
l.classoid,
--- 1550,1556 ----
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_tablespace spc ON (((l.classoid = spc.tableoid) AND (l.objoid = spc.oid)))))
UNION ALL
SELECT l.objoid,
l.classoid,
*************** UNION ALL
*** 1561,1567 ****
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
pg_settings| SELECT a.name,
a.setting,
a.unit,
--- 1561,1567 ----
l.provider,
l.label
FROM (pg_shseclabel l
! JOIN pg_authid rol ON (((l.classoid = rol.tableoid) AND (l.objoid = rol.oid))));
pg_settings| SELECT a.name,
a.setting,
a.unit,
*************** pg_shadow| SELECT pg_authid.rolname AS u
*** 1589,1595 ****
(pg_authid.rolvaliduntil)::abstime AS valuntil,
s.setconfig AS useconfig
FROM (pg_authid
! LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid))))
WHERE pg_authid.rolcanlogin;
pg_stat_activity| SELECT s.datid,
d.datname,
--- 1589,1595 ----
(pg_authid.rolvaliduntil)::abstime AS valuntil,
s.setconfig AS useconfig
FROM (pg_authid
! LEFT JOIN pg_db_role_setting s ON (((pg_authid.oid = s.setrole) AND (s.setdatabase = (0)::oid))))
WHERE pg_authid.rolcanlogin;
pg_stat_activity| SELECT s.datid,
d.datname,
*************** pg_stat_all_indexes| SELECT c.oid AS rel
*** 1622,1630 ****
pg_stat_get_tuples_returned(i.oid) AS idx_tup_read,
pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch
FROM (((pg_class c
! JOIN pg_index x ON ((c.oid = x.indrelid)))
! JOIN pg_class i ON ((i.oid = x.indexrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]));
pg_stat_all_tables| SELECT c.oid AS relid,
n.nspname AS schemaname,
--- 1622,1630 ----
pg_stat_get_tuples_returned(i.oid) AS idx_tup_read,
pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch
FROM (((pg_class c
! JOIN pg_index x ON ((c.oid = x.indrelid)))
! JOIN pg_class i ON ((i.oid = x.indexrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]));
pg_stat_all_tables| SELECT c.oid AS relid,
n.nspname AS schemaname,
*************** pg_stat_all_tables| SELECT c.oid AS reli
*** 1649,1656 ****
pg_stat_get_analyze_count(c.oid) AS analyze_count,
pg_stat_get_autoanalyze_count(c.oid) AS autoanalyze_count
FROM ((pg_class c
! LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]))
GROUP BY c.oid, n.nspname, c.relname;
pg_stat_archiver| SELECT s.archived_count,
--- 1649,1656 ----
pg_stat_get_analyze_count(c.oid) AS analyze_count,
pg_stat_get_autoanalyze_count(c.oid) AS autoanalyze_count
FROM ((pg_class c
! LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]))
GROUP BY c.oid, n.nspname, c.relname;
pg_stat_archiver| SELECT s.archived_count,
*************** pg_stat_user_functions| SELECT p.oid AS
*** 1761,1767 ****
pg_stat_get_function_total_time(p.oid) AS total_time,
pg_stat_get_function_self_time(p.oid) AS self_time
FROM (pg_proc p
! LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace)))
WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_function_calls(p.oid) IS NOT NULL));
pg_stat_user_indexes| SELECT pg_stat_all_indexes.relid,
pg_stat_all_indexes.indexrelid,
--- 1761,1767 ----
pg_stat_get_function_total_time(p.oid) AS total_time,
pg_stat_get_function_self_time(p.oid) AS self_time
FROM (pg_proc p
! LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace)))
WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_function_calls(p.oid) IS NOT NULL));
pg_stat_user_indexes| SELECT pg_stat_all_indexes.relid,
pg_stat_all_indexes.indexrelid,
*************** pg_stat_xact_all_tables| SELECT c.oid AS
*** 1809,1816 ****
pg_stat_get_xact_tuples_deleted(c.oid) AS n_tup_del,
pg_stat_get_xact_tuples_hot_updated(c.oid) AS n_tup_hot_upd
FROM ((pg_class c
! LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]))
GROUP BY c.oid, n.nspname, c.relname;
pg_stat_xact_sys_tables| SELECT pg_stat_xact_all_tables.relid,
--- 1809,1816 ----
pg_stat_get_xact_tuples_deleted(c.oid) AS n_tup_del,
pg_stat_get_xact_tuples_hot_updated(c.oid) AS n_tup_hot_upd
FROM ((pg_class c
! LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]))
GROUP BY c.oid, n.nspname, c.relname;
pg_stat_xact_sys_tables| SELECT pg_stat_xact_all_tables.relid,
*************** pg_stat_xact_user_functions| SELECT p.oi
*** 1833,1839 ****
pg_stat_get_xact_function_total_time(p.oid) AS total_time,
pg_stat_get_xact_function_self_time(p.oid) AS self_time
FROM (pg_proc p
! LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace)))
WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_xact_function_calls(p.oid) IS NOT NULL));
pg_stat_xact_user_tables| SELECT pg_stat_xact_all_tables.relid,
pg_stat_xact_all_tables.schemaname,
--- 1833,1839 ----
pg_stat_get_xact_function_total_time(p.oid) AS total_time,
pg_stat_get_xact_function_self_time(p.oid) AS self_time
FROM (pg_proc p
! LEFT JOIN pg_namespace n ON ((n.oid = p.pronamespace)))
WHERE ((p.prolang <> (12)::oid) AND (pg_stat_get_xact_function_calls(p.oid) IS NOT NULL));
pg_stat_xact_user_tables| SELECT pg_stat_xact_all_tables.relid,
pg_stat_xact_all_tables.schemaname,
*************** pg_statio_all_indexes| SELECT c.oid AS r
*** 1856,1864 ****
(pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read,
pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit
FROM (((pg_class c
! JOIN pg_index x ON ((c.oid = x.indrelid)))
! JOIN pg_class i ON ((i.oid = x.indexrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]));
pg_statio_all_sequences| SELECT c.oid AS relid,
n.nspname AS schemaname,
--- 1856,1864 ----
(pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read,
pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit
FROM (((pg_class c
! JOIN pg_index x ON ((c.oid = x.indrelid)))
! JOIN pg_class i ON ((i.oid = x.indexrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]));
pg_statio_all_sequences| SELECT c.oid AS relid,
n.nspname AS schemaname,
*************** pg_statio_all_sequences| SELECT c.oid AS
*** 1866,1872 ****
(pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS blks_read,
pg_stat_get_blocks_hit(c.oid) AS blks_hit
FROM (pg_class c
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = 'S'::"char");
pg_statio_all_tables| SELECT c.oid AS relid,
n.nspname AS schemaname,
--- 1866,1872 ----
(pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS blks_read,
pg_stat_get_blocks_hit(c.oid) AS blks_hit
FROM (pg_class c
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = 'S'::"char");
pg_statio_all_tables| SELECT c.oid AS relid,
n.nspname AS schemaname,
*************** pg_statio_all_tables| SELECT c.oid AS re
*** 1880,1889 ****
(sum((pg_stat_get_blocks_fetched(x.indexrelid) - pg_stat_get_blocks_hit(x.indexrelid))))::bigint AS tidx_blks_read,
(sum(pg_stat_get_blocks_hit(x.indexrelid)))::bigint AS tidx_blks_hit
FROM ((((pg_class c
! LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
! LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid)))
! LEFT JOIN pg_index x ON ((t.oid = x.indrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]))
GROUP BY c.oid, n.nspname, c.relname, t.oid, x.indrelid;
pg_statio_sys_indexes| SELECT pg_statio_all_indexes.relid,
--- 1880,1889 ----
(sum((pg_stat_get_blocks_fetched(x.indexrelid) - pg_stat_get_blocks_hit(x.indexrelid))))::bigint AS tidx_blks_read,
(sum(pg_stat_get_blocks_hit(x.indexrelid)))::bigint AS tidx_blks_hit
FROM ((((pg_class c
! LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
! LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid)))
! LEFT JOIN pg_index x ON ((t.oid = x.indrelid)))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]))
GROUP BY c.oid, n.nspname, c.relname, t.oid, x.indrelid;
pg_statio_sys_indexes| SELECT pg_statio_all_indexes.relid,
*************** pg_stats| SELECT n.nspname AS schemaname
*** 2008,2016 ****
ELSE NULL::real[]
END AS elem_count_histogram
FROM (((pg_statistic s
! JOIN pg_class c ON ((c.oid = s.starelid)))
! JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum))))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE ((NOT a.attisdropped) AND has_column_privilege(c.oid, a.attnum, 'select'::text));
pg_tables| SELECT n.nspname AS schemaname,
c.relname AS tablename,
--- 2008,2016 ----
ELSE NULL::real[]
END AS elem_count_histogram
FROM (((pg_statistic s
! JOIN pg_class c ON ((c.oid = s.starelid)))
! JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum))))
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
WHERE ((NOT a.attisdropped) AND has_column_privilege(c.oid, a.attnum, 'select'::text));
pg_tables| SELECT n.nspname AS schemaname,
c.relname AS tablename,
*************** pg_tables| SELECT n.nspname AS schemanam
*** 2020,2027 ****
c.relhasrules AS hasrules,
c.relhastriggers AS hastriggers
FROM ((pg_class c
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
! LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace)))
WHERE (c.relkind = 'r'::"char");
pg_timezone_abbrevs| SELECT pg_timezone_abbrevs.abbrev,
pg_timezone_abbrevs.utc_offset,
--- 2020,2027 ----
c.relhasrules AS hasrules,
c.relhastriggers AS hastriggers
FROM ((pg_class c
! LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
! LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace)))
WHERE (c.relkind = 'r'::"char");
pg_timezone_abbrevs| SELECT pg_timezone_abbrevs.abbrev,
pg_timezone_abbrevs.utc_offset,
*************** pg_user_mappings| SELECT u.oid AS umid,
*** 2055,2068 ****
ELSE NULL::text[]
END AS umoptions
FROM ((pg_user_mapping u
! LEFT JOIN pg_authid a ON ((a.oid = u.umuser)))
! JOIN pg_foreign_server s ON ((u.umserver = s.oid)));
pg_views| 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");
rtest_v1| SELECT rtest_t1.a,
rtest_t1.b
--- 2055,2068 ----
ELSE NULL::text[]
END AS umoptions
FROM ((pg_user_mapping u
! LEFT JOIN pg_authid a ON ((a.oid = u.umuser)))
! JOIN pg_foreign_server s ON ((u.umserver = s.oid)));
pg_views| 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");
rtest_v1| SELECT rtest_t1.a,
rtest_t1.b
On Wed, Apr 30, 2014 at 6:33 AM, Stephen Frost <sfrost@snowman.net> wrote:
* Tom Lane (tgl@sss.pgh.pa.us) wrote:
Here's a draft patch tackling point 1. This gets rid of a whole lot
of parenthesization, as well as indentation, for simple UNION lists.
You can see the results in the changed regression test outputs.[...]
Comments?
+10000.
+1. Output is far easier to read.
--
Michael
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers