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