aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access')
-rw-r--r--src/backend/access/Makefile2
-rw-r--r--src/backend/access/meson.build1
-rw-r--r--src/backend/access/sequence/Makefile17
-rw-r--r--src/backend/access/sequence/meson.build5
-rw-r--r--src/backend/access/sequence/sequence.c78
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)));
+}