diff options
Diffstat (limited to 'src/backend/access')
-rw-r--r-- | src/backend/access/Makefile | 2 | ||||
-rw-r--r-- | src/backend/access/meson.build | 1 | ||||
-rw-r--r-- | src/backend/access/sequence/Makefile | 17 | ||||
-rw-r--r-- | src/backend/access/sequence/meson.build | 5 | ||||
-rw-r--r-- | src/backend/access/sequence/sequence.c | 78 |
5 files changed, 102 insertions, 1 deletions
diff --git a/src/backend/access/Makefile b/src/backend/access/Makefile index 0880e0a8bbb..1932d11d154 100644 --- a/src/backend/access/Makefile +++ b/src/backend/access/Makefile @@ -9,6 +9,6 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global SUBDIRS = brin common gin gist hash heap index nbtree rmgrdesc spgist \ - table tablesample transam + sequence table tablesample transam include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build index 621691ef344..62a371db7f7 100644 --- a/src/backend/access/meson.build +++ b/src/backend/access/meson.build @@ -9,6 +9,7 @@ subdir('heap') subdir('index') subdir('nbtree') subdir('rmgrdesc') +subdir('sequence') subdir('spgist') subdir('table') subdir('tablesample') diff --git a/src/backend/access/sequence/Makefile b/src/backend/access/sequence/Makefile new file mode 100644 index 00000000000..9f9d31f5425 --- /dev/null +++ b/src/backend/access/sequence/Makefile @@ -0,0 +1,17 @@ +#------------------------------------------------------------------------- +# +# Makefile +# Makefile for access/sequence +# +# IDENTIFICATION +# src/backend/access/sequence/Makefile +# +#------------------------------------------------------------------------- + +subdir = src/backend/access/sequence +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global + +OBJS = sequence.o + +include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/access/sequence/meson.build b/src/backend/access/sequence/meson.build new file mode 100644 index 00000000000..1843aed38db --- /dev/null +++ b/src/backend/access/sequence/meson.build @@ -0,0 +1,5 @@ +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +backend_sources += files( + 'sequence.c', +) diff --git a/src/backend/access/sequence/sequence.c b/src/backend/access/sequence/sequence.c new file mode 100644 index 00000000000..9e30e6e08fe --- /dev/null +++ b/src/backend/access/sequence/sequence.c @@ -0,0 +1,78 @@ +/*------------------------------------------------------------------------- + * + * sequence.c + * Generic routines for sequence-related code. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/access/sequence/sequence.c + * + * + * NOTES + * This file contains sequence_ routines that implement access to sequences + * (in contrast to other relation types like indexes). + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "access/relation.h" +#include "access/sequence.h" +#include "storage/lmgr.h" + +static inline void validate_relation_kind(Relation r); + +/* ---------------- + * sequence_open - open a sequence relation by relation OID + * + * This is essentially relation_open plus check that the relation + * is a sequence. + * ---------------- + */ +Relation +sequence_open(Oid relationId, LOCKMODE lockmode) +{ + Relation r; + + r = relation_open(relationId, lockmode); + + validate_relation_kind(r); + + return r; +} + +/* ---------------- + * sequence_close - close a sequence + * + * If lockmode is not "NoLock", we then release the specified lock. + * + * Note that it is often sensible to hold a lock beyond relation_close; + * in that case, the lock is released automatically at xact end. + * ---------------- + */ +void +sequence_close(Relation relation, LOCKMODE lockmode) +{ + relation_close(relation, lockmode); +} + +/* ---------------- + * validate_relation_kind - check the relation's kind + * + * Make sure relkind is from an index + * ---------------- + */ +static inline void +validate_relation_kind(Relation r) +{ + if (r->rd_rel->relkind != RELKIND_SEQUENCE) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot open relation \"%s\"", + RelationGetRelationName(r)), + errdetail_relkind_not_supported(r->rd_rel->relkind))); +} |