| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * dest.h |
| 4 | * support for communication destinations |
| 5 | * |
| 6 | * Whenever the backend executes a query that returns tuples, the results |
| 7 | * have to go someplace. For example: |
| 8 | * |
| 9 | * - stdout is the destination only when we are running a |
| 10 | * standalone backend (no postmaster) and are returning results |
| 11 | * back to an interactive user. |
| 12 | * |
| 13 | * - a remote process is the destination when we are |
| 14 | * running a backend with a frontend and the frontend executes |
| 15 | * PQexec() or PQfn(). In this case, the results are sent |
| 16 | * to the frontend via the functions in backend/libpq. |
| 17 | * |
| 18 | * - DestNone is the destination when the system executes |
| 19 | * a query internally. The results are discarded. |
| 20 | * |
| 21 | * dest.c defines three functions that implement destination management: |
| 22 | * |
| 23 | * BeginCommand: initialize the destination at start of command. |
| 24 | * CreateDestReceiver: return a pointer to a struct of destination-specific |
| 25 | * receiver functions. |
| 26 | * EndCommand: clean up the destination at end of command. |
| 27 | * |
| 28 | * BeginCommand/EndCommand are executed once per received SQL query. |
| 29 | * |
| 30 | * CreateDestReceiver returns a receiver object appropriate to the specified |
| 31 | * destination. The executor, as well as utility statements that can return |
| 32 | * tuples, are passed the resulting DestReceiver* pointer. Each executor run |
| 33 | * or utility execution calls the receiver's rStartup method, then the |
| 34 | * receiveSlot method (zero or more times), then the rShutdown method. |
| 35 | * The same receiver object may be re-used multiple times; eventually it is |
| 36 | * destroyed by calling its rDestroy method. |
| 37 | * |
| 38 | * In some cases, receiver objects require additional parameters that must |
| 39 | * be passed to them after calling CreateDestReceiver. Since the set of |
| 40 | * parameters varies for different receiver types, this is not handled by |
| 41 | * this module, but by direct calls from the calling code to receiver type |
| 42 | * specific functions. |
| 43 | * |
| 44 | * The DestReceiver object returned by CreateDestReceiver may be a statically |
| 45 | * allocated object (for destination types that require no local state), |
| 46 | * in which case rDestroy is a no-op. Alternatively it can be a palloc'd |
| 47 | * object that has DestReceiver as its first field and contains additional |
| 48 | * fields (see printtup.c for an example). These additional fields are then |
| 49 | * accessible to the DestReceiver functions by casting the DestReceiver* |
| 50 | * pointer passed to them. The palloc'd object is pfree'd by the rDestroy |
| 51 | * method. Note that the caller of CreateDestReceiver should take care to |
| 52 | * do so in a memory context that is long-lived enough for the receiver |
| 53 | * object not to disappear while still needed. |
| 54 | * |
| 55 | * Special provision: None_Receiver is a permanently available receiver |
| 56 | * object for the DestNone destination. This avoids useless creation/destroy |
| 57 | * calls in portal and cursor manipulations. |
| 58 | * |
| 59 | * |
| 60 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
| 61 | * Portions Copyright (c) 1994, Regents of the University of California |
| 62 | * |
| 63 | * src/include/tcop/dest.h |
| 64 | * |
| 65 | *------------------------------------------------------------------------- |
| 66 | */ |
| 67 | #ifndef DEST_H |
| 68 | #define DEST_H |
| 69 | |
| 70 | #include "executor/tuptable.h" |
| 71 | |
| 72 | |
| 73 | /* buffer size to use for command completion tags */ |
| 74 | #define COMPLETION_TAG_BUFSIZE 64 |
| 75 | |
| 76 | |
| 77 | /* ---------------- |
| 78 | * CommandDest is a simplistic means of identifying the desired |
| 79 | * destination. Someday this will probably need to be improved. |
| 80 | * |
| 81 | * Note: only the values DestNone, DestDebug, DestRemote are legal for the |
| 82 | * global variable whereToSendOutput. The other values may be used |
| 83 | * as the destination for individual commands. |
| 84 | * ---------------- |
| 85 | */ |
| 86 | typedef enum |
| 87 | { |
| 88 | DestNone, /* results are discarded */ |
| 89 | DestDebug, /* results go to debugging output */ |
| 90 | DestRemote, /* results sent to frontend process */ |
| 91 | DestRemoteExecute, /* sent to frontend, in Execute command */ |
| 92 | DestRemoteSimple, /* sent to frontend, w/no catalog access */ |
| 93 | DestSPI, /* results sent to SPI manager */ |
| 94 | DestTuplestore, /* results sent to Tuplestore */ |
| 95 | DestIntoRel, /* results sent to relation (SELECT INTO) */ |
| 96 | DestCopyOut, /* results sent to COPY TO code */ |
| 97 | DestSQLFunction, /* results sent to SQL-language func mgr */ |
| 98 | DestTransientRel, /* results sent to transient relation */ |
| 99 | DestTupleQueue /* results sent to tuple queue */ |
| 100 | } CommandDest; |
| 101 | |
| 102 | /* ---------------- |
| 103 | * DestReceiver is a base type for destination-specific local state. |
| 104 | * In the simplest cases, there is no state info, just the function |
| 105 | * pointers that the executor must call. |
| 106 | * |
| 107 | * Note: the receiveSlot routine must be passed a slot containing a TupleDesc |
| 108 | * identical to the one given to the rStartup routine. It returns bool where |
| 109 | * a "true" value means "continue processing" and a "false" value means |
| 110 | * "stop early, just as if we'd reached the end of the scan". |
| 111 | * ---------------- |
| 112 | */ |
| 113 | typedef struct _DestReceiver DestReceiver; |
| 114 | |
| 115 | struct _DestReceiver |
| 116 | { |
| 117 | /* Called for each tuple to be output: */ |
| 118 | bool (*receiveSlot) (TupleTableSlot *slot, |
| 119 | DestReceiver *self); |
| 120 | /* Per-executor-run initialization and shutdown: */ |
| 121 | void (*rStartup) (DestReceiver *self, |
| 122 | int operation, |
| 123 | TupleDesc typeinfo); |
| 124 | void (*rShutdown) (DestReceiver *self); |
| 125 | /* Destroy the receiver object itself (if dynamically allocated) */ |
| 126 | void (*rDestroy) (DestReceiver *self); |
| 127 | /* CommandDest code for this receiver */ |
| 128 | CommandDest mydest; |
| 129 | /* Private fields might appear beyond this point... */ |
| 130 | }; |
| 131 | |
| 132 | extern PGDLLIMPORT DestReceiver *None_Receiver; /* permanent receiver for |
| 133 | * DestNone */ |
| 134 | |
| 135 | /* The primary destination management functions */ |
| 136 | |
| 137 | extern void BeginCommand(const char *commandTag, CommandDest dest); |
| 138 | extern DestReceiver *CreateDestReceiver(CommandDest dest); |
| 139 | extern void EndCommand(const char *commandTag, CommandDest dest); |
| 140 | |
| 141 | /* Additional functions that go with destination management, more or less. */ |
| 142 | |
| 143 | extern void NullCommand(CommandDest dest); |
| 144 | extern void ReadyForQuery(CommandDest dest); |
| 145 | |
| 146 | #endif /* DEST_H */ |
| 147 | |