mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Unlogged sequences
Add support for unlogged sequences. Unlike for unlogged tables, this is not a performance feature. It allows sequences associated with unlogged tables to be excluded from replication. A new subcommand ALTER SEQUENCE ... SET LOGGED/UNLOGGED is added. An identity/serial sequence now automatically gets and follows the persistence level (logged/unlogged) of its owning table. (The sequences owned by temporary tables were already temporary through the separate mechanism in RangeVarAdjustRelationPersistence().) But you can still change the persistence of an owned sequence separately. Also, pg_dump and pg_upgrade preserve the persistence of existing sequences. Discussion: https://www.postgresql.org/message-id/flat/04e12818-2f98-257c-b926-2845d74ed04f%402ndquadrant.com
This commit is contained in:
@ -319,6 +319,7 @@ struct DropRelationCallbackState
|
||||
#define ATT_COMPOSITE_TYPE 0x0010
|
||||
#define ATT_FOREIGN_TABLE 0x0020
|
||||
#define ATT_PARTITIONED_INDEX 0x0040
|
||||
#define ATT_SEQUENCE 0x0080
|
||||
|
||||
/*
|
||||
* ForeignTruncateInfo
|
||||
@ -4660,7 +4661,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd,
|
||||
pass = AT_PASS_MISC;
|
||||
break;
|
||||
case AT_SetLogged: /* SET LOGGED */
|
||||
ATSimplePermissions(cmd->subtype, rel, ATT_TABLE);
|
||||
ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_SEQUENCE);
|
||||
if (tab->chgPersistence)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
@ -4675,7 +4676,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd,
|
||||
pass = AT_PASS_MISC;
|
||||
break;
|
||||
case AT_SetUnLogged: /* SET UNLOGGED */
|
||||
ATSimplePermissions(cmd->subtype, rel, ATT_TABLE);
|
||||
ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_SEQUENCE);
|
||||
if (tab->chgPersistence)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
@ -5425,7 +5426,7 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode,
|
||||
* and assigns a new relfilenode, we automatically create or drop an
|
||||
* init fork for the relation as appropriate.
|
||||
*/
|
||||
if (tab->rewrite > 0)
|
||||
if (tab->rewrite > 0 && tab->relkind != RELKIND_SEQUENCE)
|
||||
{
|
||||
/* Build a temporary relation and copy data */
|
||||
Relation OldHeap;
|
||||
@ -5546,6 +5547,11 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode,
|
||||
|
||||
InvokeObjectPostAlterHook(RelationRelationId, tab->relid, 0);
|
||||
}
|
||||
else if (tab->rewrite > 0 && tab->relkind == RELKIND_SEQUENCE)
|
||||
{
|
||||
if (tab->chgPersistence)
|
||||
SequenceChangePersistence(tab->relid, tab->newrelpersistence);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
@ -5564,6 +5570,23 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode,
|
||||
if (tab->newTableSpace)
|
||||
ATExecSetTableSpace(tab->relid, tab->newTableSpace, lockmode);
|
||||
}
|
||||
|
||||
/*
|
||||
* Also change persistence of owned sequences, so that it matches the
|
||||
* table persistence.
|
||||
*/
|
||||
if (tab->chgPersistence)
|
||||
{
|
||||
List *seqlist = getOwnedSequences(tab->relid);
|
||||
ListCell *lc;
|
||||
|
||||
foreach(lc, seqlist)
|
||||
{
|
||||
Oid seq_relid = lfirst_oid(lc);
|
||||
|
||||
SequenceChangePersistence(seq_relid, tab->newrelpersistence);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6224,6 +6247,9 @@ ATSimplePermissions(AlterTableType cmdtype, Relation rel, int allowed_targets)
|
||||
case RELKIND_FOREIGN_TABLE:
|
||||
actual_target = ATT_FOREIGN_TABLE;
|
||||
break;
|
||||
case RELKIND_SEQUENCE:
|
||||
actual_target = ATT_SEQUENCE;
|
||||
break;
|
||||
default:
|
||||
actual_target = 0;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user