mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
298 lines
6.1 KiB
C
298 lines
6.1 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* nodes.h--
|
|
* Definitions for tagged nodes.
|
|
*
|
|
*
|
|
* Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $Id: nodes.h,v 1.5 1997/03/02 02:12:49 momjian Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef NODES_H
|
|
#define NODES_H
|
|
|
|
/*
|
|
* 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.
|
|
*/
|
|
typedef enum NodeTag {
|
|
T_Invalid = 0,
|
|
|
|
/*---------------------
|
|
* 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,
|
|
|
|
/*---------------------
|
|
* 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,
|
|
|
|
/*---------------------
|
|
* 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,
|
|
|
|
/*---------------------
|
|
* 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,
|
|
|
|
/*---------------------
|
|
* TAGS FOR MEMORY NODES (memnodes.h)
|
|
*---------------------
|
|
*/
|
|
T_MemoryContext = 400,
|
|
T_GlobalMemory,
|
|
T_PortalMemoryContext,
|
|
T_PortalVariableMemory,
|
|
T_PortalHeapMemory,
|
|
|
|
/*---------------------
|
|
* TAGS FOR VALUE NODES (pg_list.h)
|
|
*---------------------
|
|
*/
|
|
T_Value = 500,
|
|
T_List,
|
|
T_Integer,
|
|
T_Float,
|
|
T_String,
|
|
T_Null,
|
|
|
|
/*---------------------
|
|
* 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_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_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
|
|
} NodeTag;
|
|
|
|
/*
|
|
* 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.
|
|
*/
|
|
typedef struct Node {
|
|
NodeTag type;
|
|
} Node;
|
|
|
|
#define nodeTag(_node_) ((Node*)_node_)->type
|
|
|
|
#define makeNode(_node_) (_node_*)newNode(sizeof(_node_),T_##_node_)
|
|
#define NodeSetTag(n, t) ((Node *)n)->type = t
|
|
|
|
#define IsA(_node_,_tag_) (nodeTag(_node_) == T_##_tag_)
|
|
|
|
/* ----------------------------------------------------------------
|
|
* IsA functions (no inheritence any more)
|
|
* ----------------------------------------------------------------
|
|
*/
|
|
#define IsA_JoinPath(jp) \
|
|
(nodeTag(jp)==T_JoinPath || nodeTag(jp)==T_MergePath || \
|
|
nodeTag(jp)==T_HashPath)
|
|
|
|
#define IsA_Join(j) \
|
|
(nodeTag(j)==T_Join || nodeTag(j)==T_NestLoop || \
|
|
nodeTag(j)==T_MergeJoin || nodeTag(j)==T_HashJoin)
|
|
|
|
#define IsA_Temp(t) \
|
|
(nodeTag(t)==T_Temp || nodeTag(t)==T_Material || nodeTag(t)==T_Sort || \
|
|
nodeTag(t)==T_Unique)
|
|
|
|
/* ----------------------------------------------------------------
|
|
* extern declarations follow
|
|
* ----------------------------------------------------------------
|
|
*/
|
|
|
|
/*
|
|
* nodes/nodes.c
|
|
*/
|
|
extern Node *newNode(Size size, NodeTag tag);
|
|
|
|
/*
|
|
* nodes/{outfuncs.c,print.c}
|
|
*/
|
|
#define nodeDisplay pprint
|
|
|
|
extern char *nodeToString(void *obj);
|
|
extern void print(void *obj);
|
|
|
|
/*
|
|
* nodes/{readfuncs.c,read.c}
|
|
*/
|
|
extern void *stringToNode(char *str);
|
|
|
|
/*
|
|
* nodes/copyfuncs.c
|
|
*/
|
|
extern void *copyObject(void *obj);
|
|
|
|
/*
|
|
* nodes/equalfuncs.c
|
|
*/
|
|
extern bool equal(void *a, void *b);
|
|
|
|
|
|
/* ----------------
|
|
* I don't know why this is here. Most likely a hack..
|
|
* -cim 6/3/90
|
|
* ----------------
|
|
*/
|
|
typedef float Cost;
|
|
|
|
/*
|
|
* CmdType -
|
|
* enums for type of operation to aid debugging
|
|
*
|
|
* ??? could have put this in parsenodes.h but many files not in the
|
|
* optimizer also need this...
|
|
*/
|
|
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;
|
|
|
|
|
|
#endif /* NODES_H */
|