1 /*-------------------------------------------------------------------------
4 * POSTGRES relation descriptor definitions.
7 * Copyright (c) 1994, Regents of the University of California
9 * $Id: rel.h,v 1.14 1997/11/21 19:12:32 momjian Exp $
11 *-------------------------------------------------------------------------
16 #include <catalog/pg_am.h>
17 #include <catalog/pg_class.h>
18 #include <access/strat.h>
19 #include <access/tupdesc.h>
20 #include <rewrite/prs2lock.h>
21 #include <storage/fd.h>
23 typedef struct Trigger
35 typedef struct TriggerDesc
37 uint16 n_before_statement[4];
38 uint16 n_before_row[4];
39 uint16 n_after_row[4];
40 uint16 n_after_statement[4];
41 Trigger **tg_before_statement[4];
42 Trigger **tg_before_row[4];
43 Trigger **tg_after_row[4];
44 Trigger **tg_after_statement[4];
48 typedef struct RelationData
50 File rd_fd; /* open file descriptor */
51 int rd_nblocks; /* number of blocks in rel */
52 uint16 rd_refcnt; /* reference count */
53 bool rd_islocal; /* uses the local buffer mgr */
54 bool rd_isnailed; /* rel is nailed in cache */
55 bool rd_istemp; /* rel is a temp rel */
56 bool rd_tmpunlinked; /* temp rel already unlinked */
57 Form_pg_am rd_am; /* AM tuple */
58 Form_pg_class rd_rel; /* RELATION tuple */
59 Oid rd_id; /* relations's object id */
60 Pointer lockInfo; /* ptr. to misc. info. */
61 TupleDesc rd_att; /* tuple desciptor */
62 RuleLock *rd_rules; /* rewrite rules */
63 IndexStrategy rd_istrat;
64 RegProcedure *rd_support;
65 TriggerDesc *trigdesc;
68 typedef RelationData *Relation;
71 * RelationPtr is used in the executor to support index scans
72 * where we have to keep track of several index relations in an
76 typedef Relation *RelationPtr;
78 #define InvalidRelation ((Relation)NULL)
82 * True iff relation descriptor is valid.
84 #define RelationIsValid(relation) PointerIsValid(relation)
87 * RelationGetSystemPort --
88 * Returns system port of a relation.
91 * Assumes relation descriptor is valid.
93 #define RelationGetSystemPort(relation) ((relation)->rd_fd)
96 * RelationGetLockInfo --
97 * Returns the lock information structure in the reldesc
100 #define RelationGetLockInfo(relation) ((relation)->lockInfo)
103 * RelationHasReferenceCountZero --
104 * True iff relation reference count is zero.
107 * Assumes relation descriptor is valid.
109 #define RelationHasReferenceCountZero(relation) \
110 ((bool)((relation)->rd_refcnt == 0))
113 * RelationSetReferenceCount --
114 * Sets relation reference count.
116 #define RelationSetReferenceCount(relation,count) ((relation)->rd_refcnt = count)
119 * RelationIncrementReferenceCount --
120 * Increments relation reference count.
122 #define RelationIncrementReferenceCount(relation) ((relation)->rd_refcnt += 1);
125 * RelationDecrementReferenceCount --
126 * Decrements relation reference count.
128 #define RelationDecrementReferenceCount(relation) ((relation)->rd_refcnt -= 1)
131 * RelationGetAccessMethodTupleForm --
132 * Returns access method attribute values for a relation.
135 * Assumes relation descriptor is valid.
137 #define RelationGetAccessMethodTupleForm(relation) ((relation)->rd_am)
140 * RelationGetRelationTupleForm --
141 * Returns relation attribute values for a relation.
144 * Assumes relation descriptor is valid.
146 #define RelationGetRelationTupleForm(relation) ((relation)->rd_rel)
150 * RelationGetRelationId --
152 * returns the object id of the relation
155 #define RelationGetRelationId(relation) ((relation)->rd_id)
160 * Returns the open File decscriptor
162 #define RelationGetFile(relation) ((relation)->rd_fd)
166 * RelationGetRelationName --
168 * Returns a Relation Name
170 #define RelationGetRelationName(relation) (&(relation)->rd_rel->relname)
173 * RelationGetRelationName --
175 * Returns a the number of attributes.
177 #define RelationGetNumberOfAttributes(relation) ((relation)->rd_rel->relnatts)
180 * RelationGetTupleDescriptor --
181 * Returns tuple descriptor for a relation.
184 * Assumes relation descriptor is valid.
186 #define RelationGetTupleDescriptor(relation) ((relation)->rd_att)
188 extern IndexStrategy RelationGetIndexStrategy(Relation relation);
191 RelationSetIndexSupport(Relation relation, IndexStrategy strategy,
192 RegProcedure *support);