Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * sequence.c
4 : * Generic routines for sequence-related code.
5 : *
6 : * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 : * Portions Copyright (c) 1994, Regents of the University of California
8 : *
9 : *
10 : * IDENTIFICATION
11 : * src/backend/access/sequence/sequence.c
12 : *
13 : *
14 : * NOTES
15 : * This file contains sequence_ routines that implement access to sequences
16 : * (in contrast to other relation types like indexes).
17 : *
18 : *-------------------------------------------------------------------------
19 : */
20 :
21 : #include "postgres.h"
22 :
23 : #include "access/relation.h"
24 : #include "access/sequence.h"
25 : #include "utils/rel.h"
26 :
27 : static inline void validate_relation_as_sequence(Relation r);
28 :
29 : /* ----------------
30 : * sequence_open - open a sequence relation by relation OID
31 : *
32 : * This is essentially relation_open plus check that the relation
33 : * is a sequence.
34 : * ----------------
35 : */
36 : Relation
37 220057 : sequence_open(Oid relationId, LOCKMODE lockmode)
38 : {
39 : Relation r;
40 :
41 220057 : r = relation_open(relationId, lockmode);
42 :
43 220057 : validate_relation_as_sequence(r);
44 :
45 220053 : return r;
46 : }
47 :
48 : /* ----------------
49 : * sequence_close - close a sequence
50 : *
51 : * If lockmode is not "NoLock", we then release the specified lock.
52 : *
53 : * Note that it is often sensible to hold a lock beyond relation_close;
54 : * in that case, the lock is released automatically at xact end.
55 : * ----------------
56 : */
57 : void
58 219967 : sequence_close(Relation relation, LOCKMODE lockmode)
59 : {
60 219967 : relation_close(relation, lockmode);
61 219967 : }
62 :
63 : /* ----------------
64 : * validate_relation_as_sequence
65 : *
66 : * Make sure relkind is a sequence.
67 : * ----------------
68 : */
69 : static inline void
70 220057 : validate_relation_as_sequence(Relation r)
71 : {
72 220057 : if (r->rd_rel->relkind != RELKIND_SEQUENCE)
73 4 : ereport(ERROR,
74 : (errcode(ERRCODE_WRONG_OBJECT_TYPE),
75 : errmsg("\"%s\" is not a sequence",
76 : RelationGetRelationName(r))));
77 220053 : }
|