diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 8504555..fd9eaca 100644 *** a/doc/src/sgml/catalogs.sgml --- b/doc/src/sgml/catalogs.sgml *************** *** 2178,2183 **** --- 2178,2281 ---- + + <structname>pg_comments</structname> + + + pg_comments + + + + The pg_comments view displays the comments + associated with all database objects. Object comments are manipulated + using the COMMENT ON command. + + + + <structname>pg_comments</> Columns + + + + + Name + Type + References + Description + + + + + + objoid + oid + pg_description.objoid + The OID of the object to which the comment pertains. + + + + classoid + oid + pg_class.oid + + The OID of the system catalog this object appears in + + + + + objsubid + int4 + pg_class.objsubid + + For a comment on a table column, this is the column number + (the objoid and classoid refer to the table itself). For all other + object types, this column is zero. + + + + + objtype + text + + + The type of object to which the comment pertains. + + + + + objnamespace + oid + pg_namespace.oid + + The OID of the namespace that contains this object, if applicable, + otherwise 0 + + + + + objname + text + + + The name of the object + + + + + description + text + pg_description.description or pg_shdescription.description + + The comment attached to the object + + + + + +
+ +
+ + <structname>pg_conversion</structname> diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 8f223d6..0152db0 100644 *** a/doc/src/sgml/func.sgml --- b/doc/src/sgml/func.sgml *************** SELECT relname FROM pg_class WHERE pg_ta *** 13102,13107 **** --- 13102,13113 ---- is operator visible in search path + pg_opfamily_is_visible(opclass_oid) + + boolean + is operator family visible in search path + + pg_table_is_visible(table_oid) boolean *************** SELECT relname FROM pg_class WHERE pg_ta *** 13157,13162 **** --- 13163,13171 ---- pg_operator_is_visible + pg_opfamily_is_visible + + pg_table_is_visible diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index d803d28..85a8eaa 100644 *** a/src/backend/catalog/namespace.c --- b/src/backend/catalog/namespace.c *************** Datum pg_type_is_visible(PG_FUNCTION_AR *** 200,205 **** --- 200,206 ---- Datum pg_function_is_visible(PG_FUNCTION_ARGS); Datum pg_operator_is_visible(PG_FUNCTION_ARGS); Datum pg_opclass_is_visible(PG_FUNCTION_ARGS); + Datum pg_opfamily_is_visible(PG_FUNCTION_ARGS); Datum pg_collation_is_visible(PG_FUNCTION_ARGS); Datum pg_conversion_is_visible(PG_FUNCTION_ARGS); Datum pg_ts_parser_is_visible(PG_FUNCTION_ARGS); *************** pg_collation_is_visible(PG_FUNCTION_ARGS *** 3787,3792 **** --- 3788,3804 ---- } Datum + pg_opfamily_is_visible(PG_FUNCTION_ARGS) + { + Oid oid = PG_GETARG_OID(0); + + if (!SearchSysCacheExists1(OPFAMILYOID, ObjectIdGetDatum(oid))) + PG_RETURN_NULL(); + + PG_RETURN_BOOL(OpfamilyIsVisible(oid)); + } + + Datum pg_conversion_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 325d452..5f21830 100644 *** a/src/backend/catalog/system_views.sql --- b/src/backend/catalog/system_views.sql *************** *** 6,11 **** --- 6,392 ---- * src/backend/catalog/system_views.sql */ + CREATE VIEW pg_comments AS + SELECT + d.objoid, d.classoid, d.objsubid, + CASE WHEN rel.relkind = 'r' THEN 'table'::text + WHEN rel.relkind = 'v' THEN 'view'::text + WHEN rel.relkind = 'i' THEN 'index'::text + WHEN rel.relkind = 'S' THEN 'sequence'::text END AS objtype, + rel.relnamespace AS objnamespace, + CASE WHEN pg_table_is_visible(rel.oid) + THEN quote_ident(rel.relname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_class rel ON d.classoid = rel.tableoid AND d.objoid = rel.oid + JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'column'::text AS objtype, + rel.relnamespace AS objnamespace, + CASE WHEN pg_table_is_visible(rel.oid) + THEN quote_ident(rel.relname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname) + END || '.' || att.attname AS objname, + d.description + FROM + pg_description d + JOIN pg_class rel ON d.classoid = rel.tableoid AND d.objoid = rel.oid + JOIN pg_attribute att + ON rel.oid = att.attrelid AND d.objsubid = att.attnum + JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + WHERE + d.objsubid != 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + CASE WHEN pro.proisagg = true THEN 'aggregate'::text + WHEN pro.proisagg = false THEN 'function'::text + END AS objtype, + pro.pronamespace AS objnamespace, + CASE WHEN pg_function_is_visible(pro.oid) + THEN quote_ident(pro.proname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(pro.proname) + END || '(' + || pg_catalog.pg_get_function_arguments(pro.oid) || ')' AS objname, + d.description + FROM + pg_description d + JOIN pg_proc pro ON d.classoid = pro.tableoid AND d.objoid = pro.oid + JOIN pg_namespace nsp ON pro.pronamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'cast'::text AS objtype, + NULL::oid AS objnamespace, + '(' || format_type(cst.castsource, NULL) + || ' AS ' || format_type(cst.casttarget, NULL) || ')' AS objname, + d.description + FROM + pg_description d + JOIN pg_cast cst ON d.classoid = cst.tableoid AND d.objoid = cst.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'constraint'::text AS objtype, + rel.relnamespace AS objnamespace, + con.conname || ' ON ' || + CASE WHEN pg_table_is_visible(rel.oid) + THEN quote_ident(rel.relname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_constraint con ON d.classoid = con.tableoid AND d.objoid = con.oid + JOIN pg_class rel ON con.conrelid = rel.oid + JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'conversion'::text AS objtype, + con.connamespace AS objnamespace, + CASE WHEN pg_conversion_is_visible(con.oid) + THEN quote_ident(con.conname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(con.conname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_conversion con ON d.classoid = con.tableoid AND d.objoid = con.oid + JOIN pg_namespace nsp ON con.connamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + CASE WHEN typ.typtype = 'd' 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) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(typ.typname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_type typ ON d.classoid = typ.tableoid AND d.objoid = typ.oid + JOIN pg_namespace nsp ON typ.typnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'large object'::text AS objtype, + NULL::oid AS objnamespace, + d.objoid::text AS objname, + d.description + FROM + pg_description d + JOIN pg_largeobject_metadata lom ON d.objoid = lom.oid + WHERE + d.classoid = (SELECT oid FROM pg_class WHERE relname = 'pg_largeobject') + AND d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'operator'::text AS objtype, + opr.oprnamespace AS objnamespace, + CASE WHEN pg_operator_is_visible(opr.oid) + THEN opr.oprname + ELSE quote_ident(nsp.nspname) || '.' || opr.oprname + END + || '(' + || CASE WHEN opr.oprkind = 'r' THEN 'NONE' + ELSE format_type(opr.oprleft, NULL) END + || ',' + || CASE WHEN opr.oprkind = 'l' THEN 'NONE' + ELSE format_type(opr.oprright, NULL) END + || ')' AS objname, + d.description + FROM + pg_description d + JOIN pg_operator opr ON d.classoid = opr.tableoid AND d.objoid = opr.oid + JOIN pg_namespace nsp ON opr.oprnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'operator class'::text AS objtype, + opc.opcnamespace AS objnamespace, + CASE WHEN pg_opclass_is_visible(opc.oid) + THEN quote_ident(opc.opcname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(opc.opcname) + END || ' USING ' || am.amname AS objname, + d.description + FROM + pg_description d + JOIN pg_opclass opc ON d.classoid = opc.tableoid AND d.objoid = opc.oid + JOIN pg_am am ON opc.opcmethod = am.oid + JOIN pg_namespace nsp ON opc.opcnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'operator family'::text AS objtype, + opf.opfnamespace AS objnamespace, + CASE WHEN pg_opfamily_is_visible(opf.oid) + THEN quote_ident(opf.opfname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(opf.opfname) + END || ' USING ' || am.amname AS objname, + d.description + FROM + pg_description d + JOIN pg_opfamily opf ON d.classoid = opf.tableoid AND d.objoid = opf.oid + JOIN pg_am am ON opf.opfmethod = am.oid + JOIN pg_namespace nsp ON opf.opfnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'language'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(lan.lanname) AS objname, + d.description + FROM + pg_description d + JOIN pg_language lan ON d.classoid = lan.tableoid AND d.objoid = lan.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'rule'::text AS objtype, + rel.relnamespace AS objnamespace, + quote_ident(rew.rulename) || ' ON ' || + CASE WHEN pg_table_is_visible(rel.oid) + THEN quote_ident(rel.relname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_rewrite rew ON d.classoid = rew.tableoid AND d.objoid = rew.oid + JOIN pg_class rel ON rew.ev_class = rel.oid + JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'schema'::text AS objtype, + nsp.oid AS objnamespace, + quote_ident(nsp.nspname) AS objname, + d.description + FROM + pg_description d + JOIN pg_namespace nsp ON d.classoid = nsp.tableoid AND d.objoid = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'text search configuration'::text AS objtype, + cfg.cfgnamespace AS objnamespace, + CASE WHEN pg_ts_config_is_visible(cfg.oid) + THEN quote_ident(cfg.cfgname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(cfg.cfgname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_ts_config cfg ON d.classoid = cfg.tableoid AND d.objoid = cfg.oid + JOIN pg_namespace nsp ON cfg.cfgnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'text search dictionary'::text AS objtype, + dict.dictnamespace AS objnamespace, + CASE WHEN pg_ts_dict_is_visible(dict.oid) + THEN quote_ident(dict.dictname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(dict.dictname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_ts_dict dict ON d.classoid = dict.tableoid AND d.objoid = dict.oid + JOIN pg_namespace nsp ON dict.dictnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'text search parser'::text AS objtype, + prs.prsnamespace AS objnamespace, + CASE WHEN pg_ts_parser_is_visible(prs.oid) + THEN quote_ident(prs.prsname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(prs.prsname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_ts_parser prs ON d.classoid = prs.tableoid AND d.objoid = prs.oid + JOIN pg_namespace nsp ON prs.prsnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'text search template'::text AS objtype, + tmpl.tmplnamespace AS objnamespace, + CASE WHEN pg_ts_template_is_visible(tmpl.oid) + THEN quote_ident(tmpl.tmplname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(tmpl.tmplname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_ts_template tmpl + ON d.classoid = tmpl.tableoid AND d.objoid = tmpl.oid + JOIN pg_namespace nsp ON tmpl.tmplnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'trigger'::text AS objtype, + rel.relnamespace AS objnamespace, + quote_ident(tg.tgname) || ' ON ' || + CASE WHEN pg_table_is_visible(rel.oid) + THEN quote_ident(rel.relname) + ELSE quote_ident(nsp.nspname) || '.' || quote_ident(rel.relname) + END AS objname, + d.description + FROM + pg_description d + JOIN pg_trigger tg ON d.classoid = tg.tableoid AND d.objoid = tg.oid + JOIN pg_class rel ON tg.tgrelid = rel.oid + JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'access method'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(am.amname) AS objname, + d.description + FROM + pg_description d + JOIN pg_am am ON d.classoid = am.tableoid AND d.objoid = am.oid + WHERE + d.objsubid = 0 + UNION ALL + SELECT + d.objoid, d.classoid, NULL::integer AS objsubid, + 'database'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(dat.datname) AS objname, + d.description + FROM + pg_shdescription d + JOIN pg_database dat ON d.classoid = dat.tableoid AND d.objoid = dat.oid + UNION ALL + SELECT + d.objoid, d.classoid, NULL::integer AS objsubid, + 'role'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(rol.rolname) AS objname, + d.description + FROM + pg_shdescription d + JOIN pg_authid rol ON d.classoid = rol.tableoid AND d.objoid = rol.oid + UNION ALL + SELECT + d.objoid, d.classoid, NULL::integer AS objsubid, + 'tablespace'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(spc.spcname) AS objname, + d.description + FROM + pg_shdescription d + JOIN pg_tablespace spc + ON d.classoid = spc.tableoid AND d.objoid = spc.oid + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'foreign data wrapper'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(fdw.fdwname) AS objname, + d.description + FROM + pg_description d + JOIN pg_foreign_data_wrapper fdw + ON d.classoid = fdw.tableoid AND d.objoid = fdw.oid + UNION ALL + SELECT + d.objoid, d.classoid, d.objsubid, + 'server'::text AS objtype, + NULL::oid AS objnamespace, + quote_ident(srv.srvname) AS objname, + d.description + FROM + pg_description d + JOIN pg_foreign_server srv + ON d.classoid = srv.tableoid AND d.objoid = srv.oid; + CREATE VIEW pg_roles AS SELECT rolname, diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 3c183ce..1b43ea1 100644 *** a/src/include/catalog/pg_proc.h --- b/src/include/catalog/pg_proc.h *************** DATA(insert OID = 2082 ( pg_operator_is *** 2825,2830 **** --- 2825,2832 ---- DESCR("is operator visible in search path?"); DATA(insert OID = 2083 ( pg_opclass_is_visible PGNSP PGUID 12 1 0 0 f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ pg_opclass_is_visible _null_ _null_ _null_ )); DESCR("is opclass visible in search path?"); + DATA(insert OID = 3534 ( pg_opfamily_is_visible PGNSP PGUID 12 1 0 0 f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ pg_opfamily_is_visible _null_ _null_ _null_ )); + DESCR("is opfamily visible in search path?"); DATA(insert OID = 2093 ( pg_conversion_is_visible PGNSP PGUID 12 1 0 0 f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ pg_conversion_is_visible _null_ _null_ _null_ )); DESCR("is conversion visible in search path?"); DATA(insert OID = 3756 ( pg_ts_parser_is_visible PGNSP PGUID 12 1 0 0 f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ pg_ts_parser_is_visible _null_ _null_ _null_ )); diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 20cdc39..4c0ed7d 100644 *** a/src/test/regress/expected/rules.out --- b/src/test/regress/expected/rules.out *************** drop table cchild; *** 1276,1286 **** -- 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")); --- 1276,1287 ---- -- 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_comments | (((((((((((((((((((((((SELECT d.objoid, d.classoid, d.objsubid, CASE WHEN (rel.relkind = 'r'::"char") THEN 'table'::text WHEN (rel.relkind = 'v'::"char") THEN 'view'::text WHEN (rel.relkind = 'i'::"char") THEN 'index'::text WHEN (rel.relkind = 'S'::"char") THEN 'sequence'::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, d.description FROM ((pg_description d JOIN pg_class rel ON (((d.classoid = rel.tableoid) AND (d.objoid = rel.oid)))) JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) WHERE (d.objsubid = 0) UNION ALL SELECT d.objoid, d.classoid, d.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, d.description FROM (((pg_description d JOIN pg_class rel ON (((d.classoid = rel.tableoid) AND (d.objoid = rel.oid)))) JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (d.objsubid = att.attnum)))) JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) WHERE (d.objsubid <> 0)) UNION ALL SELECT d.objoid, d.classoid, d.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, d.description FROM ((pg_description d JOIN pg_proc pro ON (((d.classoid = pro.tableoid) AND (d.objoid = pro.oid)))) JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'cast'::text AS objtype, NULL::oid AS objnamespace, (((('('::text || format_type(cst.castsource, NULL::integer)) || ' AS '::text) || format_type(cst.casttarget, NULL::integer)) || ')'::text) AS objname, d.description FROM (pg_description d JOIN pg_cast cst ON (((d.classoid = cst.tableoid) AND (d.objoid = cst.oid)))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'constraint'::text AS objtype, rel.relnamespace AS objnamespace, (((con.conname)::text || ' ON '::text) || 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, d.description FROM (((pg_description d JOIN pg_constraint con ON (((d.classoid = con.tableoid) AND (d.objoid = con.oid)))) JOIN pg_class rel ON ((con.conrelid = rel.oid))) JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'conversion'::text AS objtype, con.connamespace AS objnamespace, CASE WHEN pg_conversion_is_visible(con.oid) THEN quote_ident((con.conname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((con.conname)::text)) END AS objname, d.description FROM ((pg_description d JOIN pg_conversion con ON (((d.classoid = con.tableoid) AND (d.objoid = con.oid)))) JOIN pg_namespace nsp ON ((con.connamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.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, d.description FROM ((pg_description d JOIN pg_type typ ON (((d.classoid = typ.tableoid) AND (d.objoid = typ.oid)))) JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'large object'::text AS objtype, NULL::oid AS objnamespace, (d.objoid)::text AS objname, d.description FROM (pg_description d JOIN pg_largeobject_metadata lom ON ((d.objoid = lom.oid))) WHERE ((d.classoid = (SELECT pg_class.oid FROM pg_class WHERE (pg_class.relname = 'pg_largeobject'::name))) AND (d.objsubid = 0))) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'operator'::text AS objtype, opr.oprnamespace AS objnamespace, (((((CASE WHEN pg_operator_is_visible(opr.oid) THEN (opr.oprname)::text ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || (opr.oprname)::text) END || '('::text) || CASE WHEN (opr.oprkind = 'r'::"char") THEN 'NONE'::text ELSE format_type(opr.oprleft, NULL::integer) END) || ','::text) || CASE WHEN (opr.oprkind = 'l'::"char") THEN 'NONE'::text ELSE format_type(opr.oprright, NULL::integer) END) || ')'::text) AS objname, d.description FROM ((pg_description d JOIN pg_operator opr ON (((d.classoid = opr.tableoid) AND (d.objoid = opr.oid)))) JOIN pg_namespace nsp ON ((opr.oprnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'operator class'::text AS objtype, opc.opcnamespace AS objnamespace, ((CASE WHEN pg_opclass_is_visible(opc.oid) THEN quote_ident((opc.opcname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((opc.opcname)::text)) END || ' USING '::text) || (am.amname)::text) AS objname, d.description FROM (((pg_description d JOIN pg_opclass opc ON (((d.classoid = opc.tableoid) AND (d.objoid = opc.oid)))) JOIN pg_am am ON ((opc.opcmethod = am.oid))) JOIN pg_namespace nsp ON ((opc.opcnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'operator family'::text AS objtype, opf.opfnamespace AS objnamespace, ((CASE WHEN pg_opfamily_is_visible(opf.oid) THEN quote_ident((opf.opfname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((opf.opfname)::text)) END || ' USING '::text) || (am.amname)::text) AS objname, d.description FROM (((pg_description d JOIN pg_opfamily opf ON (((d.classoid = opf.tableoid) AND (d.objoid = opf.oid)))) JOIN pg_am am ON ((opf.opfmethod = am.oid))) JOIN pg_namespace nsp ON ((opf.opfnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'language'::text AS objtype, NULL::oid AS objnamespace, quote_ident((lan.lanname)::text) AS objname, d.description FROM (pg_description d JOIN pg_language lan ON (((d.classoid = lan.tableoid) AND (d.objoid = lan.oid)))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'rule'::text AS objtype, rel.relnamespace AS objnamespace, ((quote_ident((rew.rulename)::text) || ' ON '::text) || 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, d.description FROM (((pg_description d JOIN pg_rewrite rew ON (((d.classoid = rew.tableoid) AND (d.objoid = rew.oid)))) JOIN pg_class rel ON ((rew.ev_class = rel.oid))) JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'schema'::text AS objtype, nsp.oid AS objnamespace, quote_ident((nsp.nspname)::text) AS objname, d.description FROM (pg_description d JOIN pg_namespace nsp ON (((d.classoid = nsp.tableoid) AND (d.objoid = nsp.oid)))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'text search configuration'::text AS objtype, cfg.cfgnamespace AS objnamespace, CASE WHEN pg_ts_config_is_visible(cfg.oid) THEN quote_ident((cfg.cfgname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((cfg.cfgname)::text)) END AS objname, d.description FROM ((pg_description d JOIN pg_ts_config cfg ON (((d.classoid = cfg.tableoid) AND (d.objoid = cfg.oid)))) JOIN pg_namespace nsp ON ((cfg.cfgnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'text search dictionary'::text AS objtype, dict.dictnamespace AS objnamespace, CASE WHEN pg_ts_dict_is_visible(dict.oid) THEN quote_ident((dict.dictname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((dict.dictname)::text)) END AS objname, d.description FROM ((pg_description d JOIN pg_ts_dict dict ON (((d.classoid = dict.tableoid) AND (d.objoid = dict.oid)))) JOIN pg_namespace nsp ON ((dict.dictnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'text search parser'::text AS objtype, prs.prsnamespace AS objnamespace, CASE WHEN pg_ts_parser_is_visible(prs.oid) THEN quote_ident((prs.prsname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((prs.prsname)::text)) END AS objname, d.description FROM ((pg_description d JOIN pg_ts_parser prs ON (((d.classoid = prs.tableoid) AND (d.objoid = prs.oid)))) JOIN pg_namespace nsp ON ((prs.prsnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'text search template'::text AS objtype, tmpl.tmplnamespace AS objnamespace, CASE WHEN pg_ts_template_is_visible(tmpl.oid) THEN quote_ident((tmpl.tmplname)::text) ELSE ((quote_ident((nsp.nspname)::text) || '.'::text) || quote_ident((tmpl.tmplname)::text)) END AS objname, d.description FROM ((pg_description d JOIN pg_ts_template tmpl ON (((d.classoid = tmpl.tableoid) AND (d.objoid = tmpl.oid)))) JOIN pg_namespace nsp ON ((tmpl.tmplnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'trigger'::text AS objtype, rel.relnamespace AS objnamespace, ((quote_ident((tg.tgname)::text) || ' ON '::text) || 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, d.description FROM (((pg_description d JOIN pg_trigger tg ON (((d.classoid = tg.tableoid) AND (d.objoid = tg.oid)))) JOIN pg_class rel ON ((tg.tgrelid = rel.oid))) JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'access method'::text AS objtype, NULL::oid AS objnamespace, quote_ident((am.amname)::text) AS objname, d.description FROM (pg_description d JOIN pg_am am ON (((d.classoid = am.tableoid) AND (d.objoid = am.oid)))) WHERE (d.objsubid = 0)) UNION ALL SELECT d.objoid, d.classoid, NULL::integer AS objsubid, 'database'::text AS objtype, NULL::oid AS objnamespace, quote_ident((dat.datname)::text) AS objname, d.description FROM (pg_shdescription d JOIN pg_database dat ON (((d.classoid = dat.tableoid) AND (d.objoid = dat.oid))))) UNION ALL SELECT d.objoid, d.classoid, NULL::integer AS objsubid, 'role'::text AS objtype, NULL::oid AS objnamespace, quote_ident((rol.rolname)::text) AS objname, d.description FROM (pg_shdescription d JOIN pg_authid rol ON (((d.classoid = rol.tableoid) AND (d.objoid = rol.oid))))) UNION ALL SELECT d.objoid, d.classoid, NULL::integer AS objsubid, 'tablespace'::text AS objtype, NULL::oid AS objnamespace, quote_ident((spc.spcname)::text) AS objname, d.description FROM (pg_shdescription d JOIN pg_tablespace spc ON (((d.classoid = spc.tableoid) AND (d.objoid = spc.oid))))) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'foreign data wrapper'::text AS objtype, NULL::oid AS objnamespace, quote_ident((fdw.fdwname)::text) AS objname, d.description FROM (pg_description d JOIN pg_foreign_data_wrapper fdw ON (((d.classoid = fdw.tableoid) AND (d.objoid = fdw.oid))))) UNION ALL SELECT d.objoid, d.classoid, d.objsubid, 'server'::text AS objtype, NULL::oid AS objnamespace, quote_ident((srv.srvname)::text) AS objname, d.description FROM (pg_description d JOIN pg_foreign_server srv ON (((d.classoid = srv.tableoid) AND (d.objoid = srv.oid)))); 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")); *************** SELECT viewname, definition FROM pg_view *** 1338,1344 **** 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 ORDER BY tablename, rulename; --- 1339,1345 ---- 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; ! (61 rows) SELECT tablename, rulename, definition FROM pg_rules ORDER BY tablename, rulename;