PostgreSQL Development History Revealed with PostgreSQL
I spend a lot of time reading PostgreSQL docs. It occurred to me just a few weeks ago that those versioned manuals are great opportunity to get an insight into PostgreSQL development history. Using PostgreSQL, of course.
TOP 5 functions with the most verbose docs in each version
SELECT
version,
string_agg(func, ' | ' ORDER BY letter_count DESC)
FROM (
SELECT
version,
func,
letter_count,
row_number() OVER (PARTITION BY version ORDER BY letter_count DESC)
FROM postgresql_development.data
) a
WHERE row_number <= 10
GROUP BY version
ORDER BY version DESC
Seems like a huge comeback for CREATE TABLE.
| VERSION | 1st | 2nd | 3rd | 4th | 5th |
|---|---|---|---|---|---|
| 10.0 | CREATE TABLE | ALTER TABLE | REVOKE | GRANT | SELECT |
| 9.6 | REVOKE | ALTER TABLE | GRANT | CREATE TABLE | SELECT |
| 9.5 | REVOKE | ALTER TABLE | GRANT | CREATE TABLE | SELECT |
| 9.4 | REVOKE | GRANT | ALTER TABLE | CREATE TABLE | SELECT |
| 9.3 | REVOKE | GRANT | CREATE TABLE | ALTER TABLE | ALTER DEFAULT PRIVILEGES |
| 9.2 | REVOKE | GRANT | CREATE TABLE | ALTER TABLE | ALTER DEFAULT PRIVILEGES |
| 9.1 | REVOKE | GRANT | CREATE TABLE | ALTER TABLE | ALTER DEFAULT PRIVILEGES |
| 9.0 | REVOKE | GRANT | CREATE TABLE | ALTER TABLE | ALTER DEFAULT PRIVILEGES |
| 8.4 | REVOKE | GRANT | CREATE TABLE | ALTER TABLE | SELECT |
| 8.3 | REVOKE | CREATE TABLE | GRANT | ALTER TABLE | COMMENT |
| 8.2 | REVOKE | CREATE TABLE | GRANT | ALTER TABLE | SELECT |
| 8.1 | REVOKE | CREATE TABLE | GRANT | ALTER TABLE | SELECT |
| 8 | CREATE TABLE | REVOKE | GRANT | SELECT | ALTER TABLE |
| 7.4 | CREATE TABLE | REVOKE | ALTER TABLE | GRANT | SELECT |
| 7.3 | CREATE TABLE | SELECT | ALTER TABLE | REVOKE | GRANT |
| 7.2 | CREATE TABLE | SELECT INTO | SELECT | ALTER TABLE | CREATE TYPE |
| 7.1 | CREATE TABLE | SELECT INTO | SELECT | CREATE TYPE | ALTER TABLE |
| 7.0 | SELECT | SELECT INTO | CREATE TYPE | CREATE TABLE | COMMENT |
Number of functions available in each version
SELECT
version,
count(func),
sum(letter_count)
FROM postgresql_development.data
GROUP BY version ORDER BY version;

The most verbose docs in each version
SELECT DISTINCT ON (version)
version,
func,
letter_count
FROM postgresql_development.data
ORDER BY version, letter_count DESC;
Poor REVOKE, the defeated champion.
| VERSION | FUNCTION | LETTER COUNT |
|---|---|---|
| 10 | CREATE TABLE | 3142 |
| 9.6 | REVOKE | 2856 |
| 9.5 | REVOKE | 2856 |
| 9.4 | REVOKE | 2856 |
| 9.3 | REVOKE | 2856 |
| 9.2 | REVOKE | 2856 |
| 9.1 | REVOKE | 2508 |
| 9 | REVOKE | 2502 |
| 8.4 | REVOKE | 2105 |
| 8.3 | REVOKE | 1485 |
| 8.2 | REVOKE | 1527 |
| 8.1 | REVOKE | 1312 |
| 8 | CREATE TABLE | 1251 |
| 7.4 | CREATE TABLE | 1075 |
| 7.3 | CREATE TABLE | 929 |
| 7.2 | CREATE TABLE | 929 |
| 7.1 | CREATE TABLE | 871 |
| 7 | SELECT | 450 |
CREATE TABLE docs evolution
SELECT
version,
letter_count
FROM postgresql_development.data
WHERE func = 'CREATE TABLE'
ORDER BY func, version;
Something’s going on in an upcoming 10.0 version.

All the data was obtained with the following Python script and processed inside the PostgreSQL database. Plots done with Bokeh, though I probably wouldn’t use it again, the docs site is absurdly sluggish and the info is just all over the place.