123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- /*-------------------------------------------------------------------------
- *
- * tupdesc.h
- * POSTGRES tuple descriptor definitions.
- *
- *
- * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * src/include/access/tupdesc.h
- *
- *-------------------------------------------------------------------------
- */
- #ifndef TUPDESC_H
- #define TUPDESC_H
- #include "access/attnum.h"
- #include "catalog/pg_attribute.h"
- #include "nodes/pg_list.h"
- typedef struct attrDefault
- {
- AttrNumber adnum;
- char *adbin; /* nodeToString representation of expr */
- } AttrDefault;
- typedef struct constrCheck
- {
- char *ccname;
- char *ccbin; /* nodeToString representation of expr */
- bool ccvalid;
- bool ccnoinherit; /* this is a non-inheritable constraint */
- } ConstrCheck;
- /* This structure contains constraints of a tuple */
- typedef struct tupleConstr
- {
- AttrDefault *defval; /* array */
- ConstrCheck *check; /* array */
- uint16 num_defval;
- uint16 num_check;
- bool has_not_null;
- } TupleConstr;
- /*
- * This struct is passed around within the backend to describe the structure
- * of tuples. For tuples coming from on-disk relations, the information is
- * collected from the pg_attribute, pg_attrdef, and pg_constraint catalogs.
- * Transient row types (such as the result of a join query) have anonymous
- * TupleDesc structs that generally omit any constraint info; therefore the
- * structure is designed to let the constraints be omitted efficiently.
- *
- * Note that only user attributes, not system attributes, are mentioned in
- * TupleDesc; with the exception that tdhasoid indicates if OID is present.
- *
- * If the tupdesc is known to correspond to a named rowtype (such as a table's
- * rowtype) then tdtypeid identifies that type and tdtypmod is -1. Otherwise
- * tdtypeid is RECORDOID, and tdtypmod can be either -1 for a fully anonymous
- * row type, or a value >= 0 to allow the rowtype to be looked up in the
- * typcache.c type cache.
- *
- * Tuple descriptors that live in caches (relcache or typcache, at present)
- * are reference-counted: they can be deleted when their reference count goes
- * to zero. Tuple descriptors created by the executor need no reference
- * counting, however: they are simply created in the appropriate memory
- * context and go away when the context is freed. We set the tdrefcount
- * field of such a descriptor to -1, while reference-counted descriptors
- * always have tdrefcount >= 0.
- */
- typedef struct tupleDesc
- {
- int natts; /* number of attributes in the tuple */
- Form_pg_attribute *attrs;
- /* attrs[N] is a pointer to the description of Attribute Number N+1 */
- TupleConstr *constr; /* constraints, or NULL if none */
- Oid tdtypeid; /* composite type ID for tuple type */
- int32 tdtypmod; /* typmod for tuple type */
- bool tdhasoid; /* tuple has oid attribute in its header */
- int tdrefcount; /* reference count, or -1 if not counting */
- } *TupleDesc;
- /* Accessor for the i'th attribute of tupdesc. */
- #define TupleDescAttr(tupdesc, i) ((tupdesc)->attrs[(i)])
- extern TupleDesc CreateTemplateTupleDesc(int natts, bool hasoid);
- extern TupleDesc CreateTupleDesc(int natts, bool hasoid,
- Form_pg_attribute *attrs);
- extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);
- extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);
- extern void TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,
- TupleDesc src, AttrNumber srcAttno);
- extern void FreeTupleDesc(TupleDesc tupdesc);
- extern void IncrTupleDescRefCount(TupleDesc tupdesc);
- extern void DecrTupleDescRefCount(TupleDesc tupdesc);
- #define PinTupleDesc(tupdesc) \
- do { \
- if ((tupdesc)->tdrefcount >= 0) \
- IncrTupleDescRefCount(tupdesc); \
- } while (0)
- #define ReleaseTupleDesc(tupdesc) \
- do { \
- if ((tupdesc)->tdrefcount >= 0) \
- DecrTupleDescRefCount(tupdesc); \
- } while (0)
- extern bool equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2);
- extern void TupleDescInitEntry(TupleDesc desc,
- AttrNumber attributeNumber,
- const char *attributeName,
- Oid oidtypeid,
- int32 typmod,
- int attdim);
- extern void TupleDescInitEntryCollation(TupleDesc desc,
- AttrNumber attributeNumber,
- Oid collationid);
- extern TupleDesc BuildDescForRelation(List *schema);
- extern TupleDesc BuildDescFromLists(List *names, List *types, List *typmods, List *collations);
- #endif /* TUPDESC_H */
|