Here is a fun little view on the progress of PostgreSQL. Consider the number of “CREATE SOMETHING” commands each release contains. As more features are added over time, more such CREATE commands are added.

Release Number New
PostgreSQL 16 42  
PostgreSQL 15 42  
PostgreSQL 14 42  
PostgreSQL 13 42  
PostgreSQL 12 42  
PostgreSQL 11 42 PROCEDURE
PostgreSQL 10 41 PUBLICATION, STATISTICS, SUBSCRIPTION
PostgreSQL 9.6 38 ACCESS METHOD
PostgreSQL 9.5 37 POLICY, TRANSFORM
PostgreSQL 9.4 35  
PostgreSQL 9.3 35 EVENT TRIGGER, MATERIALIZED VIEW
PostgreSQL 9.2 33  
PostgreSQL 9.1 33 COLLATION, EXTENSION
PostgreSQL 9.0 31  
PostgreSQL 8.4 31 FOREIGN DATA WRAPPER, SERVER, USER MAPPING
PostgreSQL 8.3 28 OPERATOR FAMILY, TEXT SEARCH {CONFIGURATION, DICTIONARY, PARSER, TEMPLATE}
PostgreSQL 8.2 23  
PostgreSQL 8.1 23 ROLE
PostgreSQL 8.0 22 TABLESPACE
PostgreSQL 7.4 21  
PostgreSQL 7.3 21 CAST, CONVERSION, DOMAIN, OPERATOR CLASS, SCHEMA
PostgreSQL 7.2 16  
PostgreSQL 7.1 16  
PostgreSQL 7.0 16 CONSTRAINT, GROUP
PostgreSQL 6.5 14  
PostgreSQL 6.4 14  
PostgreSQL 6.3 14 LANGUAGE, TABLE AS, USER
PostgreSQL 6.2 11 TRIGGER
PostgreSQL 6.1 10 SEQUENCE
PostgreSQL 6.0 9  
Postgres95 1.01 9 AGGREGATE, DATABASE, FUNCTION, INDEX, OPERATOR, RULE, TABLE, TYPE, VIEW

(These are counted by what commands have a separate man page, which is why for example “CREATE TABLE AS” is counted separately. Before PostgreSQL 6.4, the documentation was organized differently, so those numbers are reconstructed from the grammar source code.)

We can also look at the number of system catalogs. Often, a new “CREATE SOMETHING” command also comes with a new system catalog (“pg_something”) to store metadata about what it is creating. But new system catalogs can also appear as part of extensions to existing features.

Release Number New/(Removed)
PostgreSQL 16 64  
PostgreSQL 15 64 pg_parameter_acl, pg_publication_namespace
PostgreSQL 14 62  
PostgreSQL 13 62 (pg_pltemplate)
PostgreSQL 12 63 pg_statistic_ext_data
PostgreSQL 11 62  
PostgreSQL 10 62 pg_partitioned_table, pg_publication, pg_publication_rel, pg_sequence, pg_statistic_ext, pg_subscription, pg_subscription_rel
PostgreSQL 9.6 55 pg_init_privs
PostgreSQL 9.5 54 pg_policy, pg_replication_origin, pg_transform
PostgreSQL 9.4 51  
PostgreSQL 9.3 51 pg_event_trigger
PostgreSQL 9.2 50 pg_range, pg_shseclabel
PostgreSQL 9.1 48 pg_collation, pg_extension, pg_foreign_table, pg_seclabel
PostgreSQL 9.0 44 pg_db_role_setting, pg_default_acl, pg_largeobject_metadata, (pg_listener)
PostgreSQL 8.4 42 pg_foreign_data_wrapper, pg_foreign_server, pg_user_mapping, (pg_autovacuum)
PostgreSQL 8.3 40 pg_enum, pg_opfamily, pg_ts_config, pg_ts_config_map, pg_ts_dict, pg_ts_parser, pg_ts_template
PostgreSQL 8.2 33 pg_shdescription
PostgreSQL 8.1 32 pg_auth_members, pg_authid, pg_autovacuum, pg_pltemplate, pg_shdepend, (pg_group), (pg_shadow), (pg_version)
PostgreSQL 8.0 30 pg_tablespace
PostgreSQL 7.4 29  
PostgreSQL 7.3 29 pg_cast, pg_constraint, pg_conversion, pg_depend, pg_namespace, (pg_relcheck)
PostgreSQL 7.2 25 (pg_inheritproc), (pg_ipl), (pg_log), (pg_variable)
PostgreSQL 7.1 29 pg_largeobject
PostgreSQL 7.0 28  
PostgreSQL 6.5 28 (pg_parg)
PostgreSQL 6.4 29  
PostgreSQL 6.3 29 pg_description, (pg_defaults), (pg_demon), (pg_hosts), (pg_magic), (pg_server), (pg_time)
PostgreSQL 6.2 34 pg_attrdef, pg_relcheck, pg_trigger
PostgreSQL 6.1 31  
PostgreSQL 6.0 31  
Postgre95 1.01 31  

Note here that before approximately PostgreSQL 7.0, things get a bit murky, since there are catalogs releated to features that didn’t really work (anymore) at the time, or things that are named like catalogs but are really something else (such as pg_control), so the exact counts might be debatable.