1 /*-------------------------------------------------------------------------
4 * POSTGRES relation descriptor definitions.
7 * Copyright (c) 1994, Regents of the University of California
9 * $Id: rel.h,v 1.11 1997/09/08 02:39:55 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
34 typedef struct TriggerDesc
36 uint16 n_before_statement[4];
37 uint16 n_before_row[4];
38 uint16 n_after_row[4];
39 uint16 n_after_statement[4];
40 Trigger **tg_before_statement[4];
41 Trigger **tg_before_row[4];
42 Trigger **tg_after_row[4];
43 Trigger **tg_after_statement[4];
47 typedef struct RelationData
49 File rd_fd; /* open file descriptor */
50 int rd_nblocks; /* number of blocks in rel */
51 uint16 rd_refcnt; /* reference count */
52 bool rd_islocal; /* uses the local buffer mgr */
53 bool rd_isnailed; /* rel is nailed in cache */
54 bool rd_istemp; /* rel is a temp rel */
55 bool rd_tmpunlinked; /* temp rel already unlinked */
56 Form_pg_am rd_am; /* AM tuple */
57 Form_pg_class rd_rel; /* RELATION tuple */
58 Oid rd_id; /* relations's object id */
59 Pointer lockInfo; /* ptr. to misc. info. */
60 TupleDesc rd_att; /* tuple desciptor */
61 RuleLock *rd_rules; /* rewrite rules */
62 IndexStrategy rd_istrat;
63 RegProcedure *rd_support;
64 TriggerDesc *trigdesc;
67 typedef RelationData *Relation;
70 * RelationPtr is used in the executor to support index scans
71 * where we have to keep track of several index relations in an
75 typedef Relation *RelationPtr;
77 #define InvalidRelation ((Relation)NULL)
79 typedef char ArchiveMode;
83 * True iff relation descriptor is valid.
85 #define RelationIsValid(relation) PointerIsValid(relation)
88 * RelationGetSystemPort --
89 * Returns system port of a relation.
92 * Assumes relation descriptor is valid.
94 #define RelationGetSystemPort(relation) ((relation)->rd_fd)
97 * RelationGetLockInfo --
98 * Returns the lock information structure in the reldesc
101 #define RelationGetLockInfo(relation) ((relation)->lockInfo)
104 * RelationHasReferenceCountZero --
105 * True iff relation reference count is zero.
108 * Assumes relation descriptor is valid.
110 #define RelationHasReferenceCountZero(relation) \
111 ((bool)((relation)->rd_refcnt == 0))
114 * RelationSetReferenceCount --
115 * Sets relation reference count.
117 #define RelationSetReferenceCount(relation,count) ((relation)->rd_refcnt = count)
120 * RelationIncrementReferenceCount --
121 * Increments relation reference count.
123 #define RelationIncrementReferenceCount(relation) ((relation)->rd_refcnt += 1);
126 * RelationDecrementReferenceCount --
127 * Decrements relation reference count.
129 #define RelationDecrementReferenceCount(relation) ((relation)->rd_refcnt -= 1)
132 * RelationGetAccessMethodTupleForm --
133 * Returns access method attribute values for a relation.
136 * Assumes relation descriptor is valid.
138 #define RelationGetAccessMethodTupleForm(relation) ((relation)->rd_am)
141 * RelationGetRelationTupleForm --
142 * Returns relation attribute values for a relation.
145 * Assumes relation descriptor is valid.
147 #define RelationGetRelationTupleForm(relation) ((relation)->rd_rel)
151 * RelationGetRelationId --
153 * returns the object id of the relation
156 #define RelationGetRelationId(relation) ((relation)->rd_id)
161 * Returns the open File decscriptor
163 #define RelationGetFile(relation) ((relation)->rd_fd)
167 * RelationGetRelationName --
169 * Returns a Relation Name
171 #define RelationGetRelationName(relation) (&(relation)->rd_rel->relname)
174 * RelationGetRelationName --
176 * Returns a the number of attributes.
178 #define RelationGetNumberOfAttributes(relation) ((relation)->rd_rel->relnatts)
181 * RelationGetTupleDescriptor --
182 * Returns tuple descriptor for a relation.
185 * Assumes relation descriptor is valid.
187 #define RelationGetTupleDescriptor(relation) ((relation)->rd_att)
189 extern IndexStrategy RelationGetIndexStrategy(Relation relation);
192 RelationSetIndexSupport(Relation relation, IndexStrategy strategy,
193 RegProcedure * support);