PostgreSQL Source Code git master
fe-exec.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * fe-exec.c
4 * functions related to sending a query down to the backend
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/interfaces/libpq/fe-exec.c
12 *
13 *-------------------------------------------------------------------------
14 */
15#include "postgres_fe.h"
16
17#include <ctype.h>
18#include <fcntl.h>
19#include <limits.h>
20
21#ifdef WIN32
22#include "win32.h"
23#else
24#include <unistd.h>
25#endif
26
27#include "common/int.h"
28#include "libpq-fe.h"
29#include "libpq-int.h"
30#include "mb/pg_wchar.h"
31
32/* keep this in same order as ExecStatusType in libpq-fe.h */
33char *const pgresStatus[] = {
34 "PGRES_EMPTY_QUERY",
35 "PGRES_COMMAND_OK",
36 "PGRES_TUPLES_OK",
37 "PGRES_COPY_OUT",
38 "PGRES_COPY_IN",
39 "PGRES_BAD_RESPONSE",
40 "PGRES_NONFATAL_ERROR",
41 "PGRES_FATAL_ERROR",
42 "PGRES_COPY_BOTH",
43 "PGRES_SINGLE_TUPLE",
44 "PGRES_PIPELINE_SYNC",
45 "PGRES_PIPELINE_ABORTED",
46 "PGRES_TUPLES_CHUNK"
47};
48
49/* We return this if we're unable to make a PGresult at all */
50static const PGresult OOM_result = {
52 .client_encoding = PG_SQL_ASCII,
53 .errMsg = "out of memory\n",
54};
55
56/*
57 * static state needed by PQescapeString and PQescapeBytea; initialize to
58 * values that result in backward-compatible behavior
59 */
61static bool static_std_strings = false;
62
63
64static PGEvent *dupEvents(PGEvent *events, int count, size_t *memSize);
65static bool pqAddTuple(PGresult *res, PGresAttValue *tup,
66 const char **errmsgp);
67static int PQsendQueryInternal(PGconn *conn, const char *query, bool newQuery);
68static bool PQsendQueryStart(PGconn *conn, bool newQuery);
69static int PQsendQueryGuts(PGconn *conn,
70 const char *command,
71 const char *stmtName,
72 int nParams,
73 const Oid *paramTypes,
74 const char *const *paramValues,
75 const int *paramLengths,
76 const int *paramFormats,
77 int resultFormat);
78static void parseInput(PGconn *conn);
80static bool PQexecStart(PGconn *conn);
82static int PQsendTypedCommand(PGconn *conn, char command, char type,
83 const char *target);
84static int check_field_number(const PGresult *res, int field_num);
86static int pqPipelineSyncInternal(PGconn *conn, bool immediate_flush);
87static int pqPipelineFlush(PGconn *conn);
88
89
90/* ----------------
91 * Space management for PGresult.
92 *
93 * Formerly, libpq did a separate malloc() for each field of each tuple
94 * returned by a query. This was remarkably expensive --- malloc/free
95 * consumed a sizable part of the application's runtime. And there is
96 * no real need to keep track of the fields separately, since they will
97 * all be freed together when the PGresult is released. So now, we grab
98 * large blocks of storage from malloc and allocate space for query data
99 * within these blocks, using a trivially simple allocator. This reduces
100 * the number of malloc/free calls dramatically, and it also avoids
101 * fragmentation of the malloc storage arena.
102 * The PGresult structure itself is still malloc'd separately. We could
103 * combine it with the first allocation block, but that would waste space
104 * for the common case that no extra storage is actually needed (that is,
105 * the SQL command did not return tuples).
106 *
107 * We also malloc the top-level array of tuple pointers separately, because
108 * we need to be able to enlarge it via realloc, and our trivial space
109 * allocator doesn't handle that effectively. (Too bad the FE/BE protocol
110 * doesn't tell us up front how many tuples will be returned.)
111 * All other subsidiary storage for a PGresult is kept in PGresult_data blocks
112 * of size PGRESULT_DATA_BLOCKSIZE. The overhead at the start of each block
113 * is just a link to the next one, if any. Free-space management info is
114 * kept in the owning PGresult.
115 * A query returning a small amount of data will thus require three malloc
116 * calls: one for the PGresult, one for the tuples pointer array, and one
117 * PGresult_data block.
118 *
119 * Only the most recently allocated PGresult_data block is a candidate to
120 * have more stuff added to it --- any extra space left over in older blocks
121 * is wasted. We could be smarter and search the whole chain, but the point
122 * here is to be simple and fast. Typical applications do not keep a PGresult
123 * around very long anyway, so some wasted space within one is not a problem.
124 *
125 * Tuning constants for the space allocator are:
126 * PGRESULT_DATA_BLOCKSIZE: size of a standard allocation block, in bytes
127 * PGRESULT_ALIGN_BOUNDARY: assumed alignment requirement for binary data
128 * PGRESULT_SEP_ALLOC_THRESHOLD: objects bigger than this are given separate
129 * blocks, instead of being crammed into a regular allocation block.
130 * Requirements for correct function are:
131 * PGRESULT_ALIGN_BOUNDARY must be a multiple of the alignment requirements
132 * of all machine data types. (Currently this is set from configure
133 * tests, so it should be OK automatically.)
134 * PGRESULT_SEP_ALLOC_THRESHOLD + PGRESULT_BLOCK_OVERHEAD <=
135 * PGRESULT_DATA_BLOCKSIZE
136 * pqResultAlloc assumes an object smaller than the threshold will fit
137 * in a new block.
138 * The amount of space wasted at the end of a block could be as much as
139 * PGRESULT_SEP_ALLOC_THRESHOLD, so it doesn't pay to make that too large.
140 * ----------------
141 */
142
143#define PGRESULT_DATA_BLOCKSIZE 2048
144#define PGRESULT_ALIGN_BOUNDARY MAXIMUM_ALIGNOF /* from configure */
145#define PGRESULT_BLOCK_OVERHEAD Max(sizeof(PGresult_data), PGRESULT_ALIGN_BOUNDARY)
146#define PGRESULT_SEP_ALLOC_THRESHOLD (PGRESULT_DATA_BLOCKSIZE / 2)
147
148
149/*
150 * PQmakeEmptyPGresult
151 * returns a newly allocated, initialized PGresult with given status.
152 * If conn is not NULL and status indicates an error, the conn's
153 * errorMessage is copied. Also, any PGEvents are copied from the conn.
154 *
155 * Note: the logic to copy the conn's errorMessage is now vestigial;
156 * no internal caller uses it. However, that behavior is documented for
157 * outside callers, so we'd better keep it.
158 */
159PGresult *
161{
162 PGresult *result;
163
164 result = (PGresult *) malloc(sizeof(PGresult));
165 if (!result)
166 return NULL;
167
168 result->ntups = 0;
169 result->numAttributes = 0;
170 result->attDescs = NULL;
171 result->tuples = NULL;
172 result->tupArrSize = 0;
173 result->numParameters = 0;
174 result->paramDescs = NULL;
175 result->resultStatus = status;
176 result->cmdStatus[0] = '\0';
177 result->binary = 0;
178 result->events = NULL;
179 result->nEvents = 0;
180 result->errMsg = NULL;
181 result->errFields = NULL;
182 result->errQuery = NULL;
183 result->null_field[0] = '\0';
184 result->curBlock = NULL;
185 result->curOffset = 0;
186 result->spaceLeft = 0;
187 result->memorySize = sizeof(PGresult);
188
189 if (conn)
190 {
191 /* copy connection data we might need for operations on PGresult */
192 result->noticeHooks = conn->noticeHooks;
194
195 /* consider copying conn's errorMessage */
196 switch (status)
197 {
199 case PGRES_COMMAND_OK:
200 case PGRES_TUPLES_OK:
201 case PGRES_COPY_OUT:
202 case PGRES_COPY_IN:
203 case PGRES_COPY_BOTH:
206 /* non-error cases */
207 break;
208 default:
209 /* we intentionally do not use or modify errorReported here */
210 pqSetResultError(result, &conn->errorMessage, 0);
211 break;
212 }
213
214 /* copy events last; result must be valid if we need to PQclear */
215 if (conn->nEvents > 0)
216 {
217 result->events = dupEvents(conn->events, conn->nEvents,
218 &result->memorySize);
219 if (!result->events)
220 {
221 PQclear(result);
222 return NULL;
223 }
224 result->nEvents = conn->nEvents;
225 }
226 }
227 else
228 {
229 /* defaults... */
230 result->noticeHooks.noticeRec = NULL;
231 result->noticeHooks.noticeRecArg = NULL;
232 result->noticeHooks.noticeProc = NULL;
233 result->noticeHooks.noticeProcArg = NULL;
235 }
236
237 return result;
238}
239
240/*
241 * PQsetResultAttrs
242 *
243 * Set the attributes for a given result. This function fails if there are
244 * already attributes contained in the provided result. The call is
245 * ignored if numAttributes is zero or attDescs is NULL. If the
246 * function fails, it returns zero. If the function succeeds, it
247 * returns a non-zero value.
248 */
249int
250PQsetResultAttrs(PGresult *res, int numAttributes, PGresAttDesc *attDescs)
251{
252 int i;
253
254 /* Fail if argument is NULL or OOM_result */
255 if (!res || (const PGresult *) res == &OOM_result)
256 return false;
257
258 /* If attrs already exist, they cannot be overwritten. */
259 if (res->numAttributes > 0)
260 return false;
261
262 /* ignore no-op request */
263 if (numAttributes <= 0 || !attDescs)
264 return true;
265
266 res->attDescs = (PGresAttDesc *)
267 PQresultAlloc(res, numAttributes * sizeof(PGresAttDesc));
268
269 if (!res->attDescs)
270 return false;
271
272 res->numAttributes = numAttributes;
273 memcpy(res->attDescs, attDescs, numAttributes * sizeof(PGresAttDesc));
274
275 /* deep-copy the attribute names, and determine format */
276 res->binary = 1;
277 for (i = 0; i < res->numAttributes; i++)
278 {
279 if (res->attDescs[i].name)
280 res->attDescs[i].name = pqResultStrdup(res, res->attDescs[i].name);
281 else
282 res->attDescs[i].name = res->null_field;
283
284 if (!res->attDescs[i].name)
285 return false;
286
287 if (res->attDescs[i].format == 0)
288 res->binary = 0;
289 }
290
291 return true;
292}
293
294/*
295 * PQcopyResult
296 *
297 * Returns a deep copy of the provided 'src' PGresult, which cannot be NULL.
298 * The 'flags' argument controls which portions of the result will or will
299 * NOT be copied. The created result is always put into the
300 * PGRES_TUPLES_OK status. The source result error message is not copied,
301 * although cmdStatus is.
302 *
303 * To set custom attributes, use PQsetResultAttrs. That function requires
304 * that there are no attrs contained in the result, so to use that
305 * function you cannot use the PG_COPYRES_ATTRS or PG_COPYRES_TUPLES
306 * options with this function.
307 *
308 * Options:
309 * PG_COPYRES_ATTRS - Copy the source result's attributes
310 *
311 * PG_COPYRES_TUPLES - Copy the source result's tuples. This implies
312 * copying the attrs, seeing how the attrs are needed by the tuples.
313 *
314 * PG_COPYRES_EVENTS - Copy the source result's events.
315 *
316 * PG_COPYRES_NOTICEHOOKS - Copy the source result's notice hooks.
317 */
318PGresult *
319PQcopyResult(const PGresult *src, int flags)
320{
321 PGresult *dest;
322 int i;
323
324 if (!src)
325 return NULL;
326
328 if (!dest)
329 return NULL;
330
331 /* Always copy these over. Is cmdStatus really useful here? */
332 dest->client_encoding = src->client_encoding;
333 strcpy(dest->cmdStatus, src->cmdStatus);
334
335 /* Wants attrs? */
336 if (flags & (PG_COPYRES_ATTRS | PG_COPYRES_TUPLES))
337 {
339 {
340 PQclear(dest);
341 return NULL;
342 }
343 }
344
345 /* Wants to copy tuples? */
346 if (flags & PG_COPYRES_TUPLES)
347 {
348 int tup,
349 field;
350
351 for (tup = 0; tup < src->ntups; tup++)
352 {
353 for (field = 0; field < src->numAttributes; field++)
354 {
355 if (!PQsetvalue(dest, tup, field,
356 src->tuples[tup][field].value,
357 src->tuples[tup][field].len))
358 {
359 PQclear(dest);
360 return NULL;
361 }
362 }
363 }
364 }
365
366 /* Wants to copy notice hooks? */
367 if (flags & PG_COPYRES_NOTICEHOOKS)
368 dest->noticeHooks = src->noticeHooks;
369
370 /* Wants to copy PGEvents? */
371 if ((flags & PG_COPYRES_EVENTS) && src->nEvents > 0)
372 {
373 dest->events = dupEvents(src->events, src->nEvents,
374 &dest->memorySize);
375 if (!dest->events)
376 {
377 PQclear(dest);
378 return NULL;
379 }
380 dest->nEvents = src->nEvents;
381 }
382
383 /* Okay, trigger PGEVT_RESULTCOPY event */
384 for (i = 0; i < dest->nEvents; i++)
385 {
386 /* We don't fire events that had some previous failure */
387 if (src->events[i].resultInitialized)
388 {
390
391 evt.src = src;
392 evt.dest = dest;
393 if (dest->events[i].proc(PGEVT_RESULTCOPY, &evt,
394 dest->events[i].passThrough))
395 dest->events[i].resultInitialized = true;
396 }
397 }
398
399 return dest;
400}
401
402/*
403 * Copy an array of PGEvents (with no extra space for more).
404 * Does not duplicate the event instance data, sets this to NULL.
405 * Also, the resultInitialized flags are all cleared.
406 * The total space allocated is added to *memSize.
407 */
408static PGEvent *
409dupEvents(PGEvent *events, int count, size_t *memSize)
410{
411 PGEvent *newEvents;
412 size_t msize;
413 int i;
414
415 if (!events || count <= 0)
416 return NULL;
417
418 msize = count * sizeof(PGEvent);
419 newEvents = (PGEvent *) malloc(msize);
420 if (!newEvents)
421 return NULL;
422
423 for (i = 0; i < count; i++)
424 {
425 newEvents[i].proc = events[i].proc;
426 newEvents[i].passThrough = events[i].passThrough;
427 newEvents[i].data = NULL;
428 newEvents[i].resultInitialized = false;
429 newEvents[i].name = strdup(events[i].name);
430 if (!newEvents[i].name)
431 {
432 while (--i >= 0)
433 free(newEvents[i].name);
434 free(newEvents);
435 return NULL;
436 }
437 msize += strlen(events[i].name) + 1;
438 }
439
440 *memSize += msize;
441 return newEvents;
442}
443
444
445/*
446 * Sets the value for a tuple field. The tup_num must be less than or
447 * equal to PQntuples(res). If it is equal, a new tuple is created and
448 * added to the result.
449 * Returns a non-zero value for success and zero for failure.
450 * (On failure, we report the specific problem via pqInternalNotice.)
451 */
452int
453PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len)
454{
455 PGresAttValue *attval;
456 const char *errmsg = NULL;
457
458 /* Fail if argument is NULL or OOM_result */
459 if (!res || (const PGresult *) res == &OOM_result)
460 return false;
461
462 /* Invalid field_num? */
463 if (!check_field_number(res, field_num))
464 return false;
465
466 /* Invalid tup_num, must be <= ntups */
467 if (tup_num < 0 || tup_num > res->ntups)
468 {
470 "row number %d is out of range 0..%d",
471 tup_num, res->ntups);
472 return false;
473 }
474
475 /* need to allocate a new tuple? */
476 if (tup_num == res->ntups)
477 {
478 PGresAttValue *tup;
479 int i;
480
481 tup = (PGresAttValue *)
482 pqResultAlloc(res, res->numAttributes * sizeof(PGresAttValue),
483 true);
484
485 if (!tup)
486 goto fail;
487
488 /* initialize each column to NULL */
489 for (i = 0; i < res->numAttributes; i++)
490 {
491 tup[i].len = NULL_LEN;
492 tup[i].value = res->null_field;
493 }
494
495 /* add it to the array */
496 if (!pqAddTuple(res, tup, &errmsg))
497 goto fail;
498 }
499
500 attval = &res->tuples[tup_num][field_num];
501
502 /* treat either NULL_LEN or NULL value pointer as a NULL field */
503 if (len == NULL_LEN || value == NULL)
504 {
505 attval->len = NULL_LEN;
506 attval->value = res->null_field;
507 }
508 else if (len <= 0)
509 {
510 attval->len = 0;
511 attval->value = res->null_field;
512 }
513 else
514 {
515 attval->value = (char *) pqResultAlloc(res, (size_t) len + 1, true);
516 if (!attval->value)
517 goto fail;
518 attval->len = len;
519 memcpy(attval->value, value, len);
520 attval->value[len] = '\0';
521 }
522
523 return true;
524
525 /*
526 * Report failure via pqInternalNotice. If preceding code didn't provide
527 * an error message, assume "out of memory" was meant.
528 */
529fail:
530 if (!errmsg)
531 errmsg = libpq_gettext("out of memory");
532 pqInternalNotice(&res->noticeHooks, "%s", errmsg);
533
534 return false;
535}
536
537/*
538 * pqResultAlloc - exported routine to allocate local storage in a PGresult.
539 *
540 * We force all such allocations to be maxaligned, since we don't know
541 * whether the value might be binary.
542 */
543void *
544PQresultAlloc(PGresult *res, size_t nBytes)
545{
546 /* Fail if argument is NULL or OOM_result */
547 if (!res || (const PGresult *) res == &OOM_result)
548 return NULL;
549
550 return pqResultAlloc(res, nBytes, true);
551}
552
553/*
554 * pqResultAlloc -
555 * Allocate subsidiary storage for a PGresult.
556 *
557 * nBytes is the amount of space needed for the object.
558 * If isBinary is true, we assume that we need to align the object on
559 * a machine allocation boundary.
560 * If isBinary is false, we assume the object is a char string and can
561 * be allocated on any byte boundary.
562 */
563void *
564pqResultAlloc(PGresult *res, size_t nBytes, bool isBinary)
565{
566 char *space;
567 PGresult_data *block;
568
569 if (!res)
570 return NULL;
571
572 if (nBytes <= 0)
573 return res->null_field;
574
575 /*
576 * If alignment is needed, round up the current position to an alignment
577 * boundary.
578 */
579 if (isBinary)
580 {
581 int offset = res->curOffset % PGRESULT_ALIGN_BOUNDARY;
582
583 if (offset)
584 {
585 res->curOffset += PGRESULT_ALIGN_BOUNDARY - offset;
586 res->spaceLeft -= PGRESULT_ALIGN_BOUNDARY - offset;
587 }
588 }
589
590 /* If there's enough space in the current block, no problem. */
591 if (nBytes <= (size_t) res->spaceLeft)
592 {
593 space = res->curBlock->space + res->curOffset;
594 res->curOffset += nBytes;
595 res->spaceLeft -= nBytes;
596 return space;
597 }
598
599 /*
600 * If the requested object is very large, give it its own block; this
601 * avoids wasting what might be most of the current block to start a new
602 * block. (We'd have to special-case requests bigger than the block size
603 * anyway.) The object is always given binary alignment in this case.
604 */
605 if (nBytes >= PGRESULT_SEP_ALLOC_THRESHOLD)
606 {
607 size_t alloc_size;
608
609 /* Don't wrap around with overly large requests. */
610 if (nBytes > SIZE_MAX - PGRESULT_BLOCK_OVERHEAD)
611 return NULL;
612
613 alloc_size = nBytes + PGRESULT_BLOCK_OVERHEAD;
614 block = (PGresult_data *) malloc(alloc_size);
615 if (!block)
616 return NULL;
617 res->memorySize += alloc_size;
618 space = block->space + PGRESULT_BLOCK_OVERHEAD;
619 if (res->curBlock)
620 {
621 /*
622 * Tuck special block below the active block, so that we don't
623 * have to waste the free space in the active block.
624 */
625 block->next = res->curBlock->next;
626 res->curBlock->next = block;
627 }
628 else
629 {
630 /* Must set up the new block as the first active block. */
631 block->next = NULL;
632 res->curBlock = block;
633 res->spaceLeft = 0; /* be sure it's marked full */
634 }
635 return space;
636 }
637
638 /* Otherwise, start a new block. */
640 if (!block)
641 return NULL;
643 block->next = res->curBlock;
644 res->curBlock = block;
645 if (isBinary)
646 {
647 /* object needs full alignment */
650 }
651 else
652 {
653 /* we can cram it right after the overhead pointer */
654 res->curOffset = sizeof(PGresult_data);
656 }
657
658 space = block->space + res->curOffset;
659 res->curOffset += nBytes;
660 res->spaceLeft -= nBytes;
661 return space;
662}
663
664/*
665 * PQresultMemorySize -
666 * Returns total space allocated for the PGresult.
667 */
668size_t
670{
671 if (!res)
672 return 0;
673 return res->memorySize;
674}
675
676/*
677 * pqResultStrdup -
678 * Like strdup, but the space is subsidiary PGresult space.
679 */
680char *
681pqResultStrdup(PGresult *res, const char *str)
682{
683 char *space = (char *) pqResultAlloc(res, strlen(str) + 1, false);
684
685 if (space)
686 strcpy(space, str);
687 return space;
688}
689
690/*
691 * pqSetResultError -
692 * assign a new error message to a PGresult
693 *
694 * Copy text from errorMessage buffer beginning at given offset
695 * (it's caller's responsibility that offset is valid)
696 */
697void
698pqSetResultError(PGresult *res, PQExpBuffer errorMessage, int offset)
699{
700 char *msg;
701
702 if (!res)
703 return;
704
705 /*
706 * We handle two OOM scenarios here. The errorMessage buffer might be
707 * marked "broken" due to having previously failed to allocate enough
708 * memory for the message, or it might be fine but pqResultStrdup fails
709 * and returns NULL. In either case, just make res->errMsg point directly
710 * at a constant "out of memory" string.
711 */
712 if (!PQExpBufferBroken(errorMessage))
713 msg = pqResultStrdup(res, errorMessage->data + offset);
714 else
715 msg = NULL;
716 if (msg)
717 res->errMsg = msg;
718 else
719 res->errMsg = libpq_gettext("out of memory\n");
720}
721
722/*
723 * PQclear -
724 * free's the memory associated with a PGresult
725 */
726void
728{
729 PGresult_data *block;
730 int i;
731
732 /* As a convenience, do nothing for a NULL pointer */
733 if (!res)
734 return;
735 /* Also, do nothing if the argument is OOM_result */
736 if ((const PGresult *) res == &OOM_result)
737 return;
738
739 /* Close down any events we may have */
740 for (i = 0; i < res->nEvents; i++)
741 {
742 /* only send DESTROY to successfully-initialized event procs */
743 if (res->events[i].resultInitialized)
744 {
746
747 evt.result = res;
748 (void) res->events[i].proc(PGEVT_RESULTDESTROY, &evt,
749 res->events[i].passThrough);
750 }
751 free(res->events[i].name);
752 }
753
754 free(res->events);
755
756 /* Free all the subsidiary blocks */
757 while ((block = res->curBlock) != NULL)
758 {
759 res->curBlock = block->next;
760 free(block);
761 }
762
763 /* Free the top-level tuple pointer array */
764 free(res->tuples);
765
766 /* zero out the pointer fields to catch programming errors */
767 res->attDescs = NULL;
768 res->tuples = NULL;
769 res->paramDescs = NULL;
770 res->errFields = NULL;
771 res->events = NULL;
772 res->nEvents = 0;
773 /* res->curBlock was zeroed out earlier */
774
775 /* Free the PGresult structure itself */
776 free(res);
777}
778
779/*
780 * Handy subroutine to deallocate any partially constructed async result.
781 *
782 * Any "saved" result gets cleared too.
783 */
784void
786{
788 conn->result = NULL;
789 conn->error_result = false;
791 conn->saved_result = NULL;
792}
793
794/*
795 * pqSaveErrorResult -
796 * remember that we have an error condition
797 *
798 * In much of libpq, reporting an error just requires appending text to
799 * conn->errorMessage and returning a failure code to one's caller.
800 * Where returning a failure code is impractical, instead call this
801 * function to remember that an error needs to be reported.
802 *
803 * (It might seem that appending text to conn->errorMessage should be
804 * sufficient, but we can't rely on that working under out-of-memory
805 * conditions. The OOM hazard is also why we don't try to make a new
806 * PGresult right here.)
807 */
808void
810{
811 /* Drop any pending result ... */
813 /* ... and set flag to remember to make an error result later */
814 conn->error_result = true;
815}
816
817/*
818 * pqSaveWriteError -
819 * report a write failure
820 *
821 * As above, after appending conn->write_err_msg to whatever other error we
822 * have. This is used when we've detected a write failure and have exhausted
823 * our chances of reporting something else instead.
824 */
825static void
827{
828 /*
829 * If write_err_msg is null because of previous strdup failure, do what we
830 * can. (It's likely our machinations here will get OOM failures as well,
831 * but might as well try.)
832 */
833 if (conn->write_err_msg)
834 {
836 /* Avoid possibly appending the same message twice */
837 conn->write_err_msg[0] = '\0';
838 }
839 else
840 libpq_append_conn_error(conn, "write to server failed");
841
843}
844
845/*
846 * pqPrepareAsyncResult -
847 * prepare the current async result object for return to the caller
848 *
849 * If there is not already an async result object, build an error object
850 * using whatever is in conn->errorMessage. In any case, clear the async
851 * result storage, and update our notion of how much error text has been
852 * returned to the application.
853 *
854 * Note that in no case (not even OOM) do we return NULL.
855 */
856PGresult *
858{
859 PGresult *res;
860
861 res = conn->result;
862 if (res)
863 {
864 /*
865 * If the pre-existing result is an ERROR (presumably something
866 * received from the server), assume that it represents whatever is in
867 * conn->errorMessage, and advance errorReported.
868 */
871 }
872 else
873 {
874 /*
875 * We get here after internal-to-libpq errors. We should probably
876 * always have error_result = true, but if we don't, gin up some error
877 * text.
878 */
879 if (!conn->error_result)
880 libpq_append_conn_error(conn, "no error text available");
881
882 /* Paranoia: be sure errorReported offset is sane */
883 if (conn->errorReported < 0 ||
885 conn->errorReported = 0;
886
887 /*
888 * Make a PGresult struct for the error. We temporarily lie about the
889 * result status, so that PQmakeEmptyPGresult doesn't uselessly copy
890 * all of conn->errorMessage.
891 */
893 if (res)
894 {
895 /*
896 * Report whatever new error text we have, and advance
897 * errorReported.
898 */
902 }
903 else
904 {
905 /*
906 * Ouch, not enough memory for a PGresult. Fortunately, we have a
907 * card up our sleeve: we can use the static OOM_result. Casting
908 * away const here is a bit ugly, but it seems best to declare
909 * OOM_result as const, in hopes it will be allocated in read-only
910 * storage.
911 */
912 res = unconstify(PGresult *, &OOM_result);
913
914 /*
915 * Don't advance errorReported. Perhaps we'll be able to report
916 * the text later.
917 */
918 }
919 }
920
921 /*
922 * Replace conn->result with saved_result, if any. In the normal case
923 * there isn't a saved result and we're just dropping ownership of the
924 * current result. In partial-result mode this restores the situation to
925 * what it was before we created the current partial result.
926 */
928 conn->error_result = false; /* saved_result is never an error */
929 conn->saved_result = NULL;
930
931 return res;
932}
933
934/*
935 * pqInternalNotice - produce an internally-generated notice message
936 *
937 * A format string and optional arguments can be passed. Note that we do
938 * libpq_gettext() here, so callers need not.
939 *
940 * The supplied text is taken as primary message (ie., it should not include
941 * a trailing newline, and should not be more than one line).
942 */
943void
944pqInternalNotice(const PGNoticeHooks *hooks, const char *fmt,...)
945{
946 char msgBuf[1024];
947 va_list args;
948 PGresult *res;
949
950 if (hooks->noticeRec == NULL)
951 return; /* nobody home to receive notice? */
952
953 /* Format the message */
954 va_start(args, fmt);
955 vsnprintf(msgBuf, sizeof(msgBuf), libpq_gettext(fmt), args);
956 va_end(args);
957 msgBuf[sizeof(msgBuf) - 1] = '\0'; /* make real sure it's terminated */
958
959 /* Make a PGresult to pass to the notice receiver */
961 if (!res)
962 return;
963 res->noticeHooks = *hooks;
964
965 /*
966 * Set up fields of notice.
967 */
971 /* XXX should provide a SQLSTATE too? */
972
973 /*
974 * Result text is always just the primary message + newline. If we can't
975 * allocate it, substitute "out of memory", as in pqSetResultError.
976 */
977 res->errMsg = (char *) pqResultAlloc(res, strlen(msgBuf) + 2, false);
978 if (res->errMsg)
979 sprintf(res->errMsg, "%s\n", msgBuf);
980 else
981 res->errMsg = libpq_gettext("out of memory\n");
982
983 /*
984 * Pass to receiver, then free it.
985 */
987 PQclear(res);
988}
989
990/*
991 * pqAddTuple
992 * add a row pointer to the PGresult structure, growing it if necessary
993 * Returns true if OK, false if an error prevented adding the row
994 *
995 * On error, *errmsgp can be set to an error string to be returned.
996 * If it is left NULL, the error is presumed to be "out of memory".
997 */
998static bool
999pqAddTuple(PGresult *res, PGresAttValue *tup, const char **errmsgp)
1000{
1001 if (res->ntups >= res->tupArrSize)
1002 {
1003 /*
1004 * Try to grow the array.
1005 *
1006 * We can use realloc because shallow copying of the structure is
1007 * okay. Note that the first time through, res->tuples is NULL. While
1008 * ANSI says that realloc() should act like malloc() in that case,
1009 * some old C libraries (like SunOS 4.1.x) coredump instead. On
1010 * failure realloc is supposed to return NULL without damaging the
1011 * existing allocation. Note that the positions beyond res->ntups are
1012 * garbage, not necessarily NULL.
1013 */
1014 int newSize;
1015 PGresAttValue **newTuples;
1016
1017 /*
1018 * Since we use integers for row numbers, we can't support more than
1019 * INT_MAX rows. Make sure we allow that many, though.
1020 */
1021 if (res->tupArrSize <= INT_MAX / 2)
1022 newSize = (res->tupArrSize > 0) ? res->tupArrSize * 2 : 128;
1023 else if (res->tupArrSize < INT_MAX)
1024 newSize = INT_MAX;
1025 else
1026 {
1027 *errmsgp = libpq_gettext("PGresult cannot support more than INT_MAX tuples");
1028 return false;
1029 }
1030
1031 /*
1032 * Also, on 32-bit platforms we could, in theory, overflow size_t even
1033 * before newSize gets to INT_MAX. (In practice we'd doubtless hit
1034 * OOM long before that, but let's check.)
1035 */
1036#if INT_MAX >= (SIZE_MAX / 2)
1037 if (newSize > SIZE_MAX / sizeof(PGresAttValue *))
1038 {
1039 *errmsgp = libpq_gettext("size_t overflow");
1040 return false;
1041 }
1042#endif
1043
1044 if (res->tuples == NULL)
1045 newTuples = (PGresAttValue **)
1046 malloc(newSize * sizeof(PGresAttValue *));
1047 else
1048 newTuples = (PGresAttValue **)
1049 realloc(res->tuples, newSize * sizeof(PGresAttValue *));
1050 if (!newTuples)
1051 return false; /* malloc or realloc failed */
1052 res->memorySize +=
1053 (newSize - res->tupArrSize) * sizeof(PGresAttValue *);
1054 res->tupArrSize = newSize;
1055 res->tuples = newTuples;
1056 }
1057 res->tuples[res->ntups] = tup;
1058 res->ntups++;
1059 return true;
1060}
1061
1062/*
1063 * pqSaveMessageField - save one field of an error or notice message
1064 */
1065void
1066pqSaveMessageField(PGresult *res, char code, const char *value)
1067{
1068 PGMessageField *pfield;
1069
1070 pfield = (PGMessageField *)
1071 pqResultAlloc(res,
1072 offsetof(PGMessageField, contents) +
1073 strlen(value) + 1,
1074 true);
1075 if (!pfield)
1076 return; /* out of memory? */
1077 pfield->code = code;
1078 strcpy(pfield->contents, value);
1079 pfield->next = res->errFields;
1080 res->errFields = pfield;
1081}
1082
1083/*
1084 * pqSaveParameterStatus - remember parameter status sent by backend
1085 *
1086 * Returns 1 on success, 0 on out-of-memory. (Note that on out-of-memory, we
1087 * have already released the old value of the parameter, if any. The only
1088 * really safe way to recover is to terminate the connection.)
1089 */
1090int
1091pqSaveParameterStatus(PGconn *conn, const char *name, const char *value)
1092{
1093 pgParameterStatus *pstatus;
1094 pgParameterStatus *prev;
1095
1096 /*
1097 * Forget any old information about the parameter
1098 */
1099 for (pstatus = conn->pstatus, prev = NULL;
1100 pstatus != NULL;
1101 prev = pstatus, pstatus = pstatus->next)
1102 {
1103 if (strcmp(pstatus->name, name) == 0)
1104 {
1105 if (prev)
1106 prev->next = pstatus->next;
1107 else
1108 conn->pstatus = pstatus->next;
1109 free(pstatus); /* frees name and value strings too */
1110 break;
1111 }
1112 }
1113
1114 /*
1115 * Store new info as a single malloc block
1116 */
1117 pstatus = (pgParameterStatus *) malloc(sizeof(pgParameterStatus) +
1118 strlen(name) + strlen(value) + 2);
1119 if (pstatus)
1120 {
1121 char *ptr;
1122
1123 ptr = ((char *) pstatus) + sizeof(pgParameterStatus);
1124 pstatus->name = ptr;
1125 strcpy(ptr, name);
1126 ptr += strlen(name) + 1;
1127 pstatus->value = ptr;
1128 strcpy(ptr, value);
1129 pstatus->next = conn->pstatus;
1130 conn->pstatus = pstatus;
1131 }
1132 else
1133 {
1134 /* out of memory */
1135 return 0;
1136 }
1137
1138 /*
1139 * Save values of settings that are of interest to libpq in fields of the
1140 * PGconn object. We keep client_encoding and standard_conforming_strings
1141 * in static variables as well, so that PQescapeString and PQescapeBytea
1142 * can behave somewhat sanely (at least in single-connection-using
1143 * programs).
1144 */
1145 if (strcmp(name, "client_encoding") == 0)
1146 {
1148 /* if we don't recognize the encoding name, fall back to SQL_ASCII */
1149 if (conn->client_encoding < 0)
1152 }
1153 else if (strcmp(name, "standard_conforming_strings") == 0)
1154 {
1155 conn->std_strings = (strcmp(value, "on") == 0);
1157 }
1158 else if (strcmp(name, "server_version") == 0)
1159 {
1160 /* We convert the server version to numeric form. */
1161 int cnt;
1162 int vmaj,
1163 vmin,
1164 vrev;
1165
1166 cnt = sscanf(value, "%d.%d.%d", &vmaj, &vmin, &vrev);
1167
1168 if (cnt == 3)
1169 {
1170 /* old style, e.g. 9.6.1 */
1171 conn->sversion = (100 * vmaj + vmin) * 100 + vrev;
1172 }
1173 else if (cnt == 2)
1174 {
1175 if (vmaj >= 10)
1176 {
1177 /* new style, e.g. 10.1 */
1178 conn->sversion = 100 * 100 * vmaj + vmin;
1179 }
1180 else
1181 {
1182 /* old style without minor version, e.g. 9.6devel */
1183 conn->sversion = (100 * vmaj + vmin) * 100;
1184 }
1185 }
1186 else if (cnt == 1)
1187 {
1188 /* new style without minor version, e.g. 10devel */
1189 conn->sversion = 100 * 100 * vmaj;
1190 }
1191 else
1192 conn->sversion = 0; /* unknown */
1193 }
1194 else if (strcmp(name, "default_transaction_read_only") == 0)
1195 {
1197 (strcmp(value, "on") == 0) ? PG_BOOL_YES : PG_BOOL_NO;
1198 }
1199 else if (strcmp(name, "in_hot_standby") == 0)
1200 {
1202 (strcmp(value, "on") == 0) ? PG_BOOL_YES : PG_BOOL_NO;
1203 }
1204 else if (strcmp(name, "scram_iterations") == 0)
1205 {
1207 }
1208
1209 return 1;
1210}
1211
1212
1213/*
1214 * pqRowProcessor
1215 * Add the received row to the current async result (conn->result).
1216 * Returns 1 if OK, 0 if error occurred.
1217 *
1218 * On error, *errmsgp can be set to an error string to be returned.
1219 * (Such a string should already be translated via libpq_gettext().)
1220 * If it is left NULL, the error is presumed to be "out of memory".
1221 */
1222int
1223pqRowProcessor(PGconn *conn, const char **errmsgp)
1224{
1225 PGresult *res = conn->result;
1226 int nfields = res->numAttributes;
1227 const PGdataValue *columns = conn->rowBuf;
1228 PGresAttValue *tup;
1229 int i;
1230
1231 /*
1232 * In partial-result mode, if we don't already have a partial PGresult
1233 * then make one by cloning conn->result (which should hold the correct
1234 * result metadata by now). Then the original conn->result is moved over
1235 * to saved_result so that we can re-use it as a reference for future
1236 * partial results. The saved result will become active again after
1237 * pqPrepareAsyncResult() returns the partial result to the application.
1238 */
1239 if (conn->partialResMode && conn->saved_result == NULL)
1240 {
1241 /* Copy everything that should be in the result at this point */
1242 res = PQcopyResult(res,
1245 if (!res)
1246 return 0;
1247 /* Change result status to appropriate special value */
1249 /* And stash it as the active result */
1251 conn->result = res;
1252 }
1253
1254 /*
1255 * Basically we just allocate space in the PGresult for each field and
1256 * copy the data over.
1257 *
1258 * Note: on malloc failure, we return 0 leaving *errmsgp still NULL, which
1259 * caller will take to mean "out of memory". This is preferable to trying
1260 * to set up such a message here, because evidently there's not enough
1261 * memory for gettext() to do anything.
1262 */
1263 tup = (PGresAttValue *)
1264 pqResultAlloc(res, nfields * sizeof(PGresAttValue), true);
1265 if (tup == NULL)
1266 return 0;
1267
1268 for (i = 0; i < nfields; i++)
1269 {
1270 int clen = columns[i].len;
1271
1272 if (clen < 0)
1273 {
1274 /* null field */
1275 tup[i].len = NULL_LEN;
1276 tup[i].value = res->null_field;
1277 }
1278 else
1279 {
1280 bool isbinary = (res->attDescs[i].format != 0);
1281 char *val;
1282
1283 val = (char *) pqResultAlloc(res, (size_t) clen + 1, isbinary);
1284 if (val == NULL)
1285 return 0;
1286
1287 /* copy and zero-terminate the data (even if it's binary) */
1288 memcpy(val, columns[i].value, clen);
1289 val[clen] = '\0';
1290
1291 tup[i].len = clen;
1292 tup[i].value = val;
1293 }
1294 }
1295
1296 /* And add the tuple to the PGresult's tuple array */
1297 if (!pqAddTuple(res, tup, errmsgp))
1298 return 0;
1299
1300 /*
1301 * Success. In partial-result mode, if we have enough rows then make the
1302 * result available to the client immediately.
1303 */
1304 if (conn->partialResMode && res->ntups >= conn->maxChunkSize)
1306
1307 return 1;
1308}
1309
1310
1311/*
1312 * pqAllocCmdQueueEntry
1313 * Get a command queue entry for caller to fill.
1314 *
1315 * If the recycle queue has a free element, that is returned; if not, a
1316 * fresh one is allocated. Caller is responsible for adding it to the
1317 * command queue (pqAppendCmdQueueEntry) once the struct is filled in, or
1318 * releasing the memory (pqRecycleCmdQueueEntry) if an error occurs.
1319 *
1320 * If allocation fails, sets the error message and returns NULL.
1321 */
1322static PGcmdQueueEntry *
1324{
1325 PGcmdQueueEntry *entry;
1326
1327 if (conn->cmd_queue_recycle == NULL)
1328 {
1329 entry = (PGcmdQueueEntry *) malloc(sizeof(PGcmdQueueEntry));
1330 if (entry == NULL)
1331 {
1332 libpq_append_conn_error(conn, "out of memory");
1333 return NULL;
1334 }
1335 }
1336 else
1337 {
1338 entry = conn->cmd_queue_recycle;
1339 conn->cmd_queue_recycle = entry->next;
1340 }
1341 entry->next = NULL;
1342 entry->query = NULL;
1343
1344 return entry;
1345}
1346
1347/*
1348 * pqAppendCmdQueueEntry
1349 * Append a caller-allocated entry to the command queue, and update
1350 * conn->asyncStatus to account for it.
1351 *
1352 * The query itself must already have been put in the output buffer by the
1353 * caller.
1354 */
1355static void
1357{
1358 Assert(entry->next == NULL);
1359
1360 if (conn->cmd_queue_head == NULL)
1361 conn->cmd_queue_head = entry;
1362 else
1363 conn->cmd_queue_tail->next = entry;
1364
1365 conn->cmd_queue_tail = entry;
1366
1367 switch (conn->pipelineStatus)
1368 {
1369 case PQ_PIPELINE_OFF:
1370 case PQ_PIPELINE_ON:
1371
1372 /*
1373 * When not in pipeline aborted state, if there's a result ready
1374 * to be consumed, let it be so (that is, don't change away from
1375 * READY or READY_MORE); otherwise set us busy to wait for
1376 * something to arrive from the server.
1377 */
1380 break;
1381
1383
1384 /*
1385 * In aborted pipeline state, we don't expect anything from the
1386 * server (since we don't send any queries that are queued).
1387 * Therefore, if IDLE then do what PQgetResult would do to let
1388 * itself consume commands from the queue; if we're in any other
1389 * state, we don't have to do anything.
1390 */
1391 if (conn->asyncStatus == PGASYNC_IDLE ||
1394 break;
1395 }
1396}
1397
1398/*
1399 * pqRecycleCmdQueueEntry
1400 * Push a command queue entry onto the freelist.
1401 */
1402static void
1404{
1405 if (entry == NULL)
1406 return;
1407
1408 /* recyclable entries should not have a follow-on command */
1409 Assert(entry->next == NULL);
1410
1411 if (entry->query)
1412 {
1413 free(entry->query);
1414 entry->query = NULL;
1415 }
1416
1417 entry->next = conn->cmd_queue_recycle;
1418 conn->cmd_queue_recycle = entry;
1419}
1420
1421
1422/*
1423 * PQsendQuery
1424 * Submit a query, but don't wait for it to finish
1425 *
1426 * Returns: 1 if successfully submitted
1427 * 0 if error (conn->errorMessage is set)
1428 *
1429 * PQsendQueryContinue is a non-exported version that behaves identically
1430 * except that it doesn't reset conn->errorMessage.
1431 */
1432int
1433PQsendQuery(PGconn *conn, const char *query)
1434{
1435 return PQsendQueryInternal(conn, query, true);
1436}
1437
1438int
1439PQsendQueryContinue(PGconn *conn, const char *query)
1440{
1441 return PQsendQueryInternal(conn, query, false);
1442}
1443
1444static int
1445PQsendQueryInternal(PGconn *conn, const char *query, bool newQuery)
1446{
1447 PGcmdQueueEntry *entry = NULL;
1448
1449 if (!PQsendQueryStart(conn, newQuery))
1450 return 0;
1451
1452 /* check the argument */
1453 if (!query)
1454 {
1455 libpq_append_conn_error(conn, "command string is a null pointer");
1456 return 0;
1457 }
1458
1460 {
1461 libpq_append_conn_error(conn, "%s not allowed in pipeline mode",
1462 "PQsendQuery");
1463 return 0;
1464 }
1465
1466 entry = pqAllocCmdQueueEntry(conn);
1467 if (entry == NULL)
1468 return 0; /* error msg already set */
1469
1470 /* Send the query message(s) */
1471 /* construct the outgoing Query message */
1472 if (pqPutMsgStart(PqMsg_Query, conn) < 0 ||
1473 pqPuts(query, conn) < 0 ||
1474 pqPutMsgEnd(conn) < 0)
1475 {
1476 /* error message should be set up already */
1478 return 0;
1479 }
1480
1481 /* remember we are using simple query protocol */
1482 entry->queryclass = PGQUERY_SIMPLE;
1483 /* and remember the query text too, if possible */
1484 entry->query = strdup(query);
1485
1486 /*
1487 * Give the data a push. In nonblock mode, don't complain if we're unable
1488 * to send it all; PQgetResult() will do any additional flushing needed.
1489 */
1490 if (pqFlush(conn) < 0)
1491 goto sendFailed;
1492
1493 /* OK, it's launched! */
1495
1496 return 1;
1497
1498sendFailed:
1500 /* error message should be set up already */
1501 return 0;
1502}
1503
1504/*
1505 * PQsendQueryParams
1506 * Like PQsendQuery, but use extended query protocol so we can pass parameters
1507 */
1508int
1510 const char *command,
1511 int nParams,
1512 const Oid *paramTypes,
1513 const char *const *paramValues,
1514 const int *paramLengths,
1515 const int *paramFormats,
1516 int resultFormat)
1517{
1518 if (!PQsendQueryStart(conn, true))
1519 return 0;
1520
1521 /* check the arguments */
1522 if (!command)
1523 {
1524 libpq_append_conn_error(conn, "command string is a null pointer");
1525 return 0;
1526 }
1527 if (nParams < 0 || nParams > PQ_QUERY_PARAM_MAX_LIMIT)
1528 {
1529 libpq_append_conn_error(conn, "number of parameters must be between 0 and %d",
1531 return 0;
1532 }
1533
1534 return PQsendQueryGuts(conn,
1535 command,
1536 "", /* use unnamed statement */
1537 nParams,
1538 paramTypes,
1539 paramValues,
1540 paramLengths,
1541 paramFormats,
1542 resultFormat);
1543}
1544
1545/*
1546 * PQsendPrepare
1547 * Submit a Parse message, but don't wait for it to finish
1548 *
1549 * Returns: 1 if successfully submitted
1550 * 0 if error (conn->errorMessage is set)
1551 */
1552int
1554 const char *stmtName, const char *query,
1555 int nParams, const Oid *paramTypes)
1556{
1557 PGcmdQueueEntry *entry = NULL;
1558
1559 if (!PQsendQueryStart(conn, true))
1560 return 0;
1561
1562 /* check the arguments */
1563 if (!stmtName)
1564 {
1565 libpq_append_conn_error(conn, "statement name is a null pointer");
1566 return 0;
1567 }
1568 if (!query)
1569 {
1570 libpq_append_conn_error(conn, "command string is a null pointer");
1571 return 0;
1572 }
1573 if (nParams < 0 || nParams > PQ_QUERY_PARAM_MAX_LIMIT)
1574 {
1575 libpq_append_conn_error(conn, "number of parameters must be between 0 and %d",
1577 return 0;
1578 }
1579
1580 entry = pqAllocCmdQueueEntry(conn);
1581 if (entry == NULL)
1582 return 0; /* error msg already set */
1583
1584 /* construct the Parse message */
1585 if (pqPutMsgStart(PqMsg_Parse, conn) < 0 ||
1586 pqPuts(stmtName, conn) < 0 ||
1587 pqPuts(query, conn) < 0)
1588 goto sendFailed;
1589
1590 if (nParams > 0 && paramTypes)
1591 {
1592 int i;
1593
1594 if (pqPutInt(nParams, 2, conn) < 0)
1595 goto sendFailed;
1596 for (i = 0; i < nParams; i++)
1597 {
1598 if (pqPutInt(paramTypes[i], 4, conn) < 0)
1599 goto sendFailed;
1600 }
1601 }
1602 else
1603 {
1604 if (pqPutInt(0, 2, conn) < 0)
1605 goto sendFailed;
1606 }
1607 if (pqPutMsgEnd(conn) < 0)
1608 goto sendFailed;
1609
1610 /* Add a Sync, unless in pipeline mode. */
1612 {
1613 if (pqPutMsgStart(PqMsg_Sync, conn) < 0 ||
1614 pqPutMsgEnd(conn) < 0)
1615 goto sendFailed;
1616 }
1617
1618 /* remember we are doing just a Parse */
1619 entry->queryclass = PGQUERY_PREPARE;
1620
1621 /* and remember the query text too, if possible */
1622 /* if insufficient memory, query just winds up NULL */
1623 entry->query = strdup(query);
1624
1625 /*
1626 * Give the data a push (in pipeline mode, only if we're past the size
1627 * threshold). In nonblock mode, don't complain if we're unable to send
1628 * it all; PQgetResult() will do any additional flushing needed.
1629 */
1630 if (pqPipelineFlush(conn) < 0)
1631 goto sendFailed;
1632
1633 /* OK, it's launched! */
1635
1636 return 1;
1637
1638sendFailed:
1640 /* error message should be set up already */
1641 return 0;
1642}
1643
1644/*
1645 * PQsendQueryPrepared
1646 * Like PQsendQuery, but execute a previously prepared statement,
1647 * using extended query protocol so we can pass parameters
1648 */
1649int
1651 const char *stmtName,
1652 int nParams,
1653 const char *const *paramValues,
1654 const int *paramLengths,
1655 const int *paramFormats,
1656 int resultFormat)
1657{
1658 if (!PQsendQueryStart(conn, true))
1659 return 0;
1660
1661 /* check the arguments */
1662 if (!stmtName)
1663 {
1664 libpq_append_conn_error(conn, "statement name is a null pointer");
1665 return 0;
1666 }
1667 if (nParams < 0 || nParams > PQ_QUERY_PARAM_MAX_LIMIT)
1668 {
1669 libpq_append_conn_error(conn, "number of parameters must be between 0 and %d",
1671 return 0;
1672 }
1673
1674 return PQsendQueryGuts(conn,
1675 NULL, /* no command to parse */
1676 stmtName,
1677 nParams,
1678 NULL, /* no param types */
1679 paramValues,
1680 paramLengths,
1681 paramFormats,
1682 resultFormat);
1683}
1684
1685/*
1686 * PQsendQueryStart
1687 * Common startup code for PQsendQuery and sibling routines
1688 */
1689static bool
1691{
1692 if (!conn)
1693 return false;
1694
1695 /*
1696 * If this is the beginning of a query cycle, reset the error state.
1697 * However, in pipeline mode with something already queued, the error
1698 * buffer belongs to that command and we shouldn't clear it.
1699 */
1700 if (newQuery && conn->cmd_queue_head == NULL)
1702
1703 /* Don't try to send if we know there's no live connection. */
1704 if (conn->status != CONNECTION_OK)
1705 {
1706 libpq_append_conn_error(conn, "no connection to the server");
1707 return false;
1708 }
1709
1710 /* Can't send while already busy, either, unless enqueuing for later */
1711 if (conn->asyncStatus != PGASYNC_IDLE &&
1713 {
1714 libpq_append_conn_error(conn, "another command is already in progress");
1715 return false;
1716 }
1717
1719 {
1720 /*
1721 * When enqueuing commands we don't change much of the connection
1722 * state since it's already in use for the current command. The
1723 * connection state will get updated when pqPipelineProcessQueue()
1724 * advances to start processing the queued message.
1725 *
1726 * Just make sure we can safely enqueue given the current connection
1727 * state. We can enqueue behind another queue item, or behind a
1728 * non-queue command (one that sends its own sync), but we can't
1729 * enqueue if the connection is in a copy state.
1730 */
1731 switch (conn->asyncStatus)
1732 {
1733 case PGASYNC_IDLE:
1735 case PGASYNC_READY:
1736 case PGASYNC_READY_MORE:
1737 case PGASYNC_BUSY:
1738 /* ok to queue */
1739 break;
1740
1741 case PGASYNC_COPY_IN:
1742 case PGASYNC_COPY_OUT:
1743 case PGASYNC_COPY_BOTH:
1744 libpq_append_conn_error(conn, "cannot queue commands during COPY");
1745 return false;
1746 }
1747 }
1748 else
1749 {
1750 /*
1751 * This command's results will come in immediately. Initialize async
1752 * result-accumulation state
1753 */
1755
1756 /* reset partial-result mode */
1757 conn->partialResMode = false;
1758 conn->singleRowMode = false;
1759 conn->maxChunkSize = 0;
1760 }
1761
1762 /* ready to send command message */
1763 return true;
1764}
1765
1766/*
1767 * PQsendQueryGuts
1768 * Common code for sending a query with extended query protocol
1769 * PQsendQueryStart should be done already
1770 *
1771 * command may be NULL to indicate we use an already-prepared statement
1772 */
1773static int
1775 const char *command,
1776 const char *stmtName,
1777 int nParams,
1778 const Oid *paramTypes,
1779 const char *const *paramValues,
1780 const int *paramLengths,
1781 const int *paramFormats,
1782 int resultFormat)
1783{
1784 int i;
1785 PGcmdQueueEntry *entry;
1786
1787 entry = pqAllocCmdQueueEntry(conn);
1788 if (entry == NULL)
1789 return 0; /* error msg already set */
1790
1791 /*
1792 * We will send Parse (if needed), Bind, Describe Portal, Execute, Sync
1793 * (if not in pipeline mode), using specified statement name and the
1794 * unnamed portal.
1795 */
1796
1797 if (command)
1798 {
1799 /* construct the Parse message */
1800 if (pqPutMsgStart(PqMsg_Parse, conn) < 0 ||
1801 pqPuts(stmtName, conn) < 0 ||
1802 pqPuts(command, conn) < 0)
1803 goto sendFailed;
1804 if (nParams > 0 && paramTypes)
1805 {
1806 if (pqPutInt(nParams, 2, conn) < 0)
1807 goto sendFailed;
1808 for (i = 0; i < nParams; i++)
1809 {
1810 if (pqPutInt(paramTypes[i], 4, conn) < 0)
1811 goto sendFailed;
1812 }
1813 }
1814 else
1815 {
1816 if (pqPutInt(0, 2, conn) < 0)
1817 goto sendFailed;
1818 }
1819 if (pqPutMsgEnd(conn) < 0)
1820 goto sendFailed;
1821 }
1822
1823 /* Construct the Bind message */
1824 if (pqPutMsgStart(PqMsg_Bind, conn) < 0 ||
1825 pqPuts("", conn) < 0 ||
1826 pqPuts(stmtName, conn) < 0)
1827 goto sendFailed;
1828
1829 /* Send parameter formats */
1830 if (nParams > 0 && paramFormats)
1831 {
1832 if (pqPutInt(nParams, 2, conn) < 0)
1833 goto sendFailed;
1834 for (i = 0; i < nParams; i++)
1835 {
1836 if (pqPutInt(paramFormats[i], 2, conn) < 0)
1837 goto sendFailed;
1838 }
1839 }
1840 else
1841 {
1842 if (pqPutInt(0, 2, conn) < 0)
1843 goto sendFailed;
1844 }
1845
1846 if (pqPutInt(nParams, 2, conn) < 0)
1847 goto sendFailed;
1848
1849 /* Send parameters */
1850 for (i = 0; i < nParams; i++)
1851 {
1852 if (paramValues && paramValues[i])
1853 {
1854 int nbytes;
1855
1856 if (paramFormats && paramFormats[i] != 0)
1857 {
1858 /* binary parameter */
1859 if (paramLengths)
1860 nbytes = paramLengths[i];
1861 else
1862 {
1863 libpq_append_conn_error(conn, "length must be given for binary parameter");
1864 goto sendFailed;
1865 }
1866 }
1867 else
1868 {
1869 /* text parameter, do not use paramLengths */
1870 nbytes = strlen(paramValues[i]);
1871 }
1872 if (pqPutInt(nbytes, 4, conn) < 0 ||
1873 pqPutnchar(paramValues[i], nbytes, conn) < 0)
1874 goto sendFailed;
1875 }
1876 else
1877 {
1878 /* take the param as NULL */
1879 if (pqPutInt(-1, 4, conn) < 0)
1880 goto sendFailed;
1881 }
1882 }
1883 if (pqPutInt(1, 2, conn) < 0 ||
1884 pqPutInt(resultFormat, 2, conn))
1885 goto sendFailed;
1886 if (pqPutMsgEnd(conn) < 0)
1887 goto sendFailed;
1888
1889 /* construct the Describe Portal message */
1890 if (pqPutMsgStart(PqMsg_Describe, conn) < 0 ||
1891 pqPutc('P', conn) < 0 ||
1892 pqPuts("", conn) < 0 ||
1893 pqPutMsgEnd(conn) < 0)
1894 goto sendFailed;
1895
1896 /* construct the Execute message */
1897 if (pqPutMsgStart(PqMsg_Execute, conn) < 0 ||
1898 pqPuts("", conn) < 0 ||
1899 pqPutInt(0, 4, conn) < 0 ||
1900 pqPutMsgEnd(conn) < 0)
1901 goto sendFailed;
1902
1903 /* construct the Sync message if not in pipeline mode */
1905 {
1906 if (pqPutMsgStart(PqMsg_Sync, conn) < 0 ||
1907 pqPutMsgEnd(conn) < 0)
1908 goto sendFailed;
1909 }
1910
1911 /* remember we are using extended query protocol */
1913
1914 /* and remember the query text too, if possible */
1915 /* if insufficient memory, query just winds up NULL */
1916 if (command)
1917 entry->query = strdup(command);
1918
1919 /*
1920 * Give the data a push (in pipeline mode, only if we're past the size
1921 * threshold). In nonblock mode, don't complain if we're unable to send
1922 * it all; PQgetResult() will do any additional flushing needed.
1923 */
1924 if (pqPipelineFlush(conn) < 0)
1925 goto sendFailed;
1926
1927 /* OK, it's launched! */
1929
1930 return 1;
1931
1932sendFailed:
1934 /* error message should be set up already */
1935 return 0;
1936}
1937
1938/*
1939 * Is it OK to change partial-result mode now?
1940 */
1941static bool
1943{
1944 /*
1945 * Only allow changing the mode when we have launched a query and not yet
1946 * received any results.
1947 */
1948 if (!conn)
1949 return false;
1951 return false;
1952 if (!conn->cmd_queue_head ||
1955 return false;
1957 return false;
1958 return true;
1959}
1960
1961/*
1962 * Select row-by-row processing mode
1963 */
1964int
1966{
1968 {
1969 conn->partialResMode = true;
1970 conn->singleRowMode = true;
1971 conn->maxChunkSize = 1;
1972 return 1;
1973 }
1974 else
1975 return 0;
1976}
1977
1978/*
1979 * Select chunked results processing mode
1980 */
1981int
1983{
1984 if (chunkSize > 0 && canChangeResultMode(conn))
1985 {
1986 conn->partialResMode = true;
1987 conn->singleRowMode = false;
1988 conn->maxChunkSize = chunkSize;
1989 return 1;
1990 }
1991 else
1992 return 0;
1993}
1994
1995/*
1996 * Consume any available input from the backend
1997 * 0 return: some kind of trouble
1998 * 1 return: no problem
1999 */
2000int
2002{
2003 if (!conn)
2004 return 0;
2005
2006 /*
2007 * for non-blocking connections try to flush the send-queue, otherwise we
2008 * may never get a response for something that may not have already been
2009 * sent because it's in our write buffer!
2010 */
2011 if (pqIsnonblocking(conn))
2012 {
2013 if (pqFlush(conn) < 0)
2014 return 0;
2015 }
2016
2017 /*
2018 * Load more data, if available. We do this no matter what state we are
2019 * in, since we are probably getting called because the application wants
2020 * to get rid of a read-select condition. Note that we will NOT block
2021 * waiting for more input.
2022 */
2023 if (pqReadData(conn) < 0)
2024 return 0;
2025
2026 /* Parsing of the data waits till later. */
2027 return 1;
2028}
2029
2030
2031/*
2032 * parseInput: if appropriate, parse input data from backend
2033 * until input is exhausted or a stopping state is reached.
2034 * Note that this function will NOT attempt to read more data from the backend.
2035 */
2036static void
2038{
2040}
2041
2042/*
2043 * PQisBusy
2044 * Return true if PQgetResult would block waiting for input.
2045 */
2046
2047int
2049{
2050 if (!conn)
2051 return false;
2052
2053 /* Parse any available data, if our state permits. */
2055
2056 /*
2057 * PQgetResult will return immediately in all states except BUSY. Also,
2058 * if we've detected read EOF and dropped the connection, we can expect
2059 * that PQgetResult will fail immediately. Note that we do *not* check
2060 * conn->write_failed here --- once that's become set, we know we have
2061 * trouble, but we need to keep trying to read until we have a complete
2062 * server message or detect read EOF.
2063 */
2065}
2066
2067/*
2068 * PQgetResult
2069 * Get the next PGresult produced by a query. Returns NULL if no
2070 * query work remains or an error has occurred (e.g. out of
2071 * memory).
2072 *
2073 * In pipeline mode, once all the result of a query have been returned,
2074 * PQgetResult returns NULL to let the user know that the next
2075 * query is being processed. At the end of the pipeline, returns a
2076 * result with PQresultStatus(result) == PGRES_PIPELINE_SYNC.
2077 */
2078PGresult *
2080{
2081 PGresult *res;
2082
2083 if (!conn)
2084 return NULL;
2085
2086 /* Parse any available data, if our state permits. */
2088
2089 /* If not ready to return something, block until we are. */
2090 while (conn->asyncStatus == PGASYNC_BUSY)
2091 {
2092 int flushResult;
2093
2094 /*
2095 * If data remains unsent, send it. Else we might be waiting for the
2096 * result of a command the backend hasn't even got yet.
2097 */
2098 while ((flushResult = pqFlush(conn)) > 0)
2099 {
2100 if (pqWait(false, true, conn))
2101 {
2102 flushResult = -1;
2103 break;
2104 }
2105 }
2106
2107 /*
2108 * Wait for some more data, and load it. (Note: if the connection has
2109 * been lost, pqWait should return immediately because the socket
2110 * should be read-ready, either with the last server data or with an
2111 * EOF indication. We expect therefore that this won't result in any
2112 * undue delay in reporting a previous write failure.)
2113 */
2114 if (flushResult ||
2115 pqWait(true, false, conn) ||
2116 pqReadData(conn) < 0)
2117 {
2118 /* Report the error saved by pqWait or pqReadData */
2121 return pqPrepareAsyncResult(conn);
2122 }
2123
2124 /* Parse it. */
2126
2127 /*
2128 * If we had a write error, but nothing above obtained a query result
2129 * or detected a read error, report the write error.
2130 */
2132 {
2135 return pqPrepareAsyncResult(conn);
2136 }
2137 }
2138
2139 /* Return the appropriate thing. */
2140 switch (conn->asyncStatus)
2141 {
2142 case PGASYNC_IDLE:
2143 res = NULL; /* query is complete */
2144 break;
2147
2148 /*
2149 * We're about to return the NULL that terminates the round of
2150 * results from the current query; prepare to send the results of
2151 * the next query, if any, when we're called next. If there's no
2152 * next element in the command queue, this gets us in IDLE state.
2153 */
2155 res = NULL; /* query is complete */
2156 break;
2157
2158 case PGASYNC_READY:
2160
2161 /*
2162 * Normally pqPrepareAsyncResult will have left conn->result
2163 * empty. Otherwise, "res" must be a not-full PGRES_TUPLES_CHUNK
2164 * result, which we want to return to the caller while staying in
2165 * PGASYNC_READY state. Then the next call here will return the
2166 * empty PGRES_TUPLES_OK result that was restored from
2167 * saved_result, after which we can proceed.
2168 */
2169 if (conn->result)
2170 {
2172 break;
2173 }
2174
2175 /* Advance the queue as appropriate */
2178
2180 {
2181 /*
2182 * We're about to send the results of the current query. Set
2183 * us idle now, and ...
2184 */
2186
2187 /*
2188 * ... in cases when we're sending a pipeline-sync result,
2189 * move queue processing forwards immediately, so that next
2190 * time we're called, we're prepared to return the next result
2191 * received from the server. In all other cases, leave the
2192 * queue state change for next time, so that a terminating
2193 * NULL result is sent.
2194 *
2195 * (In other words: we don't return a NULL after a pipeline
2196 * sync.)
2197 */
2200 }
2201 else
2202 {
2203 /* Set the state back to BUSY, allowing parsing to proceed. */
2205 }
2206 break;
2207 case PGASYNC_READY_MORE:
2209 /* Set the state back to BUSY, allowing parsing to proceed. */
2211 break;
2212 case PGASYNC_COPY_IN:
2214 break;
2215 case PGASYNC_COPY_OUT:
2217 break;
2218 case PGASYNC_COPY_BOTH:
2220 break;
2221 default:
2222 libpq_append_conn_error(conn, "unexpected asyncStatus: %d", (int) conn->asyncStatus);
2224 conn->asyncStatus = PGASYNC_IDLE; /* try to restore valid state */
2226 break;
2227 }
2228
2229 /* Time to fire PGEVT_RESULTCREATE events, if there are any */
2230 if (res && res->nEvents > 0)
2231 (void) PQfireResultCreateEvents(conn, res);
2232
2233 return res;
2234}
2235
2236/*
2237 * getCopyResult
2238 * Helper for PQgetResult: generate result for COPY-in-progress cases
2239 */
2240static PGresult *
2242{
2243 /*
2244 * If the server connection has been lost, don't pretend everything is
2245 * hunky-dory; instead return a PGRES_FATAL_ERROR result, and reset the
2246 * asyncStatus to idle (corresponding to what we'd do if we'd detected I/O
2247 * error in the earlier steps in PQgetResult). The text returned in the
2248 * result is whatever is in conn->errorMessage; we hope that was filled
2249 * with something relevant when the lost connection was detected.
2250 */
2251 if (conn->status != CONNECTION_OK)
2252 {
2255 return pqPrepareAsyncResult(conn);
2256 }
2257
2258 /* If we have an async result for the COPY, return that */
2259 if (conn->result && conn->result->resultStatus == copytype)
2260 return pqPrepareAsyncResult(conn);
2261
2262 /* Otherwise, invent a suitable PGresult */
2263 return PQmakeEmptyPGresult(conn, copytype);
2264}
2265
2266
2267/*
2268 * PQexec
2269 * send a query to the backend and package up the result in a PGresult
2270 *
2271 * If the query was not even sent, return NULL; conn->errorMessage is set to
2272 * a relevant message.
2273 * If the query was sent, a new PGresult is returned (which could indicate
2274 * either success or failure).
2275 * The user is responsible for freeing the PGresult via PQclear()
2276 * when done with it.
2277 */
2278PGresult *
2279PQexec(PGconn *conn, const char *query)
2280{
2281 if (!PQexecStart(conn))
2282 return NULL;
2283 if (!PQsendQuery(conn, query))
2284 return NULL;
2285 return PQexecFinish(conn);
2286}
2287
2288/*
2289 * PQexecParams
2290 * Like PQexec, but use extended query protocol so we can pass parameters
2291 */
2292PGresult *
2294 const char *command,
2295 int nParams,
2296 const Oid *paramTypes,
2297 const char *const *paramValues,
2298 const int *paramLengths,
2299 const int *paramFormats,
2300 int resultFormat)
2301{
2302 if (!PQexecStart(conn))
2303 return NULL;
2304 if (!PQsendQueryParams(conn, command,
2305 nParams, paramTypes, paramValues, paramLengths,
2306 paramFormats, resultFormat))
2307 return NULL;
2308 return PQexecFinish(conn);
2309}
2310
2311/*
2312 * PQprepare
2313 * Creates a prepared statement by issuing a Parse message.
2314 *
2315 * If the query was not even sent, return NULL; conn->errorMessage is set to
2316 * a relevant message.
2317 * If the query was sent, a new PGresult is returned (which could indicate
2318 * either success or failure).
2319 * The user is responsible for freeing the PGresult via PQclear()
2320 * when done with it.
2321 */
2322PGresult *
2324 const char *stmtName, const char *query,
2325 int nParams, const Oid *paramTypes)
2326{
2327 if (!PQexecStart(conn))
2328 return NULL;
2329 if (!PQsendPrepare(conn, stmtName, query, nParams, paramTypes))
2330 return NULL;
2331 return PQexecFinish(conn);
2332}
2333
2334/*
2335 * PQexecPrepared
2336 * Like PQexec, but execute a previously prepared statement,
2337 * using extended query protocol so we can pass parameters
2338 */
2339PGresult *
2341 const char *stmtName,
2342 int nParams,
2343 const char *const *paramValues,
2344 const int *paramLengths,
2345 const int *paramFormats,
2346 int resultFormat)
2347{
2348 if (!PQexecStart(conn))
2349 return NULL;
2350 if (!PQsendQueryPrepared(conn, stmtName,
2351 nParams, paramValues, paramLengths,
2352 paramFormats, resultFormat))
2353 return NULL;
2354 return PQexecFinish(conn);
2355}
2356
2357/*
2358 * Common code for PQexec and sibling routines: prepare to send command
2359 */
2360static bool
2362{
2363 PGresult *result;
2364
2365 if (!conn)
2366 return false;
2367
2368 /*
2369 * Since this is the beginning of a query cycle, reset the error state.
2370 * However, in pipeline mode with something already queued, the error
2371 * buffer belongs to that command and we shouldn't clear it.
2372 */
2373 if (conn->cmd_queue_head == NULL)
2375
2377 {
2378 libpq_append_conn_error(conn, "synchronous command execution functions are not allowed in pipeline mode");
2379 return false;
2380 }
2381
2382 /*
2383 * Silently discard any prior query result that application didn't eat.
2384 * This is probably poor design, but it's here for backward compatibility.
2385 */
2386 while ((result = PQgetResult(conn)) != NULL)
2387 {
2388 ExecStatusType resultStatus = result->resultStatus;
2389
2390 PQclear(result); /* only need its status */
2391 if (resultStatus == PGRES_COPY_IN)
2392 {
2393 /* get out of a COPY IN state */
2394 if (PQputCopyEnd(conn,
2395 libpq_gettext("COPY terminated by new PQexec")) < 0)
2396 return false;
2397 /* keep waiting to swallow the copy's failure message */
2398 }
2399 else if (resultStatus == PGRES_COPY_OUT)
2400 {
2401 /*
2402 * Get out of a COPY OUT state: we just switch back to BUSY and
2403 * allow the remaining COPY data to be dropped on the floor.
2404 */
2406 /* keep waiting to swallow the copy's completion message */
2407 }
2408 else if (resultStatus == PGRES_COPY_BOTH)
2409 {
2410 /* We don't allow PQexec during COPY BOTH */
2411 libpq_append_conn_error(conn, "PQexec not allowed during COPY BOTH");
2412 return false;
2413 }
2414 /* check for loss of connection, too */
2415 if (conn->status == CONNECTION_BAD)
2416 return false;
2417 }
2418
2419 /* OK to send a command */
2420 return true;
2421}
2422
2423/*
2424 * Common code for PQexec and sibling routines: wait for command result
2425 */
2426static PGresult *
2428{
2429 PGresult *result;
2430 PGresult *lastResult;
2431
2432 /*
2433 * For backwards compatibility, return the last result if there are more
2434 * than one. (We used to have logic here to concatenate successive error
2435 * messages, but now that happens automatically, since conn->errorMessage
2436 * will continue to accumulate errors throughout this loop.)
2437 *
2438 * We have to stop if we see copy in/out/both, however. We will resume
2439 * parsing after application performs the data transfer.
2440 *
2441 * Also stop if the connection is lost (else we'll loop infinitely).
2442 */
2443 lastResult = NULL;
2444 while ((result = PQgetResult(conn)) != NULL)
2445 {
2446 PQclear(lastResult);
2447 lastResult = result;
2448 if (result->resultStatus == PGRES_COPY_IN ||
2449 result->resultStatus == PGRES_COPY_OUT ||
2450 result->resultStatus == PGRES_COPY_BOTH ||
2452 break;
2453 }
2454
2455 return lastResult;
2456}
2457
2458/*
2459 * PQdescribePrepared
2460 * Obtain information about a previously prepared statement
2461 *
2462 * If the query was not even sent, return NULL; conn->errorMessage is set to
2463 * a relevant message.
2464 * If the query was sent, a new PGresult is returned (which could indicate
2465 * either success or failure). On success, the PGresult contains status
2466 * PGRES_COMMAND_OK, and its parameter and column-heading fields describe
2467 * the statement's inputs and outputs respectively.
2468 * The user is responsible for freeing the PGresult via PQclear()
2469 * when done with it.
2470 */
2471PGresult *
2473{
2474 if (!PQexecStart(conn))
2475 return NULL;
2477 return NULL;
2478 return PQexecFinish(conn);
2479}
2480
2481/*
2482 * PQdescribePortal
2483 * Obtain information about a previously created portal
2484 *
2485 * This is much like PQdescribePrepared, except that no parameter info is
2486 * returned. Note that at the moment, libpq doesn't really expose portals
2487 * to the client; but this can be used with a portal created by a SQL
2488 * DECLARE CURSOR command.
2489 */
2490PGresult *
2491PQdescribePortal(PGconn *conn, const char *portal)
2492{
2493 if (!PQexecStart(conn))
2494 return NULL;
2495 if (!PQsendTypedCommand(conn, PqMsg_Describe, 'P', portal))
2496 return NULL;
2497 return PQexecFinish(conn);
2498}
2499
2500/*
2501 * PQsendDescribePrepared
2502 * Submit a Describe Statement command, but don't wait for it to finish
2503 *
2504 * Returns: 1 if successfully submitted
2505 * 0 if error (conn->errorMessage is set)
2506 */
2507int
2509{
2511}
2512
2513/*
2514 * PQsendDescribePortal
2515 * Submit a Describe Portal command, but don't wait for it to finish
2516 *
2517 * Returns: 1 if successfully submitted
2518 * 0 if error (conn->errorMessage is set)
2519 */
2520int
2521PQsendDescribePortal(PGconn *conn, const char *portal)
2522{
2523 return PQsendTypedCommand(conn, PqMsg_Describe, 'P', portal);
2524}
2525
2526/*
2527 * PQclosePrepared
2528 * Close a previously prepared statement
2529 *
2530 * If the query was not even sent, return NULL; conn->errorMessage is set to
2531 * a relevant message.
2532 * If the query was sent, a new PGresult is returned (which could indicate
2533 * either success or failure). On success, the PGresult contains status
2534 * PGRES_COMMAND_OK. The user is responsible for freeing the PGresult via
2535 * PQclear() when done with it.
2536 */
2537PGresult *
2539{
2540 if (!PQexecStart(conn))
2541 return NULL;
2543 return NULL;
2544 return PQexecFinish(conn);
2545}
2546
2547/*
2548 * PQclosePortal
2549 * Close a previously created portal
2550 *
2551 * This is exactly like PQclosePrepared, but for portals. Note that at the
2552 * moment, libpq doesn't really expose portals to the client; but this can be
2553 * used with a portal created by a SQL DECLARE CURSOR command.
2554 */
2555PGresult *
2556PQclosePortal(PGconn *conn, const char *portal)
2557{
2558 if (!PQexecStart(conn))
2559 return NULL;
2560 if (!PQsendTypedCommand(conn, PqMsg_Close, 'P', portal))
2561 return NULL;
2562 return PQexecFinish(conn);
2563}
2564
2565/*
2566 * PQsendClosePrepared
2567 * Submit a Close Statement command, but don't wait for it to finish
2568 *
2569 * Returns: 1 if successfully submitted
2570 * 0 if error (conn->errorMessage is set)
2571 */
2572int
2574{
2575 return PQsendTypedCommand(conn, PqMsg_Close, 'S', stmt);
2576}
2577
2578/*
2579 * PQsendClosePortal
2580 * Submit a Close Portal command, but don't wait for it to finish
2581 *
2582 * Returns: 1 if successfully submitted
2583 * 0 if error (conn->errorMessage is set)
2584 */
2585int
2586PQsendClosePortal(PGconn *conn, const char *portal)
2587{
2588 return PQsendTypedCommand(conn, PqMsg_Close, 'P', portal);
2589}
2590
2591/*
2592 * PQsendTypedCommand
2593 * Common code to send a Describe or Close command
2594 *
2595 * Available options for "command" are
2596 * PqMsg_Close for Close; or
2597 * PqMsg_Describe for Describe.
2598 *
2599 * Available options for "type" are
2600 * 'S' to run a command on a prepared statement; or
2601 * 'P' to run a command on a portal.
2602 *
2603 * Returns 1 on success and 0 on failure.
2604 */
2605static int
2606PQsendTypedCommand(PGconn *conn, char command, char type, const char *target)
2607{
2608 PGcmdQueueEntry *entry = NULL;
2609
2610 /* Treat null target as empty string */
2611 if (!target)
2612 target = "";
2613
2614 if (!PQsendQueryStart(conn, true))
2615 return 0;
2616
2617 entry = pqAllocCmdQueueEntry(conn);
2618 if (entry == NULL)
2619 return 0; /* error msg already set */
2620
2621 /* construct the Close message */
2622 if (pqPutMsgStart(command, conn) < 0 ||
2623 pqPutc(type, conn) < 0 ||
2624 pqPuts(target, conn) < 0 ||
2625 pqPutMsgEnd(conn) < 0)
2626 goto sendFailed;
2627
2628 /* construct the Sync message */
2630 {
2631 if (pqPutMsgStart(PqMsg_Sync, conn) < 0 ||
2632 pqPutMsgEnd(conn) < 0)
2633 goto sendFailed;
2634 }
2635
2636 /* remember if we are doing a Close or a Describe */
2637 if (command == PqMsg_Close)
2638 {
2639 entry->queryclass = PGQUERY_CLOSE;
2640 }
2641 else if (command == PqMsg_Describe)
2642 {
2644 }
2645 else
2646 {
2647 libpq_append_conn_error(conn, "unrecognized message type \"%c\"", command);
2648 goto sendFailed;
2649 }
2650
2651 /*
2652 * Give the data a push (in pipeline mode, only if we're past the size
2653 * threshold). In nonblock mode, don't complain if we're unable to send
2654 * it all; PQgetResult() will do any additional flushing needed.
2655 */
2656 if (pqPipelineFlush(conn) < 0)
2657 goto sendFailed;
2658
2659 /* OK, it's launched! */
2661
2662 return 1;
2663
2664sendFailed:
2666 /* error message should be set up already */
2667 return 0;
2668}
2669
2670/*
2671 * PQnotifies
2672 * returns a PGnotify* structure of the latest async notification
2673 * that has not yet been handled
2674 *
2675 * returns NULL, if there is currently
2676 * no unhandled async notification from the backend
2677 *
2678 * the CALLER is responsible for FREE'ing the structure returned
2679 *
2680 * Note that this function does not read any new data from the socket;
2681 * so usually, caller should call PQconsumeInput() first.
2682 */
2683PGnotify *
2685{
2686 PGnotify *event;
2687
2688 if (!conn)
2689 return NULL;
2690
2691 /* Parse any available data to see if we can extract NOTIFY messages. */
2693
2694 event = conn->notifyHead;
2695 if (event)
2696 {
2697 conn->notifyHead = event->next;
2698 if (!conn->notifyHead)
2699 conn->notifyTail = NULL;
2700 event->next = NULL; /* don't let app see the internal state */
2701 }
2702 return event;
2703}
2704
2705/*
2706 * PQputCopyData - send some data to the backend during COPY IN or COPY BOTH
2707 *
2708 * Returns 1 if successful, 0 if data could not be sent (only possible
2709 * in nonblock mode), or -1 if an error occurs.
2710 */
2711int
2712PQputCopyData(PGconn *conn, const char *buffer, int nbytes)
2713{
2714 if (!conn)
2715 return -1;
2718 {
2719 libpq_append_conn_error(conn, "no COPY in progress");
2720 return -1;
2721 }
2722
2723 /*
2724 * Process any NOTICE or NOTIFY messages that might be pending in the
2725 * input buffer. Since the server might generate many notices during the
2726 * COPY, we want to clean those out reasonably promptly to prevent
2727 * indefinite expansion of the input buffer. (Note: the actual read of
2728 * input data into the input buffer happens down inside pqSendSome, but
2729 * it's not authorized to get rid of the data again.)
2730 */
2732
2733 if (nbytes > 0)
2734 {
2735 /*
2736 * Try to flush any previously sent data in preference to growing the
2737 * output buffer. If we can't enlarge the buffer enough to hold the
2738 * data, return 0 in the nonblock case, else hard error. (For
2739 * simplicity, always assume 5 bytes of overhead.)
2740 */
2741 if ((conn->outBufSize - conn->outCount - 5) < nbytes)
2742 {
2743 if (pqFlush(conn) < 0)
2744 return -1;
2745 if (pqCheckOutBufferSpace(conn->outCount + 5 + (size_t) nbytes,
2746 conn))
2747 return pqIsnonblocking(conn) ? 0 : -1;
2748 }
2749 /* Send the data (too simple to delegate to fe-protocol files) */
2750 if (pqPutMsgStart(PqMsg_CopyData, conn) < 0 ||
2751 pqPutnchar(buffer, nbytes, conn) < 0 ||
2752 pqPutMsgEnd(conn) < 0)
2753 return -1;
2754 }
2755 return 1;
2756}
2757
2758/*
2759 * PQputCopyEnd - send EOF indication to the backend during COPY IN
2760 *
2761 * After calling this, use PQgetResult() to check command completion status.
2762 *
2763 * Returns 1 if successful, or -1 if an error occurs.
2764 */
2765int
2766PQputCopyEnd(PGconn *conn, const char *errormsg)
2767{
2768 if (!conn)
2769 return -1;
2772 {
2773 libpq_append_conn_error(conn, "no COPY in progress");
2774 return -1;
2775 }
2776
2777 /*
2778 * Send the COPY END indicator. This is simple enough that we don't
2779 * bother delegating it to the fe-protocol files.
2780 */
2781 if (errormsg)
2782 {
2783 /* Send COPY FAIL */
2784 if (pqPutMsgStart(PqMsg_CopyFail, conn) < 0 ||
2785 pqPuts(errormsg, conn) < 0 ||
2786 pqPutMsgEnd(conn) < 0)
2787 return -1;
2788 }
2789 else
2790 {
2791 /* Send COPY DONE */
2792 if (pqPutMsgStart(PqMsg_CopyDone, conn) < 0 ||
2793 pqPutMsgEnd(conn) < 0)
2794 return -1;
2795 }
2796
2797 /*
2798 * If we sent the COPY command in extended-query mode, we must issue a
2799 * Sync as well.
2800 */
2801 if (conn->cmd_queue_head &&
2803 {
2804 if (pqPutMsgStart(PqMsg_Sync, conn) < 0 ||
2805 pqPutMsgEnd(conn) < 0)
2806 return -1;
2807 }
2808
2809 /* Return to active duty */
2812 else
2814
2815 /* Try to flush data */
2816 if (pqFlush(conn) < 0)
2817 return -1;
2818
2819 return 1;
2820}
2821
2822/*
2823 * PQgetCopyData - read a row of data from the backend during COPY OUT
2824 * or COPY BOTH
2825 *
2826 * If successful, sets *buffer to point to a malloc'd row of data, and
2827 * returns row length (always > 0) as result.
2828 * Returns 0 if no row available yet (only possible if async is true),
2829 * -1 if end of copy (consult PQgetResult), or -2 if error (consult
2830 * PQerrorMessage).
2831 */
2832int
2833PQgetCopyData(PGconn *conn, char **buffer, int async)
2834{
2835 *buffer = NULL; /* for all failure cases */
2836 if (!conn)
2837 return -2;
2840 {
2841 libpq_append_conn_error(conn, "no COPY in progress");
2842 return -2;
2843 }
2844 return pqGetCopyData3(conn, buffer, async);
2845}
2846
2847/*
2848 * PQgetline - gets a newline-terminated string from the backend.
2849 *
2850 * Chiefly here so that applications can use "COPY <rel> to stdout"
2851 * and read the output string. Returns a null-terminated string in `buffer`.
2852 *
2853 * XXX this routine is now deprecated, because it can't handle binary data.
2854 * If called during a COPY BINARY we return EOF.
2855 *
2856 * PQgetline reads up to `length`-1 characters (like fgets(3)) but strips
2857 * the terminating \n (like gets(3)).
2858 *
2859 * CAUTION: the caller is responsible for detecting the end-of-copy signal
2860 * (a line containing just "\.") when using this routine.
2861 *
2862 * RETURNS:
2863 * EOF if error (eg, invalid arguments are given)
2864 * 0 if EOL is reached (i.e., \n has been read)
2865 * (this is required for backward-compatibility -- this
2866 * routine used to always return EOF or 0, assuming that
2867 * the line ended within `length` bytes.)
2868 * 1 in other cases (i.e., the buffer was filled before \n is reached)
2869 */
2870int
2871PQgetline(PGconn *conn, char *buffer, int length)
2872{
2873 if (!buffer || length <= 0)
2874 return EOF;
2875 *buffer = '\0';
2876 /* length must be at least 3 to hold the \. terminator! */
2877 if (length < 3)
2878 return EOF;
2879
2880 if (!conn)
2881 return EOF;
2882
2883 return pqGetline3(conn, buffer, length);
2884}
2885
2886/*
2887 * PQgetlineAsync - gets a COPY data row without blocking.
2888 *
2889 * This routine is for applications that want to do "COPY <rel> to stdout"
2890 * asynchronously, that is without blocking. Having issued the COPY command
2891 * and gotten a PGRES_COPY_OUT response, the app should call PQconsumeInput
2892 * and this routine until the end-of-data signal is detected. Unlike
2893 * PQgetline, this routine takes responsibility for detecting end-of-data.
2894 *
2895 * On each call, PQgetlineAsync will return data if a complete data row
2896 * is available in libpq's input buffer. Otherwise, no data is returned
2897 * until the rest of the row arrives.
2898 *
2899 * If -1 is returned, the end-of-data signal has been recognized (and removed
2900 * from libpq's input buffer). The caller *must* next call PQendcopy and
2901 * then return to normal processing.
2902 *
2903 * RETURNS:
2904 * -1 if the end-of-copy-data marker has been recognized
2905 * 0 if no data is available
2906 * >0 the number of bytes returned.
2907 *
2908 * The data returned will not extend beyond a data-row boundary. If possible
2909 * a whole row will be returned at one time. But if the buffer offered by
2910 * the caller is too small to hold a row sent by the backend, then a partial
2911 * data row will be returned. In text mode this can be detected by testing
2912 * whether the last returned byte is '\n' or not.
2913 *
2914 * The returned data is *not* null-terminated.
2915 */
2916
2917int
2918PQgetlineAsync(PGconn *conn, char *buffer, int bufsize)
2919{
2920 if (!conn)
2921 return -1;
2922
2923 return pqGetlineAsync3(conn, buffer, bufsize);
2924}
2925
2926/*
2927 * PQputline -- sends a string to the backend during COPY IN.
2928 * Returns 0 if OK, EOF if not.
2929 *
2930 * This is deprecated primarily because the return convention doesn't allow
2931 * caller to tell the difference between a hard error and a nonblock-mode
2932 * send failure.
2933 */
2934int
2935PQputline(PGconn *conn, const char *string)
2936{
2937 return PQputnbytes(conn, string, strlen(string));
2938}
2939
2940/*
2941 * PQputnbytes -- like PQputline, but buffer need not be null-terminated.
2942 * Returns 0 if OK, EOF if not.
2943 */
2944int
2945PQputnbytes(PGconn *conn, const char *buffer, int nbytes)
2946{
2947 if (PQputCopyData(conn, buffer, nbytes) > 0)
2948 return 0;
2949 else
2950 return EOF;
2951}
2952
2953/*
2954 * PQendcopy
2955 * After completing the data transfer portion of a copy in/out,
2956 * the application must call this routine to finish the command protocol.
2957 *
2958 * This is deprecated; it's cleaner to use PQgetResult to get the transfer
2959 * status.
2960 *
2961 * RETURNS:
2962 * 0 on success
2963 * 1 on failure
2964 */
2965int
2967{
2968 if (!conn)
2969 return 0;
2970
2971 return pqEndcopy3(conn);
2972}
2973
2974
2975/* ----------------
2976 * PQfn - Send a function call to the POSTGRES backend.
2977 *
2978 * conn : backend connection
2979 * fnid : OID of function to be called
2980 * result_buf : pointer to result buffer
2981 * result_len : actual length of result is returned here
2982 * result_is_int : If the result is an integer, this must be 1,
2983 * otherwise this should be 0
2984 * args : pointer to an array of function arguments
2985 * (each has length, if integer, and value/pointer)
2986 * nargs : # of arguments in args array.
2987 *
2988 * RETURNS
2989 * PGresult with status = PGRES_COMMAND_OK if successful.
2990 * *result_len is > 0 if there is a return value, 0 if not.
2991 * PGresult with status = PGRES_FATAL_ERROR if backend returns an error.
2992 * NULL on communications failure. conn->errorMessage will be set.
2993 * ----------------
2994 */
2995
2996PGresult *
2998 int fnid,
2999 int *result_buf,
3000 int *result_len,
3001 int result_is_int,
3002 const PQArgBlock *args,
3003 int nargs)
3004{
3005 *result_len = 0;
3006
3007 if (!conn)
3008 return NULL;
3009
3010 /*
3011 * Since this is the beginning of a query cycle, reset the error state.
3012 * However, in pipeline mode with something already queued, the error
3013 * buffer belongs to that command and we shouldn't clear it.
3014 */
3015 if (conn->cmd_queue_head == NULL)
3017
3019 {
3020 libpq_append_conn_error(conn, "%s not allowed in pipeline mode", "PQfn");
3021 return NULL;
3022 }
3023
3026 {
3027 libpq_append_conn_error(conn, "connection in wrong state");
3028 return NULL;
3029 }
3030
3031 return pqFunctionCall3(conn, fnid,
3032 result_buf, result_len,
3033 result_is_int,
3034 args, nargs);
3035}
3036
3037/* ====== Pipeline mode support ======== */
3038
3039/*
3040 * PQenterPipelineMode
3041 * Put an idle connection in pipeline mode.
3042 *
3043 * Returns 1 on success. On failure, errorMessage is set and 0 is returned.
3044 *
3045 * Commands submitted after this can be pipelined on the connection;
3046 * there's no requirement to wait for one to finish before the next is
3047 * dispatched.
3048 *
3049 * Queuing of a new query or syncing during COPY is not allowed.
3050 *
3051 * A set of commands is terminated by a PQpipelineSync. Multiple sync
3052 * points can be established while in pipeline mode. Pipeline mode can
3053 * be exited by calling PQexitPipelineMode() once all results are processed.
3054 *
3055 * This doesn't actually send anything on the wire, it just puts libpq
3056 * into a state where it can pipeline work.
3057 */
3058int
3060{
3061 if (!conn)
3062 return 0;
3063
3064 /* succeed with no action if already in pipeline mode */
3066 return 1;
3067
3069 {
3070 libpq_append_conn_error(conn, "cannot enter pipeline mode, connection not idle");
3071 return 0;
3072 }
3073
3075
3076 return 1;
3077}
3078
3079/*
3080 * PQexitPipelineMode
3081 * End pipeline mode and return to normal command mode.
3082 *
3083 * Returns 1 in success (pipeline mode successfully ended, or not in pipeline
3084 * mode).
3085 *
3086 * Returns 0 if in pipeline mode and cannot be ended yet. Error message will
3087 * be set.
3088 */
3089int
3091{
3092 if (!conn)
3093 return 0;
3094
3098 conn->cmd_queue_head == NULL)
3099 return 1;
3100
3101 switch (conn->asyncStatus)
3102 {
3103 case PGASYNC_READY:
3104 case PGASYNC_READY_MORE:
3105 /* there are some uncollected results */
3106 libpq_append_conn_error(conn, "cannot exit pipeline mode with uncollected results");
3107 return 0;
3108
3109 case PGASYNC_BUSY:
3110 libpq_append_conn_error(conn, "cannot exit pipeline mode while busy");
3111 return 0;
3112
3113 case PGASYNC_IDLE:
3115 /* OK */
3116 break;
3117
3118 case PGASYNC_COPY_IN:
3119 case PGASYNC_COPY_OUT:
3120 case PGASYNC_COPY_BOTH:
3121 libpq_append_conn_error(conn, "cannot exit pipeline mode while in COPY");
3122 }
3123
3124 /* still work to process */
3125 if (conn->cmd_queue_head != NULL)
3126 {
3127 libpq_append_conn_error(conn, "cannot exit pipeline mode with uncollected results");
3128 return 0;
3129 }
3130
3133
3134 /* Flush any pending data in out buffer */
3135 if (pqFlush(conn) < 0)
3136 return 0; /* error message is setup already */
3137 return 1;
3138}
3139
3140/*
3141 * pqCommandQueueAdvance
3142 * Remove one query from the command queue, if appropriate.
3143 *
3144 * If we have received all results corresponding to the head element
3145 * in the command queue, remove it.
3146 *
3147 * In simple query protocol we must not advance the command queue until the
3148 * ReadyForQuery message has been received. This is because in simple mode a
3149 * command can have multiple queries, and we must process result for all of
3150 * them before moving on to the next command.
3151 *
3152 * Another consideration is synchronization during error processing in
3153 * extended query protocol: we refuse to advance the queue past a SYNC queue
3154 * element, unless the result we've received is also a SYNC. In particular
3155 * this protects us from advancing when an error is received at an
3156 * inappropriate moment.
3157 */
3158void
3159pqCommandQueueAdvance(PGconn *conn, bool isReadyForQuery, bool gotSync)
3160{
3161 PGcmdQueueEntry *prevquery;
3162
3163 if (conn->cmd_queue_head == NULL)
3164 return;
3165
3166 /*
3167 * If processing a query of simple query protocol, we only advance the
3168 * queue when we receive the ReadyForQuery message for it.
3169 */
3170 if (conn->cmd_queue_head->queryclass == PGQUERY_SIMPLE && !isReadyForQuery)
3171 return;
3172
3173 /*
3174 * If we're waiting for a SYNC, don't advance the queue until we get one.
3175 */
3176 if (conn->cmd_queue_head->queryclass == PGQUERY_SYNC && !gotSync)
3177 return;
3178
3179 /* delink element from queue */
3180 prevquery = conn->cmd_queue_head;
3182
3183 /* If the queue is now empty, reset the tail too */
3184 if (conn->cmd_queue_head == NULL)
3185 conn->cmd_queue_tail = NULL;
3186
3187 /* and make the queue element recyclable */
3188 prevquery->next = NULL;
3189 pqRecycleCmdQueueEntry(conn, prevquery);
3190}
3191
3192/*
3193 * pqPipelineProcessQueue: subroutine for PQgetResult
3194 * In pipeline mode, start processing the results of the next query in the queue.
3195 */
3196static void
3198{
3199 switch (conn->asyncStatus)
3200 {
3201 case PGASYNC_COPY_IN:
3202 case PGASYNC_COPY_OUT:
3203 case PGASYNC_COPY_BOTH:
3204 case PGASYNC_READY:
3205 case PGASYNC_READY_MORE:
3206 case PGASYNC_BUSY:
3207 /* client still has to process current query or results */
3208 return;
3209
3210 case PGASYNC_IDLE:
3211
3212 /*
3213 * If we're in IDLE mode and there's some command in the queue,
3214 * get us into PIPELINE_IDLE mode and process normally. Otherwise
3215 * there's nothing for us to do.
3216 */
3217 if (conn->cmd_queue_head != NULL)
3218 {
3220 break;
3221 }
3222 return;
3223
3226 /* next query please */
3227 break;
3228 }
3229
3230 /*
3231 * Reset partial-result mode. (Client has to set it up for each query, if
3232 * desired.)
3233 */
3234 conn->partialResMode = false;
3235 conn->singleRowMode = false;
3236 conn->maxChunkSize = 0;
3237
3238 /*
3239 * If there are no further commands to process in the queue, get us in
3240 * "real idle" mode now.
3241 */
3242 if (conn->cmd_queue_head == NULL)
3243 {
3245 return;
3246 }
3247
3248 /*
3249 * Reset the error state. This and the next couple of steps correspond to
3250 * what PQsendQueryStart didn't do for this query.
3251 */
3253
3254 /* Initialize async result-accumulation state */
3256
3259 {
3260 /*
3261 * In an aborted pipeline we don't get anything from the server for
3262 * each result; we're just discarding commands from the queue until we
3263 * get to the next sync from the server.
3264 *
3265 * The PGRES_PIPELINE_ABORTED results tell the client that its queries
3266 * got aborted.
3267 */
3269 if (!conn->result)
3270 {
3271 libpq_append_conn_error(conn, "out of memory");
3273 return;
3274 }
3276 }
3277 else
3278 {
3279 /* allow parsing to continue */
3281 }
3282}
3283
3284/*
3285 * PQpipelineSync
3286 * Send a Sync message as part of a pipeline, and flush to server
3287 */
3288int
3290{
3291 return pqPipelineSyncInternal(conn, true);
3292}
3293
3294/*
3295 * PQsendPipelineSync
3296 * Send a Sync message as part of a pipeline, without flushing to server
3297 */
3298int
3300{
3301 return pqPipelineSyncInternal(conn, false);
3302}
3303
3304/*
3305 * Workhorse function for PQpipelineSync and PQsendPipelineSync.
3306 *
3307 * immediate_flush controls if the flush happens immediately after sending the
3308 * Sync message or not.
3309 */
3310static int
3311pqPipelineSyncInternal(PGconn *conn, bool immediate_flush)
3312{
3313 PGcmdQueueEntry *entry;
3314
3315 if (!conn)
3316 return 0;
3317
3319 {
3320 libpq_append_conn_error(conn, "cannot send pipeline when not in pipeline mode");
3321 return 0;
3322 }
3323
3324 switch (conn->asyncStatus)
3325 {
3326 case PGASYNC_COPY_IN:
3327 case PGASYNC_COPY_OUT:
3328 case PGASYNC_COPY_BOTH:
3329 /* should be unreachable */
3331 "internal error: cannot send pipeline while in COPY\n");
3332 return 0;
3333 case PGASYNC_READY:
3334 case PGASYNC_READY_MORE:
3335 case PGASYNC_BUSY:
3336 case PGASYNC_IDLE:
3338 /* OK to send sync */
3339 break;
3340 }
3341
3342 entry = pqAllocCmdQueueEntry(conn);
3343 if (entry == NULL)
3344 return 0; /* error msg already set */
3345
3346 entry->queryclass = PGQUERY_SYNC;
3347 entry->query = NULL;
3348
3349 /* construct the Sync message */
3350 if (pqPutMsgStart(PqMsg_Sync, conn) < 0 ||
3351 pqPutMsgEnd(conn) < 0)
3352 goto sendFailed;
3353
3354 /*
3355 * Give the data a push. In nonblock mode, don't complain if we're unable
3356 * to send it all; PQgetResult() will do any additional flushing needed.
3357 * If immediate_flush is disabled, the data is pushed if we are past the
3358 * size threshold.
3359 */
3360 if (immediate_flush)
3361 {
3362 if (pqFlush(conn) < 0)
3363 goto sendFailed;
3364 }
3365 else
3366 {
3367 if (pqPipelineFlush(conn) < 0)
3368 goto sendFailed;
3369 }
3370
3371 /* OK, it's launched! */
3373
3374 return 1;
3375
3376sendFailed:
3378 /* error message should be set up already */
3379 return 0;
3380}
3381
3382/*
3383 * PQsendFlushRequest
3384 * Send request for server to flush its buffer. Useful in pipeline
3385 * mode when a sync point is not desired.
3386 */
3387int
3389{
3390 if (!conn)
3391 return 0;
3392
3393 /* Don't try to send if we know there's no live connection. */
3394 if (conn->status != CONNECTION_OK)
3395 {
3396 libpq_append_conn_error(conn, "no connection to the server");
3397 return 0;
3398 }
3399
3400 /* Can't send while already busy, either, unless enqueuing for later */
3401 if (conn->asyncStatus != PGASYNC_IDLE &&
3403 {
3404 libpq_append_conn_error(conn, "another command is already in progress");
3405 return 0;
3406 }
3407
3408 if (pqPutMsgStart(PqMsg_Flush, conn) < 0 ||
3409 pqPutMsgEnd(conn) < 0)
3410 {
3411 return 0;
3412 }
3413
3414 /*
3415 * Give the data a push (in pipeline mode, only if we're past the size
3416 * threshold). In nonblock mode, don't complain if we're unable to send
3417 * it all; PQgetResult() will do any additional flushing needed.
3418 */
3419 if (pqPipelineFlush(conn) < 0)
3420 return 0;
3421
3422 return 1;
3423}
3424
3425/* ====== accessor funcs for PGresult ======== */
3426
3429{
3430 if (!res)
3431 return PGRES_FATAL_ERROR;
3432 return res->resultStatus;
3433}
3434
3435char *
3437{
3438 if ((unsigned int) status >= lengthof(pgresStatus))
3439 return libpq_gettext("invalid ExecStatusType code");
3440 return pgresStatus[status];
3441}
3442
3443char *
3445{
3446 if (!res || !res->errMsg)
3447 return "";
3448 return res->errMsg;
3449}
3450
3451char *
3453 PGVerbosity verbosity,
3454 PGContextVisibility show_context)
3455{
3456 PQExpBufferData workBuf;
3457
3458 /*
3459 * Because the caller is expected to free the result string, we must
3460 * strdup any constant result. We use plain strdup and document that
3461 * callers should expect NULL if out-of-memory.
3462 */
3463 if (!res ||
3466 return strdup(libpq_gettext("PGresult is not an error result\n"));
3467
3468 initPQExpBuffer(&workBuf);
3469
3470 pqBuildErrorMessage3(&workBuf, res, verbosity, show_context);
3471
3472 /* If insufficient memory to format the message, fail cleanly */
3473 if (PQExpBufferDataBroken(workBuf))
3474 {
3475 termPQExpBuffer(&workBuf);
3476 return strdup(libpq_gettext("out of memory\n"));
3477 }
3478
3479 return workBuf.data;
3480}
3481
3482char *
3483PQresultErrorField(const PGresult *res, int fieldcode)
3484{
3485 PGMessageField *pfield;
3486
3487 if (!res)
3488 return NULL;
3489 for (pfield = res->errFields; pfield != NULL; pfield = pfield->next)
3490 {
3491 if (pfield->code == fieldcode)
3492 return pfield->contents;
3493 }
3494 return NULL;
3495}
3496
3497int
3499{
3500 if (!res)
3501 return 0;
3502 return res->ntups;
3503}
3504
3505int
3507{
3508 if (!res)
3509 return 0;
3510 return res->numAttributes;
3511}
3512
3513int
3515{
3516 if (!res)
3517 return 0;
3518 return res->binary;
3519}
3520
3521/*
3522 * Helper routines to range-check field numbers and tuple numbers.
3523 * Return true if OK, false if not
3524 */
3525
3526static int
3527check_field_number(const PGresult *res, int field_num)
3528{
3529 if (!res)
3530 return false; /* no way to display error message... */
3531 if (field_num < 0 || field_num >= res->numAttributes)
3532 {
3534 "column number %d is out of range 0..%d",
3535 field_num, res->numAttributes - 1);
3536 return false;
3537 }
3538 return true;
3539}
3540
3541static int
3543 int tup_num, int field_num)
3544{
3545 if (!res)
3546 return false; /* no way to display error message... */
3547 if (tup_num < 0 || tup_num >= res->ntups)
3548 {
3550 "row number %d is out of range 0..%d",
3551 tup_num, res->ntups - 1);
3552 return false;
3553 }
3554 if (field_num < 0 || field_num >= res->numAttributes)
3555 {
3557 "column number %d is out of range 0..%d",
3558 field_num, res->numAttributes - 1);
3559 return false;
3560 }
3561 return true;
3562}
3563
3564static int
3565check_param_number(const PGresult *res, int param_num)
3566{
3567 if (!res)
3568 return false; /* no way to display error message... */
3569 if (param_num < 0 || param_num >= res->numParameters)
3570 {
3572 "parameter number %d is out of range 0..%d",
3573 param_num, res->numParameters - 1);
3574 return false;
3575 }
3576
3577 return true;
3578}
3579
3580/*
3581 * returns NULL if the field_num is invalid
3582 */
3583char *
3584PQfname(const PGresult *res, int field_num)
3585{
3586 if (!check_field_number(res, field_num))
3587 return NULL;
3588 if (res->attDescs)
3589 return res->attDescs[field_num].name;
3590 else
3591 return NULL;
3592}
3593
3594/*
3595 * PQfnumber: find column number given column name
3596 *
3597 * The column name is parsed as if it were in a SQL statement, including
3598 * case-folding and double-quote processing. But note a possible gotcha:
3599 * downcasing in the frontend might follow different locale rules than
3600 * downcasing in the backend...
3601 *
3602 * Returns -1 if no match. In the present backend it is also possible
3603 * to have multiple matches, in which case the first one is found.
3604 */
3605int
3606PQfnumber(const PGresult *res, const char *field_name)
3607{
3608 char *field_case;
3609 bool in_quotes;
3610 bool all_lower = true;
3611 const char *iptr;
3612 char *optr;
3613 int i;
3614
3615 if (!res)
3616 return -1;
3617
3618 /*
3619 * Note: it is correct to reject a zero-length input string; the proper
3620 * input to match a zero-length field name would be "".
3621 */
3622 if (field_name == NULL ||
3623 field_name[0] == '\0' ||
3624 res->attDescs == NULL)
3625 return -1;
3626
3627 /*
3628 * Check if we can avoid the strdup() and related work because the
3629 * passed-in string wouldn't be changed before we do the check anyway.
3630 */
3631 for (iptr = field_name; *iptr; iptr++)
3632 {
3633 char c = *iptr;
3634
3635 if (c == '"' || c != pg_tolower((unsigned char) c))
3636 {
3637 all_lower = false;
3638 break;
3639 }
3640 }
3641
3642 if (all_lower)
3643 for (i = 0; i < res->numAttributes; i++)
3644 if (strcmp(field_name, res->attDescs[i].name) == 0)
3645 return i;
3646
3647 /* Fall through to the normal check if that didn't work out. */
3648
3649 /*
3650 * Note: this code will not reject partially quoted strings, eg
3651 * foo"BAR"foo will become fooBARfoo when it probably ought to be an error
3652 * condition.
3653 */
3654 field_case = strdup(field_name);
3655 if (field_case == NULL)
3656 return -1; /* grotty */
3657
3658 in_quotes = false;
3659 optr = field_case;
3660 for (iptr = field_case; *iptr; iptr++)
3661 {
3662 char c = *iptr;
3663
3664 if (in_quotes)
3665 {
3666 if (c == '"')
3667 {
3668 if (iptr[1] == '"')
3669 {
3670 /* doubled quotes become a single quote */
3671 *optr++ = '"';
3672 iptr++;
3673 }
3674 else
3675 in_quotes = false;
3676 }
3677 else
3678 *optr++ = c;
3679 }
3680 else if (c == '"')
3681 in_quotes = true;
3682 else
3683 {
3684 c = pg_tolower((unsigned char) c);
3685 *optr++ = c;
3686 }
3687 }
3688 *optr = '\0';
3689
3690 for (i = 0; i < res->numAttributes; i++)
3691 {
3692 if (strcmp(field_case, res->attDescs[i].name) == 0)
3693 {
3694 free(field_case);
3695 return i;
3696 }
3697 }
3698 free(field_case);
3699 return -1;
3700}
3701
3702Oid
3703PQftable(const PGresult *res, int field_num)
3704{
3705 if (!check_field_number(res, field_num))
3706 return InvalidOid;
3707 if (res->attDescs)
3708 return res->attDescs[field_num].tableid;
3709 else
3710 return InvalidOid;
3711}
3712
3713int
3714PQftablecol(const PGresult *res, int field_num)
3715{
3716 if (!check_field_number(res, field_num))
3717 return 0;
3718 if (res->attDescs)
3719 return res->attDescs[field_num].columnid;
3720 else
3721 return 0;
3722}
3723
3724int
3725PQfformat(const PGresult *res, int field_num)
3726{
3727 if (!check_field_number(res, field_num))
3728 return 0;
3729 if (res->attDescs)
3730 return res->attDescs[field_num].format;
3731 else
3732 return 0;
3733}
3734
3735Oid
3736PQftype(const PGresult *res, int field_num)
3737{
3738 if (!check_field_number(res, field_num))
3739 return InvalidOid;
3740 if (res->attDescs)
3741 return res->attDescs[field_num].typid;
3742 else
3743 return InvalidOid;
3744}
3745
3746int
3747PQfsize(const PGresult *res, int field_num)
3748{
3749 if (!check_field_number(res, field_num))
3750 return 0;
3751 if (res->attDescs)
3752 return res->attDescs[field_num].typlen;
3753 else
3754 return 0;
3755}
3756
3757int
3758PQfmod(const PGresult *res, int field_num)
3759{
3760 if (!check_field_number(res, field_num))
3761 return 0;
3762 if (res->attDescs)
3763 return res->attDescs[field_num].atttypmod;
3764 else
3765 return 0;
3766}
3767
3768char *
3770{
3771 if (!res)
3772 return NULL;
3773 return res->cmdStatus;
3774}
3775
3776/*
3777 * PQoidStatus -
3778 * if the last command was an INSERT, return the oid string
3779 * if not, return ""
3780 */
3781char *
3783{
3784 /*
3785 * This must be enough to hold the result. Don't laugh, this is better
3786 * than what this function used to do.
3787 */
3788 static char buf[24];
3789
3790 size_t len;
3791
3792 if (!res || strncmp(res->cmdStatus, "INSERT ", 7) != 0)
3793 return "";
3794
3795 len = strspn(res->cmdStatus + 7, "0123456789");
3796 if (len > sizeof(buf) - 1)
3797 len = sizeof(buf) - 1;
3798 memcpy(buf, res->cmdStatus + 7, len);
3799 buf[len] = '\0';
3800
3801 return buf;
3802}
3803
3804/*
3805 * PQoidValue -
3806 * a perhaps preferable form of the above which just returns
3807 * an Oid type
3808 */
3809Oid
3811{
3812 char *endptr = NULL;
3813 unsigned long result;
3814
3815 if (!res ||
3816 strncmp(res->cmdStatus, "INSERT ", 7) != 0 ||
3817 res->cmdStatus[7] < '0' ||
3818 res->cmdStatus[7] > '9')
3819 return InvalidOid;
3820
3821 result = strtoul(res->cmdStatus + 7, &endptr, 10);
3822
3823 if (!endptr || (*endptr != ' ' && *endptr != '\0'))
3824 return InvalidOid;
3825 else
3826 return (Oid) result;
3827}
3828
3829
3830/*
3831 * PQcmdTuples -
3832 * If the last command was INSERT/UPDATE/DELETE/MERGE/MOVE/FETCH/COPY,
3833 * return a string containing the number of inserted/affected tuples.
3834 * If not, return "".
3835 *
3836 * XXX: this should probably return an int
3837 */
3838char *
3840{
3841 char *p,
3842 *c;
3843
3844 if (!res)
3845 return "";
3846
3847 if (strncmp(res->cmdStatus, "INSERT ", 7) == 0)
3848 {
3849 p = res->cmdStatus + 7;
3850 /* INSERT: skip oid and space */
3851 while (*p && *p != ' ')
3852 p++;
3853 if (*p == 0)
3854 goto interpret_error; /* no space? */
3855 p++;
3856 }
3857 else if (strncmp(res->cmdStatus, "SELECT ", 7) == 0 ||
3858 strncmp(res->cmdStatus, "DELETE ", 7) == 0 ||
3859 strncmp(res->cmdStatus, "UPDATE ", 7) == 0)
3860 p = res->cmdStatus + 7;
3861 else if (strncmp(res->cmdStatus, "FETCH ", 6) == 0 ||
3862 strncmp(res->cmdStatus, "MERGE ", 6) == 0)
3863 p = res->cmdStatus + 6;
3864 else if (strncmp(res->cmdStatus, "MOVE ", 5) == 0 ||
3865 strncmp(res->cmdStatus, "COPY ", 5) == 0)
3866 p = res->cmdStatus + 5;
3867 else
3868 return "";
3869
3870 /* check that we have an integer (at least one digit, nothing else) */
3871 for (c = p; *c; c++)
3872 {
3873 if (!isdigit((unsigned char) *c))
3874 goto interpret_error;
3875 }
3876 if (c == p)
3877 goto interpret_error;
3878
3879 return p;
3880
3881interpret_error:
3883 "could not interpret result from server: %s",
3884 res->cmdStatus);
3885 return "";
3886}
3887
3888/*
3889 * PQgetvalue:
3890 * return the value of field 'field_num' of row 'tup_num'
3891 */
3892char *
3893PQgetvalue(const PGresult *res, int tup_num, int field_num)
3894{
3895 if (!check_tuple_field_number(res, tup_num, field_num))
3896 return NULL;
3897 return res->tuples[tup_num][field_num].value;
3898}
3899
3900/* PQgetlength:
3901 * returns the actual length of a field value in bytes.
3902 */
3903int
3904PQgetlength(const PGresult *res, int tup_num, int field_num)
3905{
3906 if (!check_tuple_field_number(res, tup_num, field_num))
3907 return 0;
3908 if (res->tuples[tup_num][field_num].len != NULL_LEN)
3909 return res->tuples[tup_num][field_num].len;
3910 else
3911 return 0;
3912}
3913
3914/* PQgetisnull:
3915 * returns the null status of a field value.
3916 */
3917int
3918PQgetisnull(const PGresult *res, int tup_num, int field_num)
3919{
3920 if (!check_tuple_field_number(res, tup_num, field_num))
3921 return 1; /* pretend it is null */
3922 if (res->tuples[tup_num][field_num].len == NULL_LEN)
3923 return 1;
3924 else
3925 return 0;
3926}
3927
3928/* PQnparams:
3929 * returns the number of input parameters of a prepared statement.
3930 */
3931int
3933{
3934 if (!res)
3935 return 0;
3936 return res->numParameters;
3937}
3938
3939/* PQparamtype:
3940 * returns type Oid of the specified statement parameter.
3941 */
3942Oid
3943PQparamtype(const PGresult *res, int param_num)
3944{
3945 if (!check_param_number(res, param_num))
3946 return InvalidOid;
3947 if (res->paramDescs)
3948 return res->paramDescs[param_num].typid;
3949 else
3950 return InvalidOid;
3951}
3952
3953
3954/* PQsetnonblocking:
3955 * sets the PGconn's database connection non-blocking if the arg is true
3956 * or makes it blocking if the arg is false, this will not protect
3957 * you from PQexec(), you'll only be safe when using the non-blocking API.
3958 * Needs to be called only on a connected database connection.
3959 */
3960int
3962{
3963 bool barg;
3964
3965 if (!conn || conn->status == CONNECTION_BAD)
3966 return -1;
3967
3968 barg = (arg ? true : false);
3969
3970 /* early out if the socket is already in the state requested */
3971 if (barg == conn->nonblocking)
3972 return 0;
3973
3974 /*
3975 * to guarantee constancy for flushing/query/result-polling behavior we
3976 * need to flush the send queue at this point in order to guarantee proper
3977 * behavior. this is ok because either they are making a transition _from_
3978 * or _to_ blocking mode, either way we can block them.
3979 *
3980 * Clear error state in case pqFlush adds to it, unless we're actively
3981 * pipelining, in which case it seems best not to.
3982 */
3983 if (conn->cmd_queue_head == NULL)
3985
3986 /* if we are going from blocking to non-blocking flush here */
3987 if (pqFlush(conn))
3988 return -1;
3989
3990 conn->nonblocking = barg;
3991
3992 return 0;
3993}
3994
3995/*
3996 * return the blocking status of the database connection
3997 * true == nonblocking, false == blocking
3998 */
3999int
4001{
4002 if (!conn || conn->status == CONNECTION_BAD)
4003 return false;
4004 return pqIsnonblocking(conn);
4005}
4006
4007/* libpq is thread-safe? */
4008int
4010{
4011 return true;
4012}
4013
4014
4015/* try to force data out, really only useful for non-blocking users */
4016int
4018{
4019 if (!conn || conn->status == CONNECTION_BAD)
4020 return -1;
4021 return pqFlush(conn);
4022}
4023
4024/*
4025 * pqPipelineFlush
4026 *
4027 * In pipeline mode, data will be flushed only when the out buffer reaches the
4028 * threshold value. In non-pipeline mode, it behaves as stock pqFlush.
4029 *
4030 * Returns 0 on success.
4031 */
4032static int
4034{
4037 return pqFlush(conn);
4038 return 0;
4039}
4040
4041
4042/*
4043 * PQfreemem - safely frees memory allocated
4044 *
4045 * Needed mostly by Win32, unless multithreaded DLL (/MD in VC6)
4046 * Used for freeing memory from PQescapeBytea()/PQunescapeBytea()
4047 */
4048void
4049PQfreemem(void *ptr)
4050{
4051 free(ptr);
4052}
4053
4054/*
4055 * PQfreeNotify - free's the memory associated with a PGnotify
4056 *
4057 * This function is here only for binary backward compatibility.
4058 * New code should use PQfreemem(). A macro will automatically map
4059 * calls to PQfreemem. It should be removed in the future. bjm 2003-03-24
4060 */
4061
4062#undef PQfreeNotify
4063void PQfreeNotify(PGnotify *notify);
4064
4065void
4067{
4068 PQfreemem(notify);
4069}
4070
4071
4072/*
4073 * Escaping arbitrary strings to get valid SQL literal strings.
4074 *
4075 * Replaces "'" with "''", and if not std_strings, replaces "\" with "\\".
4076 *
4077 * length is the length of the source string. (Note: if a terminating NUL
4078 * is encountered sooner, PQescapeString stops short of "length"; the behavior
4079 * is thus rather like strncpy.)
4080 *
4081 * For safety the buffer at "to" must be at least 2*length + 1 bytes long.
4082 * A terminating NUL character is added to the output string, whether the
4083 * input is NUL-terminated or not.
4084 *
4085 * Returns the actual length of the output (not counting the terminating NUL).
4086 */
4087static size_t
4089 char *to, const char *from, size_t length,
4090 int *error,
4091 int encoding, bool std_strings)
4092{
4093 const char *source = from;
4094 char *target = to;
4095 size_t remaining = strnlen(from, length);
4096 bool already_complained = false;
4097
4098 if (error)
4099 *error = 0;
4100
4101 while (remaining > 0)
4102 {
4103 char c = *source;
4104 int charlen;
4105 int i;
4106
4107 /* Fast path for plain ASCII */
4108 if (!IS_HIGHBIT_SET(c))
4109 {
4110 /* Apply quoting if needed */
4111 if (SQL_STR_DOUBLE(c, !std_strings))
4112 *target++ = c;
4113 /* Copy the character */
4114 *target++ = c;
4115 source++;
4116 remaining--;
4117 continue;
4118 }
4119
4120 /* Slow path for possible multibyte characters */
4122 source, remaining);
4123
4124 if (remaining < charlen ||
4125 pg_encoding_verifymbchar(encoding, source, charlen) == -1)
4126 {
4127 /*
4128 * Multibyte character is invalid. It's important to verify that
4129 * as invalid multibyte characters could e.g. be used to "skip"
4130 * over quote characters, e.g. when parsing
4131 * character-by-character.
4132 *
4133 * Report an error if possible, and replace the character's first
4134 * byte with an invalid sequence. The invalid sequence ensures
4135 * that the escaped string will trigger an error on the
4136 * server-side, even if we can't directly report an error here.
4137 *
4138 * This isn't *that* crucial when we can report an error to the
4139 * caller; but if we can't or the caller ignores it, the caller
4140 * will use this string unmodified and it needs to be safe for
4141 * parsing.
4142 *
4143 * We know there's enough space for the invalid sequence because
4144 * the "to" buffer needs to be at least 2 * length + 1 long, and
4145 * at worst we're replacing a single input byte with two invalid
4146 * bytes.
4147 *
4148 * It would be a bit faster to verify the whole string the first
4149 * time we encounter a set highbit, but this way we can replace
4150 * just the invalid data, which probably makes it easier for users
4151 * to find the invalidly encoded portion of a larger string.
4152 */
4153 if (error)
4154 *error = 1;
4155 if (conn && !already_complained)
4156 {
4157 if (remaining < charlen)
4158 libpq_append_conn_error(conn, "incomplete multibyte character");
4159 else
4160 libpq_append_conn_error(conn, "invalid multibyte character");
4161 /* Issue a complaint only once per string */
4162 already_complained = true;
4163 }
4164
4166 target += 2;
4167
4168 /*
4169 * Handle the following bytes as if this byte didn't exist. That's
4170 * safer in case the subsequent bytes contain important characters
4171 * for the caller (e.g. '>' in html).
4172 */
4173 source++;
4174 remaining--;
4175 }
4176 else
4177 {
4178 /* Copy the character */
4179 for (i = 0; i < charlen; i++)
4180 {
4181 *target++ = *source++;
4182 remaining--;
4183 }
4184 }
4185 }
4186
4187 /* Write the terminating NUL character. */
4188 *target = '\0';
4189
4190 return target - to;
4191}
4192
4193size_t
4195 char *to, const char *from, size_t length,
4196 int *error)
4197{
4198 if (!conn)
4199 {
4200 /* force empty-string result */
4201 *to = '\0';
4202 if (error)
4203 *error = 1;
4204 return 0;
4205 }
4206
4207 if (conn->cmd_queue_head == NULL)
4209
4210 return PQescapeStringInternal(conn, to, from, length, error,
4212 conn->std_strings);
4213}
4214
4215size_t
4216PQescapeString(char *to, const char *from, size_t length)
4217{
4218 return PQescapeStringInternal(NULL, to, from, length, NULL,
4221}
4222
4223
4224/*
4225 * Escape arbitrary strings. If as_ident is true, we escape the result
4226 * as an identifier; if false, as a literal. The result is returned in
4227 * a newly allocated buffer. If we fail due to an encoding violation or out
4228 * of memory condition, we return NULL, storing an error message into conn.
4229 */
4230static char *
4231PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident)
4232{
4233 const char *s;
4234 char *result;
4235 char *rp;
4236 size_t num_quotes = 0; /* single or double, depending on as_ident */
4237 size_t num_backslashes = 0;
4238 size_t input_len = strnlen(str, len);
4239 size_t result_size;
4240 char quote_char = as_ident ? '"' : '\'';
4241 bool validated_mb = false;
4242
4243 /* We must have a connection, else fail immediately. */
4244 if (!conn)
4245 return NULL;
4246
4247 if (conn->cmd_queue_head == NULL)
4249
4250 /*
4251 * Scan the string for characters that must be escaped and for invalidly
4252 * encoded data.
4253 */
4254 s = str;
4255 for (size_t remaining = input_len; remaining > 0; remaining--, s++)
4256 {
4257 if (*s == quote_char)
4258 ++num_quotes;
4259 else if (*s == '\\')
4260 ++num_backslashes;
4261 else if (IS_HIGHBIT_SET(*s))
4262 {
4263 int charlen;
4264
4265 /* Slow path for possible multibyte characters */
4267 s, remaining);
4268
4269 if (charlen > remaining)
4270 {
4271 /* Multibyte character overruns allowable length. */
4272 libpq_append_conn_error(conn, "incomplete multibyte character");
4273 return NULL;
4274 }
4275
4276 /*
4277 * If we haven't already, check that multibyte characters are
4278 * valid. It's important to verify that as invalid multi-byte
4279 * characters could e.g. be used to "skip" over quote characters,
4280 * e.g. when parsing character-by-character.
4281 *
4282 * We check validity once, for the whole remainder of the string,
4283 * when we first encounter any multi-byte character. Some
4284 * encodings have optimized implementations for longer strings.
4285 */
4286 if (!validated_mb)
4287 {
4289 != remaining)
4290 {
4291 libpq_append_conn_error(conn, "invalid multibyte character");
4292 return NULL;
4293 }
4294 validated_mb = true;
4295 }
4296
4297 /* Adjust s, bearing in mind that for loop will increment it. */
4298 s += charlen - 1;
4299 remaining -= charlen - 1;
4300 }
4301 }
4302
4303 /*
4304 * Allocate output buffer. Protect against overflow, in case the caller
4305 * has allocated a large fraction of the available size_t.
4306 */
4307 if (pg_add_size_overflow(input_len, num_quotes, &result_size) ||
4308 pg_add_size_overflow(result_size, 3, &result_size)) /* two quotes plus a NUL */
4309 goto overflow;
4310
4311 if (!as_ident && num_backslashes > 0)
4312 {
4313 if (pg_add_size_overflow(result_size, num_backslashes, &result_size) ||
4314 pg_add_size_overflow(result_size, 2, &result_size)) /* for " E" prefix */
4315 goto overflow;
4316 }
4317
4318 result = rp = (char *) malloc(result_size);
4319 if (rp == NULL)
4320 {
4321 libpq_append_conn_error(conn, "out of memory");
4322 return NULL;
4323 }
4324
4325 /*
4326 * If we are escaping a literal that contains backslashes, we use the
4327 * escape string syntax so that the result is correct under either value
4328 * of standard_conforming_strings. We also emit a leading space in this
4329 * case, to guard against the possibility that the result might be
4330 * interpolated immediately following an identifier.
4331 */
4332 if (!as_ident && num_backslashes > 0)
4333 {
4334 *rp++ = ' ';
4335 *rp++ = 'E';
4336 }
4337
4338 /* Opening quote. */
4339 *rp++ = quote_char;
4340
4341 /*
4342 * Use fast path if possible.
4343 *
4344 * We've already verified that the input string is well-formed in the
4345 * current encoding. If it contains no quotes and, in the case of
4346 * literal-escaping, no backslashes, then we can just copy it directly to
4347 * the output buffer, adding the necessary quotes.
4348 *
4349 * If not, we must rescan the input and process each character
4350 * individually.
4351 */
4352 if (num_quotes == 0 && (num_backslashes == 0 || as_ident))
4353 {
4354 memcpy(rp, str, input_len);
4355 rp += input_len;
4356 }
4357 else
4358 {
4359 s = str;
4360 for (size_t remaining = input_len; remaining > 0; remaining--, s++)
4361 {
4362 if (*s == quote_char || (!as_ident && *s == '\\'))
4363 {
4364 *rp++ = *s;
4365 *rp++ = *s;
4366 }
4367 else if (!IS_HIGHBIT_SET(*s))
4368 *rp++ = *s;
4369 else
4370 {
4372
4373 while (1)
4374 {
4375 *rp++ = *s;
4376 if (--i == 0)
4377 break;
4378 remaining--;
4379 ++s; /* for loop will provide the final increment */
4380 }
4381 }
4382 }
4383 }
4384
4385 /* Closing quote and terminating NUL. */
4386 *rp++ = quote_char;
4387 *rp = '\0';
4388
4389 return result;
4390
4391overflow:
4393 "escaped string size exceeds the maximum allowed (%zu)",
4394 SIZE_MAX);
4395 return NULL;
4396}
4397
4398char *
4399PQescapeLiteral(PGconn *conn, const char *str, size_t len)
4400{
4401 return PQescapeInternal(conn, str, len, false);
4402}
4403
4404char *
4405PQescapeIdentifier(PGconn *conn, const char *str, size_t len)
4406{
4407 return PQescapeInternal(conn, str, len, true);
4408}
4409
4410/* HEX encoding support for bytea */
4411static const char hextbl[] = "0123456789abcdef";
4412
4413static const int8 hexlookup[128] = {
4414 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4415 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4416 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4417 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
4418 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4419 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4420 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4421 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
4422};
4423
4424static inline char
4426{
4427 int res = -1;
4428
4429 if (c > 0 && c < 127)
4430 res = hexlookup[(unsigned char) c];
4431
4432 return (char) res;
4433}
4434
4435
4436/*
4437 * PQescapeBytea - converts from binary string to the
4438 * minimal encoding necessary to include the string in an SQL
4439 * INSERT statement with a bytea type column as the target.
4440 *
4441 * We can use either hex or escape (traditional) encoding.
4442 * In escape mode, the following transformations are applied:
4443 * '\0' == ASCII 0 == \000
4444 * '\'' == ASCII 39 == ''
4445 * '\\' == ASCII 92 == \\
4446 * anything < 0x20, or > 0x7e ---> \ooo
4447 * (where ooo is an octal expression)
4448 *
4449 * If not std_strings, all backslashes sent to the output are doubled.
4450 */
4451static unsigned char *
4453 const unsigned char *from, size_t from_length,
4454 size_t *to_length, bool std_strings, bool use_hex)
4455{
4456 const unsigned char *vp;
4457 unsigned char *rp;
4458 unsigned char *result;
4459 size_t i;
4460 size_t len;
4461 const size_t bslash_len = (std_strings ? 1 : 2);
4462
4463 /*
4464 * Calculate the escaped length, watching for overflow as we do with
4465 * PQescapeInternal(). The following code relies on a small constant
4466 * bslash_len so that small additions and multiplications don't need their
4467 * own overflow checks.
4468 *
4469 * Start with the empty string, which has 1 char ('\0').
4470 */
4471 len = 1;
4472
4473 if (use_hex)
4474 {
4475 /* We prepend "\x" and double each input character. */
4476 if (pg_add_size_overflow(len, bslash_len + 1, &len) ||
4477 pg_add_size_overflow(len, from_length, &len) ||
4478 pg_add_size_overflow(len, from_length, &len))
4479 goto overflow;
4480 }
4481 else
4482 {
4483 vp = from;
4484 for (i = from_length; i > 0; i--, vp++)
4485 {
4486 if (*vp < 0x20 || *vp > 0x7e)
4487 {
4488 if (pg_add_size_overflow(len, bslash_len + 3, &len)) /* octal "\ooo" */
4489 goto overflow;
4490 }
4491 else if (*vp == '\'')
4492 {
4493 if (pg_add_size_overflow(len, 2, &len)) /* double each quote */
4494 goto overflow;
4495 }
4496 else if (*vp == '\\')
4497 {
4498 if (pg_add_size_overflow(len, bslash_len * 2, &len)) /* double each backslash */
4499 goto overflow;
4500 }
4501 else
4502 {
4503 if (pg_add_size_overflow(len, 1, &len))
4504 goto overflow;
4505 }
4506 }
4507 }
4508
4509 *to_length = len;
4510 rp = result = (unsigned char *) malloc(len);
4511 if (rp == NULL)
4512 {
4513 if (conn)
4514 libpq_append_conn_error(conn, "out of memory");
4515 return NULL;
4516 }
4517
4518 if (use_hex)
4519 {
4520 if (!std_strings)
4521 *rp++ = '\\';
4522 *rp++ = '\\';
4523 *rp++ = 'x';
4524 }
4525
4526 vp = from;
4527 for (i = from_length; i > 0; i--, vp++)
4528 {
4529 unsigned char c = *vp;
4530
4531 if (use_hex)
4532 {
4533 *rp++ = hextbl[(c >> 4) & 0xF];
4534 *rp++ = hextbl[c & 0xF];
4535 }
4536 else if (c < 0x20 || c > 0x7e)
4537 {
4538 if (!std_strings)
4539 *rp++ = '\\';
4540 *rp++ = '\\';
4541 *rp++ = (c >> 6) + '0';
4542 *rp++ = ((c >> 3) & 07) + '0';
4543 *rp++ = (c & 07) + '0';
4544 }
4545 else if (c == '\'')
4546 {
4547 *rp++ = '\'';
4548 *rp++ = '\'';
4549 }
4550 else if (c == '\\')
4551 {
4552 if (!std_strings)
4553 {
4554 *rp++ = '\\';
4555 *rp++ = '\\';
4556 }
4557 *rp++ = '\\';
4558 *rp++ = '\\';
4559 }
4560 else
4561 *rp++ = c;
4562 }
4563 *rp = '\0';
4564
4565 return result;
4566
4567overflow:
4568 if (conn)
4570 "escaped bytea size exceeds the maximum allowed (%zu)",
4571 SIZE_MAX);
4572 return NULL;
4573}
4574
4575unsigned char *
4577 const unsigned char *from, size_t from_length,
4578 size_t *to_length)
4579{
4580 if (!conn)
4581 return NULL;
4582
4583 if (conn->cmd_queue_head == NULL)
4585
4586 return PQescapeByteaInternal(conn, from, from_length, to_length,
4588 (conn->sversion >= 90000));
4589}
4590
4591unsigned char *
4592PQescapeBytea(const unsigned char *from, size_t from_length, size_t *to_length)
4593{
4594 return PQescapeByteaInternal(NULL, from, from_length, to_length,
4596 false /* can't use hex */ );
4597}
4598
4599
4600#define ISFIRSTOCTDIGIT(CH) ((CH) >= '0' && (CH) <= '3')
4601#define ISOCTDIGIT(CH) ((CH) >= '0' && (CH) <= '7')
4602#define OCTVAL(CH) ((CH) - '0')
4603
4604/*
4605 * PQunescapeBytea - converts the null terminated string representation
4606 * of a bytea, strtext, into binary, filling a buffer. It returns a
4607 * pointer to the buffer (or NULL on error), and the size of the
4608 * buffer in retbuflen. The pointer may subsequently be used as an
4609 * argument to the function PQfreemem.
4610 *
4611 * The following transformations are made:
4612 * \\ == ASCII 92 == \
4613 * \ooo == a byte whose value = ooo (ooo is an octal number)
4614 * \x == x (x is any character not matched by the above transformations)
4615 */
4616unsigned char *
4617PQunescapeBytea(const unsigned char *strtext, size_t *retbuflen)
4618{
4619 size_t strtextlen,
4620 buflen;
4621 unsigned char *buffer,
4622 *tmpbuf;
4623 size_t i,
4624 j;
4625
4626 if (strtext == NULL)
4627 return NULL;
4628
4629 strtextlen = strlen((const char *) strtext);
4630
4631 if (strtext[0] == '\\' && strtext[1] == 'x')
4632 {
4633 const unsigned char *s;
4634 unsigned char *p;
4635
4636 buflen = (strtextlen - 2) / 2;
4637 /* Avoid unportable malloc(0) */
4638 buffer = (unsigned char *) malloc(buflen > 0 ? buflen : 1);
4639 if (buffer == NULL)
4640 return NULL;
4641
4642 s = strtext + 2;
4643 p = buffer;
4644 while (*s)
4645 {
4646 char v1,
4647 v2;
4648
4649 /*
4650 * Bad input is silently ignored. Note that this includes
4651 * whitespace between hex pairs, which is allowed by byteain.
4652 */
4653 v1 = get_hex(*s++);
4654 if (!*s || v1 == (char) -1)
4655 continue;
4656 v2 = get_hex(*s++);
4657 if (v2 != (char) -1)
4658 *p++ = (v1 << 4) | v2;
4659 }
4660
4661 buflen = p - buffer;
4662 }
4663 else
4664 {
4665 /*
4666 * Length of input is max length of output, but add one to avoid
4667 * unportable malloc(0) if input is zero-length.
4668 */
4669 buffer = (unsigned char *) malloc(strtextlen + 1);
4670 if (buffer == NULL)
4671 return NULL;
4672
4673 for (i = j = 0; i < strtextlen;)
4674 {
4675 switch (strtext[i])
4676 {
4677 case '\\':
4678 i++;
4679 if (strtext[i] == '\\')
4680 buffer[j++] = strtext[i++];
4681 else
4682 {
4683 if ((ISFIRSTOCTDIGIT(strtext[i])) &&
4684 (ISOCTDIGIT(strtext[i + 1])) &&
4685 (ISOCTDIGIT(strtext[i + 2])))
4686 {
4687 int byte;
4688
4689 byte = OCTVAL(strtext[i++]);
4690 byte = (byte << 3) + OCTVAL(strtext[i++]);
4691 byte = (byte << 3) + OCTVAL(strtext[i++]);
4692 buffer[j++] = byte;
4693 }
4694 }
4695
4696 /*
4697 * Note: if we see '\' followed by something that isn't a
4698 * recognized escape sequence, we loop around having done
4699 * nothing except advance i. Therefore the something will
4700 * be emitted as ordinary data on the next cycle. Corner
4701 * case: '\' at end of string will just be discarded.
4702 */
4703 break;
4704
4705 default:
4706 buffer[j++] = strtext[i++];
4707 break;
4708 }
4709 }
4710 buflen = j; /* buflen is the length of the dequoted data */
4711 }
4712
4713 /* Shrink the buffer to be no larger than necessary */
4714 /* +1 avoids unportable behavior when buflen==0 */
4715 tmpbuf = realloc(buffer, buflen + 1);
4716
4717 /* It would only be a very brain-dead realloc that could fail, but... */
4718 if (!tmpbuf)
4719 {
4720 free(buffer);
4721 return NULL;
4722 }
4723
4724 *retbuflen = buflen;
4725 return tmpbuf;
4726}
#define unconstify(underlying_type, expr)
Definition: c.h:1235
#define IS_HIGHBIT_SET(ch)
Definition: c.h:1145
int8_t int8
Definition: c.h:537
#define SQL_STR_DOUBLE(ch, escape_backslash)
Definition: c.h:1153
#define lengthof(array)
Definition: c.h:792
int errmsg(const char *fmt,...)
Definition: elog.c:1080
static int PQsendQueryInternal(PGconn *conn, const char *query, bool newQuery)
Definition: fe-exec.c:1445
int PQsendQueryParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
Definition: fe-exec.c:1509
int PQsendQueryContinue(PGconn *conn, const char *query)
Definition: fe-exec.c:1439
int PQgetlength(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3904
int PQsetSingleRowMode(PGconn *conn)
Definition: fe-exec.c:1965
static char get_hex(char c)
Definition: fe-exec.c:4425
int PQbinaryTuples(const PGresult *res)
Definition: fe-exec.c:3514
int PQflush(PGconn *conn)
Definition: fe-exec.c:4017
PGresult * PQcopyResult(const PGresult *src, int flags)
Definition: fe-exec.c:319
void PQfreemem(void *ptr)
Definition: fe-exec.c:4049
static unsigned char * PQescapeByteaInternal(PGconn *conn, const unsigned char *from, size_t from_length, size_t *to_length, bool std_strings, bool use_hex)
Definition: fe-exec.c:4452
int PQgetline(PGconn *conn, char *buffer, int length)
Definition: fe-exec.c:2871
void * pqResultAlloc(PGresult *res, size_t nBytes, bool isBinary)
Definition: fe-exec.c:564
static bool canChangeResultMode(PGconn *conn)
Definition: fe-exec.c:1942
static size_t PQescapeStringInternal(PGconn *conn, char *to, const char *from, size_t length, int *error, int encoding, bool std_strings)
Definition: fe-exec.c:4088
Oid PQftype(const PGresult *res, int field_num)
Definition: fe-exec.c:3736
char * PQresultVerboseErrorMessage(const PGresult *res, PGVerbosity verbosity, PGContextVisibility show_context)
Definition: fe-exec.c:3452
PGresult * PQdescribePrepared(PGconn *conn, const char *stmt)
Definition: fe-exec.c:2472
PGresult * PQexecParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
Definition: fe-exec.c:2293
int PQexitPipelineMode(PGconn *conn)
Definition: fe-exec.c:3090
PGresult * PQexecPrepared(PGconn *conn, const char *stmtName, int nParams, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
Definition: fe-exec.c:2340
int PQsendClosePortal(PGconn *conn, const char *portal)
Definition: fe-exec.c:2586
static PGcmdQueueEntry * pqAllocCmdQueueEntry(PGconn *conn)
Definition: fe-exec.c:1323
int PQsetResultAttrs(PGresult *res, int numAttributes, PGresAttDesc *attDescs)
Definition: fe-exec.c:250
#define ISOCTDIGIT(CH)
Definition: fe-exec.c:4601
unsigned char * PQunescapeBytea(const unsigned char *strtext, size_t *retbuflen)
Definition: fe-exec.c:4617
void pqSaveMessageField(PGresult *res, char code, const char *value)
Definition: fe-exec.c:1066
static int check_tuple_field_number(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3542
PGresult * pqPrepareAsyncResult(PGconn *conn)
Definition: fe-exec.c:857
static void pqSaveWriteError(PGconn *conn)
Definition: fe-exec.c:826
int PQenterPipelineMode(PGconn *conn)
Definition: fe-exec.c:3059
void pqCommandQueueAdvance(PGconn *conn, bool isReadyForQuery, bool gotSync)
Definition: fe-exec.c:3159
void pqSetResultError(PGresult *res, PQExpBuffer errorMessage, int offset)
Definition: fe-exec.c:698
size_t PQescapeStringConn(PGconn *conn, char *to, const char *from, size_t length, int *error)
Definition: fe-exec.c:4194
void pqSaveErrorResult(PGconn *conn)
Definition: fe-exec.c:809
PGresult * PQclosePrepared(PGconn *conn, const char *stmt)
Definition: fe-exec.c:2538
char *const pgresStatus[]
Definition: fe-exec.c:33
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3893
#define OCTVAL(CH)
Definition: fe-exec.c:4602
#define PGRESULT_DATA_BLOCKSIZE
Definition: fe-exec.c:143
PGresult * PQclosePortal(PGconn *conn, const char *portal)
Definition: fe-exec.c:2556
static int pqPipelineSyncInternal(PGconn *conn, bool immediate_flush)
Definition: fe-exec.c:3311
PGresult * PQgetResult(PGconn *conn)
Definition: fe-exec.c:2079
ExecStatusType PQresultStatus(const PGresult *res)
Definition: fe-exec.c:3428
Oid PQparamtype(const PGresult *res, int param_num)
Definition: fe-exec.c:3943
static int check_param_number(const PGresult *res, int param_num)
Definition: fe-exec.c:3565
int pqRowProcessor(PGconn *conn, const char **errmsgp)
Definition: fe-exec.c:1223
int PQnparams(const PGresult *res)
Definition: fe-exec.c:3932
void PQclear(PGresult *res)
Definition: fe-exec.c:727
int PQsendClosePrepared(PGconn *conn, const char *stmt)
Definition: fe-exec.c:2573
char * PQcmdTuples(PGresult *res)
Definition: fe-exec.c:3839
static PGresult * PQexecFinish(PGconn *conn)
Definition: fe-exec.c:2427
int PQfformat(const PGresult *res, int field_num)
Definition: fe-exec.c:3725
static void pqAppendCmdQueueEntry(PGconn *conn, PGcmdQueueEntry *entry)
Definition: fe-exec.c:1356
static int PQsendQueryGuts(PGconn *conn, const char *command, const char *stmtName, int nParams, const Oid *paramTypes, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
Definition: fe-exec.c:1774
int PQendcopy(PGconn *conn)
Definition: fe-exec.c:2966
static int pqPipelineFlush(PGconn *conn)
Definition: fe-exec.c:4033
int PQputCopyEnd(PGconn *conn, const char *errormsg)
Definition: fe-exec.c:2766
static int PQsendTypedCommand(PGconn *conn, char command, char type, const char *target)
Definition: fe-exec.c:2606
int PQsendPipelineSync(PGconn *conn)
Definition: fe-exec.c:3299
int PQntuples(const PGresult *res)
Definition: fe-exec.c:3498
int PQputnbytes(PGconn *conn, const char *buffer, int nbytes)
Definition: fe-exec.c:2945
int PQputline(PGconn *conn, const char *string)
Definition: fe-exec.c:2935
int PQgetlineAsync(PGconn *conn, char *buffer, int bufsize)
Definition: fe-exec.c:2918
static const PGresult OOM_result
Definition: fe-exec.c:50
#define PGRESULT_BLOCK_OVERHEAD
Definition: fe-exec.c:145
int PQputCopyData(PGconn *conn, const char *buffer, int nbytes)
Definition: fe-exec.c:2712
static PGresult * getCopyResult(PGconn *conn, ExecStatusType copytype)
Definition: fe-exec.c:2241
PGresult * PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status)
Definition: fe-exec.c:160
static PGEvent * dupEvents(PGEvent *events, int count, size_t *memSize)
Definition: fe-exec.c:409
PGresult * PQprepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes)
Definition: fe-exec.c:2323
int PQisthreadsafe(void)
Definition: fe-exec.c:4009
static bool static_std_strings
Definition: fe-exec.c:61
char * PQresultErrorMessage(const PGresult *res)
Definition: fe-exec.c:3444
void pqInternalNotice(const PGNoticeHooks *hooks, const char *fmt,...)
Definition: fe-exec.c:944
int PQsendDescribePrepared(PGconn *conn, const char *stmt)
Definition: fe-exec.c:2508
char * PQfname(const PGresult *res, int field_num)
Definition: fe-exec.c:3584
static const char hextbl[]
Definition: fe-exec.c:4411
static bool PQexecStart(PGconn *conn)
Definition: fe-exec.c:2361
size_t PQescapeString(char *to, const char *from, size_t length)
Definition: fe-exec.c:4216
int PQconsumeInput(PGconn *conn)
Definition: fe-exec.c:2001
static char * PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident)
Definition: fe-exec.c:4231
#define ISFIRSTOCTDIGIT(CH)
Definition: fe-exec.c:4600
static void parseInput(PGconn *conn)
Definition: fe-exec.c:2037
Oid PQftable(const PGresult *res, int field_num)
Definition: fe-exec.c:3703
int PQfnumber(const PGresult *res, const char *field_name)
Definition: fe-exec.c:3606
unsigned char * PQescapeBytea(const unsigned char *from, size_t from_length, size_t *to_length)
Definition: fe-exec.c:4592
int PQsetnonblocking(PGconn *conn, int arg)
Definition: fe-exec.c:3961
char * PQescapeLiteral(PGconn *conn, const char *str, size_t len)
Definition: fe-exec.c:4399
PGresult * PQfn(PGconn *conn, int fnid, int *result_buf, int *result_len, int result_is_int, const PQArgBlock *args, int nargs)
Definition: fe-exec.c:2997
int PQsendPrepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes)
Definition: fe-exec.c:1553
#define PGRESULT_SEP_ALLOC_THRESHOLD
Definition: fe-exec.c:146
PGresult * PQdescribePortal(PGconn *conn, const char *portal)
Definition: fe-exec.c:2491
int PQfmod(const PGresult *res, int field_num)
Definition: fe-exec.c:3758
void pqClearAsyncResult(PGconn *conn)
Definition: fe-exec.c:785
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3918
int PQftablecol(const PGresult *res, int field_num)
Definition: fe-exec.c:3714
int PQsetChunkedRowsMode(PGconn *conn, int chunkSize)
Definition: fe-exec.c:1982
static int static_client_encoding
Definition: fe-exec.c:60
char * PQresultErrorField(const PGresult *res, int fieldcode)
Definition: fe-exec.c:3483
int PQsetvalue(PGresult *res, int tup_num, int field_num, char *value, int len)
Definition: fe-exec.c:453
int PQsendQuery(PGconn *conn, const char *query)
Definition: fe-exec.c:1433
char * PQcmdStatus(PGresult *res)
Definition: fe-exec.c:3769
int PQpipelineSync(PGconn *conn)
Definition: fe-exec.c:3289
char * PQoidStatus(const PGresult *res)
Definition: fe-exec.c:3782
int PQsendDescribePortal(PGconn *conn, const char *portal)
Definition: fe-exec.c:2521
char * PQresStatus(ExecStatusType status)
Definition: fe-exec.c:3436
size_t PQresultMemorySize(const PGresult *res)
Definition: fe-exec.c:669
void * PQresultAlloc(PGresult *res, size_t nBytes)
Definition: fe-exec.c:544
int PQisBusy(PGconn *conn)
Definition: fe-exec.c:2048
PGresult * PQexec(PGconn *conn, const char *query)
Definition: fe-exec.c:2279
unsigned char * PQescapeByteaConn(PGconn *conn, const unsigned char *from, size_t from_length, size_t *to_length)
Definition: fe-exec.c:4576
int PQsendQueryPrepared(PGconn *conn, const char *stmtName, int nParams, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)
Definition: fe-exec.c:1650
static void pqPipelineProcessQueue(PGconn *conn)
Definition: fe-exec.c:3197
char * PQescapeIdentifier(PGconn *conn, const char *str, size_t len)
Definition: fe-exec.c:4405
int PQsendFlushRequest(PGconn *conn)
Definition: fe-exec.c:3388
int pqSaveParameterStatus(PGconn *conn, const char *name, const char *value)
Definition: fe-exec.c:1091
int PQisnonblocking(const PGconn *conn)
Definition: fe-exec.c:4000
char * pqResultStrdup(PGresult *res, const char *str)
Definition: fe-exec.c:681
Oid PQoidValue(const PGresult *res)
Definition: fe-exec.c:3810
static bool pqAddTuple(PGresult *res, PGresAttValue *tup, const char **errmsgp)
Definition: fe-exec.c:999
#define PGRESULT_ALIGN_BOUNDARY
Definition: fe-exec.c:144
int PQnfields(const PGresult *res)
Definition: fe-exec.c:3506
static int check_field_number(const PGresult *res, int field_num)
Definition: fe-exec.c:3527
int PQfsize(const PGresult *res, int field_num)
Definition: fe-exec.c:3747
PGnotify * PQnotifies(PGconn *conn)
Definition: fe-exec.c:2684
static bool PQsendQueryStart(PGconn *conn, bool newQuery)
Definition: fe-exec.c:1690
static const int8 hexlookup[128]
Definition: fe-exec.c:4413
int PQgetCopyData(PGconn *conn, char **buffer, int async)
Definition: fe-exec.c:2833
static void pqRecycleCmdQueueEntry(PGconn *conn, PGcmdQueueEntry *entry)
Definition: fe-exec.c:1403
void PQfreeNotify(PGnotify *notify)
Definition: fe-exec.c:4066
int pqPutc(char c, PGconn *conn)
Definition: fe-misc.c:92
int pqReadData(PGconn *conn)
Definition: fe-misc.c:606
int pqPutInt(int value, size_t bytes, PGconn *conn)
Definition: fe-misc.c:253
int pqCheckOutBufferSpace(size_t bytes_needed, PGconn *conn)
Definition: fe-misc.c:287
int pqFlush(PGconn *conn)
Definition: fe-misc.c:994
int pqPutMsgStart(char msg_type, PGconn *conn)
Definition: fe-misc.c:473
int pqWait(int forRead, int forWrite, PGconn *conn)
Definition: fe-misc.c:1019
int pqPutnchar(const void *s, size_t len, PGconn *conn)
Definition: fe-misc.c:202
int pqPuts(const char *s, PGconn *conn)
Definition: fe-misc.c:152
int pqPutMsgEnd(PGconn *conn)
Definition: fe-misc.c:532
void pqBuildErrorMessage3(PQExpBuffer msg, const PGresult *res, PGVerbosity verbosity, PGContextVisibility show_context)
void pqParseInput3(PGconn *conn)
Definition: fe-protocol3.c:70
int pqEndcopy3(PGconn *conn)
PGresult * pqFunctionCall3(PGconn *conn, Oid fnid, int *result_buf, int *actual_result_len, int result_is_int, const PQArgBlock *args, int nargs)
int pqGetlineAsync3(PGconn *conn, char *buffer, int bufsize)
int pqGetCopyData3(PGconn *conn, char **buffer, int async)
int pqGetline3(PGconn *conn, char *s, int maxlen)
Assert(PointerIsAligned(start, uint64))
const char * str
#define realloc(a, b)
Definition: header.h:60
#define free(a)
Definition: header.h:65
#define malloc(a)
Definition: header.h:50
#define stmt
Definition: indent_codes.h:59
#define bufsize
Definition: indent_globs.h:36
long val
Definition: informix.c:689
static struct @171 value
int remaining
Definition: informix.c:692
static bool pg_add_size_overflow(size_t a, size_t b, size_t *result)
Definition: int.h:608
return true
Definition: isn.c:130
int j
Definition: isn.c:78
int i
Definition: isn.c:77
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:81
int PQfireResultCreateEvents(PGconn *conn, PGresult *res)
Definition: libpq-events.c:185
@ PGEVT_RESULTDESTROY
Definition: libpq-events.h:34
@ PGEVT_RESULTCOPY
Definition: libpq-events.h:33
@ CONNECTION_BAD
Definition: libpq-fe.h:85
@ CONNECTION_OK
Definition: libpq-fe.h:84
ExecStatusType
Definition: libpq-fe.h:123
@ PGRES_COPY_IN
Definition: libpq-fe.h:132
@ PGRES_COPY_BOTH
Definition: libpq-fe.h:137
@ PGRES_COMMAND_OK
Definition: libpq-fe.h:125
@ PGRES_TUPLES_CHUNK
Definition: libpq-fe.h:142
@ PGRES_FATAL_ERROR
Definition: libpq-fe.h:136
@ PGRES_SINGLE_TUPLE
Definition: libpq-fe.h:138
@ PGRES_COPY_OUT
Definition: libpq-fe.h:131
@ PGRES_EMPTY_QUERY
Definition: libpq-fe.h:124
@ PGRES_PIPELINE_SYNC
Definition: libpq-fe.h:139
@ PGRES_PIPELINE_ABORTED
Definition: libpq-fe.h:140
@ PGRES_NONFATAL_ERROR
Definition: libpq-fe.h:135
@ PGRES_TUPLES_OK
Definition: libpq-fe.h:128
PGContextVisibility
Definition: libpq-fe.h:163
#define PG_COPYRES_TUPLES
Definition: libpq-fe.h:70
@ PQ_PIPELINE_OFF
Definition: libpq-fe.h:187
@ PQ_PIPELINE_ABORTED
Definition: libpq-fe.h:189
@ PQ_PIPELINE_ON
Definition: libpq-fe.h:188
#define PG_COPYRES_ATTRS
Definition: libpq-fe.h:69
struct pg_result PGresult
Definition: libpq-fe.h:214
PGVerbosity
Definition: libpq-fe.h:155
#define PG_COPYRES_EVENTS
Definition: libpq-fe.h:71
#define PG_COPYRES_NOTICEHOOKS
Definition: libpq-fe.h:72
#define PQ_QUERY_PARAM_MAX_LIMIT
Definition: libpq-fe.h:507
struct PGEvent PGEvent
@ PGASYNC_COPY_OUT
Definition: libpq-int.h:223
@ PGASYNC_READY_MORE
Definition: libpq-int.h:219
@ PGASYNC_READY
Definition: libpq-int.h:217
@ PGASYNC_COPY_BOTH
Definition: libpq-int.h:224
@ PGASYNC_IDLE
Definition: libpq-int.h:215
@ PGASYNC_COPY_IN
Definition: libpq-int.h:222
@ PGASYNC_BUSY
Definition: libpq-int.h:216
@ PGASYNC_PIPELINE_IDLE
Definition: libpq-int.h:225
@ PGQUERY_SIMPLE
Definition: libpq-int.h:320
@ PGQUERY_SYNC
Definition: libpq-int.h:324
@ PGQUERY_EXTENDED
Definition: libpq-int.h:321
@ PGQUERY_DESCRIBE
Definition: libpq-int.h:323
@ PGQUERY_CLOSE
Definition: libpq-int.h:325
@ PGQUERY_PREPARE
Definition: libpq-int.h:322
#define NULL_LEN
Definition: libpq-int.h:130
struct pgParameterStatus pgParameterStatus
#define pqClearConnErrorState(conn)
Definition: libpq-int.h:923
union pgresult_data PGresult_data
Definition: libpq-int.h:98
#define pqIsnonblocking(conn)
Definition: libpq-int.h:939
#define OUTBUFFER_THRESHOLD
Definition: libpq-int.h:944
#define pgHavePendingResult(conn)
Definition: libpq-int.h:932
void libpq_append_conn_error(PGconn *conn, const char *fmt,...)
Definition: oauth-utils.c:95
#define libpq_gettext(x)
Definition: oauth-utils.h:86
@ PG_BOOL_YES
Definition: oauth-utils.h:74
@ PG_BOOL_NO
Definition: oauth-utils.h:75
void * arg
const void size_t len
int32 encoding
Definition: pg_database.h:41
static rewind_source * source
Definition: pg_rewind.c:89
static char * buf
Definition: pg_test_fsync.c:72
@ PG_SQL_ASCII
Definition: pg_wchar.h:226
#define pg_char_to_encoding
Definition: pg_wchar.h:629
#define vsnprintf
Definition: port.h:259
#define sprintf
Definition: port.h:262
unsigned char pg_tolower(unsigned char ch)
Definition: pgstrcasecmp.c:118
#define PGINVALID_SOCKET
Definition: port.h:31
size_t strnlen(const char *str, size_t maxlen)
Definition: strnlen.c:26
#define InvalidOid
Definition: postgres_ext.h:37
unsigned int Oid
Definition: postgres_ext.h:32
#define PG_DIAG_SEVERITY_NONLOCALIZED
Definition: postgres_ext.h:56
#define PG_DIAG_MESSAGE_PRIMARY
Definition: postgres_ext.h:58
#define PG_DIAG_SEVERITY
Definition: postgres_ext.h:55
void initPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:90
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
Definition: pqexpbuffer.c:367
void termPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:129
#define PQExpBufferBroken(str)
Definition: pqexpbuffer.h:59
#define PQExpBufferDataBroken(buf)
Definition: pqexpbuffer.h:67
char * c
#define PqMsg_CopyDone
Definition: protocol.h:64
#define PqMsg_CopyData
Definition: protocol.h:65
#define PqMsg_Describe
Definition: protocol.h:21
#define PqMsg_Parse
Definition: protocol.h:25
#define PqMsg_Bind
Definition: protocol.h:19
#define PqMsg_Sync
Definition: protocol.h:27
#define PqMsg_CopyFail
Definition: protocol.h:29
#define PqMsg_Flush
Definition: protocol.h:24
#define PqMsg_Query
Definition: protocol.h:26
#define PqMsg_Execute
Definition: protocol.h:22
#define PqMsg_Close
Definition: protocol.h:20
static void error(void)
Definition: sql-dyntest.c:147
PGconn * conn
Definition: streamutil.c:52
const PGresult * src
Definition: libpq-events.h:60
PGresult * dest
Definition: libpq-events.h:61
void * passThrough
Definition: libpq-int.h:159
char * name
Definition: libpq-int.h:158
void * data
Definition: libpq-int.h:160
PGEventProc proc
Definition: libpq-int.h:157
bool resultInitialized
Definition: libpq-int.h:161
void * noticeProcArg
Definition: libpq-int.h:152
PQnoticeReceiver noticeRec
Definition: libpq-int.h:149
PQnoticeProcessor noticeProc
Definition: libpq-int.h:151
void * noticeRecArg
Definition: libpq-int.h:150
PGQueryClass queryclass
Definition: libpq-int.h:345
struct PGcmdQueueEntry * next
Definition: libpq-int.h:347
struct pgMessageField * next
Definition: libpq-int.h:141
char contents[FLEXIBLE_ARRAY_MEMBER]
Definition: libpq-int.h:143
struct pgNotify * next
Definition: libpq-fe.h:234
struct pgParameterStatus * next
Definition: libpq-int.h:271
char * write_err_msg
Definition: libpq-int.h:513
PGnotify * notifyHead
Definition: libpq-int.h:476
int maxChunkSize
Definition: libpq-int.h:472
PGdataValue * rowBuf
Definition: libpq-int.h:593
bool singleRowMode
Definition: libpq-int.h:471
pgsocket sock
Definition: libpq-int.h:499
bool std_strings
Definition: libpq-int.h:557
int errorReported
Definition: libpq-int.h:684
bool write_failed
Definition: libpq-int.h:512
PGTernaryBool in_hot_standby
Definition: libpq-int.h:559
PGcmdQueueEntry * cmd_queue_recycle
Definition: libpq-int.h:496
PGcmdQueueEntry * cmd_queue_tail
Definition: libpq-int.h:490
PGnotify * notifyTail
Definition: libpq-int.h:477
bool nonblocking
Definition: libpq-int.h:467
int client_encoding
Definition: libpq-int.h:556
int sversion
Definition: libpq-int.h:504
PGTernaryBool default_transaction_read_only
Definition: libpq-int.h:558
pgParameterStatus * pstatus
Definition: libpq-int.h:555
PGresult * result
Definition: libpq-int.h:606
PGresult * saved_result
Definition: libpq-int.h:608
PQExpBufferData errorMessage
Definition: libpq-int.h:683
int nEvents
Definition: libpq-int.h:458
bool error_result
Definition: libpq-int.h:607
PGAsyncStatusType asyncStatus
Definition: libpq-int.h:463
int scram_sha_256_iterations
Definition: libpq-int.h:613
PGpipelineStatus pipelineStatus
Definition: libpq-int.h:469
int outBufSize
Definition: libpq-int.h:584
bool partialResMode
Definition: libpq-int.h:470
PGNoticeHooks noticeHooks
Definition: libpq-int.h:454
PGcmdQueueEntry * cmd_queue_head
Definition: libpq-int.h:489
int outCount
Definition: libpq-int.h:585
PGEvent * events
Definition: libpq-int.h:457
ConnStatusType status
Definition: libpq-int.h:462
size_t memorySize
Definition: libpq-int.h:209
int ntups
Definition: libpq-int.h:166
int curOffset
Definition: libpq-int.h:206
int binary
Definition: libpq-int.h:176
PGNoticeHooks noticeHooks
Definition: libpq-int.h:183
char null_field[1]
Definition: libpq-int.h:198
char * errMsg
Definition: libpq-int.h:193
int nEvents
Definition: libpq-int.h:185
PGresAttValue ** tuples
Definition: libpq-int.h:169
int numParameters
Definition: libpq-int.h:172
int spaceLeft
Definition: libpq-int.h:207
PGresAttDesc * attDescs
Definition: libpq-int.h:168
int numAttributes
Definition: libpq-int.h:167
char cmdStatus[CMDSTATUS_LEN]
Definition: libpq-int.h:175
PGMessageField * errFields
Definition: libpq-int.h:194
PGresParamDesc * paramDescs
Definition: libpq-int.h:173
PGEvent * events
Definition: libpq-int.h:184
PGresult_data * curBlock
Definition: libpq-int.h:205
int tupArrSize
Definition: libpq-int.h:171
ExecStatusType resultStatus
Definition: libpq-int.h:174
char * errQuery
Definition: libpq-int.h:195
int client_encoding
Definition: libpq-int.h:186
char * name
Definition: libpq-fe.h:307
int columnid
Definition: libpq-fe.h:309
int atttypmod
Definition: libpq-fe.h:313
char * value
Definition: libpq-int.h:135
PGresult_data * next
Definition: libpq-int.h:102
char space[1]
Definition: libpq-int.h:103
const char * type
const char * name
static StringInfoData tmpbuf
Definition: walsender.c:178
void pg_encoding_set_invalid(int encoding, char *dst)
Definition: wchar.c:2051
int pg_encoding_mblen_or_incomplete(int encoding, const char *mbstr, size_t remaining)
Definition: wchar.c:2147
int pg_encoding_verifymbstr(int encoding, const char *mbstr, int len)
Definition: wchar.c:2202
int pg_encoding_mblen(int encoding, const char *mbstr)
Definition: wchar.c:2135
int pg_encoding_verifymbchar(int encoding, const char *mbstr, int len)
Definition: wchar.c:2189