Skip to content

Commit 908d61c

Browse files
nathan-bossartCommitfest Bot
authored and
Commitfest Bot
committed
pg_prewarm: For indexes, check privileges on table.
Author: Ayush Vatsa <[email protected]> Discussion: https://postgr.es/m/CACX%2BKaMz2ZoOojh0nQ6QNBYx8Ak1Dkoko%3DD4FSb80BYW%2Bo8CHQ%40mail.gmail.com Backpatch-through: 13
1 parent 092e72a commit 908d61c

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

contrib/pg_prewarm/pg_prewarm.c

+11-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <unistd.h>
1717

1818
#include "access/relation.h"
19+
#include "catalog/index.h"
1920
#include "fmgr.h"
2021
#include "miscadmin.h"
2122
#include "storage/bufmgr.h"
@@ -58,6 +59,7 @@ Datum
5859
pg_prewarm(PG_FUNCTION_ARGS)
5960
{
6061
Oid relOid;
62+
Oid permOid;
6163
text *forkName;
6264
text *type;
6365
int64 first_block;
@@ -106,9 +108,16 @@ pg_prewarm(PG_FUNCTION_ARGS)
106108
forkString = text_to_cstring(forkName);
107109
forkNumber = forkname_to_number(forkString);
108110

109-
/* Open relation and check privileges. */
111+
/*
112+
* Open relation and check privileges. Indexes don't have their own
113+
* privileges, so we check privileges on the table instead in that case.
114+
*/
110115
rel = relation_open(relOid, AccessShareLock);
111-
aclresult = pg_class_aclcheck(relOid, GetUserId(), ACL_SELECT);
116+
if (rel->rd_rel->relkind == RELKIND_INDEX)
117+
permOid = IndexGetRelation(relOid, false);
118+
else
119+
permOid = relOid;
120+
aclresult = pg_class_aclcheck(permOid, GetUserId(), ACL_SELECT);
112121
if (aclresult != ACLCHECK_OK)
113122
aclcheck_error(aclresult, get_relkind_objtype(rel->rd_rel->relkind), get_rel_name(relOid));
114123

contrib/pg_prewarm/t/001_basic.pl

+28-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
$node->safe_psql("postgres",
2424
"CREATE EXTENSION pg_prewarm;\n"
2525
. "CREATE TABLE test(c1 int);\n"
26-
. "INSERT INTO test SELECT generate_series(1, 100);");
26+
. "INSERT INTO test SELECT generate_series(1, 100);\n"
27+
. "CREATE INDEX test_idx ON test(c1);\n"
28+
. "CREATE ROLE test_user LOGIN;");
2729

2830
# test read mode
2931
my $result =
@@ -42,6 +44,31 @@
4244
or $stderr =~ qr/prefetch is not supported by this build/),
4345
'prefetch mode succeeded');
4446

47+
# test_user should be unable to prewarm table/index without privileges
48+
($cmdret, $stdout, $stderr) =
49+
$node->psql(
50+
"postgres", "SELECT pg_prewarm('test');",
51+
extra_params => [ '--username' => 'test_user' ]);
52+
ok($stderr =~ /permission denied for table test/, 'pg_prewarm failed as expected');
53+
($cmdret, $stdout, $stderr) =
54+
$node->psql(
55+
"postgres", "SELECT pg_prewarm('test_idx');",
56+
extra_params => [ '--username' => 'test_user' ]);
57+
ok($stderr =~ /permission denied for index test_idx/, 'pg_prewarm failed as expected');
58+
59+
# test_user should be able to prewarm table/index with privileges
60+
$node->safe_psql("postgres", "GRANT SELECT ON test TO test_user;");
61+
$result =
62+
$node->safe_psql(
63+
"postgres", "SELECT pg_prewarm('test');",
64+
extra_params => [ '--username' => 'test_user' ]);
65+
like($result, qr/^[1-9][0-9]*$/, 'pg_prewarm succeeded as expected');
66+
$result =
67+
$node->safe_psql(
68+
"postgres", "SELECT pg_prewarm('test_idx');",
69+
extra_params => [ '--username' => 'test_user' ]);
70+
like($result, qr/^[1-9][0-9]*$/, 'pg_prewarm succeeded as expected');
71+
4572
# test autoprewarm_dump_now()
4673
$result = $node->safe_psql("postgres", "SELECT autoprewarm_dump_now();");
4774
like($result, qr/^[1-9][0-9]*$/, 'autoprewarm_dump_now succeeded');

0 commit comments

Comments
 (0)