Skip to content

Commit e25e6a6

Browse files
committed
Commit the bulk of Mike Ansley's long-query changes in the
backend. Still much left to do.
1 parent ab5cafa commit e25e6a6

File tree

6 files changed

+67
-109
lines changed

6 files changed

+67
-109
lines changed

src/backend/libpq/pqcomm.c

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
*
2929
* Copyright (c) 1994, Regents of the University of California
3030
*
31-
* $Id: pqcomm.c,v 1.81 1999/07/23 03:00:10 tgl Exp $
31+
* $Id: pqcomm.c,v 1.82 1999/08/31 04:26:37 tgl Exp $
3232
*
3333
*-------------------------------------------------------------------------
3434
*/
@@ -526,38 +526,32 @@ pq_getbytes(char *s, size_t len)
526526
/* --------------------------------
527527
* pq_getstring - get a null terminated string from connection
528528
*
529+
* The return value is placed in an expansible StringInfo.
530+
* Note that space allocation comes from the current memory context!
531+
*
529532
* NOTE: this routine does not do any MULTIBYTE conversion,
530533
* even though it is presumably useful only for text, because
531534
* no code in this module should depend on MULTIBYTE mode.
532535
* See pq_getstr in pqformat.c for that.
533536
*
534-
* FIXME: we ought to use an expansible StringInfo buffer,
535-
* rather than dropping data if the message is too long.
536-
*
537537
* returns 0 if OK, EOF if trouble
538538
* --------------------------------
539539
*/
540540
int
541-
pq_getstring(char *s, size_t len)
541+
pq_getstring(StringInfo s)
542542
{
543543
int c;
544544

545-
/*
546-
* Keep on reading until we get the terminating '\0', discarding any
547-
* bytes we don't have room for.
548-
*/
545+
/* Reset string to empty */
546+
s->len = 0;
547+
s->data[0] = '\0';
549548

549+
/* Read until we get the terminating '\0' */
550550
while ((c = pq_getbyte()) != EOF && c != '\0')
551551
{
552-
if (len > 1)
553-
{
554-
*s++ = c;
555-
len--;
556-
}
552+
appendStringInfoChar(s, c);
557553
}
558554

559-
*s = '\0';
560-
561555
if (c == EOF)
562556
return EOF;
563557

src/backend/libpq/pqformat.c

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*
1616
* Copyright (c) 1994, Regents of the University of California
1717
*
18-
* $Id: pqformat.c,v 1.7 1999/07/17 20:17:03 momjian Exp $
18+
* $Id: pqformat.c,v 1.8 1999/08/31 04:26:37 tgl Exp $
1919
*
2020
*-------------------------------------------------------------------------
2121
*/
@@ -290,37 +290,30 @@ pq_getint(int *result, int b)
290290
/* --------------------------------
291291
* pq_getstr - get a null terminated string from connection
292292
*
293-
* FIXME: we ought to use an expansible StringInfo buffer,
294-
* rather than dropping data if the message is too long.
293+
* The return value is placed in an expansible StringInfo.
294+
* Note that space allocation comes from the current memory context!
295295
*
296296
* returns 0 if OK, EOF if trouble
297297
* --------------------------------
298298
*/
299299
int
300-
pq_getstr(char *s, int maxlen)
300+
pq_getstr(StringInfo s)
301301
{
302302
int c;
303-
304303
#ifdef MULTIBYTE
305304
char *p;
306-
307305
#endif
308306

309-
c = pq_getstring(s, maxlen);
307+
c = pq_getstring(s);
310308

311309
#ifdef MULTIBYTE
312-
p = (char *) pg_client_to_server((unsigned char *) s, strlen(s));
313-
if (p != s) /* actual conversion has been done? */
310+
p = (char *) pg_client_to_server((unsigned char *) s->data, s->len);
311+
if (p != s->data) /* actual conversion has been done? */
314312
{
315-
int newlen = strlen(p);
316-
317-
if (newlen < maxlen)
318-
strcpy(s, p);
319-
else
320-
{
321-
strncpy(s, p, maxlen);
322-
s[maxlen - 1] = '\0';
323-
}
313+
/* reset s to empty, and append the new string p */
314+
s->len = 0;
315+
s->data[0] = '\0';
316+
appendBinaryStringInfo(s, p, strlen(p));
324317
}
325318
#endif
326319

src/backend/tcop/postgres.c

Lines changed: 40 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.127 1999/07/22 02:40:07 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.128 1999/08/31 04:26:40 tgl Exp $
1111
*
1212
* NOTES
1313
* this is the "main" module of the postgres backend and
@@ -158,9 +158,9 @@ int _exec_repeat_ = 1;
158158
* decls for routines only used in this file
159159
* ----------------------------------------------------------------
160160
*/
161-
static int InteractiveBackend(char *inBuf);
162-
static int SocketBackend(char *inBuf);
163-
static int ReadCommand(char *inBuf);
161+
static int InteractiveBackend(StringInfo inBuf);
162+
static int SocketBackend(StringInfo inBuf);
163+
static int ReadCommand(StringInfo inBuf);
164164
static void pg_exec_query(char *query_string);
165165

166166

@@ -178,9 +178,8 @@ static void pg_exec_query(char *query_string);
178178
*/
179179

180180
static int
181-
InteractiveBackend(char *inBuf)
181+
InteractiveBackend(StringInfo inBuf)
182182
{
183-
char *stuff = inBuf; /* current place in input buffer */
184183
int c; /* character read from getc() */
185184
bool end = false; /* end-of-input flag */
186185
bool backslashSeen = false; /* have we seen a \ ? */
@@ -192,6 +191,10 @@ InteractiveBackend(char *inBuf)
192191
printf("backend> ");
193192
fflush(stdout);
194193

194+
/* Reset inBuf to empty */
195+
inBuf->len = 0;
196+
inBuf->data[0] = '\0';
197+
195198
for (;;)
196199
{
197200
if (UseNewLine)
@@ -207,14 +210,15 @@ InteractiveBackend(char *inBuf)
207210
{
208211
if (backslashSeen)
209212
{
210-
stuff--;
213+
/* discard backslash from inBuf */
214+
inBuf->data[--inBuf->len] = '\0';
215+
backslashSeen = false;
211216
continue;
212217
}
213218
else
214219
{
215220
/* keep the newline character */
216-
*stuff++ = '\n';
217-
*stuff++ = '\0';
221+
appendStringInfoChar(inBuf, '\n');
218222
break;
219223
}
220224
}
@@ -223,7 +227,7 @@ InteractiveBackend(char *inBuf)
223227
else
224228
backslashSeen = false;
225229

226-
*stuff++ = (char) c;
230+
appendStringInfoChar(inBuf, (char) c);
227231
}
228232

229233
if (c == EOF)
@@ -236,9 +240,9 @@ InteractiveBackend(char *inBuf)
236240
* ----------------
237241
*/
238242
while ((c = getc(stdin)) != EOF)
239-
*stuff++ = (char) c;
243+
appendStringInfoChar(inBuf, (char) c);
240244

241-
if (stuff == inBuf)
245+
if (inBuf->len == 0)
242246
end = true;
243247
}
244248

@@ -261,7 +265,7 @@ InteractiveBackend(char *inBuf)
261265
* ----------------
262266
*/
263267
if (EchoQuery)
264-
printf("query: %s\n", inBuf);
268+
printf("query: %s\n", inBuf->data);
265269
fflush(stdout);
266270

267271
return 'Q';
@@ -274,15 +278,15 @@ InteractiveBackend(char *inBuf)
274278
* the user is placed in its parameter inBuf.
275279
*
276280
* If the input is a fastpath function call (case 'F') then
277-
* the function call is processed in HandleFunctionRequest().
281+
* the function call is processed in HandleFunctionRequest()
278282
* (now called from PostgresMain()).
279283
*
280284
* EOF is returned if the connection is lost.
281285
* ----------------
282286
*/
283287

284288
static int
285-
SocketBackend(char *inBuf)
289+
SocketBackend(StringInfo inBuf)
286290
{
287291
char qtype;
288292
char result = '\0';
@@ -302,7 +306,7 @@ SocketBackend(char *inBuf)
302306
* ----------------
303307
*/
304308
case 'Q':
305-
if (pq_getstr(inBuf, MAX_PARSE_BUFFER))
309+
if (pq_getstr(inBuf))
306310
return EOF;
307311
result = 'Q';
308312
break;
@@ -312,7 +316,7 @@ SocketBackend(char *inBuf)
312316
* ----------------
313317
*/
314318
case 'F':
315-
if (pq_getstr(inBuf, MAX_PARSE_BUFFER))
319+
if (pq_getstr(inBuf))
316320
return EOF; /* ignore "string" at start of F message */
317321
result = 'F';
318322
break;
@@ -347,12 +351,21 @@ SocketBackend(char *inBuf)
347351
* ----------------
348352
*/
349353
static int
350-
ReadCommand(char *inBuf)
354+
ReadCommand(StringInfo inBuf)
351355
{
356+
MemoryContext oldcontext;
357+
int result;
358+
359+
/* Make sure any expansion of inBuf happens in permanent memory context,
360+
* so that we can keep using it for future command cycles.
361+
*/
362+
oldcontext = MemoryContextSwitchTo(TopMemoryContext);
352363
if (IsUnderPostmaster)
353-
return SocketBackend(inBuf);
364+
result = SocketBackend(inBuf);
354365
else
355-
return InteractiveBackend(inBuf);
366+
result = InteractiveBackend(inBuf);
367+
MemoryContextSwitchTo(oldcontext);
368+
return result;
356369
}
357370

358371
List *
@@ -374,45 +387,7 @@ pg_parse_and_plan(char *query_string, /* string to execute */
374387

375388
if (DebugPrintQuery)
376389
{
377-
if (DebugPrintQuery > 3)
378-
{
379-
/* Print the query string as is if query debug level > 3 */
380-
TPRINTF(TRACE_QUERY, "query: %s", query_string);
381-
}
382-
else
383-
{
384-
/* Print condensed query string to fit in one log line */
385-
char buff[MAX_QUERY_SIZE + 1];
386-
char c,
387-
*s,
388-
*d;
389-
int n,
390-
is_space = 1;
391-
392-
for (s = query_string, d = buff, n = 0; (c = *s) && (n < MAX_QUERY_SIZE); s++)
393-
{
394-
switch (c)
395-
{
396-
case '\r':
397-
case '\n':
398-
case '\t':
399-
c = ' ';
400-
/* fall through */
401-
case ' ':
402-
if (is_space)
403-
continue;
404-
is_space = 1;
405-
break;
406-
default:
407-
is_space = 0;
408-
break;
409-
}
410-
*d++ = c;
411-
n++;
412-
}
413-
*d = '\0';
414-
TPRINTF(TRACE_QUERY, "query: %s", buff);
415-
}
390+
TPRINTF(TRACE_QUERY, "query: %s", query_string);
416391
}
417392

418393
/* ----------------
@@ -889,7 +864,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
889864
int errs = 0;
890865

891866
int firstchar;
892-
char parser_input[MAX_PARSE_BUFFER];
867+
StringInfo parser_input;
893868
char *userName;
894869

895870
/* Used if verbose is set, must be initialized */
@@ -1452,6 +1427,8 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
14521427

14531428
on_shmem_exit(remove_all_temp_relations, NULL);
14541429

1430+
parser_input = makeStringInfo(); /* initialize input buffer */
1431+
14551432
/* ----------------
14561433
* Set up handler for cancel-request signal, and
14571434
* send this backend's cancellation info to the frontend.
@@ -1492,7 +1469,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
14921469
if (!IsUnderPostmaster)
14931470
{
14941471
puts("\nPOSTGRES backend interactive interface ");
1495-
puts("$Revision: 1.127 $ $Date: 1999/07/22 02:40:07 $\n");
1472+
puts("$Revision: 1.128 $ $Date: 1999/08/31 04:26:40 $\n");
14961473
}
14971474

14981475
/* ----------------
@@ -1548,8 +1525,6 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
15481525
* (3) read a command.
15491526
* ----------------
15501527
*/
1551-
MemSet(parser_input, 0, MAX_PARSE_BUFFER);
1552-
15531528
firstchar = ReadCommand(parser_input);
15541529

15551530
QueryCancel = false; /* forget any earlier CANCEL signal */
@@ -1592,7 +1567,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
15921567
* ----------------
15931568
*/
15941569
case 'Q':
1595-
if (strspn(parser_input, " \t\n") == strlen(parser_input))
1570+
if (strspn(parser_input->data, " \t\n") == parser_input->len)
15961571
{
15971572
/* ----------------
15981573
* if there is nothing in the input buffer, don't bother
@@ -1616,7 +1591,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
16161591
TPRINTF(TRACE_VERBOSE, "StartTransactionCommand");
16171592
StartTransactionCommand();
16181593

1619-
pg_exec_query(parser_input);
1594+
pg_exec_query(parser_input->data);
16201595

16211596
if (ShowStats)
16221597
ShowUsage();

src/include/libpq/libpq.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: libpq.h,v 1.32 1999/07/15 15:21:15 momjian Exp $
9+
* $Id: libpq.h,v 1.33 1999/08/31 04:26:33 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -17,6 +17,7 @@
1717

1818
#include <netinet/in.h>
1919

20+
#include "lib/stringinfo.h"
2021
#include "libpq/libpq-be.h"
2122
#include "tcop/dest.h"
2223
#include "utils/exc.h"
@@ -241,7 +242,7 @@ extern void pq_init(void);
241242
extern int pq_getport(void);
242243
extern void pq_close(void);
243244
extern int pq_getbytes(char *s, size_t len);
244-
extern int pq_getstring(char *s, size_t len);
245+
extern int pq_getstring(StringInfo s);
245246
extern int pq_peekbyte(void);
246247
extern int pq_putbytes(const char *s, size_t len);
247248
extern int pq_flush(void);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy