postgresql/src/include/catalog/pg_attribute.h

241 lines
8.4 KiB
C

/*-------------------------------------------------------------------------
*
* pg_attribute.h
* definition of the "attribute" system catalog (pg_attribute)
*
* The initial contents of pg_attribute are generated at compile time by
* genbki.pl, so there is no pg_attribute.dat file. Only "bootstrapped"
* relations need be included.
*
*
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/catalog/pg_attribute.h
*
* NOTES
* The Catalog.pm module reads this file and derives schema
* information.
*
*-------------------------------------------------------------------------
*/
#ifndef PG_ATTRIBUTE_H
#define PG_ATTRIBUTE_H
#include "catalog/genbki.h"
#include "catalog/pg_attribute_d.h"
/* ----------------
* pg_attribute definition. cpp turns this into
* typedef struct FormData_pg_attribute
*
* If you change the following, make sure you change the structs for
* system attributes in catalog/heap.c also.
* You may need to change catalog/genbki.pl as well.
* ----------------
*/
CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,AttributeRelation_Rowtype_Id) BKI_SCHEMA_MACRO
{
Oid attrelid BKI_LOOKUP(pg_class); /* OID of relation containing
* this attribute */
NameData attname; /* name of attribute */
/*
* atttypid is the OID of the instance in Catalog Class pg_type that
* defines the data type of this attribute (e.g. int4). Information in
* that instance is redundant with the attlen, attbyval, and attalign
* attributes of this instance, so they had better match or Postgres will
* fail. In an entry for a dropped column, this field is set to zero
* since the pg_type entry may no longer exist; but we rely on attlen,
* attbyval, and attalign to still tell us how large the values in the
* table are.
*/
Oid atttypid BKI_LOOKUP_OPT(pg_type);
/*
* attlen is a copy of the typlen field from pg_type for this attribute.
* See atttypid comments above.
*/
int16 attlen;
/*
* attnum is the "attribute number" for the attribute: A value that
* uniquely identifies this attribute within its class. For user
* attributes, Attribute numbers are greater than 0 and not greater than
* the number of attributes in the class. I.e. if the Class pg_class says
* that Class XYZ has 10 attributes, then the user attribute numbers in
* Class pg_attribute must be 1-10.
*
* System attributes have attribute numbers less than 0 that are unique
* within the class, but not constrained to any particular range.
*
* Note that (attnum - 1) is often used as the index to an array.
*/
int16 attnum;
/*
* fastgetattr() uses attcacheoff to cache byte offsets of attributes in
* heap tuples. The value actually stored in pg_attribute (-1) indicates
* no cached value. But when we copy these tuples into a tuple
* descriptor, we may then update attcacheoff in the copies. This speeds
* up the attribute walking process.
*/
int32 attcacheoff BKI_DEFAULT(-1);
/*
* atttypmod records type-specific data supplied at table creation time
* (for example, the max length of a varchar field). It is passed to
* type-specific input and output functions as the third argument. The
* value will generally be -1 for types that do not need typmod.
*/
int32 atttypmod BKI_DEFAULT(-1);
/*
* attndims is the declared number of dimensions, if an array type,
* otherwise zero.
*/
int16 attndims;
/*
* attbyval is a copy of the typbyval field from pg_type for this
* attribute. See atttypid comments above.
*/
bool attbyval;
/*
* attalign is a copy of the typalign field from pg_type for this
* attribute. See atttypid comments above.
*/
char attalign;
/*----------
* attstorage tells for VARLENA attributes, what the heap access
* methods can do to it if a given tuple doesn't fit into a page.
* Possible values are as for pg_type.typstorage (see TYPSTORAGE macros).
*----------
*/
char attstorage;
/*
* attcompression sets the current compression method of the attribute.
* Typically this is InvalidCompressionMethod ('\0') to specify use of the
* current default setting (see default_toast_compression). Otherwise,
* 'p' selects pglz compression, while 'l' selects LZ4 compression.
* However, this field is ignored whenever attstorage does not allow
* compression.
*/
char attcompression BKI_DEFAULT('\0');
/* This flag represents the "NOT NULL" constraint */
bool attnotnull;
/* Has DEFAULT value or not */
bool atthasdef BKI_DEFAULT(f);
/* Has a missing value or not */
bool atthasmissing BKI_DEFAULT(f);
/* One of the ATTRIBUTE_IDENTITY_* constants below, or '\0' */
char attidentity BKI_DEFAULT('\0');
/* One of the ATTRIBUTE_GENERATED_* constants below, or '\0' */
char attgenerated BKI_DEFAULT('\0');
/* Is dropped (ie, logically invisible) or not */
bool attisdropped BKI_DEFAULT(f);
/*
* This flag specifies whether this column has ever had a local
* definition. It is set for normal non-inherited columns, but also for
* columns that are inherited from parents if also explicitly listed in
* CREATE TABLE INHERITS. It is also set when inheritance is removed from
* a table with ALTER TABLE NO INHERIT. If the flag is set, the column is
* not dropped by a parent's DROP COLUMN even if this causes the column's
* attinhcount to become zero.
*/
bool attislocal BKI_DEFAULT(t);
/* Number of times inherited from direct parent relation(s) */
int16 attinhcount BKI_DEFAULT(0);
/* attribute's collation, if any */
Oid attcollation BKI_LOOKUP_OPT(pg_collation);
#ifdef CATALOG_VARLEN /* variable-length/nullable fields start here */
/* NOTE: The following fields are not present in tuple descriptors. */
/*
* attstattarget is the target number of statistics datapoints to collect
* during VACUUM ANALYZE of this column. A zero here indicates that we do
* not wish to collect any stats about this column. A null value here
* indicates that no value has been explicitly set for this column, so
* ANALYZE should use the default setting.
*
* int16 is sufficient for the current max value (MAX_STATISTICS_TARGET).
*/
int16 attstattarget BKI_DEFAULT(_null_) BKI_FORCE_NULL;
/* Column-level access permissions */
aclitem attacl[1] BKI_DEFAULT(_null_);
/* Column-level options */
text attoptions[1] BKI_DEFAULT(_null_);
/* Column-level FDW options */
text attfdwoptions[1] BKI_DEFAULT(_null_);
/*
* Missing value for added columns. This is a one element array which lets
* us store a value of the attribute type here.
*/
anyarray attmissingval BKI_DEFAULT(_null_);
#endif
} FormData_pg_attribute;
/*
* ATTRIBUTE_FIXED_PART_SIZE is the size of the fixed-layout,
* guaranteed-not-null part of a pg_attribute row. This is in fact as much
* of the row as gets copied into tuple descriptors, so don't expect you
* can access the variable-length fields except in a real tuple!
*/
#define ATTRIBUTE_FIXED_PART_SIZE \
(offsetof(FormData_pg_attribute,attcollation) + sizeof(Oid))
/* ----------------
* Form_pg_attribute corresponds to a pointer to a tuple with
* the format of pg_attribute relation.
* ----------------
*/
typedef FormData_pg_attribute *Form_pg_attribute;
/*
* FormExtraData_pg_attribute contains (some of) the fields that are not in
* FormData_pg_attribute because they are excluded by CATALOG_VARLEN. It is
* meant to be used by DDL code so that the combination of
* FormData_pg_attribute (often via tuple descriptor) and
* FormExtraData_pg_attribute can be used to pass around all the information
* about an attribute. Fields can be included here as needed.
*/
typedef struct FormExtraData_pg_attribute
{
NullableDatum attstattarget;
NullableDatum attoptions;
} FormExtraData_pg_attribute;
DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, pg_attribute, btree(attrelid oid_ops, attname name_ops));
DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, pg_attribute, btree(attrelid oid_ops, attnum int2_ops));
MAKE_SYSCACHE(ATTNAME, pg_attribute_relid_attnam_index, 32);
MAKE_SYSCACHE(ATTNUM, pg_attribute_relid_attnum_index, 128);
#ifdef EXPOSE_TO_CLIENT_CODE
#define ATTRIBUTE_IDENTITY_ALWAYS 'a'
#define ATTRIBUTE_IDENTITY_BY_DEFAULT 'd'
#define ATTRIBUTE_GENERATED_STORED 's'
#endif /* EXPOSE_TO_CLIENT_CODE */
#endif /* PG_ATTRIBUTE_H */