mirror of
https://github.com/postgres/postgres.git
synced 2026-04-21 14:19:26 -04:00
cluster_rel() receives the OID of the relation to process, which it opens and locks; but then its subroutine copy_table_data() also receives the relation OID and opens it by itself. This is a bit wasteful. It's better to have cluster_rel() receive the relation already open, and pass it down to its subroutines as necessary; then cluster_rel closes the rel before returning. This simplifies things. But a better motivation to make this change is that a future command to do logical-decoding-based "concurrent VACUUM FULL" will need to release all locks on the relation (and possibly on the clustering index) at some point. Since it makes little sense to keep the relation reference without the lock, the cluster_rel() function will also close it (and the index). With this arrangement, neither the function nor its subroutines need open extra references, which, again, makes things simpler. Author: Antonin Houska <ah@cybertec.at> Discussion: https://postgr.es/m/82651.1720540558@antos
51 lines
1.7 KiB
C
51 lines
1.7 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* cluster.h
|
|
* header file for postgres cluster command stuff
|
|
*
|
|
* Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994-5, Regents of the University of California
|
|
*
|
|
* src/include/commands/cluster.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef CLUSTER_H
|
|
#define CLUSTER_H
|
|
|
|
#include "nodes/parsenodes.h"
|
|
#include "parser/parse_node.h"
|
|
#include "storage/lock.h"
|
|
#include "utils/relcache.h"
|
|
|
|
|
|
/* flag bits for ClusterParams->options */
|
|
#define CLUOPT_VERBOSE 0x01 /* print progress info */
|
|
#define CLUOPT_RECHECK 0x02 /* recheck relation state */
|
|
#define CLUOPT_RECHECK_ISCLUSTERED 0x04 /* recheck relation state for
|
|
* indisclustered */
|
|
|
|
/* options for CLUSTER */
|
|
typedef struct ClusterParams
|
|
{
|
|
bits32 options; /* bitmask of CLUOPT_* */
|
|
} ClusterParams;
|
|
|
|
extern void cluster(ParseState *pstate, ClusterStmt *stmt, bool isTopLevel);
|
|
extern void cluster_rel(Relation OldHeap, Oid indexOid, ClusterParams *params);
|
|
extern void check_index_is_clusterable(Relation OldHeap, Oid indexOid,
|
|
LOCKMODE lockmode);
|
|
extern void mark_index_clustered(Relation rel, Oid indexOid, bool is_internal);
|
|
|
|
extern Oid make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, Oid NewAccessMethod,
|
|
char relpersistence, LOCKMODE lockmode);
|
|
extern void finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap,
|
|
bool is_system_catalog,
|
|
bool swap_toast_by_content,
|
|
bool check_constraints,
|
|
bool is_internal,
|
|
TransactionId frozenXid,
|
|
MultiXactId cutoffMulti,
|
|
char newrelpersistence);
|
|
|
|
#endif /* CLUSTER_H */
|