diff options
Diffstat (limited to 'src/include/nodes/parsenodes.h')
-rw-r--r-- | src/include/nodes/parsenodes.h | 1497 |
1 files changed, 0 insertions, 1497 deletions
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h deleted file mode 100644 index c561ac62183..00000000000 --- a/src/include/nodes/parsenodes.h +++ /dev/null @@ -1,1497 +0,0 @@ -/*------------------------------------------------------------------------- - * - * parsenodes.h - * definitions for parse tree nodes - * - * - * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * $Id: parsenodes.h,v 1.182 2002/06/20 20:29:51 momjian Exp $ - * - *------------------------------------------------------------------------- - */ -#ifndef PARSENODES_H -#define PARSENODES_H - -#include "nodes/primnodes.h" - - -/***************************************************************************** - * Query Tree - *****************************************************************************/ - -/* - * Query - - * all statments are turned into a Query tree (via transformStmt) - * for further processing by the optimizer - * utility statements (i.e. non-optimizable statements) - * have the *utilityStmt field set. - * - * we need the isPortal flag because portal names can be null too; can - * get rid of it if we support CURSOR as a commandType. - */ -typedef struct Query -{ - NodeTag type; - - CmdType commandType; /* select|insert|update|delete|utility */ - - Node *utilityStmt; /* non-null if this is a non-optimizable - * statement */ - - int resultRelation; /* target relation (index into rtable) */ - RangeVar *into; /* target relation or portal (cursor) - * for portal just name is meaningful */ - bool isPortal; /* is this a retrieve into portal? */ - bool isBinary; /* binary portal? */ - - bool hasAggs; /* has aggregates in tlist or havingQual */ - bool hasSubLinks; /* has subquery SubLink */ - - bool originalQuery; /* marks original query through rewriting */ - - List *rtable; /* list of range table entries */ - FromExpr *jointree; /* table join tree (FROM and WHERE - * clauses) */ - - List *rowMarks; /* integer list of RT indexes of relations - * that are selected FOR UPDATE */ - - List *targetList; /* target list (of TargetEntry) */ - - List *groupClause; /* a list of GroupClause's */ - - Node *havingQual; /* qualifications applied to groups */ - - List *distinctClause; /* a list of SortClause's */ - - List *sortClause; /* a list of SortClause's */ - - Node *limitOffset; /* # of result tuples to skip */ - Node *limitCount; /* # of result tuples to return */ - - Node *setOperations; /* set-operation tree if this is top level - * of a UNION/INTERSECT/EXCEPT query */ - - /* - * If the resultRelation turns out to be the parent of an inheritance - * tree, the planner will add all the child tables to the rtable and - * store a list of the rtindexes of all the result relations here. - * This is done at plan time, not parse time, since we don't want to - * commit to the exact set of child tables at parse time. This field - * ought to go in some sort of TopPlan plan node, not in the Query. - */ - List *resultRelations; /* integer list of RT indexes, or NIL */ - - /* internal to planner */ - List *base_rel_list; /* list of base-relation RelOptInfos */ - List *other_rel_list; /* list of other 1-relation RelOptInfos */ - List *join_rel_list; /* list of join-relation RelOptInfos */ - List *equi_key_list; /* list of lists of equijoined - * PathKeyItems */ - List *query_pathkeys; /* pathkeys for query_planner()'s result */ -} Query; - - -/**************************************************************************** - * Supporting data structures for Parse Trees - * - * Most of these node types appear in raw parsetrees output by the grammar, - * and get transformed to something else by the analyzer. A few of them - * are used as-is in transformed querytrees. - ****************************************************************************/ - -/* - * TypeName - specifies a type in definitions - * - * For TypeName structures generated internally, it is often easier to - * specify the type by OID than by name. If "names" is NIL then the - * actual type OID is given by typeid, otherwise typeid is unused. - * - * If pct_type is TRUE, then names is actually a field name and we look up - * the type of that field. Otherwise (the normal case), names is a type - * name possibly qualified with schema and database name. - */ -typedef struct TypeName -{ - NodeTag type; - List *names; /* qualified name (list of Value strings) */ - Oid typeid; /* type identified by OID */ - bool timezone; /* timezone specified? */ - bool setof; /* is a set? */ - bool pct_type; /* %TYPE specified? */ - int32 typmod; /* type modifier */ - List *arrayBounds; /* array bounds */ -} TypeName; - -/* - * ColumnRef - specifies a reference to a column, or possibly a whole tuple - * - * The "fields" list must be nonempty; its last component may be "*" - * instead of a field name. Subscripts are optional. - */ -typedef struct ColumnRef -{ - NodeTag type; - List *fields; /* field names (list of Value strings) */ - List *indirection; /* subscripts (list of A_Indices) */ -} ColumnRef; - -/* - * ParamRef - specifies a parameter reference - * - * The parameter could be qualified with field names and/or subscripts - */ -typedef struct ParamRef -{ - NodeTag type; - int number; /* the number of the parameter */ - List *fields; /* field names (list of Value strings) */ - List *indirection; /* subscripts (list of A_Indices) */ -} ParamRef; - -/* - * A_Expr - binary expressions - */ -typedef struct A_Expr -{ - NodeTag type; - int oper; /* type of operation (OP,OR,AND,NOT) */ - List *name; /* possibly-qualified name of operator */ - Node *lexpr; /* left argument */ - Node *rexpr; /* right argument */ -} A_Expr; - -/* - * A_Const - a constant expression - */ -typedef struct A_Const -{ - NodeTag type; - Value val; /* the value (with the tag) */ - TypeName *typename; /* typecast */ -} A_Const; - -/* - * TypeCast - a CAST expression - * - * NOTE: for mostly historical reasons, A_Const parsenodes contain - * room for a TypeName; we only generate a separate TypeCast node if the - * argument to be casted is not a constant. In theory either representation - * would work, but it is convenient to have the target type immediately - * available while resolving a constant's datatype. - */ -typedef struct TypeCast -{ - NodeTag type; - Node *arg; /* the expression being casted */ - TypeName *typename; /* the target type */ -} TypeCast; - -/* - * CaseExpr - a CASE expression - */ -typedef struct CaseExpr -{ - NodeTag type; - Oid casetype; - Node *arg; /* implicit equality comparison argument */ - List *args; /* the arguments (list of WHEN clauses) */ - Node *defresult; /* the default result (ELSE clause) */ -} CaseExpr; - -/* - * CaseWhen - an argument to a CASE expression - */ -typedef struct CaseWhen -{ - NodeTag type; - Node *expr; /* comparison expression */ - Node *result; /* substitution result */ -} CaseWhen; - -/* ---------------- - * NullTest - * - * NullTest represents the operation of testing a value for NULLness. - * Currently, we only support scalar input values, but eventually a - * row-constructor input should be supported. - * The appropriate test is performed and returned as a boolean Datum. - * ---------------- - */ - -typedef enum NullTestType -{ - IS_NULL, IS_NOT_NULL -} NullTestType; - -typedef struct NullTest -{ - NodeTag type; - Node *arg; /* input expression */ - NullTestType nulltesttype; /* IS NULL, IS NOT NULL */ -} NullTest; - -/* ---------------- - * BooleanTest - * - * BooleanTest represents the operation of determining whether a boolean - * is TRUE, FALSE, or UNKNOWN (ie, NULL). All six meaningful combinations - * are supported. Note that a NULL input does *not* cause a NULL result. - * The appropriate test is performed and returned as a boolean Datum. - * ---------------- - */ - -typedef enum BoolTestType -{ - IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN -} BoolTestType; - -typedef struct BooleanTest -{ - NodeTag type; - Node *arg; /* input expression */ - BoolTestType booltesttype; /* test type */ -} BooleanTest; - -/* - * ColumnDef - column definition (used in various creates) - * - * If the column has a default value, we may have the value expression - * in either "raw" form (an untransformed parse tree) or "cooked" form - * (the nodeToString representation of an executable expression tree), - * depending on how this ColumnDef node was created (by parsing, or by - * inheritance from an existing relation). We should never have both - * in the same node! - * - * The constraints list may contain a CONSTR_DEFAULT item in a raw - * parsetree produced by gram.y, but transformCreateStmt will remove - * the item and set raw_default instead. CONSTR_DEFAULT items - * should not appear in any subsequent processing. - */ -typedef struct ColumnDef -{ - NodeTag type; - char *colname; /* name of column */ - TypeName *typename; /* type of column */ - bool is_not_null; /* NOT NULL constraint specified? */ - Node *raw_default; /* default value (untransformed parse - * tree) */ - char *cooked_default; /* nodeToString representation */ - List *constraints; /* other constraints on column */ -} ColumnDef; - -/* - * Ident - - * an unqualified identifier. This is currently used only in the context - * of column name lists. - */ -typedef struct Ident -{ - NodeTag type; - char *name; /* its name */ -} Ident; - -/* - * FuncCall - a function or aggregate invocation - * - * agg_star indicates we saw a 'foo(*)' construct, while agg_distinct - * indicates we saw 'foo(DISTINCT ...)'. In either case, the construct - * *must* be an aggregate call. Otherwise, it might be either an - * aggregate or some other kind of function. - */ -typedef struct FuncCall -{ - NodeTag type; - List *funcname; /* qualified name of function */ - List *args; /* the arguments (list of exprs) */ - bool agg_star; /* argument was really '*' */ - bool agg_distinct; /* arguments were labeled DISTINCT */ -} FuncCall; - -/* - * A_Indices - array reference or bounds ([lidx:uidx] or [uidx]) - */ -typedef struct A_Indices -{ - NodeTag type; - Node *lidx; /* could be NULL */ - Node *uidx; -} A_Indices; - -/* - * ExprFieldSelect - select a field and/or array element from an expression - * - * This is used in the raw parsetree to represent selection from an - * arbitrary expression (not a column or param reference). Either - * fields or indirection may be NIL if not used. - */ -typedef struct ExprFieldSelect -{ - NodeTag type; - Node *arg; /* the thing being selected from */ - List *fields; /* field names (list of Value strings) */ - List *indirection; /* subscripts (list of A_Indices) */ -} ExprFieldSelect; - -/* - * ResTarget - - * result target (used in target list of pre-transformed Parse trees) - * - * In a SELECT or INSERT target list, 'name' is either NULL or - * the column name assigned to the value. (If there is an 'AS ColumnLabel' - * clause, the grammar sets 'name' from it; otherwise 'name' is initially NULL - * and is filled in during the parse analysis phase.) - * The 'indirection' field is not used at all. - * - * In an UPDATE target list, 'name' is the name of the destination column, - * and 'indirection' stores any subscripts attached to the destination. - * That is, our representation is UPDATE table SET name [indirection] = val. - */ -typedef struct ResTarget -{ - NodeTag type; - char *name; /* column name or NULL */ - List *indirection; /* subscripts for destination column, or - * NIL */ - Node *val; /* the value expression to compute or - * assign */ -} ResTarget; - -/* - * Empty node used as a marker for Default Columns - */ -typedef struct InsertDefault -{ - NodeTag type; -} InsertDefault; - -/* - * SortGroupBy - for ORDER BY clause - */ -typedef struct SortGroupBy -{ - NodeTag type; - List *useOp; /* operator to use */ - Node *node; /* Expression */ -} SortGroupBy; - -/* - * RangeSubselect - subquery appearing in a FROM clause - */ -typedef struct RangeSubselect -{ - NodeTag type; - Node *subquery; /* the untransformed sub-select clause */ - Alias *alias; /* table alias & optional column aliases */ -} RangeSubselect; - -/* - * RangeFunction - function call appearing in a FROM clause - */ -typedef struct RangeFunction -{ - NodeTag type; - Node *funccallnode; /* untransformed function call tree */ - Alias *alias; /* table alias & optional column aliases */ -} RangeFunction; - -/* - * IndexElem - index parameters (used in CREATE INDEX) - * - * For a plain index, each 'name' is an attribute name in the heap relation; - * 'funcname' and 'args' are NIL. For a functional index, only one IndexElem - * is allowed. It has name = NULL, funcname = name of function and args = - * list of attribute names that are the function's arguments. - */ -typedef struct IndexElem -{ - NodeTag type; - char *name; /* name of attribute to index, or NULL */ - List *funcname; /* qualified name of function */ - List *args; /* list of names of function arguments */ - List *opclass; /* name of desired opclass; NIL = default */ -} IndexElem; - -/* - * DefElem - - * a definition (used in definition lists in the form of defname = arg) - */ -typedef struct DefElem -{ - NodeTag type; - char *defname; - Node *arg; /* a (Value *) or a (TypeName *) */ -} DefElem; - - -/**************************************************************************** - * Nodes for a Query tree - ****************************************************************************/ - -/* - * TargetEntry - - * a target entry (used in the transformed target list) - * - * one of resdom or fjoin is not NULL. a target list is - * ((<resdom | fjoin> expr) (<resdom | fjoin> expr) ...) - */ -typedef struct TargetEntry -{ - NodeTag type; - Resdom *resdom; /* fjoin overload this to be a list?? */ - Fjoin *fjoin; - Node *expr; -} TargetEntry; - -/*-------------------- - * RangeTblEntry - - * A range table is a List of RangeTblEntry nodes. - * - * A range table entry may represent a plain relation, a sub-select in - * FROM, or the result of a JOIN clause. (Only explicit JOIN syntax - * produces an RTE, not the implicit join resulting from multiple FROM - * items. This is because we only need the RTE to deal with SQL features - * like outer joins and join-output-column aliasing.) Other special - * RTE types also exist, as indicated by RTEKind. - * - * alias is an Alias node representing the AS alias-clause attached to the - * FROM expression, or NULL if no clause. - * - * eref is the table reference name and column reference names (either - * real or aliases). Note that system columns (OID etc) are not included - * in the column list. - * eref->aliasname is required to be present, and should generally be used - * to identify the RTE for error messages etc. - * - * inh is TRUE for relation references that should be expanded to include - * inheritance children, if the rel has any. This *must* be FALSE for - * RTEs other than RTE_RELATION entries. - * - * inFromCl marks those range variables that are listed in the FROM clause. - * In SQL, the query can only refer to range variables listed in the - * FROM clause, but POSTQUEL allows you to refer to tables not listed, - * in which case a range table entry will be generated. We still support - * this POSTQUEL feature, although there is some doubt whether it's - * convenient or merely confusing. The flag is needed since an - * implicitly-added RTE shouldn't change the namespace for unqualified - * column names processed later, and it also shouldn't affect the - * expansion of '*'. - * - * checkForRead, checkForWrite, and checkAsUser control run-time access - * permissions checks. A rel will be checked for read or write access - * (or both, or neither) per checkForRead and checkForWrite. If - * checkAsUser is not InvalidOid, then do the permissions checks using - * the access rights of that user, not the current effective user ID. - * (This allows rules to act as setuid gateways.) - *-------------------- - */ -typedef enum RTEKind -{ - RTE_RELATION, /* ordinary relation reference */ - RTE_SUBQUERY, /* subquery in FROM */ - RTE_JOIN, /* join */ - RTE_SPECIAL, /* special rule relation (NEW or OLD) */ - RTE_FUNCTION /* function in FROM */ -} RTEKind; - -typedef struct RangeTblEntry -{ - NodeTag type; - - RTEKind rtekind; /* see above */ - - /* - * XXX the fields applicable to only some rte kinds should be merged - * into a union. I didn't do this yet because the diffs would impact - * a lot of code that is being actively worked on. FIXME later. - */ - - /* - * Fields valid for a plain relation RTE (else zero): - */ - Oid relid; /* OID of the relation */ - - /* - * Fields valid for a subquery RTE (else NULL): - */ - Query *subquery; /* the sub-query */ - - /* - * Fields valid for a function RTE (else NULL): - */ - Node *funcexpr; /* expression tree for func call */ - - /* - * Fields valid for a join RTE (else NULL/zero): - * - * joinaliasvars is a list of Vars or COALESCE expressions corresponding - * to the columns of the join result. An alias Var referencing column - * K of the join result can be replaced by the K'th element of - * joinaliasvars --- but to simplify the task of reverse-listing aliases - * correctly, we do not do that until planning time. - */ - JoinType jointype; /* type of join */ - List *joinaliasvars; /* list of alias-var expansions */ - - /* - * Fields valid in all RTEs: - */ - Alias *alias; /* user-written alias clause, if any */ - Alias *eref; /* expanded reference names */ - bool inh; /* inheritance requested? */ - bool inFromCl; /* present in FROM clause */ - bool checkForRead; /* check rel for read access */ - bool checkForWrite; /* check rel for write access */ - Oid checkAsUser; /* if not zero, check access as this user */ -} RangeTblEntry; - -/* - * SortClause - - * representation of ORDER BY clauses - * - * tleSortGroupRef must match ressortgroupref of exactly one Resdom of the - * associated targetlist; that is the expression to be sorted (or grouped) by. - * sortop is the OID of the ordering operator. - * - * SortClauses are also used to identify Resdoms that we will do a "Unique" - * filter step on (for SELECT DISTINCT and SELECT DISTINCT ON). The - * distinctClause list is simply a copy of the relevant members of the - * sortClause list. Note that distinctClause can be a subset of sortClause, - * but cannot have members not present in sortClause; and the members that - * do appear must be in the same order as in sortClause. - */ -typedef struct SortClause -{ - NodeTag type; - Index tleSortGroupRef; /* reference into targetlist */ - Oid sortop; /* the sort operator to use */ -} SortClause; - -/* - * GroupClause - - * representation of GROUP BY clauses - * - * GroupClause is exactly like SortClause except for the nodetag value - * (it's probably not even really necessary to have two different - * nodetags...). We have routines that operate interchangeably on both. - */ -typedef SortClause GroupClause; - - -/***************************************************************************** - * Optimizable Statements - *****************************************************************************/ - -/* ---------------------- - * Insert Statement - * ---------------------- - */ -typedef struct InsertStmt -{ - NodeTag type; - RangeVar *relation; /* relation to insert into */ - List *cols; /* optional: names of the target columns */ - - /* - * An INSERT statement has *either* VALUES or SELECT, never both. If - * VALUES, a targetList is supplied (empty for DEFAULT VALUES). If - * SELECT, a complete SelectStmt (or set-operation tree) is supplied. - */ - List *targetList; /* the target list (of ResTarget) */ - Node *selectStmt; /* the source SELECT */ -} InsertStmt; - -/* ---------------------- - * Delete Statement - * ---------------------- - */ -typedef struct DeleteStmt -{ - NodeTag type; - RangeVar *relation; /* relation to delete from */ - Node *whereClause; /* qualifications */ -} DeleteStmt; - -/* ---------------------- - * Update Statement - * ---------------------- - */ -typedef struct UpdateStmt -{ - NodeTag type; - RangeVar *relation; /* relation to update */ - List *targetList; /* the target list (of ResTarget) */ - Node *whereClause; /* qualifications */ - List *fromClause; /* optional from clause for more tables */ -} UpdateStmt; - -/* ---------------------- - * Select Statement - * - * A "simple" SELECT is represented in the output of gram.y by a single - * SelectStmt node. A SELECT construct containing set operators (UNION, - * INTERSECT, EXCEPT) is represented by a tree of SelectStmt nodes, in - * which the leaf nodes are component SELECTs and the internal nodes - * represent UNION, INTERSECT, or EXCEPT operators. Using the same node - * type for both leaf and internal nodes allows gram.y to stick ORDER BY, - * LIMIT, etc, clause values into a SELECT statement without worrying - * whether it is a simple or compound SELECT. - * ---------------------- - */ -typedef enum SetOperation -{ - SETOP_NONE = 0, - SETOP_UNION, - SETOP_INTERSECT, - SETOP_EXCEPT -} SetOperation; - -typedef struct SelectStmt -{ - NodeTag type; - - /* - * These fields are used only in "leaf" SelectStmts. - */ - List *distinctClause; /* NULL, list of DISTINCT ON exprs, or - * lcons(NIL,NIL) for all (SELECT - * DISTINCT) */ - RangeVar *into; /* target table (for select into table) */ - List *intoColNames; /* column names for into table */ - List *targetList; /* the target list (of ResTarget) */ - List *fromClause; /* the FROM clause */ - Node *whereClause; /* WHERE qualification */ - List *groupClause; /* GROUP BY clauses */ - Node *havingClause; /* HAVING conditional-expression */ - - /* - * These fields are used in both "leaf" SelectStmts and upper-level - * SelectStmts. portalname/binary may only be set at the top level. - */ - List *sortClause; /* sort clause (a list of SortGroupBy's) */ - char *portalname; /* the portal (cursor) to create */ - bool binary; /* a binary (internal) portal? */ - Node *limitOffset; /* # of result tuples to skip */ - Node *limitCount; /* # of result tuples to return */ - List *forUpdate; /* FOR UPDATE clause */ - - /* - * These fields are used only in upper-level SelectStmts. - */ - SetOperation op; /* type of set op */ - bool all; /* ALL specified? */ - struct SelectStmt *larg; /* left child */ - struct SelectStmt *rarg; /* right child */ - /* Eventually add fields for CORRESPONDING spec here */ -} SelectStmt; - -/* ---------------------- - * Set Operation node for post-analysis query trees - * - * After parse analysis, a SELECT with set operations is represented by a - * top-level Query node containing the leaf SELECTs as subqueries in its - * range table. Its setOperations field shows the tree of set operations, - * with leaf SelectStmt nodes replaced by RangeTblRef nodes, and internal - * nodes replaced by SetOperationStmt nodes. - * ---------------------- - */ -typedef struct SetOperationStmt -{ - NodeTag type; - SetOperation op; /* type of set op */ - bool all; /* ALL specified? */ - Node *larg; /* left child */ - Node *rarg; /* right child */ - /* Eventually add fields for CORRESPONDING spec here */ - - /* Fields derived during parse analysis: */ - List *colTypes; /* integer list of OIDs of output column - * types */ -} SetOperationStmt; - - -/***************************************************************************** - * Other Statements (no optimizations required) - * - * Some of them require a little bit of transformation (which is also - * done by transformStmt). The whole structure is then passed on to - * ProcessUtility (by-passing the optimization step) as the utilityStmt - * field in Query. - *****************************************************************************/ - -/* ---------------------- - * Create Schema Statement - * - * NOTE: the schemaElts list contains raw parsetrees for component statements - * of the schema, such as CREATE TABLE, GRANT, etc. These are analyzed and - * executed after the schema itself is created. - * ---------------------- - */ -typedef struct CreateSchemaStmt -{ - NodeTag type; - char *schemaname; /* the name of the schema to create */ - char *authid; /* the owner of the created schema */ - List *schemaElts; /* schema components (list of parsenodes) */ -} CreateSchemaStmt; - -/* ---------------------- - * Alter Table - * - * The fields are used in different ways by the different variants of - * this command. - * ---------------------- - */ -typedef struct AlterTableStmt -{ - NodeTag type; - char subtype; /*------------ - * A = add column - * T = alter column default - * N = alter column drop not null - * O = alter column set not null - * S = alter column statistics - * M = alter column storage - * D = drop column - * C = add constraint - * X = drop constraint - * E = create toast table - * U = change owner - *------------ - */ - RangeVar *relation; /* table to work on */ - char *name; /* column or constraint name to act on, or - * new owner */ - Node *def; /* definition of new column or constraint */ - int behavior; /* CASCADE or RESTRICT drop behavior */ -} AlterTableStmt; - -/* ---------------------- - * Grant|Revoke Statement - * ---------------------- - */ -typedef enum GrantObjectType -{ - ACL_OBJECT_RELATION, /* table, view, sequence */ - ACL_OBJECT_DATABASE, /* database */ - ACL_OBJECT_FUNCTION, /* function */ - ACL_OBJECT_LANGUAGE, /* procedural language */ - ACL_OBJECT_NAMESPACE /* namespace */ -} GrantObjectType; - -/* - * Grantable rights are encoded so that we can OR them together in a bitmask. - * The present representation of AclItem limits us to 30 distinct rights. - * Caution: changing these codes breaks stored ACLs, hence forces initdb. - */ -#define ACL_INSERT (1<<0) /* for relations */ -#define ACL_SELECT (1<<1) -#define ACL_UPDATE (1<<2) -#define ACL_DELETE (1<<3) -#define ACL_RULE (1<<4) -#define ACL_REFERENCES (1<<5) -#define ACL_TRIGGER (1<<6) -#define ACL_EXECUTE (1<<7) /* for functions */ -#define ACL_USAGE (1<<8) /* for languages and namespaces */ -#define ACL_CREATE (1<<9) /* for namespaces and databases */ -#define ACL_CREATE_TEMP (1<<10) /* for databases */ -#define N_ACL_RIGHTS 11 /* 1 plus the last 1<<x */ -#define ACL_ALL_RIGHTS (-1) /* all-privileges marker in GRANT list */ -#define ACL_NO_RIGHTS 0 - -typedef struct GrantStmt -{ - NodeTag type; - bool is_grant; /* true = GRANT, false = REVOKE */ - GrantObjectType objtype; /* kind of object being operated on */ - List *objects; /* list of RangeVar nodes, FuncWithArgs nodes, - * or plain names (as Value strings) */ - List *privileges; /* integer list of privilege codes */ - List *grantees; /* list of PrivGrantee nodes */ -} GrantStmt; - -typedef struct PrivGrantee -{ - NodeTag type; - char *username; /* if both are NULL then PUBLIC */ - char *groupname; -} PrivGrantee; - -typedef struct FuncWithArgs -{ - NodeTag type; - List *funcname; /* qualified name of function */ - List *funcargs; /* list of Typename nodes */ -} FuncWithArgs; - -/* This is only used internally in gram.y. */ -typedef struct PrivTarget -{ - NodeTag type; - GrantObjectType objtype; - List *objs; -} PrivTarget; - -/* ---------------------- - * Close Portal Statement - * ---------------------- - */ -typedef struct ClosePortalStmt -{ - NodeTag type; - char *portalname; /* name of the portal (cursor) */ -} ClosePortalStmt; - -/* ---------------------- - * Copy Statement - * ---------------------- - */ -typedef struct CopyStmt -{ - NodeTag type; - RangeVar *relation; /* the relation to copy */ - bool is_from; /* TO or FROM */ - char *filename; /* if NULL, use stdin/stdout */ - List *options; /* List of DefElem nodes */ -} CopyStmt; - -/* ---------------------- - * Create Table Statement - * - * NOTE: in the raw gram.y output, ColumnDef, Constraint, and FkConstraint - * nodes are intermixed in tableElts, and constraints is NIL. After parse - * analysis, tableElts contains just ColumnDefs, and constraints contains - * just Constraint nodes (in fact, only CONSTR_CHECK nodes, in the present - * implementation). - * ---------------------- - */ -typedef struct CreateStmt -{ - NodeTag type; - RangeVar *relation; /* relation to create */ - List *tableElts; /* column definitions (list of ColumnDef) */ - List *inhRelations; /* relations to inherit from */ - List *constraints; /* constraints (list of Constraint nodes) */ - bool hasoids; /* should it have OIDs? */ -} CreateStmt; - -/* ---------- - * Definitions for plain (non-FOREIGN KEY) constraints in CreateStmt - * - * XXX probably these ought to be unified with FkConstraints at some point? - * - * For constraints that use expressions (CONSTR_DEFAULT, CONSTR_CHECK) - * we may have the expression in either "raw" form (an untransformed - * parse tree) or "cooked" form (the nodeToString representation of - * an executable expression tree), depending on how this Constraint - * node was created (by parsing, or by inheritance from an existing - * relation). We should never have both in the same node! - * - * Constraint attributes (DEFERRABLE etc) are initially represented as - * separate Constraint nodes for simplicity of parsing. analyze.c makes - * a pass through the constraints list to attach the info to the appropriate - * FkConstraint node (and, perhaps, someday to other kinds of constraints). - * ---------- - */ - -typedef enum ConstrType /* types of constraints */ -{ - CONSTR_NULL, /* not SQL92, but a lot of people expect - * it */ - CONSTR_NOTNULL, - CONSTR_DEFAULT, - CONSTR_CHECK, - CONSTR_PRIMARY, - CONSTR_UNIQUE, - CONSTR_ATTR_DEFERRABLE, /* attributes for previous constraint node */ - CONSTR_ATTR_NOT_DEFERRABLE, - CONSTR_ATTR_DEFERRED, - CONSTR_ATTR_IMMEDIATE -} ConstrType; - -typedef struct Constraint -{ - NodeTag type; - ConstrType contype; - char *name; /* name, or NULL if unnamed */ - Node *raw_expr; /* expr, as untransformed parse tree */ - char *cooked_expr; /* expr, as nodeToString representation */ - List *keys; /* Ident nodes naming referenced column(s) */ -} Constraint; - -/* ---------- - * Definitions for FOREIGN KEY constraints in CreateStmt - * ---------- - */ -#define FKCONSTR_ON_KEY_NOACTION 0x0000 -#define FKCONSTR_ON_KEY_RESTRICT 0x0001 -#define FKCONSTR_ON_KEY_CASCADE 0x0002 -#define FKCONSTR_ON_KEY_SETNULL 0x0004 -#define FKCONSTR_ON_KEY_SETDEFAULT 0x0008 - -#define FKCONSTR_ON_DELETE_MASK 0x000F -#define FKCONSTR_ON_DELETE_SHIFT 0 - -#define FKCONSTR_ON_UPDATE_MASK 0x00F0 -#define FKCONSTR_ON_UPDATE_SHIFT 4 - -typedef struct FkConstraint -{ - NodeTag type; - char *constr_name; /* Constraint name */ - RangeVar *pktable; /* Primary key table */ - List *fk_attrs; /* Attributes of foreign key */ - List *pk_attrs; /* Corresponding attrs in PK table */ - char *match_type; /* FULL or PARTIAL */ - int32 actions; /* ON DELETE/UPDATE actions */ - bool deferrable; /* DEFERRABLE */ - bool initdeferred; /* INITIALLY DEFERRED */ -} FkConstraint; - -/* ---------------------- - * Create/Drop TRIGGER Statements - * ---------------------- - */ - -typedef struct CreateTrigStmt -{ - NodeTag type; - char *trigname; /* TRIGGER's name */ - RangeVar *relation; /* relation trigger is on */ - List *funcname; /* qual. name of function to call */ - List *args; /* list of (T_String) Values or NIL */ - bool before; /* BEFORE/AFTER */ - bool row; /* ROW/STATEMENT */ - char actions[4]; /* Insert, Update, Delete */ - char *lang; /* currently not used, always NULL */ - char *text; /* AS 'text' */ - List *attr; /* UPDATE OF a, b,... (NI) or NULL */ - char *when; /* WHEN 'a > 10 ...' (NI) or NULL */ - - /* The following are used for referential */ - /* integrity constraint triggers */ - bool isconstraint; /* This is an RI trigger */ - bool deferrable; /* [NOT] DEFERRABLE */ - bool initdeferred; /* INITIALLY {DEFERRED|IMMEDIATE} */ - RangeVar *constrrel; /* opposite relation */ -} CreateTrigStmt; - -/* ---------------------- - * Create/Drop PROCEDURAL LANGUAGE Statement - * ---------------------- - */ -typedef struct CreatePLangStmt -{ - NodeTag type; - char *plname; /* PL name */ - List *plhandler; /* PL call handler function (qual. name) */ - List *plvalidator; /* optional validator function (qual. name) */ - char *plcompiler; /* lancompiler text */ - bool pltrusted; /* PL is trusted */ -} CreatePLangStmt; - -typedef struct DropPLangStmt -{ - NodeTag type; - char *plname; /* PL name */ -} DropPLangStmt; - -/* ---------------------- - * Create/Alter/Drop User Statements - * ---------------------- - */ -typedef struct CreateUserStmt -{ - NodeTag type; - char *user; /* PostgreSQL user login name */ - List *options; /* List of DefElem nodes */ -} CreateUserStmt; - -typedef struct AlterUserStmt -{ - NodeTag type; - char *user; /* PostgreSQL user login name */ - List *options; /* List of DefElem nodes */ -} AlterUserStmt; - -typedef struct AlterUserSetStmt -{ - NodeTag type; - char *user; - char *variable; - List *value; -} AlterUserSetStmt; - -typedef struct DropUserStmt -{ - NodeTag type; - List *users; /* List of users to remove */ -} DropUserStmt; - -/* ---------------------- - * Create/Alter/Drop Group Statements - * ---------------------- - */ -typedef struct CreateGroupStmt -{ - NodeTag type; - char *name; /* name of the new group */ - List *options; /* List of DefElem nodes */ -} CreateGroupStmt; - -typedef struct AlterGroupStmt -{ - NodeTag type; - char *name; /* name of group to alter */ - int action; /* +1 = add, -1 = drop user */ - List *listUsers; /* list of users to add/drop */ -} AlterGroupStmt; - -typedef struct DropGroupStmt -{ - NodeTag type; - char *name; -} DropGroupStmt; - -/* ---------------------- - * Create SEQUENCE Statement - * ---------------------- - */ - -typedef struct CreateSeqStmt -{ - NodeTag type; - RangeVar *sequence; /* the sequence to create */ - List *options; -} CreateSeqStmt; - -/* ---------------------- - * Create {Operator|Type|Aggregate} Statement - * ---------------------- - */ -typedef struct DefineStmt -{ - NodeTag type; - int defType; /* OPERATOR|TYPE_P|AGGREGATE */ - List *defnames; /* qualified name (list of Value strings) */ - List *definition; /* a list of DefElem */ -} DefineStmt; - -/* ---------------------- - * Create Domain Statement - * ---------------------- - */ -typedef struct CreateDomainStmt -{ - NodeTag type; - List *domainname; /* qualified name (list of Value strings) */ - TypeName *typename; /* the base type */ - List *constraints; /* constraints (list of Constraint nodes) */ -} CreateDomainStmt; - -/* ---------------------- - * Drop Table|Sequence|View|Index|Type|Domain Statement - * ---------------------- - */ - -#define DROP_TABLE 1 -#define DROP_SEQUENCE 2 -#define DROP_VIEW 3 -#define DROP_INDEX 4 -#define DROP_TYPE 5 -#define DROP_DOMAIN 6 - -typedef struct DropStmt -{ - NodeTag type; - List *objects; /* list of sublists of names (as Values) */ - int removeType; - int behavior; /* CASCADE or RESTRICT drop behavior */ -} DropStmt; - -/* ---------------------- - * Drop Rule|Trigger Statement - * - * In general this may be used for dropping any property of a relation; - * for example, someday soon we may have DROP ATTRIBUTE. - * ---------------------- - */ - -#define DROP_RULE 100 -#define DROP_TRIGGER 101 - -typedef struct DropPropertyStmt -{ - NodeTag type; - RangeVar *relation; /* owning relation */ - char *property; /* name of rule, trigger, etc */ - int removeType; -} DropPropertyStmt; - -/* ---------------------- - * Truncate Table Statement - * ---------------------- - */ -typedef struct TruncateStmt -{ - NodeTag type; - RangeVar *relation; /* relation to be truncated */ -} TruncateStmt; - -/* ---------------------- - * Comment On Statement - * ---------------------- - */ -typedef struct CommentStmt -{ - NodeTag type; - int objtype; /* Object's type */ - List *objname; /* Qualified name of the object */ - List *objargs; /* Arguments if needed (eg, for functions) */ - char *comment; /* Comment to insert, or NULL to remove */ -} CommentStmt; - -/* ---------------------- - * Begin Recipe Statement - * ---------------------- - */ -typedef struct RecipeStmt -{ - NodeTag type; - char *recipeName; /* name of the recipe */ -} RecipeStmt; - -/* ---------------------- - * Fetch Statement - * ---------------------- - */ -typedef struct FetchStmt -{ - NodeTag type; - int direction; /* FORWARD or BACKWARD */ - int howMany; /* amount to fetch ("ALL" --> 0) */ - char *portalname; /* name of portal (cursor) */ - bool ismove; /* TRUE if MOVE */ -} FetchStmt; - -/* ---------------------- - * Create Index Statement - * ---------------------- - */ -typedef struct IndexStmt -{ - NodeTag type; - char *idxname; /* name of the index */ - RangeVar *relation; /* relation to build index on */ - char *accessMethod; /* name of access method (eg. btree) */ - List *indexParams; /* a list of IndexElem */ - Node *whereClause; /* qualification (partial-index predicate) */ - List *rangetable; /* range table for qual, filled in by - * transformStmt() */ - bool unique; /* is index unique? */ - bool primary; /* is index on primary key? */ -} IndexStmt; - -/* ---------------------- - * Create Function Statement - * ---------------------- - */ -typedef struct CreateFunctionStmt -{ - NodeTag type; - bool replace; /* T => replace if already exists */ - List *funcname; /* qualified name of function to create */ - List *argTypes; /* list of argument types (TypeName nodes) */ - TypeName *returnType; /* the return type */ - List *options; /* a list of DefElem */ - List *withClause; /* a list of DefElem */ -} CreateFunctionStmt; - -/* ---------------------- - * Drop Aggregate Statement - * ---------------------- - */ -typedef struct RemoveAggrStmt -{ - NodeTag type; - List *aggname; /* aggregate to drop */ - TypeName *aggtype; /* TypeName for input datatype, or NULL */ -} RemoveAggrStmt; - -/* ---------------------- - * Drop Function Statement - * ---------------------- - */ -typedef struct RemoveFuncStmt -{ - NodeTag type; - List *funcname; /* function to drop */ - List *args; /* types of the arguments */ -} RemoveFuncStmt; - -/* ---------------------- - * Drop Operator Statement - * ---------------------- - */ -typedef struct RemoveOperStmt -{ - NodeTag type; - List *opname; /* operator to drop */ - List *args; /* types of the arguments */ -} RemoveOperStmt; - -/* ---------------------- - * Alter Object Rename Statement - * ---------------------- - * Currently supports renaming tables, table columns, and triggers. - * If renaming a table, oldname is ignored. - */ -#define RENAME_TABLE 110 -#define RENAME_COLUMN 111 -#define RENAME_TRIGGER 112 -#define RENAME_RULE 113 - -typedef struct RenameStmt -{ - NodeTag type; - RangeVar *relation; /* owning relation */ - char *oldname; /* name of rule, trigger, etc */ - char *newname; /* the new name */ - int renameType; /* RENAME_TABLE, RENAME_COLUMN, etc */ -} RenameStmt; - -/* ---------------------- - * Create Rule Statement - * ---------------------- - */ -typedef struct RuleStmt -{ - NodeTag type; - RangeVar *relation; /* relation the rule is for */ - char *rulename; /* name of the rule */ - Node *whereClause; /* qualifications */ - CmdType event; /* SELECT, INSERT, etc */ - bool instead; /* is a 'do instead'? */ - List *actions; /* the action statements */ -} RuleStmt; - -/* ---------------------- - * Notify Statement - * ---------------------- - */ -typedef struct NotifyStmt -{ - NodeTag type; - RangeVar *relation; /* qualified name to notify */ -} NotifyStmt; - -/* ---------------------- - * Listen Statement - * ---------------------- - */ -typedef struct ListenStmt -{ - NodeTag type; - RangeVar *relation; /* qualified name to listen on */ -} ListenStmt; - -/* ---------------------- - * Unlisten Statement - * ---------------------- - */ -typedef struct UnlistenStmt -{ - NodeTag type; - RangeVar *relation; /* qualified name to unlisten on, or '*' */ -} UnlistenStmt; - -/* ---------------------- - * {Begin|Abort|End} Transaction Statement - * ---------------------- - */ -typedef struct TransactionStmt -{ - NodeTag type; - int command; /* BEGIN|END|ABORT */ -} TransactionStmt; - -/* ---------------------- - * Create View Statement - * ---------------------- - */ -typedef struct ViewStmt -{ - NodeTag type; - RangeVar *view; /* the view to be created */ - List *aliases; /* target column names */ - Query *query; /* the SQL statement */ -} ViewStmt; - -/* ---------------------- - * Load Statement - * ---------------------- - */ -typedef struct LoadStmt -{ - NodeTag type; - char *filename; /* file to load */ -} LoadStmt; - -/* ---------------------- - * Createdb Statement - * ---------------------- - */ -typedef struct CreatedbStmt -{ - NodeTag type; - char *dbname; /* name of database to create */ - List *options; /* List of DefElem nodes */ -} CreatedbStmt; - -/* ---------------------- - * Alter Database - * ---------------------- - */ -typedef struct AlterDatabaseSetStmt -{ - NodeTag type; - char *dbname; - char *variable; - List *value; -} AlterDatabaseSetStmt; - -/* ---------------------- - * Dropdb Statement - * ---------------------- - */ -typedef struct DropdbStmt -{ - NodeTag type; - char *dbname; /* database to drop */ -} DropdbStmt; - -/* ---------------------- - * Cluster Statement (support pbrown's cluster index implementation) - * ---------------------- - */ -typedef struct ClusterStmt -{ - NodeTag type; - RangeVar *relation; /* relation being indexed */ - char *indexname; /* original index defined */ -} ClusterStmt; - -/* ---------------------- - * Vacuum and Analyze Statements - * - * Even though these are nominally two statements, it's convenient to use - * just one node type for both. - * ---------------------- - */ -typedef struct VacuumStmt -{ - NodeTag type; - bool vacuum; /* do VACUUM step */ - bool full; /* do FULL (non-concurrent) vacuum */ - bool analyze; /* do ANALYZE step */ - bool freeze; /* early-freeze option */ - bool verbose; /* print progress info */ - RangeVar *relation; /* single table to process, or NULL */ - List *va_cols; /* list of column names, or NIL for all */ -} VacuumStmt; - -/* ---------------------- - * Explain Statement - * ---------------------- - */ -typedef struct ExplainStmt -{ - NodeTag type; - Query *query; /* the query */ - bool verbose; /* print plan info */ - bool analyze; /* get statistics by executing plan */ -} ExplainStmt; - -/* ---------------------- - * Checkpoint Statement - * ---------------------- - */ -typedef struct CheckPointStmt -{ - NodeTag type; -} CheckPointStmt; - -/* ---------------------- - * Set Statement - * ---------------------- - */ - -typedef struct VariableSetStmt -{ - NodeTag type; - char *name; - List *args; - bool is_local; /* SET LOCAL */ -} VariableSetStmt; - -/* ---------------------- - * Show Statement - * ---------------------- - */ - -typedef struct VariableShowStmt -{ - NodeTag type; - char *name; -} VariableShowStmt; - -/* ---------------------- - * Reset Statement - * ---------------------- - */ - -typedef struct VariableResetStmt -{ - NodeTag type; - char *name; -} VariableResetStmt; - -/* ---------------------- - * LOCK Statement - * ---------------------- - */ -typedef struct LockStmt -{ - NodeTag type; - List *relations; /* relations to lock */ - int mode; /* lock mode */ -} LockStmt; - -/* ---------------------- - * SET CONSTRAINTS Statement - * ---------------------- - */ -typedef struct ConstraintsSetStmt -{ - NodeTag type; - List *constraints; /* List of names as Value strings */ - bool deferred; -} ConstraintsSetStmt; - -/* ---------------------- - * REINDEX Statement - * ---------------------- - */ -typedef struct ReindexStmt -{ - NodeTag type; - int reindexType; /* INDEX|TABLE|DATABASE */ - RangeVar *relation; /* Table or index to reindex */ - const char *name; /* name of database to reindex */ - bool force; - bool all; -} ReindexStmt; - -#endif /* PARSENODES_H */ |