nodes.h 5.8 KB
Newer Older
1 2 3
/*-------------------------------------------------------------------------
 *
 * nodes.h--
4
 *	  Definitions for tagged nodes.
5 6 7 8
 *
 *
 * Copyright (c) 1994, Regents of the University of California
 *
9
 * $Id: nodes.h,v 1.12 1997/09/07 04:58:39 momjian Exp $
10 11 12 13
 *
 *-------------------------------------------------------------------------
 */
#ifndef NODES_H
14
#define NODES_H
15 16 17 18 19 20 21 22

/*
 * The first field of every node is NodeTag. Each node created (with makeNode)
 * will have one of the following tags as the value of its first field.
 *
 * Note that the number of the node tags are not contiguous. We left holes
 * here so that we can add more tags without changing the existing enum's.
 */
23 24 25
typedef enum NodeTag
{
	T_Invalid = 0,
26

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
	/*---------------------
	 * TAGS FOR PLAN NODES (plannodes.h)
	 *---------------------
	 */
	T_Plan = 10,
	T_Existential,
	T_Result,
	T_Append,
	T_Scan,
	T_SeqScan,
	T_IndexScan,
	T_Join,
	T_NestLoop,
	T_MergeJoin,
	T_HashJoin,
	T_Temp,
	T_Material,
	T_Sort,
	T_Agg,
	T_Unique,
	T_Hash,
	T_Choose,
	T_Tee,
	T_Group,
51

52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
	/*---------------------
	 * TAGS FOR PRIMITIVE NODES (primnodes.h)
	 *---------------------
	 */
	T_Resdom = 100,
	T_Fjoin,
	T_Expr,
	T_Var,
	T_Oper,
	T_Const,
	T_Param,
	T_Aggreg,
	T_Func,
	T_Array,
	T_ArrayRef,
67

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
	/*---------------------
	 * TAGS FOR INNER PLAN NODES (relation.h)
	 *---------------------
	 */
	T_Rel = 200,
	T_Path,
	T_IndexPath,
	T_JoinPath,
	T_MergePath,
	T_HashPath,
	T_OrderKey,
	T_JoinKey,
	T_MergeOrder,
	T_CInfo,
	T_JoinMethod,
	T_HInfo,
	T_MInfo,
	T_JInfo,
	T_Iter,
	T_Stream,
88

89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
	/*---------------------
	 * TAGS FOR EXECUTOR NODES (execnodes.h)
	 *---------------------
	 */
	T_IndexInfo = 300,
	T_RelationInfo,
	T_TupleCount,
	T_TupleTableSlot,
	T_ExprContext,
	T_ProjectionInfo,
	T_JunkFilter,
	T_EState,
	T_BaseNode,
	T_CommonState,
	T_ResultState,
	T_AppendState,
	T_CommonScanState,
	T_ScanState,
	T_IndexScanState,
	T_JoinState,
	T_NestLoopState,
	T_MergeJoinState,
	T_HashJoinState,
	T_MaterialState,
	T_AggState,
	T_GroupState,
	T_SortState,
	T_UniqueState,
	T_HashState,
	T_TeeState,
119

120 121 122 123 124 125 126 127 128
	/*---------------------
	 * TAGS FOR MEMORY NODES (memnodes.h)
	 *---------------------
	 */
	T_MemoryContext = 400,
	T_GlobalMemory,
	T_PortalMemoryContext,
	T_PortalVariableMemory,
	T_PortalHeapMemory,
129

130 131 132 133 134 135 136 137 138 139
	/*---------------------
	 * TAGS FOR VALUE NODES (pg_list.h)
	 *---------------------
	 */
	T_Value = 500,
	T_List,
	T_Integer,
	T_Float,
	T_String,
	T_Null,
140

141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
	/*---------------------
	 * TAGS FOR PARSE TREE NODES (parsenode.h)
	 *---------------------
	 */
	T_Query = 600,
	T_AppendStmt,
	T_DeleteStmt,
	T_ReplaceStmt,
	T_CursorStmt,
	T_RetrieveStmt,
	T_AddAttrStmt,
	T_AggregateStmt,
	T_ChangeACLStmt,
	T_ClosePortalStmt,
	T_ClusterStmt,
	T_CopyStmt,
	T_CreateStmt,
	T_VersionStmt,
	T_DefineStmt,
	T_DestroyStmt,
	T_ExtendStmt,
	T_FetchStmt,
	T_IndexStmt,
	T_MoveStmt,
	T_ProcedureStmt,
	T_PurgeStmt,
	T_RecipeStmt,
	T_RemoveAggrStmt,
	T_RemoveFuncStmt,
	T_RemoveOperStmt,
	T_RemoveStmt,
	T_RenameStmt,
	T_RuleStmt,
	T_NotifyStmt,
	T_ListenStmt,
	T_TransactionStmt,
	T_ViewStmt,
	T_LoadStmt,
	T_CreatedbStmt,
	T_DestroydbStmt,
	T_VacuumStmt,
	T_ExplainStmt,
	T_CreateSeqStmt,
	T_VariableSetStmt,
	T_VariableShowStmt,
	T_VariableResetStmt,
	T_CreateTrigStmt,
	T_DropTrigStmt,

	T_A_Expr = 700,
	T_Attr,
	T_A_Const,
	T_ParamNo,
	T_Ident,
	T_FuncCall,
	T_A_Indices,
	T_ResTarget,
	T_ParamString,
	T_TimeRange,
	T_RelExpr,
	T_SortGroupBy,
	T_RangeVar,
	T_TypeName,
	T_IndexElem,
	T_ColumnDef,
	T_DefElem,
	T_TargetEntry,
	T_RangeTblEntry,
	T_SortClause,
	T_GroupClause,
	T_SubSelect
}				NodeTag;
213 214 215 216 217 218 219

