mirror of
https://github.com/postgres/postgres.git
synced 2026-02-16 17:19:08 -05:00
Two code paths of tablecmds.c (for relations with storage and without storage) use the same logic to check if the move of a relation to a new tablespace is allowed or not and to update pg_class.reltablespace and pg_class.relfilenode. A potential TABLESPACE clause for REINDEX, CLUSTER and VACUUM FULL needs similar checks to make sure that nothing is moved around in illegal ways (no mapped relations, shared relations only in pg_global, no move of temp tables owned by other backends). This reorganizes the existing code of ALTER TABLE so as all this logic is controlled by two new routines that can be reused for the other commands able to move relations across tablespaces, limiting the number of code paths in need of the same protections. This also removes some code that was duplicated for tables with and without storage for ALTER TABLE. Author: Alexey Kondratov, Michael Paquier Discussion: https://postgr.es/m/YA+9mAMWYLXJMVPL@paquier.xyz
101 lines
3.4 KiB
C
101 lines
3.4 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* tablecmds.h
|
|
* prototypes for tablecmds.c.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/commands/tablecmds.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef TABLECMDS_H
|
|
#define TABLECMDS_H
|
|
|
|
#include "access/htup.h"
|
|
#include "catalog/dependency.h"
|
|
#include "catalog/objectaddress.h"
|
|
#include "nodes/parsenodes.h"
|
|
#include "storage/lock.h"
|
|
#include "utils/relcache.h"
|
|
|
|
struct AlterTableUtilityContext; /* avoid including tcop/utility.h here */
|
|
|
|
|
|
extern ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
|
|
ObjectAddress *typaddress, const char *queryString);
|
|
|
|
extern void RemoveRelations(DropStmt *drop);
|
|
|
|
extern Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode);
|
|
|
|
extern void AlterTable(AlterTableStmt *stmt, LOCKMODE lockmode,
|
|
struct AlterTableUtilityContext *context);
|
|
|
|
extern LOCKMODE AlterTableGetLockLevel(List *cmds);
|
|
|
|
extern void ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lockmode);
|
|
|
|
extern void AlterTableInternal(Oid relid, List *cmds, bool recurse);
|
|
|
|
extern Oid AlterTableMoveAll(AlterTableMoveAllStmt *stmt);
|
|
|
|
extern ObjectAddress AlterTableNamespace(AlterObjectSchemaStmt *stmt,
|
|
Oid *oldschema);
|
|
|
|
extern void AlterTableNamespaceInternal(Relation rel, Oid oldNspOid,
|
|
Oid nspOid, ObjectAddresses *objsMoved);
|
|
|
|
extern void AlterRelationNamespaceInternal(Relation classRel, Oid relOid,
|
|
Oid oldNspOid, Oid newNspOid,
|
|
bool hasDependEntry,
|
|
ObjectAddresses *objsMoved);
|
|
|
|
extern void CheckTableNotInUse(Relation rel, const char *stmt);
|
|
|
|
extern void ExecuteTruncate(TruncateStmt *stmt);
|
|
extern void ExecuteTruncateGuts(List *explicit_rels, List *relids, List *relids_logged,
|
|
DropBehavior behavior, bool restart_seqs);
|
|
|
|
extern void SetRelationHasSubclass(Oid relationId, bool relhassubclass);
|
|
|
|
extern bool CheckRelationTableSpaceMove(Relation rel, Oid newTableSpaceId);
|
|
extern void SetRelationTableSpace(Relation rel, Oid newTableSpaceId,
|
|
Oid newRelFileNode);
|
|
|
|
extern ObjectAddress renameatt(RenameStmt *stmt);
|
|
|
|
extern ObjectAddress RenameConstraint(RenameStmt *stmt);
|
|
|
|
extern ObjectAddress RenameRelation(RenameStmt *stmt);
|
|
|
|
extern void RenameRelationInternal(Oid myrelid,
|
|
const char *newrelname, bool is_internal,
|
|
bool is_index);
|
|
|
|
extern void find_composite_type_dependencies(Oid typeOid,
|
|
Relation origRelation,
|
|
const char *origTypeName);
|
|
|
|
extern void check_of_type(HeapTuple typetuple);
|
|
|
|
extern void register_on_commit_action(Oid relid, OnCommitAction action);
|
|
extern void remove_on_commit_action(Oid relid);
|
|
|
|
extern void PreCommit_on_commit_actions(void);
|
|
extern void AtEOXact_on_commit_actions(bool isCommit);
|
|
extern void AtEOSubXact_on_commit_actions(bool isCommit,
|
|
SubTransactionId mySubid,
|
|
SubTransactionId parentSubid);
|
|
|
|
extern void RangeVarCallbackOwnsTable(const RangeVar *relation,
|
|
Oid relId, Oid oldRelId, void *arg);
|
|
|
|
extern void RangeVarCallbackOwnsRelation(const RangeVar *relation,
|
|
Oid relId, Oid oldRelId, void *arg);
|
|
extern bool PartConstraintImpliedByRelConstraint(Relation scanrel,
|
|
List *partConstraint);
|
|
|
|
#endif /* TABLECMDS_H */
|