> As it stands, a superuser can prewarm an index (because she bypasses all > privilege checks including this one), but nobody else can. That's not fully true. Any role can prewarm an index if the role has the correct privileges. postgres=# GRANT CREATE ON SCHEMA PUBLIC TO alpha; GRANT postgres=# SET ROLE alpha; SET postgres=> CREATE TABLE tab(id INT); CREATE TABLE postgres=> CREATE INDEX tab_idx ON tab(id); CREATE INDEX postgres=> SELECT pg_prewarm('tab_idx'); pg_prewarm ------------ 1 (1 row)
Don't know what stopped it from prewarming the catalog table index. Maybe it's checking who is the owner of the table. Although in code it's just checking the ACL_SELECT [1]. I will be debugging more here and maybe create a patch for the same. postgres=# RESET ROLE; RESET postgres=# CREATE TABLE superuser_tab(id INT); CREATE TABLE postgres=# CREATE INDEX idx_superuser_tab ON superuser_tab(id); CREATE INDEX postgres=# GRANT SELECT ON superuser_tab TO alpha; GRANT postgres=# SET ROLE alpha; SET postgres=> SELECT pg_prewarm('superuser_tab'); pg_prewarm ------------ 0 (1 row) postgres=> SELECT pg_prewarm('idx_superuser_tab'); ERROR: permission denied for index idx_superuser_tab postgres=> RESET ROLE; RESET postgres=# ALTER TABLE superuser_tab OWNER TO alpha; ALTER TABLE postgres=# SET ROLE alpha; SET postgres=> SELECT pg_prewarm('idx_superuser_tab'); pg_prewarm ------------ 1 (1 row) But I agree we should just check the table privileges even in the case of indexes to decide whether to prewarm or not, as *indexes don't have any privilegesof their own.* > I think -hackers would be the appropriate location for that. I am shifting this to -hackers mailing list instead of general. [1] https://github.com/postgres/postgres/blob/master/contrib/pg_prewarm/pg_prewarm.c#L108-L110 Regards, Ayush Vatsa SDE AWS