else if (IsA(setOp, SetOperationStmt))
{
SetOperationStmt *op = (SetOperationStmt *) setOp;
-
- if (PRETTY_INDENT(context))
- {
- context->indentLevel += PRETTYINDENT_STD;
- appendStringInfoSpaces(buf, PRETTYINDENT_STD);
- }
+ int subindent;
/*
- * 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).
+ * 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. If we use
+ * parens, we also increase the indentation level for the child query.
+ *
+ * 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 (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, '(');
+ subindent = PRETTYINDENT_STD;
+ appendContextKeyword(context, "", subindent, 0, 0);
+ }
+ else
+ subindent = 0;
+
get_setop_query(op->larg, query, context, resultDesc);
- if (need_paren)
- appendStringInfoChar(buf, ')');
- if (!PRETTY_INDENT(context))
+ if (need_paren)
+ appendContextKeyword(context, ") ", -subindent, 0, 0);
+ else if (PRETTY_INDENT(context))
+ appendContextKeyword(context, "", -subindent, 0, 0);
+ else
appendStringInfoChar(buf, ' ');
+
switch (op->op)
{
case SETOP_UNION:
- appendContextKeyword(context, "UNION ",
- -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ appendStringInfoString(buf, "UNION ");
break;
case SETOP_INTERSECT:
- appendContextKeyword(context, "INTERSECT ",
- -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ appendStringInfoString(buf, "INTERSECT ");
break;
case SETOP_EXCEPT:
- appendContextKeyword(context, "EXCEPT ",
- -PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
+ appendStringInfoString(buf, "EXCEPT ");
break;
default:
elog(ERROR, "unrecognized set op: %d",
if (op->all)
appendStringInfo(buf, "ALL ");
- if (PRETTY_INDENT(context))
- appendContextKeyword(context, "", 0, 0, 0);
-
- need_paren = !IsA(op->rarg, RangeTblRef);
+ /* Always parenthesize if RHS is another setop */
+ need_paren = IsA(op->rarg, SetOperationStmt);
+ /*
+ * The indentation code here is deliberately a bit different from that
+ * for the lefthand input, because we want the line breaks in
+ * different places.
+ */
if (need_paren)
+ {
appendStringInfoChar(buf, '(');
+ subindent = PRETTYINDENT_STD;
+ }
+ else
+ subindent = 0;
+ appendContextKeyword(context, "", subindent, 0, 0);
+
get_setop_query(op->rarg, query, context, resultDesc);
- if (need_paren)
- appendStringInfoChar(buf, ')');
if (PRETTY_INDENT(context))
- context->indentLevel -= PRETTYINDENT_STD;
+ context->indentLevel -= subindent;
+ if (need_paren)
+ appendContextKeyword(context, ")", 0, 0, 0);
}
else
{
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);
+ 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
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);
+ 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)
create view vv4 as
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);
+ 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 zz int;
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);
+ 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);
+ 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);
+ 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)
-- Implicit coercions in a JOIN USING create issues similar to FULL JOIN
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);
+ 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)
--
moo | integer | | plain |
?column? | integer | | plain |
View definition:
- SELECT v_test1.moo,
- 2 * v_test1.moo
- FROM v_test1
+ SELECT v_test1.moo,
+ 2 * v_test1.moo
+ FROM v_test1
UNION ALL
- SELECT v_test1.moo,
- 3 * v_test1.moo
- FROM v_test1;
+ 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
moo | integer | | plain | |
?column? | integer | | plain | |
View definition:
- SELECT v_test2.moo,
- 2 * v_test2.moo
- FROM v_test2
+ SELECT v_test2.moo,
+ 2 * v_test2.moo
+ FROM v_test2
UNION ALL
- SELECT v_test2.moo,
- 3 * v_test2.moo
- FROM v_test2;
+ 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;
| 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, +
+ pg_seclabels | SELECT l.objoid, +
+ | l.classoid, +
+ | l.objsubid, +
| CASE +
- | WHEN (typ.typtype = 'd'::"char") THEN 'domain'::text +
- | ELSE 'type'::text +
+ | 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, +
- | typ.typnamespace AS objnamespace, +
+ | rel.relnamespace 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)) +
+ | 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_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))) +
+ | 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, +
- | '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, +
| 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))))) +
+ | 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))));
+ | 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, +
-- 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 +
+ 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 +
+ 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)
sum | bigint | | plain |
View definition:
WITH RECURSIVE t(n) AS (
- VALUES (1)
+ VALUES (1)
UNION ALL
- SELECT t_1.n + 1
- FROM t t_1
- WHERE t_1.n < 100
+ SELECT t_1.n + 1
+ FROM t t_1
+ WHERE t_1.n < 100
)
SELECT sum(t.n) AS sum
FROM t;