/*
 * The first field of a node of any type is gauranteed to be the NodeTag.
 * Hence the type of any node can be gotten by casting it to Node. Declaring
 * a variable to be of Node * (instead of void *) can also facilitate
 * debugging.
 */
220 221 222 223
typedef struct Node
{
	NodeTag			type;
}				Node;
224

225
#define nodeTag(_node_)			((Node*)_node_)->type
226

227 228
#define makeNode(_node_)		(_node_*)newNode(sizeof(_node_),T_##_node_)
#define NodeSetTag(n, t)		((Node *)n)->type = t
229

230
#define IsA(_node_,_tag_)		(nodeTag(_node_) == T_##_tag_)
231 232

/* ----------------------------------------------------------------
233
 *					  IsA functions (no inheritence any more)
234 235 236
 * ----------------------------------------------------------------
 */
#define IsA_JoinPath(jp) \
237 238
	(nodeTag(jp)==T_JoinPath || nodeTag(jp)==T_MergePath || \
	 nodeTag(jp)==T_HashPath)
239 240

#define IsA_Join(j) \
241 242
	(nodeTag(j)==T_Join || nodeTag(j)==T_NestLoop || \
	 nodeTag(j)==T_MergeJoin || nodeTag(j)==T_HashJoin)
243 244

#define IsA_Temp(t) \
245 246
	(nodeTag(t)==T_Temp || nodeTag(t)==T_Material || nodeTag(t)==T_Sort || \
	 nodeTag(t)==T_Unique)
247 248

/* ----------------------------------------------------------------
249
 *					  extern declarations follow
250 251 252 253 254 255
 * ----------------------------------------------------------------
 */

/*
 * nodes/nodes.c
 */
256
extern Node    *newNode(Size size, NodeTag tag);
257 258 259 260

/*
 * nodes/{outfuncs.c,print.c}
 */
261
#define nodeDisplay		pprint
262

263 264
extern char    *nodeToString(void *obj);
extern void		print(void *obj);
265 266 267 268

/*
 * nodes/{readfuncs.c,read.c}
 */
269
extern void    *stringToNode(char *str);
270 271 272 273

/*
 * nodes/copyfuncs.c
 */
274
extern void    *copyObject(void *obj);
275 276 277 278

/*
 * nodes/equalfuncs.c
 */
279
extern bool		equal(void *a, void *b);
280 281 282


/* ----------------
283 284
 *		I don't know why this is here.  Most likely a hack..
 *		-cim 6/3/90
285 286
 * ----------------
 */
287
typedef float	Cost;
288 289 290

/*
 * CmdType -
291
 *	  enums for type of operation to aid debugging
292 293
 *
 * ??? could have put this in parsenodes.h but many files not in the
294
 *	  optimizer also need this...
295
 */
296 297 298 299 300 301 302 303 304 305 306 307
typedef enum CmdType
{
	CMD_UNKNOWN,
	CMD_SELECT,					/* select stmt (formerly retrieve) */
	CMD_UPDATE,					/* update stmt (formerly replace) */
	CMD_INSERT,					/* insert stmt (formerly append) */
	CMD_DELETE,
	CMD_NOTIFY,
	CMD_UTILITY					/* cmds like create, destroy, copy,
								 * vacuum, etc. */
}				CmdType;

308

309
#endif							/* NODES_H */