58#define SEQ_LOG_VALS 32
137 if (
seq->if_not_exists)
152 errmsg(
"relation \"%s\" already exists, skipping",
153 seq->sequence->relname)));
187 coldef->is_not_null =
true;
193 stmt->relation =
seq->sequence;
199 stmt->if_not_exists =
seq->if_not_exists;
295 seq->last_value = startv;
296 seq->is_called =
false;
397 elog(
ERROR,
"failed to add sequence tuple to page");
457 (
errmsg(
"relation \"%s\" does not exist, skipping",
458 stmt->sequence->relname)));
468 elog(
ERROR,
"cache lookup failed for sequence %u",
580 elog(
ERROR,
"cache lookup failed for sequence %u", relid);
655 errmsg(
"permission denied for sequence %s",
659 if (!
seqrel->rd_islocaltemp)
681 elog(
ERROR,
"cache lookup failed for sequence %u", relid);
694 last =
next = result =
seq->last_value;
741 if ((maxv >= 0 &&
next > maxv - incby) ||
749 errmsg(
"nextval: reached maximum value of sequence \"%s\" (%" PRId64 ")",
760 if ((minv < 0 &&
next < minv - incby) ||
761 (minv >= 0 &&
next + incby < minv))
768 errmsg(
"nextval: reached minimum value of sequence \"%s\" (%" PRId64 ")",
839 seq->is_called =
true;
853 seq->last_value = last;
854 seq->is_called =
true;
881 errmsg(
"permission denied for sequence %s",
887 errmsg(
"currval of sequence \"%s\" is not yet defined in this session",
906 errmsg(
"lastval is not yet defined in this session")));
912 errmsg(
"lastval is not yet defined in this session")));
923 errmsg(
"permission denied for sequence %s",
964 errmsg(
"permission denied for sequence %s",
969 elog(
ERROR,
"cache lookup failed for sequence %u", relid);
976 if (!
seqrel->rd_islocaltemp)
1205 elog(
ERROR,
"bad magic number in sequence \"%s\": %08X",
1295 else if (
strcmp(
defel->defname,
"increment") == 0)
1350 else if (
strcmp(
defel->defname,
"sequence_name") == 0)
1362 errmsg(
"invalid sequence option SEQUENCE NAME"),
1366 elog(
ERROR,
"option \"%s\" not recognized",
1388 ?
errmsg(
"identity column type must be smallint, integer, or bigint")
1389 :
errmsg(
"sequence type must be smallint, integer, or bigint")));
1420 if (
seqform->seqincrement == 0)
1423 errmsg(
"INCREMENT must not be zero")));
1471 errmsg(
"MAXVALUE (%" PRId64 ") is out of range for sequence data type %s",
1503 errmsg(
"MINVALUE (%" PRId64 ") is out of range for sequence data type %s",
1522 if (
seqform->seqincrement > 0)
1548 *last_value =
seqform->seqstart;
1554 *last_value =
seqform->seqstart;
1565 if (*last_value >
seqform->seqmax)
1579 errmsg(
"CACHE (%" PRId64 ") must be greater than zero",
1615 errmsg(
"invalid OWNED BY option"),
1616 errhint(
"Specify OWNED BY table.column or OWNED BY NONE.")));
1641 errmsg(
"sequence cannot be owned by relation \"%s\"",
1649 errmsg(
"sequence must have same owner as table it is linked to")));
1653 errmsg(
"sequence must be in same schema as table it is linked to")));
1660 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
1675 errmsg(
"cannot change ownership of identity sequence"),
1676 errdetail(
"Sequence \"%s\" is linked to table \"%s\".",
1720 elog(
ERROR,
"cache lookup failed for sequence %u", relid);
1758 errmsg(
"permission denied for sequence %s",
1762 elog(
ERROR,
"return type must be a row type");
1764 memset(isnull, 0,
sizeof(isnull));
1768 elog(
ERROR,
"cache lookup failed for sequence %u", relid);
1795#define PG_GET_SEQUENCE_DATA_COLS 3
1840 memset(isnull,
true,
sizeof(isnull));
1848#undef PG_GET_SEQUENCE_DATA_COLS
1863 bool is_called =
false;
1888 is_called =
seq->is_called;
1889 result =
seq->last_value;
Relation sequence_open(Oid relationId, LOCKMODE lockmode)
void sequence_close(Relation relation, LOCKMODE lockmode)
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
#define InvalidAttrNumber
static Datum values[MAXATTR]
BlockNumber BufferGetBlockNumber(Buffer buffer)
Buffer ExtendBufferedRel(BufferManagerRelation bmr, ForkNumber forkNum, BufferAccessStrategy strategy, uint32 flags)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
void MarkBufferDirtyHint(Buffer buffer, bool buffer_std)
void FlushRelationBuffers(Relation rel)
Buffer ReadBuffer(Relation reln, BlockNumber blockNum)
static Page BufferGetPage(Buffer buffer)
static Size BufferGetPageSize(Buffer buffer)
static void LockBuffer(Buffer buffer, BufferLockMode mode)
void PageInit(Page page, Size pageSize, Size specialSize)
#define PageGetSpecialPointer(page)
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static void * PageGetItem(PageData *page, const ItemIdData *itemId)
static void PageSetLSN(Page page, XLogRecPtr lsn)
static XLogRecPtr PageGetLSN(const PageData *page)
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
#define Assert(condition)
#define BoolIsValid(boolean)
uint32 LocalTransactionId
#define OidIsValid(objectId)
ObjectAddress DefineSequence(ParseState *pstate, CreateSeqStmt *seq)
static void fill_seq_fork_with_data(Relation rel, HeapTuple tuple, ForkNumber forkNum)
void ResetSequence(Oid seq_relid)
static void fill_seq_with_data(Relation rel, HeapTuple tuple)
Datum setval_oid(PG_FUNCTION_ARGS)
List * sequence_options(Oid relid)
static SeqTableData * last_used_seq
ObjectAddress AlterSequence(ParseState *pstate, AlterSeqStmt *stmt)
Datum pg_sequence_parameters(PG_FUNCTION_ARGS)
void SetSequence(Oid relid, int64 next, bool iscalled)
Datum nextval_oid(PG_FUNCTION_ARGS)
static void init_sequence(Oid relid, SeqTable *p_elm, Relation *p_rel)
Datum setval3_oid(PG_FUNCTION_ARGS)
static Form_pg_sequence_data read_seq_tuple(Relation rel, Buffer *buf, HeapTuple seqdatatuple)
Datum pg_get_sequence_data(PG_FUNCTION_ARGS)
Datum lastval(PG_FUNCTION_ARGS)
Datum nextval(PG_FUNCTION_ARGS)
int64 nextval_internal(Oid relid, bool check_permissions)
void SequenceChangePersistence(Oid relid, char newrelpersistence)
#define PG_GET_SEQUENCE_DATA_COLS
static void process_owned_by(Relation seqrel, List *owned_by, bool for_identity)
Datum pg_sequence_last_value(PG_FUNCTION_ARGS)
Datum currval_oid(PG_FUNCTION_ARGS)
void ResetSequenceCaches(void)
static void create_seq_hashtable(void)
static void init_params(ParseState *pstate, List *options, bool for_identity, bool isInit, Form_pg_sequence seqform, int64 *last_value, bool *reset_state, bool *is_called, bool *need_seq_rewrite, List **owned_by)
static Relation lock_and_open_sequence(SeqTable seq)
void DeleteSequenceTuple(Oid relid)
FormData_pg_sequence_data * Form_pg_sequence_data
TypeName * defGetTypeName(DefElem *def)
List * defGetQualifiedName(DefElem *def)
int64 defGetInt64(DefElem *def)
void errorConflictingDefElem(DefElem *defel, ParseState *pstate)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
void hash_destroy(HTAB *hashp)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
#define PG_GETARG_TEXT_PP(n)
#define PG_RETURN_INT64(x)
#define PG_GETARG_INT64(n)
#define PG_GETARG_BOOL(n)
#define PG_RETURN_DATUM(x)
TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, Oid *resultTypeId, TupleDesc *resultTupleDesc)
static Datum HeapTupleGetDatum(const HeapTupleData *tuple)
HeapTuple heap_copytuple(HeapTuple tuple)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
void heap_freetuple(HeapTuple htup)
HeapTupleHeaderData * HeapTupleHeader
#define HeapTupleIsValid(tuple)
static void HeapTupleHeaderSetXminFrozen(HeapTupleHeaderData *tup)
static void HeapTupleHeaderSetCmin(HeapTupleHeaderData *tup, CommandId cid)
static TransactionId HeapTupleHeaderGetRawXmax(const HeapTupleHeaderData *tup)
#define HEAP_XMAX_IS_MULTI
#define HEAP_XMAX_INVALID
static void * GETSTRUCT(const HeapTupleData *tuple)
static void HeapTupleHeaderSetXmin(HeapTupleHeaderData *tup, TransactionId xid)
static void HeapTupleHeaderSetXmax(HeapTupleHeaderData *tup, TransactionId xid)
void CatalogTupleUpdate(Relation heapRel, const ItemPointerData *otid, HeapTuple tup)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
void CatalogTupleDelete(Relation heapRel, const ItemPointerData *tid)
#define ItemIdGetLength(itemId)
#define ItemIdIsNormal(itemId)
static void ItemPointerSet(ItemPointerData *pointer, BlockNumber blockNumber, OffsetNumber offNum)
List * lappend(List *list, void *datum)
List * list_copy_head(const List *oldlist, int len)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
#define InvalidLocalTransactionId
#define AccessExclusiveLock
#define ShareRowExclusiveLock
char * get_rel_name(Oid relid)
AttrNumber get_attnum(Oid relid, const char *attname)
DefElem * makeDefElem(char *name, Node *arg, int location)
ColumnDef * makeColumnDef(const char *colname, Oid typeOid, int32 typmod, Oid collOid)
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
#define InvalidMultiXactId
Oid RangeVarGetAndCheckCreationNamespace(RangeVar *relation, LOCKMODE lockmode, Oid *existing_relation_id)
RangeVar * makeRangeVarFromNameList(const List *names)
Oid RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, uint32 flags, RangeVarGetRelidCallback callback, void *callback_arg)
#define RangeVarGetRelid(relation, lockmode, missing_ok)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
const ObjectAddress InvalidObjectAddress
#define ObjectAddressSet(addr, class_id, object_id)
#define InvalidOffsetNumber
#define FirstOffsetNumber
int parser_errposition(ParseState *pstate, int location)
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
int errdetail_relkind_not_supported(char relkind)
void checkMembershipInCurrentExtension(const ObjectAddress *object)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId)
static int list_length(const List *l)
static Datum LSNGetDatum(XLogRecPtr X)
FormData_pg_sequence * Form_pg_sequence
static char buf[DEFAULT_XLOG_SEG_SIZE]
static Datum Int64GetDatum(int64 X)
#define Int64GetDatumFast(X)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
#define INVALID_PROC_NUMBER
char * psprintf(const char *fmt,...)
#define RelationGetRelid(relation)
#define RelationGetDescr(relation)
#define RelationGetRelationName(relation)
#define RelationNeedsWAL(relation)
#define RELATION_IS_OTHER_TEMP(relation)
#define RelationGetNamespace(relation)
#define RelationIsPermanent(relation)
void RelationSetNewRelfilenumber(Relation relation, char persistence)
#define InvalidRelFileNumber
ResourceOwner TopTransactionResourceOwner
ResourceOwner CurrentResourceOwner
SMgrRelation smgropen(RelFileLocator rlocator, ProcNumber backend)
void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
void smgrclose(SMgrRelation reln)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation try_relation_open(Oid relationId, LOCKMODE lockmode)
Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode)
void log_smgrcreate(const RelFileLocator *rlocator, ForkNumber forkNum)
RelFileLocator rd_locator
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
#define SearchSysCacheCopy1(cacheId, key1)
#define SearchSysCacheExists1(cacheId, key1)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, ObjectAddress *typaddress, const char *queryString)
void RangeVarCallbackOwnsRelation(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
#define FrozenTransactionId
#define InvalidTransactionId
TupleDesc CreateTemplateTupleDesc(int natts)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
void PreventCommandIfReadOnly(const char *cmdname)
void PreventCommandIfParallelMode(const char *cmdname)
Float * makeFloat(char *numericStr)
Boolean * makeBoolean(bool val)
List * textToQualifiedNameList(text *textval)
TransactionId GetTopTransactionId(void)
bool RecoveryInProgress(void)
XLogRecPtr GetRedoRecPtr(void)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterData(const void *data, uint32 len)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
void XLogBeginInsert(void)