PostgreSQL Source Code git master
Loading...
Searching...
No Matches
dest.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * dest.c
4 * support for communication destinations
5 *
6 *
7 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * IDENTIFICATION
11 * src/backend/tcop/dest.c
12 *
13 *-------------------------------------------------------------------------
14 */
15/*
16 * INTERFACE ROUTINES
17 * BeginCommand - initialize the destination at start of command
18 * CreateDestReceiver - create tuple receiver object for destination
19 * EndCommand - clean up the destination at end of command
20 * NullCommand - tell dest that an empty query string was recognized
21 * ReadyForQuery - tell dest that we are ready for a new query
22 *
23 * NOTES
24 * These routines do the appropriate work before and after
25 * tuples are returned by a query to keep the backend and the
26 * "destination" portals synchronized.
27 */
28
29#include "postgres.h"
30
31#include "access/printsimple.h"
32#include "access/printtup.h"
33#include "access/xact.h"
34#include "commands/copy.h"
35#include "commands/createas.h"
36#include "commands/explain_dr.h"
37#include "commands/matview.h"
38#include "executor/functions.h"
39#include "executor/tqueue.h"
41#include "libpq/libpq.h"
42#include "libpq/pqformat.h"
43
44
45/* ----------------
46 * dummy DestReceiver functions
47 * ----------------
48 */
49static bool
51{
52 return true;
53}
54
55static void
57{
58}
59
60static void
62{
63 /* this is used for both shutdown and destroy methods */
64}
65
66/* ----------------
67 * static DestReceiver structs for dest types needing no local state
68 * ----------------
69 */
74
79
84
89
90/*
91 * Globally available receiver for DestNone.
92 *
93 * It's ok to cast the constness away as any modification of the none receiver
94 * would be a bug (which gets easier to catch this way).
95 */
97
98/* ----------------
99 * BeginCommand - initialize the destination at start of command
100 * ----------------
101 */
102void
104{
105 /* Nothing to do at present */
106}
107
108/* ----------------
109 * CreateDestReceiver - return appropriate receiver function set for dest
110 * ----------------
111 */
114{
115 /*
116 * It's ok to cast the constness away as any modification of the none
117 * receiver would be a bug (which gets easier to catch this way).
118 */
119
120 switch (dest)
121 {
122 case DestRemote:
124 return printtup_create_DR(dest);
125
126 case DestRemoteSimple:
128
129 case DestNone:
131
132 case DestDebug:
134
135 case DestSPI:
137
138 case DestTuplestore:
140
141 case DestIntoRel:
143
144 case DestCopyOut:
145 return CreateCopyDestReceiver();
146
147 case DestSQLFunction:
149
150 case DestTransientRel:
152
153 case DestTupleQueue:
155
158 }
159
160 /* should never get here */
162}
163
164/* ----------------
165 * EndCommand - clean up the destination at end of command
166 * ----------------
167 */
168void
170{
172 Size len;
173
174 switch (dest)
175 {
176 case DestRemote:
178 case DestRemoteSimple:
179
183 break;
184
185 case DestNone:
186 case DestDebug:
187 case DestSPI:
188 case DestTuplestore:
189 case DestIntoRel:
190 case DestCopyOut:
191 case DestSQLFunction:
192 case DestTransientRel:
193 case DestTupleQueue:
195 break;
196 }
197}
198
199/* ----------------
200 * EndReplicationCommand - stripped down version of EndCommand
201 *
202 * For use by replication commands.
203 * ----------------
204 */
205void
206EndReplicationCommand(const char *commandTag)
207{
208 pq_putmessage(PqMsg_CommandComplete, commandTag, strlen(commandTag) + 1);
209}
210
211/* ----------------
212 * NullCommand - tell dest that an empty query string was recognized
213 *
214 * This ensures that there will be a recognizable end to the response
215 * to an Execute message in the extended query protocol.
216 * ----------------
217 */
218void
220{
221 switch (dest)
222 {
223 case DestRemote:
225 case DestRemoteSimple:
226
227 /* Tell the FE that we saw an empty query string */
229 break;
230
231 case DestNone:
232 case DestDebug:
233 case DestSPI:
234 case DestTuplestore:
235 case DestIntoRel:
236 case DestCopyOut:
237 case DestSQLFunction:
238 case DestTransientRel:
239 case DestTupleQueue:
241 break;
242 }
243}
244
245/* ----------------
246 * ReadyForQuery - tell dest that we are ready for a new query
247 *
248 * The ReadyForQuery message is sent so that the FE can tell when
249 * we are done processing a query string.
250 * In versions 3.0 and up, it also carries a transaction state indicator.
251 *
252 * Note that by flushing the stdio buffer here, we can avoid doing it
253 * most other places and thus reduce the number of separate packets sent.
254 * ----------------
255 */
256void
258{
259 switch (dest)
260 {
261 case DestRemote:
263 case DestRemoteSimple:
264 {
266
270 }
271 /* Flush output at end of cycle in any case. */
272 pq_flush();
273 break;
274
275 case DestNone:
276 case DestDebug:
277 case DestSPI:
278 case DestTuplestore:
279 case DestIntoRel:
280 case DestCopyOut:
281 case DestSQLFunction:
282 case DestTransientRel:
283 case DestTupleQueue:
285 break;
286 }
287}
#define unconstify(underlying_type, expr)
Definition c.h:1262
#define pg_unreachable()
Definition c.h:353
size_t Size
Definition c.h:631
Size BuildQueryCompletionString(char *buff, const QueryCompletion *qc, bool nameonly)
Definition cmdtag.c:121
#define COMPLETION_TAG_BUFSIZE
Definition cmdtag.h:17
CommandTag
Definition cmdtag.h:23
DestReceiver * CreateCopyDestReceiver(void)
Definition copyto.c:1530
DestReceiver * CreateIntoRelDestReceiver(IntoClause *intoClause)
Definition createas.c:440
void EndCommand(const QueryCompletion *qc, CommandDest dest, bool force_undecorated_output)
Definition dest.c:169
static const DestReceiver spi_printtupDR
Definition dest.c:85
DestReceiver * CreateDestReceiver(CommandDest dest)
Definition dest.c:113
static void donothingStartup(DestReceiver *self, int operation, TupleDesc typeinfo)
Definition dest.c:56
static void donothingCleanup(DestReceiver *self)
Definition dest.c:61
void BeginCommand(CommandTag commandTag, CommandDest dest)
Definition dest.c:103
static const DestReceiver debugtupDR
Definition dest.c:75
static const DestReceiver donothingDR
Definition dest.c:70
void ReadyForQuery(CommandDest dest)
Definition dest.c:257
static bool donothingReceive(TupleTableSlot *slot, DestReceiver *self)
Definition dest.c:50
void EndReplicationCommand(const char *commandTag)
Definition dest.c:206
DestReceiver * None_Receiver
Definition dest.c:96
static const DestReceiver printsimpleDR
Definition dest.c:80
void NullCommand(CommandDest dest)
Definition dest.c:219
CommandDest
Definition dest.h:86
@ DestSQLFunction
Definition dest.h:96
@ DestTupleQueue
Definition dest.h:98
@ DestTuplestore
Definition dest.h:93
@ DestRemote
Definition dest.h:89
@ DestDebug
Definition dest.h:88
@ DestExplainSerialize
Definition dest.h:99
@ DestRemoteSimple
Definition dest.h:91
@ DestCopyOut
Definition dest.h:95
@ DestTransientRel
Definition dest.h:97
@ DestSPI
Definition dest.h:92
@ DestIntoRel
Definition dest.h:94
@ DestRemoteExecute
Definition dest.h:90
@ DestNone
Definition dest.h:87
DestReceiver * CreateExplainSerializeDestReceiver(ExplainState *es)
Definition explain_dr.c:275
DestReceiver * CreateSQLFunctionDestReceiver(void)
Definition functions.c:2617
#define pq_flush()
Definition libpq.h:49
#define pq_putmessage(msgtype, s, len)
Definition libpq.h:52
DestReceiver * CreateTransientRelDestReceiver(Oid transientoid)
Definition matview.c:464
const void size_t len
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define InvalidOid
void pq_putemptymessage(char msgtype)
Definition pqformat.c:387
void pq_endmessage(StringInfo buf)
Definition pqformat.c:296
void pq_beginmessage(StringInfo buf, char msgtype)
Definition pqformat.c:88
static void pq_sendbyte(StringInfo buf, uint8 byt)
Definition pqformat.h:160
static int fb(int x)
void printsimple_startup(DestReceiver *self, int operation, TupleDesc tupdesc)
Definition printsimple.c:32
bool printsimple(TupleTableSlot *slot, DestReceiver *self)
Definition printsimple.c:60
bool debugtup(TupleTableSlot *slot, DestReceiver *self)
Definition printtup.c:463
void debugStartup(DestReceiver *self, int operation, TupleDesc typeinfo)
Definition printtup.c:445
DestReceiver * printtup_create_DR(CommandDest dest)
Definition printtup.c:72
#define PqMsg_ReadyForQuery
Definition protocol.h:55
#define PqMsg_EmptyQueryResponse
Definition protocol.h:47
#define PqMsg_CommandComplete
Definition protocol.h:42
bool spi_printtup(TupleTableSlot *slot, DestReceiver *self)
Definition spi.c:2170
void spi_dest_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
Definition spi.c:2123
DestReceiver * CreateTupleQueueDestReceiver(shm_mq_handle *handle)
Definition tqueue.c:119
DestReceiver * CreateTuplestoreDestReceiver(void)
char TransactionBlockStatusCode(void)
Definition xact.c:5025