From ec6884c189849a10b39d2ea953a962dce34a23fa Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 13 Jun 2017 14:58:17 -0400 Subject: [PATCH] Use RangeVarGetRelidExtended() in AlterSequence() This allows us to combine the opening and the ownership check. Reported-by: Robert Haas --- src/backend/commands/sequence.c | 16 +++++++--------- src/test/regress/expected/sequence.out | 4 ++-- src/test/regress/sql/sequence.sql | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 2d820e5ceb..031bbc874d 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -429,10 +429,13 @@ AlterSequence(ParseState *pstate, AlterSeqStmt *stmt) HeapTuple seqtuple; HeapTuple newdatatuple; - /* Open and lock sequence. */ - relid = RangeVarGetRelid(stmt->sequence, - ShareRowExclusiveLock, - stmt->missing_ok); + /* Open and lock sequence, and check for ownership along the way. */ + relid = RangeVarGetRelidExtended(stmt->sequence, + ShareRowExclusiveLock, + stmt->missing_ok, + false, + RangeVarCallbackOwnsRelation, + NULL); if (relid == InvalidOid) { ereport(NOTICE, @@ -443,11 +446,6 @@ AlterSequence(ParseState *pstate, AlterSeqStmt *stmt) init_sequence(relid, &elm, &seqrel); - /* allow ALTER to sequence owner only */ - if (!pg_class_ownercheck(relid, GetUserId())) - aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS, - stmt->sequence->relname); - rel = heap_open(SequenceRelationId, RowExclusiveLock); seqtuple = SearchSysCacheCopy1(SEQRELID, ObjectIdGetDatum(relid)); diff --git a/src/test/regress/expected/sequence.out b/src/test/regress/expected/sequence.out index 16c12f3434..a43b52cfc1 100644 --- a/src/test/regress/expected/sequence.out +++ b/src/test/regress/expected/sequence.out @@ -307,8 +307,8 @@ DROP SEQUENCE myseq2; ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 24 INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; NOTICE: relation "sequence_test2" does not exist, skipping -ALTER SEQUENCE pg_class CYCLE; -- error, not a sequence -ERROR: "pg_class" is not a sequence +ALTER SEQUENCE serialTest1 CYCLE; -- error, not a sequence +ERROR: "serialtest1" is not a sequence CREATE SEQUENCE sequence_test2 START WITH 32; CREATE SEQUENCE sequence_test4 INCREMENT BY -1; SELECT nextval('sequence_test2'); diff --git a/src/test/regress/sql/sequence.sql b/src/test/regress/sql/sequence.sql index d53e33d779..b41c5a753d 100644 --- a/src/test/regress/sql/sequence.sql +++ b/src/test/regress/sql/sequence.sql @@ -172,7 +172,7 @@ CREATE TEMP TABLE t1 ( ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 24 INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; -ALTER SEQUENCE pg_class CYCLE; -- error, not a sequence +ALTER SEQUENCE serialTest1 CYCLE; -- error, not a sequence CREATE SEQUENCE sequence_test2 START WITH 32; CREATE SEQUENCE sequence_test4 INCREMENT BY -1; -- 2.13.1