On Sun, Jan 17, 2021, at 21:32, Tom Lane wrote: >Well, SGML is actually plenty easy to parse as long as you've got xml >tooling at hand. We'd never want to introduce such a dependency in the >normal build process, but making something like findoidjoins depend on >such tools seems within reason. I recall having whipped up some one-off >Perl scripts of that sort when I was doing that massive rewrite of the >func.sgml tables last year. I didn't save them though, and in any case >I'm the world's worst Perl programmer, so it'd be better for someone >with more Perl-fu to take point if we decide to go that route.
I went a head and implemented the parser, it was indeed easy. Patch attached. Add catalog_oidjoins.pl -- parses catalog references out of catalogs.sgml Since doc/src/sgml/catalogs.sgml is the master where catalog references are to be documented, if someone needs machine-readable access to such information, it should be extracted from this document. The added script catalog_oidjoins.pl parses the SGML and extract the fields necessary to produce the same output as generated by findoidjoins, which has historically been copy/pasted to the README. This is to allow for easy comparison, to verify the correctness of catalog_oidjoins.pl, and if necessary, to update the README based on the information in catalogs.sgml. Helper-files: diff_oidjoins.sh Runs ./catalog_oidjoins.pl and compares its output with STDIN. Shows a diff of the result, witout any context. test_oidjoins.sh Runs ./diff_oidjoins.sh for both the README and the output from ./findoidjoins regression. bogus_oidjoins.txt List of bogus diff entires to ignore, based on documentation in README. After having run make installcheck in src/test/regress, the test_oidjoins.sh can be run: $ ./test_oidjoins.sh README: + Join pg_catalog.pg_attrdef.adnum => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_class.relrewrite => pg_catalog.pg_class.oid + Join pg_catalog.pg_constraint.confkey []=> pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_constraint.conkey []=> pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_db_role_setting.setrole => pg_catalog.pg_authid.oid + Join pg_catalog.pg_default_acl.defaclnamespace => pg_catalog.pg_namespace.oid + Join pg_catalog.pg_default_acl.defaclrole => pg_catalog.pg_authid.oid + Join pg_catalog.pg_event_trigger.evtfoid => pg_catalog.pg_proc.oid + Join pg_catalog.pg_event_trigger.evtowner => pg_catalog.pg_authid.oid + Join pg_catalog.pg_extension.extconfig []=> pg_catalog.pg_class.oid + Join pg_catalog.pg_foreign_data_wrapper.fdwhandler => pg_catalog.pg_proc.oid + Join pg_catalog.pg_foreign_data_wrapper.fdwvalidator => pg_catalog.pg_proc.oid + Join pg_catalog.pg_foreign_table.ftrelid => pg_catalog.pg_class.oid + Join pg_catalog.pg_foreign_table.ftserver => pg_catalog.pg_foreign_server.oid + Join pg_catalog.pg_index.indkey => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_partitioned_table.partattrs => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_policy.polroles []=> pg_catalog.pg_authid.oid + Join pg_catalog.pg_publication.pubowner => pg_catalog.pg_authid.oid + Join pg_catalog.pg_publication_rel.prpubid => pg_catalog.pg_publication.oid + Join pg_catalog.pg_publication_rel.prrelid => pg_catalog.pg_class.oid + Join pg_catalog.pg_range.rngmultitypid => pg_catalog.pg_type.oid + Join pg_catalog.pg_seclabel.classoid => pg_catalog.pg_class.oid + Join pg_catalog.pg_shseclabel.classoid => pg_catalog.pg_class.oid + Join pg_catalog.pg_statistic.staattnum => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_statistic_ext.stxkeys => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_subscription.subdbid => pg_catalog.pg_database.oid + Join pg_catalog.pg_subscription.subowner => pg_catalog.pg_authid.oid + Join pg_catalog.pg_subscription_rel.srrelid => pg_catalog.pg_class.oid + Join pg_catalog.pg_subscription_rel.srsubid => pg_catalog.pg_subscription.oid + Join pg_catalog.pg_trigger.tgattr => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_type.typsubscript => pg_catalog.pg_proc.oid + Join pg_catalog.pg_user_mapping.umserver => pg_catalog.pg_foreign_server.oid + Join pg_catalog.pg_user_mapping.umuser => pg_catalog.pg_authid.oid findoidjoins: + Join pg_catalog.pg_attrdef.adnum => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_class.relrewrite => pg_catalog.pg_class.oid + Join pg_catalog.pg_constraint.confkey []=> pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_constraint.conkey []=> pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_db_role_setting.setrole => pg_catalog.pg_authid.oid + Join pg_catalog.pg_default_acl.defaclnamespace => pg_catalog.pg_namespace.oid + Join pg_catalog.pg_default_acl.defaclrole => pg_catalog.pg_authid.oid + Join pg_catalog.pg_event_trigger.evtfoid => pg_catalog.pg_proc.oid + Join pg_catalog.pg_event_trigger.evtowner => pg_catalog.pg_authid.oid + Join pg_catalog.pg_extension.extconfig []=> pg_catalog.pg_class.oid + Join pg_catalog.pg_foreign_data_wrapper.fdwhandler => pg_catalog.pg_proc.oid + Join pg_catalog.pg_foreign_data_wrapper.fdwvalidator => pg_catalog.pg_proc.oid + Join pg_catalog.pg_foreign_table.ftrelid => pg_catalog.pg_class.oid + Join pg_catalog.pg_foreign_table.ftserver => pg_catalog.pg_foreign_server.oid + Join pg_catalog.pg_index.indkey => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_partitioned_table.partattrs => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_policy.polroles []=> pg_catalog.pg_authid.oid + Join pg_catalog.pg_publication.pubowner => pg_catalog.pg_authid.oid + Join pg_catalog.pg_publication_rel.prpubid => pg_catalog.pg_publication.oid + Join pg_catalog.pg_publication_rel.prrelid => pg_catalog.pg_class.oid + Join pg_catalog.pg_seclabel.classoid => pg_catalog.pg_class.oid + Join pg_catalog.pg_statistic_ext.stxkeys => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_subscription.subdbid => pg_catalog.pg_database.oid + Join pg_catalog.pg_subscription.subowner => pg_catalog.pg_authid.oid + Join pg_catalog.pg_subscription_rel.srrelid => pg_catalog.pg_class.oid + Join pg_catalog.pg_subscription_rel.srsubid => pg_catalog.pg_subscription.oid + Join pg_catalog.pg_trigger.tgattr => pg_catalog.pg_attribute.attnum + Join pg_catalog.pg_user_mapping.umserver => pg_catalog.pg_foreign_server.oid + Join pg_catalog.pg_user_mapping.umuser => pg_catalog.pg_authid.oid diff of diffs: 21d20 < + Join pg_catalog.pg_range.rngmultitypid => pg_catalog.pg_type.oid 23,24d21 < + Join pg_catalog.pg_shseclabel.classoid => pg_catalog.pg_class.oid < + Join pg_catalog.pg_statistic.staattnum => pg_catalog.pg_attribute.attnum 31d27 < + Join pg_catalog.pg_type.typsubscript => pg_catalog.pg_proc.oid
parse-catalog-oidjoins.patch
Description: Binary data