Commit 62e66640 authored by Tom Lane's avatar Tom Lane

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
parent 330ed4ac
...@@ -13872,8 +13872,7 @@ SELECT pg_type_is_visible('myschema.widget'::regtype); ...@@ -13872,8 +13872,7 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
<row> <row>
<entry><literal><function>pg_get_viewdef(<parameter>view_name</parameter>, <parameter>pretty_bool</>)</function></literal></entry> <entry><literal><function>pg_get_viewdef(<parameter>view_name</parameter>, <parameter>pretty_bool</>)</function></literal></entry>
<entry><type>text</type></entry> <entry><type>text</type></entry>
<entry>get underlying <command>SELECT</command> command for view; <entry>get underlying <command>SELECT</command> command for view (<emphasis>deprecated</emphasis>)</entry>
lines with fields are wrapped to 80 columns if <parameter>pretty_bool</parameter> is true (<emphasis>deprecated</emphasis>)</entry>
</row> </row>
<row> <row>
<entry><literal><function>pg_get_viewdef(<parameter>view_oid</parameter>)</function></literal></entry> <entry><literal><function>pg_get_viewdef(<parameter>view_oid</parameter>)</function></literal></entry>
...@@ -13883,15 +13882,14 @@ SELECT pg_type_is_visible('myschema.widget'::regtype); ...@@ -13883,15 +13882,14 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
<row> <row>
<entry><literal><function>pg_get_viewdef(<parameter>view_oid</parameter>, <parameter>pretty_bool</>)</function></literal></entry> <entry><literal><function>pg_get_viewdef(<parameter>view_oid</parameter>, <parameter>pretty_bool</>)</function></literal></entry>
<entry><type>text</type></entry> <entry><type>text</type></entry>
<entry>get underlying <command>SELECT</command> command for view; <entry>get underlying <command>SELECT</command> command for view</entry>
lines with fields are wrapped to 80 columns if <parameter>pretty_bool</parameter> is true</entry>
</row> </row>
<row> <row>
<entry><literal><function>pg_get_viewdef(<parameter>view_oid</parameter>, <parameter>wrap_column_int</>)</function></literal></entry> <entry><literal><function>pg_get_viewdef(<parameter>view_oid</parameter>, <parameter>wrap_column_int</>)</function></literal></entry>
<entry><type>text</type></entry> <entry><type>text</type></entry>
<entry>get underlying <command>SELECT</command> command for view; <entry>get underlying <command>SELECT</command> command for view;
lines with fields are wrapped to specified number of columns, lines with fields are wrapped to specified number of columns,
pretty printing is implied</entry> pretty-printing is implied</entry>
</row> </row>
<row> <row>
<entry><literal><function>pg_options_to_table(<parameter>reloptions</parameter>)</function></literal></entry> <entry><literal><function>pg_options_to_table(<parameter>reloptions</parameter>)</function></literal></entry>
......
...@@ -74,8 +74,8 @@ ...@@ -74,8 +74,8 @@
#define PRETTYFLAG_PAREN 1 #define PRETTYFLAG_PAREN 1
#define PRETTYFLAG_INDENT 2 #define PRETTYFLAG_INDENT 2
/* Default line length for pretty-print wrapping */ /* Default line length for pretty-print wrapping: 0 means wrap always */
#define WRAP_COLUMN_DEFAULT 79 #define WRAP_COLUMN_DEFAULT 0
/* macro to test if pretty action needed */ /* macro to test if pretty action needed */
#define PRETTY_PAREN(context) ((context)->prettyFlags & PRETTYFLAG_PAREN) #define PRETTY_PAREN(context) ((context)->prettyFlags & PRETTYFLAG_PAREN)
...@@ -416,8 +416,10 @@ Datum ...@@ -416,8 +416,10 @@ Datum
pg_get_ruledef(PG_FUNCTION_ARGS) pg_get_ruledef(PG_FUNCTION_ARGS)
{ {
Oid ruleoid = PG_GETARG_OID(0); Oid ruleoid = PG_GETARG_OID(0);
int prettyFlags;
PG_RETURN_TEXT_P(string_to_text(pg_get_ruledef_worker(ruleoid, 0))); prettyFlags = PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_ruledef_worker(ruleoid, prettyFlags)));
} }
...@@ -428,7 +430,7 @@ pg_get_ruledef_ext(PG_FUNCTION_ARGS) ...@@ -428,7 +430,7 @@ pg_get_ruledef_ext(PG_FUNCTION_ARGS)
bool pretty = PG_GETARG_BOOL(1); bool pretty = PG_GETARG_BOOL(1);
int prettyFlags; int prettyFlags;
prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0; prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_ruledef_worker(ruleoid, prettyFlags))); PG_RETURN_TEXT_P(string_to_text(pg_get_ruledef_worker(ruleoid, prettyFlags)));
} }
...@@ -512,8 +514,10 @@ pg_get_viewdef(PG_FUNCTION_ARGS) ...@@ -512,8 +514,10 @@ pg_get_viewdef(PG_FUNCTION_ARGS)
{ {
/* By OID */ /* By OID */
Oid viewoid = PG_GETARG_OID(0); Oid viewoid = PG_GETARG_OID(0);
int prettyFlags;
PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, 0, -1))); prettyFlags = PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT)));
} }
...@@ -525,7 +529,7 @@ pg_get_viewdef_ext(PG_FUNCTION_ARGS) ...@@ -525,7 +529,7 @@ pg_get_viewdef_ext(PG_FUNCTION_ARGS)
bool pretty = PG_GETARG_BOOL(1); bool pretty = PG_GETARG_BOOL(1);
int prettyFlags; int prettyFlags;
prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0; prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT))); PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, WRAP_COLUMN_DEFAULT)));
} }
...@@ -536,12 +540,10 @@ pg_get_viewdef_wrap(PG_FUNCTION_ARGS) ...@@ -536,12 +540,10 @@ pg_get_viewdef_wrap(PG_FUNCTION_ARGS)
Oid viewoid = PG_GETARG_OID(0); Oid viewoid = PG_GETARG_OID(0);
int wrap = PG_GETARG_INT32(1); int wrap = PG_GETARG_INT32(1);
int prettyFlags; int prettyFlags;
char *result;
/* calling this implies we want pretty printing */ /* calling this implies we want pretty printing */
prettyFlags = PRETTYFLAG_PAREN | PRETTYFLAG_INDENT; prettyFlags = PRETTYFLAG_PAREN | PRETTYFLAG_INDENT;
result = pg_get_viewdef_worker(viewoid, prettyFlags, wrap); PG_RETURN_TEXT_P(string_to_text(pg_get_viewdef_worker(viewoid, prettyFlags, wrap)));
PG_RETURN_TEXT_P(string_to_text(result));
} }
Datum Datum
...@@ -549,14 +551,17 @@ pg_get_viewdef_name(PG_FUNCTION_ARGS) ...@@ -549,14 +551,17 @@ pg_get_viewdef_name(PG_FUNCTION_ARGS)
{ {
/* By qualified name */ /* By qualified name */
text *viewname = PG_GETARG_TEXT_P(0); text *viewname = PG_GETARG_TEXT_P(0);
int prettyFlags;
RangeVar *viewrel; RangeVar *viewrel;
Oid viewoid; Oid viewoid;
prettyFlags = PRETTYFLAG_INDENT;
/* Look up view name. Can't lock it - we might not have privileges. */ /* Look up view name. Can't lock it - we might not have privileges. */
viewrel = makeRangeVarFromNameList(textToQualifiedNameList(viewname)); viewrel = makeRangeVarFromNameList(textToQualifiedNameList(viewname));
viewoid = RangeVarGetRelid(viewrel, NoLock, false); viewoid = RangeVarGetRelid(viewrel, NoLock, false);
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)));
} }
...@@ -570,7 +575,7 @@ pg_get_viewdef_name_ext(PG_FUNCTION_ARGS) ...@@ -570,7 +575,7 @@ pg_get_viewdef_name_ext(PG_FUNCTION_ARGS)
RangeVar *viewrel; RangeVar *viewrel;
Oid viewoid; Oid viewoid;
prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0; prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
/* Look up view name. Can't lock it - we might not have privileges. */ /* Look up view name. Can't lock it - we might not have privileges. */
viewrel = makeRangeVarFromNameList(textToQualifiedNameList(viewname)); viewrel = makeRangeVarFromNameList(textToQualifiedNameList(viewname));
...@@ -848,7 +853,7 @@ pg_get_triggerdef_worker(Oid trigid, bool pretty) ...@@ -848,7 +853,7 @@ pg_get_triggerdef_worker(Oid trigid, bool pretty)
context.windowClause = NIL; context.windowClause = NIL;
context.windowTList = NIL; context.windowTList = NIL;
context.varprefix = true; context.varprefix = true;
context.prettyFlags = pretty ? PRETTYFLAG_PAREN : 0; context.prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
context.wrapColumn = WRAP_COLUMN_DEFAULT; context.wrapColumn = WRAP_COLUMN_DEFAULT;
context.indentLevel = PRETTYINDENT_STD; context.indentLevel = PRETTYINDENT_STD;
...@@ -911,10 +916,13 @@ Datum ...@@ -911,10 +916,13 @@ Datum
pg_get_indexdef(PG_FUNCTION_ARGS) pg_get_indexdef(PG_FUNCTION_ARGS)
{ {
Oid indexrelid = PG_GETARG_OID(0); Oid indexrelid = PG_GETARG_OID(0);
int prettyFlags;
prettyFlags = PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_indexdef_worker(indexrelid, 0, PG_RETURN_TEXT_P(string_to_text(pg_get_indexdef_worker(indexrelid, 0,
NULL, NULL,
false, false, 0))); false, false,
prettyFlags)));
} }
Datum Datum
...@@ -925,7 +933,7 @@ pg_get_indexdef_ext(PG_FUNCTION_ARGS) ...@@ -925,7 +933,7 @@ pg_get_indexdef_ext(PG_FUNCTION_ARGS)
bool pretty = PG_GETARG_BOOL(2); bool pretty = PG_GETARG_BOOL(2);
int prettyFlags; int prettyFlags;
prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0; prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_indexdef_worker(indexrelid, colno, PG_RETURN_TEXT_P(string_to_text(pg_get_indexdef_worker(indexrelid, colno,
NULL, NULL,
colno != 0, colno != 0,
...@@ -933,7 +941,7 @@ pg_get_indexdef_ext(PG_FUNCTION_ARGS) ...@@ -933,7 +941,7 @@ pg_get_indexdef_ext(PG_FUNCTION_ARGS)
prettyFlags))); prettyFlags)));
} }
/* Internal version that returns a palloc'd C string */ /* Internal version that returns a palloc'd C string; no pretty-printing */
char * char *
pg_get_indexdef_string(Oid indexrelid) pg_get_indexdef_string(Oid indexrelid)
{ {
...@@ -946,7 +954,7 @@ pg_get_indexdef_columns(Oid indexrelid, bool pretty) ...@@ -946,7 +954,7 @@ pg_get_indexdef_columns(Oid indexrelid, bool pretty)
{ {
int prettyFlags; int prettyFlags;
prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0; prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
return pg_get_indexdef_worker(indexrelid, 0, NULL, true, false, prettyFlags); return pg_get_indexdef_worker(indexrelid, 0, NULL, true, false, prettyFlags);
} }
...@@ -1245,9 +1253,12 @@ Datum ...@@ -1245,9 +1253,12 @@ Datum
pg_get_constraintdef(PG_FUNCTION_ARGS) pg_get_constraintdef(PG_FUNCTION_ARGS)
{ {
Oid constraintId = PG_GETARG_OID(0); Oid constraintId = PG_GETARG_OID(0);
int prettyFlags;
prettyFlags = PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_constraintdef_worker(constraintId, PG_RETURN_TEXT_P(string_to_text(pg_get_constraintdef_worker(constraintId,
false, 0))); false,
prettyFlags)));
} }
Datum Datum
...@@ -1257,12 +1268,13 @@ pg_get_constraintdef_ext(PG_FUNCTION_ARGS) ...@@ -1257,12 +1268,13 @@ pg_get_constraintdef_ext(PG_FUNCTION_ARGS)
bool pretty = PG_GETARG_BOOL(1); bool pretty = PG_GETARG_BOOL(1);
int prettyFlags; int prettyFlags;
prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0; prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
PG_RETURN_TEXT_P(string_to_text(pg_get_constraintdef_worker(constraintId, PG_RETURN_TEXT_P(string_to_text(pg_get_constraintdef_worker(constraintId,
false, prettyFlags))); false,
prettyFlags)));
} }
/* Internal version that returns a palloc'd C string */ /* Internal version that returns a palloc'd C string; no pretty-printing */
char * char *
pg_get_constraintdef_string(Oid constraintId) pg_get_constraintdef_string(Oid constraintId)
{ {
...@@ -1615,8 +1627,11 @@ pg_get_expr(PG_FUNCTION_ARGS) ...@@ -1615,8 +1627,11 @@ pg_get_expr(PG_FUNCTION_ARGS)
{ {
text *expr = PG_GETARG_TEXT_P(0); text *expr = PG_GETARG_TEXT_P(0);
Oid relid = PG_GETARG_OID(1); Oid relid = PG_GETARG_OID(1);
int prettyFlags;
char *relname; char *relname;
prettyFlags = PRETTYFLAG_INDENT;
if (OidIsValid(relid)) if (OidIsValid(relid))
{ {
/* Get the name for the relation */ /* Get the name for the relation */
...@@ -1634,7 +1649,7 @@ pg_get_expr(PG_FUNCTION_ARGS) ...@@ -1634,7 +1649,7 @@ pg_get_expr(PG_FUNCTION_ARGS)
else else
relname = NULL; relname = NULL;
PG_RETURN_TEXT_P(pg_get_expr_worker(expr, relid, relname, 0)); PG_RETURN_TEXT_P(pg_get_expr_worker(expr, relid, relname, prettyFlags));
} }
Datum Datum
...@@ -1646,7 +1661,7 @@ pg_get_expr_ext(PG_FUNCTION_ARGS) ...@@ -1646,7 +1661,7 @@ pg_get_expr_ext(PG_FUNCTION_ARGS)
int prettyFlags; int prettyFlags;
char *relname; char *relname;
prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0; prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : PRETTYFLAG_INDENT;
if (OidIsValid(relid)) if (OidIsValid(relid))
{ {
......
...@@ -943,9 +943,10 @@ select * from agg_view1; ...@@ -943,9 +943,10 @@ select * from agg_view1;
(1 row) (1 row)
select pg_get_viewdef('agg_view1'::regclass); select pg_get_viewdef('agg_view1'::regclass);
pg_get_viewdef 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); 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) (1 row)
create or replace view agg_view1 as create or replace view agg_view1 as
...@@ -959,9 +960,11 @@ select * from agg_view1; ...@@ -959,9 +960,11 @@ select * from agg_view1;
(1 row) (1 row)
select pg_get_viewdef('agg_view1'::regclass); select pg_get_viewdef('agg_view1'::regclass);
pg_get_viewdef 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); 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) (1 row)
create or replace view agg_view1 as create or replace view agg_view1 as
...@@ -975,9 +978,11 @@ select * from agg_view1; ...@@ -975,9 +978,11 @@ select * from agg_view1;
(1 row) (1 row)
select pg_get_viewdef('agg_view1'::regclass); select pg_get_viewdef('agg_view1'::regclass);
pg_get_viewdef 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); 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) (1 row)
create or replace view agg_view1 as create or replace view agg_view1 as
...@@ -990,9 +995,10 @@ select * from agg_view1; ...@@ -990,9 +995,10 @@ select * from agg_view1;
(1 row) (1 row)
select pg_get_viewdef('agg_view1'::regclass); select pg_get_viewdef('agg_view1'::regclass);
pg_get_viewdef 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); 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) (1 row)
create or replace view agg_view1 as create or replace view agg_view1 as
...@@ -1005,9 +1011,10 @@ select * from agg_view1; ...@@ -1005,9 +1011,10 @@ select * from agg_view1;
(1 row) (1 row)
select pg_get_viewdef('agg_view1'::regclass); select pg_get_viewdef('agg_view1'::regclass);
pg_get_viewdef 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); 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) (1 row)
create or replace view agg_view1 as create or replace view agg_view1 as
...@@ -1020,9 +1027,10 @@ select * from agg_view1; ...@@ -1020,9 +1027,10 @@ select * from agg_view1;
(1 row) (1 row)
select pg_get_viewdef('agg_view1'::regclass); select pg_get_viewdef('agg_view1'::regclass);
pg_get_viewdef 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); 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) (1 row)
create or replace view agg_view1 as create or replace view agg_view1 as
...@@ -1036,9 +1044,11 @@ select * from agg_view1; ...@@ -1036,9 +1044,11 @@ select * from agg_view1;
(1 row) (1 row)
select pg_get_viewdef('agg_view1'::regclass); select pg_get_viewdef('agg_view1'::regclass);
pg_get_viewdef 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); 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) (1 row)
drop view agg_view1; drop view agg_view1;
......
...@@ -194,11 +194,19 @@ CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; ...@@ -194,11 +194,19 @@ 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; CREATE VIEW collview3 AS SELECT a, lower((x || x) COLLATE "POSIX") FROM collate_test10;
SELECT table_name, view_definition FROM information_schema.views SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'collview%' ORDER BY 1; WHERE table_name LIKE 'collview%' ORDER BY 1;
table_name | view_definition table_name | view_definition
------------+------------------------------------------------------------------------------------------------------------------------ ------------+------------------------------------------------------------------------------
collview1 | SELECT collate_test1.a, collate_test1.b FROM collate_test1 WHERE ((collate_test1.b COLLATE "C") >= 'bbc'::text); collview1 | SELECT collate_test1.a, +
collview2 | SELECT collate_test1.a, collate_test1.b FROM collate_test1 ORDER BY (collate_test1.b COLLATE "C"); | collate_test1.b +
collview3 | SELECT collate_test10.a, lower(((collate_test10.x || collate_test10.x) COLLATE "POSIX")) AS lower FROM collate_test10; | 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) (3 rows)
-- collation propagation in various expression types -- collation propagation in various expression types
......
This diff is collapsed.
...@@ -1381,7 +1381,8 @@ select * from dfview; ...@@ -1381,7 +1381,8 @@ select * from dfview;
c3 | bigint | | plain | c3 | bigint | | plain |
c4 | bigint | | plain | c4 | bigint | | plain |
View definition: View definition:
SELECT int8_tbl.q1, int8_tbl.q2, SELECT int8_tbl.q1,
int8_tbl.q2,
dfunc(int8_tbl.q1, int8_tbl.q2, flag := int8_tbl.q1 > int8_tbl.q2) AS c3, dfunc(int8_tbl.q1, int8_tbl.q2, flag := int8_tbl.q1 > int8_tbl.q2) AS c3,
dfunc(int8_tbl.q1, flag := int8_tbl.q1 < int8_tbl.q2, b := int8_tbl.q2) AS c4 dfunc(int8_tbl.q1, flag := int8_tbl.q1 < int8_tbl.q2, b := int8_tbl.q2) AS c4
FROM int8_tbl; FROM int8_tbl;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -1119,7 +1119,8 @@ DROP TRIGGER instead_of_delete_trig ON main_view; ...@@ -1119,7 +1119,8 @@ DROP TRIGGER instead_of_delete_trig ON main_view;
a | integer | | plain | a | integer | | plain |
b | integer | | plain | b | integer | | plain |
View definition: View definition:
SELECT main_table.a, main_table.b SELECT main_table.a,
main_table.b
FROM main_table; FROM main_table;
Triggers: Triggers:
after_del_stmt_trig AFTER DELETE ON main_view FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('after_view_del_stmt') after_del_stmt_trig AFTER DELETE ON main_view FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('after_view_del_stmt')
......
...@@ -950,9 +950,11 @@ SELECT * FROM v_window; ...@@ -950,9 +950,11 @@ SELECT * FROM v_window;
(10 rows) (10 rows)
SELECT pg_get_viewdef('v_window'); SELECT pg_get_viewdef('v_window');
pg_get_viewdef pg_get_viewdef
--------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------
SELECT i.i, sum(i.i) OVER (ORDER BY i.i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sum_rows FROM generate_series(1, 10) i(i); SELECT i.i, +
sum(i.i) OVER (ORDER BY i.i ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sum_rows+
FROM generate_series(1, 10) i(i);
(1 row) (1 row)
-- with UNION -- with UNION
......
...@@ -300,25 +300,48 @@ SELECT * FROM vsubdepartment ORDER BY name; ...@@ -300,25 +300,48 @@ SELECT * FROM vsubdepartment ORDER BY name;
-- Check reverse listing -- Check reverse listing
SELECT pg_get_viewdef('vsubdepartment'::regclass); SELECT pg_get_viewdef('vsubdepartment'::regclass);
pg_get_viewdef 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; 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) (1 row)
SELECT pg_get_viewdef('vsubdepartment'::regclass, true); SELECT pg_get_viewdef('vsubdepartment'::regclass, true);
pg_get_viewdef pg_get_viewdef
------------------------------------------------------------------------------- -----------------------------------------------------
WITH RECURSIVE subdepartment AS ( + WITH RECURSIVE subdepartment AS ( +
SELECT department.id, department.parent_department, + SELECT department.id, +
department.name + department.parent_department, +
FROM department + department.name +
WHERE department.name = 'A'::text + FROM department +
UNION ALL + WHERE department.name = 'A'::text+
SELECT d.id, d.parent_department, d.name + UNION ALL +
FROM department d, subdepartment sd + SELECT d.id, +
WHERE d.parent_department = sd.id + d.parent_department, +
) + d.name +
SELECT subdepartment.id, subdepartment.parent_department, subdepartment.name+ FROM department d, +
subdepartment sd +
WHERE d.parent_department = sd.id+
) +
SELECT subdepartment.id, +
subdepartment.parent_department, +
subdepartment.name +
FROM subdepartment; FROM subdepartment;
(1 row) (1 row)
......
...@@ -540,17 +540,18 @@ CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); ...@@ -540,17 +540,18 @@ CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10));
CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text);
SELECT table_name, view_definition FROM information_schema.views SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'xmlview%' ORDER BY 1; WHERE table_name LIKE 'xmlview%' ORDER BY 1;
table_name | view_definition table_name | view_definition
------------+---------------------------------------------------------------------------------------------------------------------------- ------------+-------------------------------------------------------------------------------------------------------------------
xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment;
xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat"; xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat";
xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement"; 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; xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(emp.name AS name, emp.age AS age, emp.salary AS pay)) AS "xmlelement"+
xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse"; | FROM emp;
xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi"; xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse";
xmlview7 | SELECT XMLROOT('<foo/>'::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot"; xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi";
xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10)))::character(10) AS "xmlserialize"; xmlview7 | SELECT XMLROOT('<foo/>'::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot";
xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text) AS "xmlserialize"; 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) (9 rows)
-- Text XPath expressions evaluation -- Text XPath expressions evaluation
......
...@@ -463,10 +463,10 @@ DETAIL: This functionality requires the server to be built with libxml support. ...@@ -463,10 +463,10 @@ DETAIL: This functionality requires the server to be built with libxml support.
HINT: You need to rebuild PostgreSQL using --with-libxml. HINT: You need to rebuild PostgreSQL using --with-libxml.
SELECT table_name, view_definition FROM information_schema.views SELECT table_name, view_definition FROM information_schema.views
WHERE table_name LIKE 'xmlview%' ORDER BY 1; WHERE table_name LIKE 'xmlview%' ORDER BY 1;
table_name | view_definition table_name | view_definition
------------+------------------------------------------------------------------------------- ------------+--------------------------------------------------------------------------------
xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment;
xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse"; xmlview5 | SELECT XMLPARSE(CONTENT '<abc>x</abc>'::text STRIP WHITESPACE) AS "xmlparse";
(2 rows) (2 rows)
-- Text XPath expressions evaluation -- Text XPath expressions evaluation
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment