summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2003-04-27 20:09:44 +0000
committerTom Lane2003-04-27 20:09:44 +0000
commit982430f8469dfc0fd9d9196862f34a2c3fc7dc13 (patch)
tree5f672e30ddd44b4548ba3e18f534fd5008bf3fa8
parent351372e585746538ef080bfe1219de3f3074a025 (diff)
Put back encoding-conversion step in processing of incoming queries;
I had inadvertently omitted it while rearranging things to support length-counted incoming messages. Also, change the parser's API back to accepting a 'char *' query string instead of 'StringInfo', as the latter wasn't buying us anything except overhead. (I think when I put it in I had some notion of making the parser API 8-bit-clean, but seeing that flex depends on null-terminated input, that's not really ever gonna happen.)
-rw-r--r--src/backend/executor/spi.c8
-rw-r--r--src/backend/optimizer/util/clauses.c8
-rw-r--r--src/backend/parser/parse_type.c4
-rw-r--r--src/backend/parser/parser.c4
-rw-r--r--src/backend/parser/scan.l17
-rw-r--r--src/backend/postmaster/pgstat.c7
-rw-r--r--src/backend/tcop/postgres.c71
-rw-r--r--src/include/parser/gramparse.h5
-rw-r--r--src/include/parser/parser.h5
-rw-r--r--src/include/pgstat.h4
-rw-r--r--src/include/tcop/tcopprot.h11
11 files changed, 69 insertions, 75 deletions
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index faceb1ec738..11ed2914de5 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.90 2003/04/24 21:16:43 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/executor/spi.c,v 1.91 2003/04/27 20:09:43 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -967,7 +967,6 @@ spi_printtup(HeapTuple tuple, TupleDesc tupdesc, DestReceiver *self)
static int
_SPI_execute(const char *src, int tcount, _SPI_plan *plan)
{
- StringInfoData stri;
List *raw_parsetree_list;
List *query_list_list;
List *plan_list;
@@ -994,10 +993,7 @@ _SPI_execute(const char *src, int tcount, _SPI_plan *plan)
/*
* Parse the request string into a list of raw parse trees.
*/
- initStringInfo(&stri);
- appendStringInfoString(&stri, src);
-
- raw_parsetree_list = pg_parse_query(&stri, argtypes, nargs);
+ raw_parsetree_list = pg_parse_query(src, argtypes, nargs);
/*
* Do parse analysis and rule rewrite for each raw parsetree.
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 72a55be667b..778fc3a2bb9 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.134 2003/04/08 23:20:01 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.135 2003/04/27 20:09:44 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -1692,7 +1692,6 @@ inline_function(Oid funcid, Oid result_type, List *args,
bool isNull;
MemoryContext oldcxt;
MemoryContext mycxt;
- StringInfoData stri;
List *raw_parsetree_list;
List *querytree_list;
Query *querytree;
@@ -1752,10 +1751,7 @@ inline_function(Oid funcid, Oid result_type, List *args,
* we care about. Also, we can punt as soon as we detect more than
* one command in the function body.
*/
- initStringInfo(&stri);
- appendStringInfo(&stri, "%s", src);
-
- raw_parsetree_list = pg_parse_query(&stri,
+ raw_parsetree_list = pg_parse_query(src,
funcform->proargtypes,
funcform->pronargs);
if (length(raw_parsetree_list) != 1)
diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c
index 6d038080ea0..85aeafacc59 100644
--- a/src/backend/parser/parse_type.c
+++ b/src/backend/parser/parse_type.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.55 2003/04/24 21:16:43 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.56 2003/04/27 20:09:44 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -437,7 +437,7 @@ parseTypeString(const char *str, Oid *type_id, int32 *typmod)
initStringInfo(&buf);
appendStringInfo(&buf, "SELECT (NULL::%s)", str);
- raw_parsetree_list = parser(&buf, NULL, 0);
+ raw_parsetree_list = parser(buf.data, NULL, 0);
/*
* Make sure we got back exactly what we expected and no more;
diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c
index c8614b57311..16745f7b370 100644
--- a/src/backend/parser/parser.c
+++ b/src/backend/parser/parser.c
@@ -14,7 +14,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.55 2002/09/04 20:31:24 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.56 2003/04/27 20:09:44 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -45,7 +45,7 @@ static bool have_lookahead; /* lookahead_token set? */
* Returns a list of raw (un-analyzed) parse trees.
*/
List *
-parser(StringInfo str, Oid *typev, int nargs)
+parser(const char *str, Oid *typev, int nargs)
{
int yyresult;
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 05b488643e3..c1f53ac8ebb 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.104 2003/04/24 21:16:43 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.105 2003/04/27 20:09:44 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -595,18 +595,23 @@ yyerror(const char *message)
* Called before any actual parsing is done
*/
void
-scanner_init(StringInfo str)
+scanner_init(const char *str)
{
+ Size slen = strlen(str);
+
/*
* Might be left over after ereport()
*/
if (YY_CURRENT_BUFFER)
yy_delete_buffer(YY_CURRENT_BUFFER);
- scanbuf = palloc(str->len + 2);
- memcpy(scanbuf, str->data, str->len);
- scanbuf[str->len] = scanbuf[str->len + 1] = YY_END_OF_BUFFER_CHAR;
- scanbufhandle = yy_scan_buffer(scanbuf, str->len + 2);
+ /*
+ * Make a scan buffer with special termination needed by flex.
+ */
+ scanbuf = palloc(slen + 2);
+ memcpy(scanbuf, str, slen);
+ scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;
+ scanbufhandle = yy_scan_buffer(scanbuf, slen + 2);
/* initialize literal buffer to a reasonable but expansible size */
literalalloc = 128;
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 05349743520..e5bd93eb066 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -13,7 +13,7 @@
*
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.34 2003/04/26 02:57:14 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/postmaster/pgstat.c,v 1.35 2003/04/27 20:09:44 tgl Exp $
* ----------
*/
#include "postgres.h"
@@ -446,7 +446,7 @@ pgstat_bestart(void)
* ----------
*/
void
-pgstat_report_activity(char *what)
+pgstat_report_activity(const char *what)
{
PgStat_MsgActivity msg;
int len;
@@ -455,7 +455,8 @@ pgstat_report_activity(char *what)
return;
len = strlen(what);
- len = pg_mbcliplen((const unsigned char *) what, len, PGSTAT_ACTIVITY_SIZE - 1);
+ len = pg_mbcliplen((const unsigned char *) what, len,
+ PGSTAT_ACTIVITY_SIZE - 1);
memcpy(msg.m_what, what, len);
msg.m_what[len] = '\0';
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index bc884906ca0..dca6455b0d0 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.324 2003/04/24 21:16:43 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.325 2003/04/27 20:09:44 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -60,16 +60,15 @@
#include "pgstat.h"
+extern int optind;
+extern char *optarg;
+
/* ----------------
* global variables
* ----------------
*/
-
-extern int optind;
-extern char *optarg;
-
-char *debug_query_string; /* for pgmonitor and
+const char *debug_query_string; /* for pgmonitor and
* log_min_error_statement */
/* Note: whereToSendOutput is initialized for the bootstrap/standalone case */
@@ -339,22 +338,18 @@ ReadCommand(StringInfo inBuf)
* but it is still needed for parsing of SQL function bodies.
*/
List *
-pg_parse_and_rewrite(char *query_string, /* string to execute */
+pg_parse_and_rewrite(const char *query_string, /* string to execute */
Oid *typev, /* parameter types */
int nargs) /* number of parameters */
{
List *raw_parsetree_list;
List *querytree_list;
List *list_item;
- StringInfoData stri;
-
- initStringInfo(&stri);
- appendStringInfoString(&stri, query_string);
/*
* (1) parse the request string into a list of raw parse trees.
*/
- raw_parsetree_list = pg_parse_query(&stri, typev, nargs);
+ raw_parsetree_list = pg_parse_query(query_string, typev, nargs);
/*
* (2) Do parse analysis and rule rewrite.
@@ -385,12 +380,12 @@ pg_parse_and_rewrite(char *query_string, /* string to execute */
* commands are not processed any further than the raw parse stage.
*/
List *
-pg_parse_query(StringInfo query_string, Oid *typev, int nargs)
+pg_parse_query(const char *query_string, Oid *typev, int nargs)
{
List *raw_parsetree_list;
if (log_statement)
- elog(LOG, "query: %s", query_string->data);
+ elog(LOG, "query: %s", query_string);
if (log_parser_stats)
ResetUsage();
@@ -569,7 +564,7 @@ pg_plan_query(Query *querytree)
*/
void
-pg_exec_query_string(StringInfo query_string, /* string to execute */
+pg_exec_query_string(const char *query_string, /* string to execute */
CommandDest dest, /* where results should go */
MemoryContext parse_context) /* context for
* parsetrees */
@@ -582,7 +577,7 @@ pg_exec_query_string(StringInfo query_string, /* string to execute */
stop_t;
bool save_log_duration = log_duration;
- debug_query_string = query_string->data;
+ debug_query_string = query_string;
/*
* We use save_log_duration so "SET log_duration = true" doesn't
@@ -1248,7 +1243,7 @@ PostgresMain(int argc, char *argv[], const char *username)
GucSource gucsource;
char *tmp;
int firstchar;
- StringInfo parser_input;
+ StringInfo input_message;
bool send_rfq;
/*
@@ -1831,7 +1826,7 @@ PostgresMain(int argc, char *argv[], const char *username)
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
- puts("$Revision: 1.324 $ $Date: 2003/04/24 21:16:43 $\n");
+ puts("$Revision: 1.325 $ $Date: 2003/04/27 20:09:44 $\n");
}
/*
@@ -1933,7 +1928,7 @@ PostgresMain(int argc, char *argv[], const char *username)
MemoryContextSwitchTo(QueryContext);
MemoryContextResetAndDeleteChildren(QueryContext);
- parser_input = makeStringInfo();
+ input_message = makeStringInfo();
/*
* (1) tell the frontend we're ready for a new query.
@@ -1983,7 +1978,7 @@ PostgresMain(int argc, char *argv[], const char *username)
/*
* (3) read a command (loop blocks here)
*/
- firstchar = ReadCommand(parser_input);
+ firstchar = ReadCommand(input_message);
/*
* (4) disable async signal conditions again.
@@ -2009,25 +2004,29 @@ PostgresMain(int argc, char *argv[], const char *username)
switch (firstchar)
{
case 'Q': /* simple query */
- /*
- * Process the query string.
- *
- * Note: transaction command start/end is now done within
- * pg_exec_query_string(), not here.
- */
- if (log_statement_stats)
- ResetUsage();
+ {
+ /*
+ * Process the query string.
+ *
+ * Note: transaction command start/end is now done within
+ * pg_exec_query_string(), not here.
+ */
+ const char *query_string = pq_getmsgstring(input_message);
- pgstat_report_activity(parser_input->data);
+ if (log_statement_stats)
+ ResetUsage();
- pg_exec_query_string(parser_input,
- whereToSendOutput,
- QueryContext);
+ pgstat_report_activity(query_string);
- if (log_statement_stats)
- ShowUsage("QUERY STATISTICS");
+ pg_exec_query_string(query_string,
+ whereToSendOutput,
+ QueryContext);
- send_rfq = true;
+ if (log_statement_stats)
+ ShowUsage("QUERY STATISTICS");
+
+ send_rfq = true;
+ }
break;
case 'F': /* fastpath function call */
@@ -2037,7 +2036,7 @@ PostgresMain(int argc, char *argv[], const char *username)
/* start an xact for this function invocation */
start_xact_command();
- if (HandleFunctionRequest(parser_input) == EOF)
+ if (HandleFunctionRequest(input_message) == EOF)
{
/* lost frontend connection during F message input */
diff --git a/src/include/parser/gramparse.h b/src/include/parser/gramparse.h
index 97a91093e23..97108f2b1c9 100644
--- a/src/include/parser/gramparse.h
+++ b/src/include/parser/gramparse.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: gramparse.h,v 1.25 2002/09/04 20:31:45 momjian Exp $
+ * $Id: gramparse.h,v 1.26 2003/04/27 20:09:44 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -15,7 +15,6 @@
#ifndef GRAMPARSE_H
#define GRAMPARSE_H
-#include "lib/stringinfo.h"
#include "nodes/parsenodes.h"
/* from parser.c */
@@ -24,7 +23,7 @@ extern Oid param_type(int t);
extern int yylex(void);
/* from scan.l */
-extern void scanner_init(StringInfo str);
+extern void scanner_init(const char *str);
extern void scanner_finish(void);
extern int base_yylex(void);
extern void yyerror(const char *message);
diff --git a/src/include/parser/parser.h b/src/include/parser/parser.h
index dfaf50c5cc8..42d82869f08 100644
--- a/src/include/parser/parser.h
+++ b/src/include/parser/parser.h
@@ -7,16 +7,15 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: parser.h,v 1.13 2002/06/20 20:29:52 momjian Exp $
+ * $Id: parser.h,v 1.14 2003/04/27 20:09:44 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#ifndef PARSER_H
#define PARSER_H
-#include "lib/stringinfo.h"
#include "parser/parse_node.h"
-extern List *parser(StringInfo str, Oid *typev, int nargs);
+extern List *parser(const char *str, Oid *typev, int nargs);
#endif /* PARSER_H */
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index e85f6ec3e91..568cf878e47 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -5,7 +5,7 @@
*
* Copyright (c) 2001-2003, PostgreSQL Global Development Group
*
- * $Id: pgstat.h,v 1.14 2003/04/26 02:57:14 tgl Exp $
+ * $Id: pgstat.h,v 1.15 2003/04/27 20:09:44 tgl Exp $
* ----------
*/
#ifndef PGSTAT_H
@@ -359,7 +359,7 @@ extern void pgstat_beterm(int pid);
extern void pgstat_bestart(void);
extern void pgstat_ping(void);
-extern void pgstat_report_activity(char *what);
+extern void pgstat_report_activity(const char *what);
extern void pgstat_report_tabstat(void);
extern int pgstat_vacuum_tabstat(void);
diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h
index 3ac7dac96a9..4235d6d257f 100644
--- a/src/include/tcop/tcopprot.h
+++ b/src/include/tcop/tcopprot.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: tcopprot.h,v 1.53 2002/11/15 01:57:28 momjian Exp $
+ * $Id: tcopprot.h,v 1.54 2003/04/27 20:09:44 tgl Exp $
*
* OLD COMMENTS
* This file was created so that other c files could get the two
@@ -22,7 +22,6 @@
#include <setjmp.h>
#include "executor/execdesc.h"
-#include "lib/stringinfo.h"
#include "tcop/dest.h"
@@ -32,16 +31,16 @@ extern bool InError;
extern CommandDest whereToSendOutput;
extern bool log_hostname;
extern bool LogSourcePort;
-extern DLLIMPORT char* debug_query_string;
+extern DLLIMPORT const char *debug_query_string;
#ifndef BOOTSTRAP_INCLUDE
-extern List *pg_parse_query(StringInfo query_string, Oid *typev, int nargs);
+extern List *pg_parse_query(const char *query_string, Oid *typev, int nargs);
extern List *pg_analyze_and_rewrite(Node *parsetree);
-extern List *pg_parse_and_rewrite(char *query_string,
+extern List *pg_parse_and_rewrite(const char *query_string,
Oid *typev, int nargs);
extern Plan *pg_plan_query(Query *querytree);
-extern void pg_exec_query_string(StringInfo query_string,
+extern void pg_exec_query_string(const char *query_string,
CommandDest dest,
MemoryContext parse_context);