]> granicus.if.org Git - postgresql/blob - src/include/utils/portal.h
Remove cvs keywords from all files.
[postgresql] / src / include / utils / portal.h
1 /*-------------------------------------------------------------------------
2  *
3  * portal.h
4  *        POSTGRES portal definitions.
5  *
6  * A portal is an abstraction which represents the execution state of
7  * a running or runnable query.  Portals support both SQL-level CURSORs
8  * and protocol-level portals.
9  *
10  * Scrolling (nonsequential access) and suspension of execution are allowed
11  * only for portals that contain a single SELECT-type query.  We do not want
12  * to let the client suspend an update-type query partway through!      Because
13  * the query rewriter does not allow arbitrary ON SELECT rewrite rules,
14  * only queries that were originally update-type could produce multiple
15  * plan trees; so the restriction to a single query is not a problem
16  * in practice.
17  *
18  * For SQL cursors, we support three kinds of scroll behavior:
19  *
20  * (1) Neither NO SCROLL nor SCROLL was specified: to remain backward
21  *         compatible, we allow backward fetches here, unless it would
22  *         impose additional runtime overhead to do so.
23  *
24  * (2) NO SCROLL was specified: don't allow any backward fetches.
25  *
26  * (3) SCROLL was specified: allow all kinds of backward fetches, even
27  *         if we need to take a performance hit to do so.  (The planner sticks
28  *         a Materialize node atop the query plan if needed.)
29  *
30  * Case #1 is converted to #2 or #3 by looking at the query itself and
31  * determining if scrollability can be supported without additional
32  * overhead.
33  *
34  * Protocol-level portals have no nonsequential-fetch API and so the
35  * distinction doesn't matter for them.  They are always initialized
36  * to look like NO SCROLL cursors.
37  *
38  *
39  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
40  * Portions Copyright (c) 1994, Regents of the University of California
41  *
42  * src/include/utils/portal.h
43  *
44  *-------------------------------------------------------------------------
45  */
46 #ifndef PORTAL_H
47 #define PORTAL_H
48
49 #include "executor/execdesc.h"
50 #include "utils/resowner.h"
51 #include "utils/timestamp.h"
52
53 /*
54  * We have several execution strategies for Portals, depending on what
55  * query or queries are to be executed.  (Note: in all cases, a Portal
56  * executes just a single source-SQL query, and thus produces just a
57  * single result from the user's viewpoint.  However, the rule rewriter
58  * may expand the single source query to zero or many actual queries.)
59  *
60  * PORTAL_ONE_SELECT: the portal contains one single SELECT query.      We run
61  * the Executor incrementally as results are demanded.  This strategy also
62  * supports holdable cursors (the Executor results can be dumped into a
63  * tuplestore for access after transaction completion).
64  *
65  * PORTAL_ONE_RETURNING: the portal contains a single INSERT/UPDATE/DELETE
66  * query with a RETURNING clause (plus possibly auxiliary queries added by
67  * rule rewriting).  On first execution, we run the portal to completion
68  * and dump the primary query's results into the portal tuplestore; the
69  * results are then returned to the client as demanded.  (We can't support
70  * suspension of the query partway through, because the AFTER TRIGGER code
71  * can't cope, and also because we don't want to risk failing to execute
72  * all the auxiliary queries.)
73  *
74  * PORTAL_UTIL_SELECT: the portal contains a utility statement that returns
75  * a SELECT-like result (for example, EXPLAIN or SHOW).  On first execution,
76  * we run the statement and dump its results into the portal tuplestore;
77  * the results are then returned to the client as demanded.
78  *
79  * PORTAL_MULTI_QUERY: all other cases.  Here, we do not support partial
80  * execution: the portal's queries will be run to completion on first call.
81  */
82 typedef enum PortalStrategy
83 {
84         PORTAL_ONE_SELECT,
85         PORTAL_ONE_RETURNING,
86         PORTAL_UTIL_SELECT,
87         PORTAL_MULTI_QUERY
88 } PortalStrategy;
89
90 /*
91  * A portal is always in one of these states.  It is possible to transit
92  * from ACTIVE back to READY if the query is not run to completion;
93  * otherwise we never back up in status.
94  */
95 typedef enum PortalStatus
96 {
97         PORTAL_NEW,                                     /* freshly created */
98         PORTAL_DEFINED,                         /* PortalDefineQuery done */
99         PORTAL_READY,                           /* PortalStart complete, can run it */
100         PORTAL_ACTIVE,                          /* portal is running (can't delete it) */
101         PORTAL_DONE,                            /* portal is finished (don't re-run it) */
102         PORTAL_FAILED                           /* portal got error (can't re-run it) */
103 } PortalStatus;
104
105 typedef struct PortalData *Portal;
106
107 typedef struct PortalData
108 {
109         /* Bookkeeping data */
110         const char *name;                       /* portal's name */
111         const char *prepStmtName;       /* source prepared statement (NULL if none) */
112         MemoryContext heap;                     /* subsidiary memory for portal */
113         ResourceOwner resowner;         /* resources owned by portal */
114         void            (*cleanup) (Portal portal);             /* cleanup hook */
115         SubTransactionId createSubid;           /* the ID of the creating subxact */
116
117         /*
118          * if createSubid is InvalidSubTransactionId, the portal is held over from
119          * a previous transaction
120          */
121
122         /* The query or queries the portal will execute */
123         const char *sourceText;         /* text of query (as of 8.4, never NULL) */
124         const char *commandTag;         /* command tag for original query */
125         List       *stmts;                      /* PlannedStmts and/or utility statements */
126         CachedPlan *cplan;                      /* CachedPlan, if stmts are from one */
127
128         ParamListInfo portalParams; /* params to pass to query */
129
130         /* Features/options */
131         PortalStrategy strategy;        /* see above */
132         int                     cursorOptions;  /* DECLARE CURSOR option bits */
133
134         /* Status data */
135         PortalStatus status;            /* see above */
136         bool            portalPinned;   /* a pinned portal can't be dropped */
137
138         /* If not NULL, Executor is active; call ExecutorEnd eventually: */
139         QueryDesc  *queryDesc;          /* info needed for executor invocation */
140
141         /* If portal returns tuples, this is their tupdesc: */
142         TupleDesc       tupDesc;                /* descriptor for result tuples */
143         /* and these are the format codes to use for the columns: */
144         int16      *formats;            /* a format code for each column */
145
146         /*
147          * Where we store tuples for a held cursor or a PORTAL_ONE_RETURNING or
148          * PORTAL_UTIL_SELECT query.  (A cursor held past the end of its
149          * transaction no longer has any active executor state.)
150          */
151         Tuplestorestate *holdStore; /* store for holdable cursors */
152         MemoryContext holdContext;      /* memory containing holdStore */
153
154         /*
155          * atStart, atEnd and portalPos indicate the current cursor position.
156          * portalPos is zero before the first row, N after fetching N'th row of
157          * query.  After we run off the end, portalPos = # of rows in query, and
158          * atEnd is true.  If portalPos overflows, set posOverflow (this causes us
159          * to stop relying on its value for navigation).  Note that atStart
160          * implies portalPos == 0, but not the reverse (portalPos could have
161          * overflowed).
162          */
163         bool            atStart;
164         bool            atEnd;
165         bool            posOverflow;
166         long            portalPos;
167
168         /* Presentation data, primarily used by the pg_cursors system view */
169         TimestampTz creation_time;      /* time at which this portal was defined */
170         bool            visible;                /* include this portal in pg_cursors? */
171 } PortalData;
172
173 /*
174  * PortalIsValid
175  *              True iff portal is valid.
176  */
177 #define PortalIsValid(p) PointerIsValid(p)
178
179 /*
180  * Access macros for Portal ... use these in preference to field access.
181  */
182 #define PortalGetQueryDesc(portal)      ((portal)->queryDesc)
183 #define PortalGetHeapMemory(portal) ((portal)->heap)
184 #define PortalGetPrimaryStmt(portal) PortalListGetPrimaryStmt((portal)->stmts)
185
186
187 /* Prototypes for functions in utils/mmgr/portalmem.c */
188 extern void EnablePortalManager(void);
189 extern bool CommitHoldablePortals(void);
190 extern bool PrepareHoldablePortals(void);
191 extern void AtCommit_Portals(void);
192 extern void AtAbort_Portals(void);
193 extern void AtCleanup_Portals(void);
194 extern void AtSubCommit_Portals(SubTransactionId mySubid,
195                                         SubTransactionId parentSubid,
196                                         ResourceOwner parentXactOwner);
197 extern void AtSubAbort_Portals(SubTransactionId mySubid,
198                                    SubTransactionId parentSubid,
199                                    ResourceOwner parentXactOwner);
200 extern void AtSubCleanup_Portals(SubTransactionId mySubid);
201 extern Portal CreatePortal(const char *name, bool allowDup, bool dupSilent);
202 extern Portal CreateNewPortal(void);
203 extern void PinPortal(Portal portal);
204 extern void UnpinPortal(Portal portal);
205 extern void PortalDrop(Portal portal, bool isTopCommit);
206 extern Portal GetPortalByName(const char *name);
207 extern void PortalDefineQuery(Portal portal,
208                                   const char *prepStmtName,
209                                   const char *sourceText,
210                                   const char *commandTag,
211                                   List *stmts,
212                                   CachedPlan *cplan);
213 extern Node *PortalListGetPrimaryStmt(List *stmts);
214 extern void PortalCreateHoldStore(Portal portal);
215 extern void PortalHashTableDeleteAll(void);
216
217 #endif   /* PORTAL_H */