mirror of https://github.com/postgres/postgres
Similarly to tables and indexes, these functions are able to open relations with a sequence relkind, which is useful to make a distinction with the other relation kinds. Previously, commands/sequence.c used a mix of table_{close,open}() and relation_{close,open}() routines when manipulating sequence relations, so this clarifies the code. A direct effect of this change is to align the error messages produced when attempting DDLs for sequences on relations with an unexpected relkind, like a table or an index with ALTER SEQUENCE, providing an extra error detail about the relkind of the relation used in the DDL query. Author: Michael Paquier Reviewed-by: Tomas Vondra Discussion: https://postgr.es/m/ZWlohtKAs0uVVpZ3@paquier.xyzpull/157/head
parent
025f0a6f91
commit
449e798c77
@ -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 |
@ -0,0 +1,5 @@ |
||||
# Copyright (c) 2022-2024, PostgreSQL Global Development Group |
||||
|
||||
backend_sources += files( |
||||
'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))); |
||||
} |
@ -0,0 +1,23 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* sequence.h |
||||
* 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 |
||||
* |
||||
* src/include/access/sequence.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef ACCESS_SEQUENCE_H |
||||
#define ACCESS_SEQUENCE_H |
||||
|
||||
#include "storage/lockdefs.h" |
||||
#include "utils/relcache.h" |
||||
|
||||
extern Relation sequence_open(Oid relationId, LOCKMODE lockmode); |
||||
extern void sequence_close(Relation relation, LOCKMODE lockmode); |
||||
|
||||
#endif /* ACCESS_SEQUENCE_H */ |
Loading…
Reference in new issue