diff --git a/src/test/regress/expected/oidjoins.out b/src/test/regress/expected/oidjoins.out index 5fe630777f..234b44fdf2 100644 --- a/src/test/regress/expected/oidjoins.out +++ b/src/test/regress/expected/oidjoins.out @@ -217,6 +217,30 @@ WHERE attcollation != 0 AND ------+-------------- (0 rows) +SELECT ctid, roleid +FROM pg_catalog.pg_auth_members fk +WHERE roleid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.roleid); + ctid | roleid +------+-------- +(0 rows) + +SELECT ctid, member +FROM pg_catalog.pg_auth_members fk +WHERE member != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.member); + ctid | member +------+-------- +(0 rows) + +SELECT ctid, grantor +FROM pg_catalog.pg_auth_members fk +WHERE grantor != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.grantor); + ctid | grantor +------+--------- +(0 rows) + SELECT ctid, castsource FROM pg_catalog.pg_cast fk WHERE castsource != 0 AND @@ -721,6 +745,14 @@ WHERE opfowner != 0 AND ------+---------- (0 rows) +SELECT ctid, partrelid +FROM pg_catalog.pg_partitioned_table fk +WHERE partrelid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.partrelid); + ctid | partrelid +------+----------- +(0 rows) + SELECT ctid, polrelid FROM pg_catalog.pg_policy fk WHERE polrelid != 0 AND @@ -833,6 +865,22 @@ WHERE ev_class != 0 AND ------+---------- (0 rows) +SELECT ctid, seqrelid +FROM pg_catalog.pg_sequence fk +WHERE seqrelid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.seqrelid); + ctid | seqrelid +------+---------- +(0 rows) + +SELECT ctid, seqtypid +FROM pg_catalog.pg_sequence fk +WHERE seqtypid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.seqtypid); + ctid | seqtypid +------+---------- +(0 rows) + SELECT ctid, refclassid FROM pg_catalog.pg_shdepend fk WHERE refclassid != 0 AND @@ -897,6 +945,30 @@ WHERE staop5 != 0 AND ------+-------- (0 rows) +SELECT ctid, stxrelid +FROM pg_catalog.pg_statistic_ext fk +WHERE stxrelid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.stxrelid); + ctid | stxrelid +------+---------- +(0 rows) + +SELECT ctid, stxnamespace +FROM pg_catalog.pg_statistic_ext fk +WHERE stxnamespace != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.stxnamespace); + ctid | stxnamespace +------+-------------- +(0 rows) + +SELECT ctid, stxowner +FROM pg_catalog.pg_statistic_ext fk +WHERE stxowner != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.stxowner); + ctid | stxowner +------+---------- +(0 rows) + SELECT ctid, spcowner FROM pg_catalog.pg_tablespace fk WHERE spcowner != 0 AND diff --git a/src/test/regress/sql/oidjoins.sql b/src/test/regress/sql/oidjoins.sql index ef749936eb..fcf9990f6b 100644 --- a/src/test/regress/sql/oidjoins.sql +++ b/src/test/regress/sql/oidjoins.sql @@ -109,6 +109,18 @@ SELECT ctid, attcollation FROM pg_catalog.pg_attribute fk WHERE attcollation != 0 AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.attcollation); +SELECT ctid, roleid +FROM pg_catalog.pg_auth_members fk +WHERE roleid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.roleid); +SELECT ctid, member +FROM pg_catalog.pg_auth_members fk +WHERE member != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.member); +SELECT ctid, grantor +FROM pg_catalog.pg_auth_members fk +WHERE grantor != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.grantor); SELECT ctid, castsource FROM pg_catalog.pg_cast fk WHERE castsource != 0 AND @@ -361,6 +373,10 @@ SELECT ctid, opfowner FROM pg_catalog.pg_opfamily fk WHERE opfowner != 0 AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.opfowner); +SELECT ctid, partrelid +FROM pg_catalog.pg_partitioned_table fk +WHERE partrelid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.partrelid); SELECT ctid, polrelid FROM pg_catalog.pg_policy fk WHERE polrelid != 0 AND @@ -417,6 +433,14 @@ SELECT ctid, ev_class FROM pg_catalog.pg_rewrite fk WHERE ev_class != 0 AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.ev_class); +SELECT ctid, seqrelid +FROM pg_catalog.pg_sequence fk +WHERE seqrelid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.seqrelid); +SELECT ctid, seqtypid +FROM pg_catalog.pg_sequence fk +WHERE seqtypid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.seqtypid); SELECT ctid, refclassid FROM pg_catalog.pg_shdepend fk WHERE refclassid != 0 AND @@ -449,6 +473,18 @@ SELECT ctid, staop5 FROM pg_catalog.pg_statistic fk WHERE staop5 != 0 AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop5); +SELECT ctid, stxrelid +FROM pg_catalog.pg_statistic_ext fk +WHERE stxrelid != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.stxrelid); +SELECT ctid, stxnamespace +FROM pg_catalog.pg_statistic_ext fk +WHERE stxnamespace != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.stxnamespace); +SELECT ctid, stxowner +FROM pg_catalog.pg_statistic_ext fk +WHERE stxowner != 0 AND + NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.stxowner); SELECT ctid, spcowner FROM pg_catalog.pg_tablespace fk WHERE spcowner != 0 AND diff --git a/src/tools/findoidjoins/README b/src/tools/findoidjoins/README index af8c99eb6a..7c5a5cf4b9 100644 --- a/src/tools/findoidjoins/README +++ b/src/tools/findoidjoins/README @@ -5,7 +5,7 @@ findoidjoins This program scans a database and prints oid fields (also reg* fields) and the tables they join to. It is normally used to check the system -catalog join relationships (shown below for 9.6devel as of 2016-01-16). +catalog join relationships (shown below for 10devel as of 2017-05-15). Historically this has been run against an empty database such as template1, but there's a problem with that approach: some of the catalogs are empty @@ -16,7 +16,7 @@ catalogs in interesting ways. Note that unexpected matches may indicate bogus entries in system tables; don't accept a peculiar match without question. In particular, a field shown as joining to more than one target table is probably messed up. -In 9.6, the *only* fields that should join to more than one target +In v10, the *only* fields that should join to more than one target table are: pg_description.objoid, pg_depend.objid, pg_depend.refobjid, pg_shdescription.objoid, pg_shdepend.objid, pg_shdepend.refobjid, @@ -35,13 +35,29 @@ regression test. The oidjoins test should be updated after any revision in the patterns of cross-links between system tables. (Typically we update it at the end of each development cycle.) -NOTE: as of 9.6, make_oidjoins_check produces two bogus join checks: +NOTE: as of v10, make_oidjoins_check produces two bogus join checks: Join pg_catalog.pg_class.relfilenode => pg_catalog.pg_class.oid Join pg_catalog.pg_database.datlastsysoid => pg_catalog.pg_database.oid These are artifacts and should not be added to the oidjoins regression test. You might also get output for pg_shdepend.refobjid and pg_shdescription.objoid, neither of which should be added to the regression test. +In short, the procedure is: + +1. make installcheck in src/test/regress +2. cd here, make +3. ./findoidjoins regression >foj.out +4. ./make_oidjoins_check foj.out >oidjoins.sql +5. paste foj.out below, removing the entries reported as duplicative + by make_oidjoins_check or described as bogus above +6. remove bogus tests in oidjoins.sql as per above +7. copy oidjoins.sql to src/test/regress/sql/, + and update oidjoins.out to match. +8. Review diffs to ensure they correspond to new catalog relationships, + then commit. (Sometimes, a pre-existing catalog relationship might + become newly visible here as a result of the regression tests populating + a catalog they didn't before. That's OK too.) + --------------------------------------------------------------------------- Join pg_catalog.pg_aggregate.aggfnoid => pg_catalog.pg_proc.oid @@ -71,6 +87,9 @@ Join pg_catalog.pg_attrdef.adrelid => pg_catalog.pg_class.oid Join pg_catalog.pg_attribute.attrelid => pg_catalog.pg_class.oid Join pg_catalog.pg_attribute.atttypid => pg_catalog.pg_type.oid Join pg_catalog.pg_attribute.attcollation => pg_catalog.pg_collation.oid +Join pg_catalog.pg_auth_members.roleid => pg_catalog.pg_authid.oid +Join pg_catalog.pg_auth_members.member => pg_catalog.pg_authid.oid +Join pg_catalog.pg_auth_members.grantor => pg_catalog.pg_authid.oid Join pg_catalog.pg_cast.castsource => pg_catalog.pg_type.oid Join pg_catalog.pg_cast.casttarget => pg_catalog.pg_type.oid Join pg_catalog.pg_cast.castfunc => pg_catalog.pg_proc.oid @@ -134,6 +153,7 @@ Join pg_catalog.pg_operator.oprjoin => pg_catalog.pg_proc.oid Join pg_catalog.pg_opfamily.opfmethod => pg_catalog.pg_am.oid Join pg_catalog.pg_opfamily.opfnamespace => pg_catalog.pg_namespace.oid Join pg_catalog.pg_opfamily.opfowner => pg_catalog.pg_authid.oid +Join pg_catalog.pg_partitioned_table.partrelid => pg_catalog.pg_class.oid Join pg_catalog.pg_policy.polrelid => pg_catalog.pg_class.oid Join pg_catalog.pg_proc.pronamespace => pg_catalog.pg_namespace.oid Join pg_catalog.pg_proc.proowner => pg_catalog.pg_authid.oid @@ -148,6 +168,8 @@ Join pg_catalog.pg_range.rngsubopc => pg_catalog.pg_opclass.oid Join pg_catalog.pg_range.rngcanonical => pg_catalog.pg_proc.oid Join pg_catalog.pg_range.rngsubdiff => pg_catalog.pg_proc.oid Join pg_catalog.pg_rewrite.ev_class => pg_catalog.pg_class.oid +Join pg_catalog.pg_sequence.seqrelid => pg_catalog.pg_class.oid +Join pg_catalog.pg_sequence.seqtypid => pg_catalog.pg_type.oid Join pg_catalog.pg_shdepend.refclassid => pg_catalog.pg_class.oid Join pg_catalog.pg_shdescription.classoid => pg_catalog.pg_class.oid Join pg_catalog.pg_statistic.starelid => pg_catalog.pg_class.oid @@ -156,6 +178,9 @@ Join pg_catalog.pg_statistic.staop2 => pg_catalog.pg_operator.oid Join pg_catalog.pg_statistic.staop3 => pg_catalog.pg_operator.oid Join pg_catalog.pg_statistic.staop4 => pg_catalog.pg_operator.oid Join pg_catalog.pg_statistic.staop5 => pg_catalog.pg_operator.oid +Join pg_catalog.pg_statistic_ext.stxrelid => pg_catalog.pg_class.oid +Join pg_catalog.pg_statistic_ext.stxnamespace => pg_catalog.pg_namespace.oid +Join pg_catalog.pg_statistic_ext.stxowner => pg_catalog.pg_authid.oid Join pg_catalog.pg_tablespace.spcowner => pg_catalog.pg_authid.oid Join pg_catalog.pg_transform.trftype => pg_catalog.pg_type.oid Join pg_catalog.pg_transform.trflang => pg_catalog.pg_language.oid