mirror of
https://github.com/postgres/postgres.git
synced 2026-03-20 17:44:08 -04:00
Now that commit 62f34097c attached BKI_LOOKUP annotation to all the
namespace and role OID columns in the catalogs, there's no real reason
to have the magic PGNSP and PGUID symbols. Get rid of them in favor
of implementing those lookups according to genbki.pl's normal pattern.
This means that in the catalog headers, BKI_DEFAULT(PGNSP) becomes
BKI_DEFAULT(pg_catalog), which seems a lot more transparent.
BKI_DEFAULT(PGUID) becomes BKI_DEFAULT(POSTGRES), which is perhaps
less so; but you can look into pg_authid.dat to discover that
POSTGRES is the nonce name for the bootstrap superuser.
This change also means that if we ever need cross-references in the
initial catalog data to any of the other built-in roles besides
POSTGRES, or to some other built-in schema besides pg_catalog,
we can just do it.
No catversion bump here, as there's no actual change in the contents
of postgres.bki.
Discussion: https://postgr.es/m/3240355.1612129197@sss.pgh.pa.us
207 lines
6.8 KiB
C
207 lines
6.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* pg_class.h
|
|
* definition of the "relation" system catalog (pg_class)
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/catalog/pg_class.h
|
|
*
|
|
* NOTES
|
|
* The Catalog.pm module reads this file and derives schema
|
|
* information.
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PG_CLASS_H
|
|
#define PG_CLASS_H
|
|
|
|
#include "catalog/genbki.h"
|
|
#include "catalog/pg_class_d.h"
|
|
|
|
/* ----------------
|
|
* pg_class definition. cpp turns this into
|
|
* typedef struct FormData_pg_class
|
|
*
|
|
* Note that the BKI_DEFAULT values below are only used for rows describing
|
|
* BKI_BOOTSTRAP catalogs, since only those rows appear in pg_class.dat.
|
|
* ----------------
|
|
*/
|
|
CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,RelationRelation_Rowtype_Id) BKI_SCHEMA_MACRO
|
|
{
|
|
/* oid */
|
|
Oid oid;
|
|
|
|
/* class name */
|
|
NameData relname;
|
|
|
|
/* OID of namespace containing this class */
|
|
Oid relnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace);
|
|
|
|
/* OID of entry in pg_type for relation's implicit row type, if any */
|
|
Oid reltype BKI_LOOKUP_OPT(pg_type);
|
|
|
|
/* OID of entry in pg_type for underlying composite type, if any */
|
|
Oid reloftype BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type);
|
|
|
|
/* class owner */
|
|
Oid relowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid);
|
|
|
|
/* access method; 0 if not a table / index */
|
|
Oid relam BKI_DEFAULT(heap) BKI_LOOKUP_OPT(pg_am);
|
|
|
|
/* identifier of physical storage file */
|
|
/* relfilenode == 0 means it is a "mapped" relation, see relmapper.c */
|
|
Oid relfilenode BKI_DEFAULT(0);
|
|
|
|
/* identifier of table space for relation (0 means default for database) */
|
|
Oid reltablespace BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_tablespace);
|
|
|
|
/* # of blocks (not always up-to-date) */
|
|
int32 relpages BKI_DEFAULT(0);
|
|
|
|
/* # of tuples (not always up-to-date; -1 means "unknown") */
|
|
float4 reltuples BKI_DEFAULT(-1);
|
|
|
|
/* # of all-visible blocks (not always up-to-date) */
|
|
int32 relallvisible BKI_DEFAULT(0);
|
|
|
|
/* OID of toast table; 0 if none */
|
|
Oid reltoastrelid BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_class);
|
|
|
|
/* T if has (or has had) any indexes */
|
|
bool relhasindex BKI_DEFAULT(f);
|
|
|
|
/* T if shared across databases */
|
|
bool relisshared BKI_DEFAULT(f);
|
|
|
|
/* see RELPERSISTENCE_xxx constants below */
|
|
char relpersistence BKI_DEFAULT(p);
|
|
|
|
/* see RELKIND_xxx constants below */
|
|
char relkind BKI_DEFAULT(r);
|
|
|
|
/* number of user attributes */
|
|
int16 relnatts BKI_DEFAULT(0); /* genbki.pl will fill this in */
|
|
|
|
/*
|
|
* Class pg_attribute must contain exactly "relnatts" user attributes
|
|
* (with attnums ranging from 1 to relnatts) for this class. It may also
|
|
* contain entries with negative attnums for system attributes.
|
|
*/
|
|
|
|
/* # of CHECK constraints for class */
|
|
int16 relchecks BKI_DEFAULT(0);
|
|
|
|
/* has (or has had) any rules */
|
|
bool relhasrules BKI_DEFAULT(f);
|
|
|
|
/* has (or has had) any TRIGGERs */
|
|
bool relhastriggers BKI_DEFAULT(f);
|
|
|
|
/* has (or has had) child tables or indexes */
|
|
bool relhassubclass BKI_DEFAULT(f);
|
|
|
|
/* row security is enabled or not */
|
|
bool relrowsecurity BKI_DEFAULT(f);
|
|
|
|
/* row security forced for owners or not */
|
|
bool relforcerowsecurity BKI_DEFAULT(f);
|
|
|
|
/* matview currently holds query results */
|
|
bool relispopulated BKI_DEFAULT(t);
|
|
|
|
/* see REPLICA_IDENTITY_xxx constants */
|
|
char relreplident BKI_DEFAULT(n);
|
|
|
|
/* is relation a partition? */
|
|
bool relispartition BKI_DEFAULT(f);
|
|
|
|
/* link to original rel during table rewrite; otherwise 0 */
|
|
Oid relrewrite BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_class);
|
|
|
|
/* all Xids < this are frozen in this rel */
|
|
TransactionId relfrozenxid BKI_DEFAULT(3); /* FirstNormalTransactionId */
|
|
|
|
/* all multixacts in this rel are >= this; it is really a MultiXactId */
|
|
TransactionId relminmxid BKI_DEFAULT(1); /* FirstMultiXactId */
|
|
|
|
#ifdef CATALOG_VARLEN /* variable-length fields start here */
|
|
/* NOTE: These fields are not present in a relcache entry's rd_rel field. */
|
|
/* access permissions */
|
|
aclitem relacl[1] BKI_DEFAULT(_null_);
|
|
|
|
/* access-method-specific options */
|
|
text reloptions[1] BKI_DEFAULT(_null_);
|
|
|
|
/* partition bound node tree */
|
|
pg_node_tree relpartbound BKI_DEFAULT(_null_);
|
|
#endif
|
|
} FormData_pg_class;
|
|
|
|
/* Size of fixed part of pg_class tuples, not counting var-length fields */
|
|
#define CLASS_TUPLE_SIZE \
|
|
(offsetof(FormData_pg_class,relminmxid) + sizeof(TransactionId))
|
|
|
|
/* ----------------
|
|
* Form_pg_class corresponds to a pointer to a tuple with
|
|
* the format of pg_class relation.
|
|
* ----------------
|
|
*/
|
|
typedef FormData_pg_class *Form_pg_class;
|
|
|
|
DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, on pg_class using btree(oid oid_ops));
|
|
#define ClassOidIndexId 2662
|
|
DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, on pg_class using btree(relname name_ops, relnamespace oid_ops));
|
|
#define ClassNameNspIndexId 2663
|
|
DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, on pg_class using btree(reltablespace oid_ops, relfilenode oid_ops));
|
|
#define ClassTblspcRelfilenodeIndexId 3455
|
|
|
|
#ifdef EXPOSE_TO_CLIENT_CODE
|
|
|
|
#define RELKIND_RELATION 'r' /* ordinary table */
|
|
#define RELKIND_INDEX 'i' /* secondary index */
|
|
#define RELKIND_SEQUENCE 'S' /* sequence object */
|
|
#define RELKIND_TOASTVALUE 't' /* for out-of-line values */
|
|
#define RELKIND_VIEW 'v' /* view */
|
|
#define RELKIND_MATVIEW 'm' /* materialized view */
|
|
#define RELKIND_COMPOSITE_TYPE 'c' /* composite type */
|
|
#define RELKIND_FOREIGN_TABLE 'f' /* foreign table */
|
|
#define RELKIND_PARTITIONED_TABLE 'p' /* partitioned table */
|
|
#define RELKIND_PARTITIONED_INDEX 'I' /* partitioned index */
|
|
|
|
#define RELPERSISTENCE_PERMANENT 'p' /* regular table */
|
|
#define RELPERSISTENCE_UNLOGGED 'u' /* unlogged permanent table */
|
|
#define RELPERSISTENCE_TEMP 't' /* temporary table */
|
|
|
|
/* default selection for replica identity (primary key or nothing) */
|
|
#define REPLICA_IDENTITY_DEFAULT 'd'
|
|
/* no replica identity is logged for this relation */
|
|
#define REPLICA_IDENTITY_NOTHING 'n'
|
|
/* all columns are logged as replica identity */
|
|
#define REPLICA_IDENTITY_FULL 'f'
|
|
/*
|
|
* an explicitly chosen candidate key's columns are used as replica identity.
|
|
* Note this will still be set if the index has been dropped; in that case it
|
|
* has the same meaning as 'd'.
|
|
*/
|
|
#define REPLICA_IDENTITY_INDEX 'i'
|
|
|
|
/*
|
|
* Relation kinds that have physical storage. These relations normally have
|
|
* relfilenode set to non-zero, but it can also be zero if the relation is
|
|
* mapped.
|
|
*/
|
|
#define RELKIND_HAS_STORAGE(relkind) \
|
|
((relkind) == RELKIND_RELATION || \
|
|
(relkind) == RELKIND_INDEX || \
|
|
(relkind) == RELKIND_SEQUENCE || \
|
|
(relkind) == RELKIND_TOASTVALUE || \
|
|
(relkind) == RELKIND_MATVIEW)
|
|
|
|
|
|
#endif /* EXPOSE_TO_CLIENT_CODE */
|
|
|
|
#endif /* PG_CLASS_H */
|