Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 8299471

Browse files
committed
Use LEFT JOINs in some system views in case referenced row doesn't exist.
In particular, left join to pg_authid so that rows in pg_stat_activity don't disappear if the session's owning user has been dropped. Also convert a few joins to pg_database to left joins, in the same spirit, though that case might be harder to hit. We were doing this in other views already, so it was a bit inconsistent that these views didn't. Oskari Saarenmaa, with some further tweaking by me Discussion: <56E87CD8.60007@ohmu.fi>
1 parent 65a603e commit 8299471

File tree

3 files changed

+19
-23
lines changed

3 files changed

+19
-23
lines changed

src/backend/catalog/system_views.sql

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -642,9 +642,9 @@ CREATE VIEW pg_stat_activity AS
642642
S.backend_xid,
643643
s.backend_xmin,
644644
S.query
645-
FROM pg_database D, pg_stat_get_activity(NULL) AS S, pg_authid U
646-
WHERE S.datid = D.oid AND
647-
S.usesysid = U.oid;
645+
FROM pg_stat_get_activity(NULL) AS S
646+
LEFT JOIN pg_database AS D ON (S.datid = D.oid)
647+
LEFT JOIN pg_authid AS U ON (S.usesysid = U.oid);
648648

649649
CREATE VIEW pg_stat_replication AS
650650
SELECT
@@ -664,10 +664,9 @@ CREATE VIEW pg_stat_replication AS
664664
W.replay_location,
665665
W.sync_priority,
666666
W.sync_state
667-
FROM pg_stat_get_activity(NULL) AS S, pg_authid U,
668-
pg_stat_get_wal_senders() AS W
669-
WHERE S.usesysid = U.oid AND
670-
S.pid = W.pid;
667+
FROM pg_stat_get_activity(NULL) AS S
668+
JOIN pg_stat_get_wal_senders() AS W ON (S.pid = W.pid)
669+
LEFT JOIN pg_authid AS U ON (S.usesysid = U.oid);
671670

672671
CREATE VIEW pg_stat_wal_receiver AS
673672
SELECT
@@ -813,7 +812,7 @@ CREATE VIEW pg_stat_progress_vacuum AS
813812
S.param4 AS heap_blks_vacuumed, S.param5 AS index_vacuum_count,
814813
S.param6 AS max_dead_tuples, S.param7 AS num_dead_tuples
815814
FROM pg_stat_get_progress_info('VACUUM') AS S
816-
JOIN pg_database D ON S.datid = D.oid;
815+
LEFT JOIN pg_database D ON S.datid = D.oid;
817816

818817
CREATE VIEW pg_user_mappings AS
819818
SELECT
@@ -832,12 +831,11 @@ CREATE VIEW pg_user_mappings AS
832831
NULL
833832
END AS umoptions
834833
FROM pg_user_mapping U
835-
LEFT JOIN pg_authid A ON (A.oid = U.umuser) JOIN
836-
pg_foreign_server S ON (U.umserver = S.oid);
834+
JOIN pg_foreign_server S ON (U.umserver = S.oid)
835+
LEFT JOIN pg_authid A ON (A.oid = U.umuser);
837836

838837
REVOKE ALL on pg_user_mapping FROM public;
839838

840-
841839
CREATE VIEW pg_replication_origin_status AS
842840
SELECT *
843841
FROM pg_show_replication_origin_status();

src/include/catalog/catversion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/* yyyymmddN */
56-
#define CATALOG_VERSION_NO 201608171
56+
#define CATALOG_VERSION_NO 201608191
5757

5858
#endif

src/test/regress/expected/rules.out

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1664,10 +1664,9 @@ pg_stat_activity| SELECT s.datid,
16641664
s.backend_xid,
16651665
s.backend_xmin,
16661666
s.query
1667-
FROM pg_database d,
1668-
pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, ssl, sslversion, sslcipher, sslbits, sslcompression, sslclientdn),
1669-
pg_authid u
1670-
WHERE ((s.datid = d.oid) AND (s.usesysid = u.oid));
1667+
FROM ((pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, ssl, sslversion, sslcipher, sslbits, sslcompression, sslclientdn)
1668+
LEFT JOIN pg_database d ON ((s.datid = d.oid)))
1669+
LEFT JOIN pg_authid u ON ((s.usesysid = u.oid)));
16711670
pg_stat_all_indexes| SELECT c.oid AS relid,
16721671
i.oid AS indexrelid,
16731672
n.nspname AS schemaname,
@@ -1776,7 +1775,7 @@ pg_stat_progress_vacuum| SELECT s.pid,
17761775
s.param6 AS max_dead_tuples,
17771776
s.param7 AS num_dead_tuples
17781777
FROM (pg_stat_get_progress_info('VACUUM'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10)
1779-
JOIN pg_database d ON ((s.datid = d.oid)));
1778+
LEFT JOIN pg_database d ON ((s.datid = d.oid)));
17801779
pg_stat_replication| SELECT s.pid,
17811780
s.usesysid,
17821781
u.rolname AS usename,
@@ -1793,10 +1792,9 @@ pg_stat_replication| SELECT s.pid,
17931792
w.replay_location,
17941793
w.sync_priority,
17951794
w.sync_state
1796-
FROM pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, ssl, sslversion, sslcipher, sslbits, sslcompression, sslclientdn),
1797-
pg_authid u,
1798-
pg_stat_get_wal_senders() w(pid, state, sent_location, write_location, flush_location, replay_location, sync_priority, sync_state)
1799-
WHERE ((s.usesysid = u.oid) AND (s.pid = w.pid));
1795+
FROM ((pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, wait_event_type, wait_event, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port, backend_xid, backend_xmin, ssl, sslversion, sslcipher, sslbits, sslcompression, sslclientdn)
1796+
JOIN pg_stat_get_wal_senders() w(pid, state, sent_location, write_location, flush_location, replay_location, sync_priority, sync_state) ON ((s.pid = w.pid)))
1797+
LEFT JOIN pg_authid u ON ((s.usesysid = u.oid)));
18001798
pg_stat_ssl| SELECT s.pid,
18011799
s.ssl,
18021800
s.sslversion AS version,
@@ -2155,8 +2153,8 @@ pg_user_mappings| SELECT u.oid AS umid,
21552153
ELSE NULL::text[]
21562154
END AS umoptions
21572155
FROM ((pg_user_mapping u
2158-
LEFT JOIN pg_authid a ON ((a.oid = u.umuser)))
2159-
JOIN pg_foreign_server s ON ((u.umserver = s.oid)));
2156+
JOIN pg_foreign_server s ON ((u.umserver = s.oid)))
2157+
LEFT JOIN pg_authid a ON ((a.oid = u.umuser)));
21602158
pg_views| SELECT n.nspname AS schemaname,
21612159
c.relname AS viewname,
21622160
pg_get_userbyid(c.relowner) AS viewowner,

0 commit comments

Comments
 (0)