|
| 1 | +-- |
| 2 | +-- Only superusers and roles with privileges of the pg_read_all_stats role |
| 3 | +-- are allowed to see the SQL text and queryid of queries executed by |
| 4 | +-- other users. Other users can see the statistics. |
| 5 | +-- |
| 6 | +SET pg_stat_statements.track_utility = FALSE; |
| 7 | +CREATE ROLE regress_stats_superuser SUPERUSER; |
| 8 | +CREATE ROLE regress_stats_user1; |
| 9 | +CREATE ROLE regress_stats_user2; |
| 10 | +GRANT pg_read_all_stats TO regress_stats_user2; |
| 11 | +SET ROLE regress_stats_superuser; |
| 12 | +SELECT pg_stat_statements_reset() IS NOT NULL AS t; |
| 13 | + t |
| 14 | +--- |
| 15 | + t |
| 16 | +(1 row) |
| 17 | + |
| 18 | +SELECT 1 AS "ONE"; |
| 19 | + ONE |
| 20 | +----- |
| 21 | + 1 |
| 22 | +(1 row) |
| 23 | + |
| 24 | +SET ROLE regress_stats_user1; |
| 25 | +SELECT 1+1 AS "TWO"; |
| 26 | + TWO |
| 27 | +----- |
| 28 | + 2 |
| 29 | +(1 row) |
| 30 | + |
| 31 | +-- |
| 32 | +-- A superuser can read all columns of queries executed by others, |
| 33 | +-- including query text and queryid. |
| 34 | +-- |
| 35 | +SET ROLE regress_stats_superuser; |
| 36 | +SELECT r.rolname, ss.queryid <> 0 AS queryid_bool, ss.query, ss.calls, ss.rows |
| 37 | + FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid |
| 38 | + ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows; |
| 39 | + rolname | queryid_bool | query | calls | rows |
| 40 | +-------------------------+--------------+----------------------------------------------------+-------+------ |
| 41 | + regress_stats_superuser | t | SELECT $1 AS "ONE" | 1 | 1 |
| 42 | + regress_stats_superuser | t | SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 |
| 43 | + regress_stats_user1 | t | SELECT $1+$2 AS "TWO" | 1 | 1 |
| 44 | +(3 rows) |
| 45 | + |
| 46 | +-- |
| 47 | +-- regress_stats_user1 has no privileges to read the query text or |
| 48 | +-- queryid of queries executed by others but can see statistics |
| 49 | +-- like calls and rows. |
| 50 | +-- |
| 51 | +SET ROLE regress_stats_user1; |
| 52 | +SELECT r.rolname, ss.queryid <> 0 AS queryid_bool, ss.query, ss.calls, ss.rows |
| 53 | + FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid |
| 54 | + ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows; |
| 55 | + rolname | queryid_bool | query | calls | rows |
| 56 | +-------------------------+--------------+--------------------------+-------+------ |
| 57 | + regress_stats_superuser | | <insufficient privilege> | 1 | 1 |
| 58 | + regress_stats_superuser | | <insufficient privilege> | 1 | 1 |
| 59 | + regress_stats_superuser | | <insufficient privilege> | 1 | 3 |
| 60 | + regress_stats_user1 | t | SELECT $1+$2 AS "TWO" | 1 | 1 |
| 61 | +(4 rows) |
| 62 | + |
| 63 | +-- |
| 64 | +-- regress_stats_user2, with pg_read_all_stats role privileges, can |
| 65 | +-- read all columns, including query text and queryid, of queries |
| 66 | +-- executed by others. |
| 67 | +-- |
| 68 | +SET ROLE regress_stats_user2; |
| 69 | +SELECT r.rolname, ss.queryid <> 0 AS queryid_bool, ss.query, ss.calls, ss.rows |
| 70 | + FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid |
| 71 | + ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows; |
| 72 | + rolname | queryid_bool | query | calls | rows |
| 73 | +-------------------------+--------------+---------------------------------------------------------------------------------+-------+------ |
| 74 | + regress_stats_superuser | t | SELECT $1 AS "ONE" | 1 | 1 |
| 75 | + regress_stats_superuser | t | SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 |
| 76 | + regress_stats_superuser | t | SELECT r.rolname, ss.queryid <> $1 AS queryid_bool, ss.query, ss.calls, ss.rows+| 1 | 3 |
| 77 | + | | FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid +| | |
| 78 | + | | ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows | | |
| 79 | + regress_stats_user1 | t | SELECT $1+$2 AS "TWO" | 1 | 1 |
| 80 | + regress_stats_user1 | t | SELECT r.rolname, ss.queryid <> $1 AS queryid_bool, ss.query, ss.calls, ss.rows+| 1 | 4 |
| 81 | + | | FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid +| | |
| 82 | + | | ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows | | |
| 83 | +(5 rows) |
| 84 | + |
| 85 | +-- |
| 86 | +-- cleanup |
| 87 | +-- |
| 88 | +RESET ROLE; |
| 89 | +DROP ROLE regress_stats_superuser; |
| 90 | +DROP ROLE regress_stats_user1; |
| 91 | +DROP ROLE regress_stats_user2; |
| 92 | +SELECT pg_stat_statements_reset() IS NOT NULL AS t; |
| 93 | + t |
| 94 | +--- |
| 95 | + t |
| 96 | +(1 row) |
| 97 | + |
0 commit comments