mirror of
https://github.com/postgres/postgres.git
synced 2025-04-18 13:44:19 +03:00
Remove redundant privilege check from pg_sequences system view.
This commit adjusts pg_sequence_last_value() to return NULL instead of ERROR-ing for sequences for which the current user lacks privileges. This allows us to remove the call to has_sequence_privilege() in the definition of the pg_sequences system view. Bumps catversion. Suggested-by: Michael Paquier Reviewed-by: Michael Paquier, Tom Lane Discussion: https://postgr.es/m/20240501005730.GA594666%40nathanxps13
This commit is contained in:
parent
1afe31f03c
commit
7967d10c5b
@ -176,11 +176,7 @@ CREATE VIEW pg_sequences AS
|
||||
S.seqincrement AS increment_by,
|
||||
S.seqcycle AS cycle,
|
||||
S.seqcache AS cache_size,
|
||||
CASE
|
||||
WHEN has_sequence_privilege(C.oid, 'SELECT,USAGE'::text)
|
||||
THEN pg_sequence_last_value(C.oid)
|
||||
ELSE NULL
|
||||
END AS last_value
|
||||
pg_sequence_last_value(C.oid) AS last_value
|
||||
FROM pg_sequence S JOIN pg_class C ON (C.oid = S.seqrelid)
|
||||
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
|
||||
WHERE NOT pg_is_other_temp_schema(N.oid)
|
||||
|
@ -1790,21 +1790,17 @@ pg_sequence_last_value(PG_FUNCTION_ARGS)
|
||||
/* open and lock sequence */
|
||||
init_sequence(relid, &elm, &seqrel);
|
||||
|
||||
if (pg_class_aclcheck(relid, GetUserId(), ACL_SELECT | ACL_USAGE) != ACLCHECK_OK)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
|
||||
errmsg("permission denied for sequence %s",
|
||||
RelationGetRelationName(seqrel))));
|
||||
|
||||
/*
|
||||
* We return NULL for other sessions' temporary sequences. The
|
||||
* pg_sequences system view already filters those out, but this offers a
|
||||
* defense against ERRORs in case someone invokes this function directly.
|
||||
*
|
||||
* Also, for the benefit of the pg_sequences view, we return NULL for
|
||||
* unlogged sequences on standbys instead of throwing an error.
|
||||
* unlogged sequences on standbys and for sequences for which the current
|
||||
* user lacks privileges instead of throwing an error.
|
||||
*/
|
||||
if (!RELATION_IS_OTHER_TEMP(seqrel) &&
|
||||
if (pg_class_aclcheck(relid, GetUserId(), ACL_SELECT | ACL_USAGE) == ACLCHECK_OK &&
|
||||
!RELATION_IS_OTHER_TEMP(seqrel) &&
|
||||
(RelationIsPermanent(seqrel) || !RecoveryInProgress()))
|
||||
{
|
||||
Buffer buf;
|
||||
|
@ -57,6 +57,6 @@
|
||||
*/
|
||||
|
||||
/* yyyymmddN */
|
||||
#define CATALOG_VERSION_NO 202407011
|
||||
#define CATALOG_VERSION_NO 202407012
|
||||
|
||||
#endif
|
||||
|
@ -1700,10 +1700,7 @@ pg_sequences| SELECT n.nspname AS schemaname,
|
||||
s.seqincrement AS increment_by,
|
||||
s.seqcycle AS cycle,
|
||||
s.seqcache AS cache_size,
|
||||
CASE
|
||||
WHEN has_sequence_privilege(c.oid, 'SELECT,USAGE'::text) THEN pg_sequence_last_value((c.oid)::regclass)
|
||||
ELSE NULL::bigint
|
||||
END AS last_value
|
||||
pg_sequence_last_value((c.oid)::regclass) AS last_value
|
||||
FROM ((pg_sequence s
|
||||
JOIN pg_class c ON ((c.oid = s.seqrelid)))
|
||||
LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
|
||||
|
Loading…
x
Reference in New Issue
Block a user