1 /*-------------------------------------------------------------------------
4 * POSTGRES relation descriptor definitions.
7 * Copyright (c) 1994, Regents of the University of California
9 * $Id: rel.h,v 1.13 1997/10/28 15:11:43 vadim 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)
80 typedef char ArchiveMode;
84 * True iff relation descriptor is valid.
86 #define RelationIsValid(relation) PointerIsValid(relation)
89 * RelationGetSystemPort --
90 * Returns system port of a relation.
93 * Assumes relation descriptor is valid.
95 #define RelationGetSystemPort(relation) ((relation)->rd_fd)
98 * RelationGetLockInfo --
99 * Returns the lock information structure in the reldesc
102 #define RelationGetLockInfo(relation) ((relation)->lockInfo)
105 * RelationHasReferenceCountZero --
106 * True iff relation reference count is zero.
109 * Assumes relation descriptor is valid.
111 #define RelationHasReferenceCountZero(relation) \
112 ((bool)((relation)->rd_refcnt == 0))
115 * RelationSetReferenceCount --
116 * Sets relation reference count.
118 #define RelationSetReferenceCount(relation,count) ((relation)->rd_refcnt = count)
121 * RelationIncrementReferenceCount --
122 * Increments relation reference count.
124 #define RelationIncrementReferenceCount(relation) ((relation)->rd_refcnt += 1);
127 * RelationDecrementReferenceCount --
128 * Decrements relation reference count.
130 #define RelationDecrementReferenceCount(relation) ((relation)->rd_refcnt -= 1)
133 * RelationGetAccessMethodTupleForm --
134 * Returns access method attribute values for a relation.
137 * Assumes relation descriptor is valid.
139 #define RelationGetAccessMethodTupleForm(relation) ((relation)->rd_am)
142 * RelationGetRelationTupleForm --
143 * Returns relation attribute values for a relation.
146 * Assumes relation descriptor is valid.
148 #define RelationGetRelationTupleForm(relation) ((relation)->rd_rel)
152 * RelationGetRelationId --
154 * returns the object id of the relation
157 #define RelationGetRelationId(relation) ((relation)->rd_id)
162 * Returns the open File decscriptor
164 #define RelationGetFile(relation) ((relation)->rd_fd)
168 * RelationGetRelationName --
170 * Returns a Relation Name
172 #define RelationGetRelationName(relation) (&(relation)->rd_rel->relname)
175 * RelationGetRelationName --
177 * Returns a the number of attributes.
179 #define RelationGetNumberOfAttributes(relation) ((relation)->rd_rel->relnatts)
182 * RelationGetTupleDescriptor --
183 * Returns tuple descriptor for a relation.
186 * Assumes relation descriptor is valid.
188 #define RelationGetTupleDescriptor(relation) ((relation)->rd_att)
190 extern IndexStrategy RelationGetIndexStrategy(Relation relation);
193 RelationSetIndexSupport(Relation relation, IndexStrategy strategy,
194 RegProcedure *support);