From 3716f90c39150ccc97d4ebd8615fcb6141663b8e Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 8 Aug 2006 01:23:15 +0000 Subject: [PATCH] For protocol-level prepare/bind/execute: o print user name for all o print portal name if defined for all o print query for all o reduce log_statement header to single keyword o print bind parameters as DETAIL if text mode --- doc/src/sgml/config.sgml | 8 +++- src/backend/commands/portalcmds.c | 3 +- src/backend/commands/prepare.c | 3 +- src/backend/executor/spi.c | 3 +- src/backend/tcop/postgres.c | 62 ++++++++++++++++++++++-------- src/backend/utils/mmgr/portalmem.c | 4 +- src/include/utils/portal.h | 4 +- 7 files changed, 63 insertions(+), 24 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 0acdd27507..c1c42656ad 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -1,4 +1,4 @@ - + Server Configuration @@ -2808,7 +2808,11 @@ SELECT * FROM parent WHERE key = 2400; UPDATE, DELETE, TRUNCATE, and COPY FROM. PREPARE and EXPLAIN ANALYZE statements are also logged if their - contained command is of an appropriate type. + contained command is of an appropriate type. Protocol-level + prepare, bind, and execute commands are logged only if + log_statement is all. Bind parameter + values are also logged if they are supplied in text + format. The default is none. Only superusers can change this diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c index 7b7d9a1ccf..8b9dd99d4e 100644 --- a/src/backend/commands/portalcmds.c +++ b/src/backend/commands/portalcmds.c @@ -14,7 +14,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.48 2006/07/13 16:49:14 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.49 2006/08/08 01:23:15 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -112,6 +112,7 @@ PerformCursorOpen(DeclareCursorStmt *stmt, ParamListInfo params) * submitted more than one semicolon delimited queries. */ PortalDefineQuery(portal, + NULL, pstrdup(debug_query_string), "SELECT", /* cursor's query is always a SELECT */ list_make1(query), diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index bb367c1718..b49069dc2a 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -10,7 +10,7 @@ * Copyright (c) 2002-2006, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.58 2006/07/14 14:52:18 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.59 2006/08/08 01:23:15 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -201,6 +201,7 @@ ExecuteQuery(ExecuteStmt *stmt, ParamListInfo params, } PortalDefineQuery(portal, + NULL, query_string, entry->commandTag, query_list, diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 18393482d1..93394e2fa1 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.152 2006/07/14 14:52:19 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.153 2006/08/08 01:23:15 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -919,6 +919,7 @@ SPI_cursor_open(const char *name, void *plan, * Set up the portal. */ PortalDefineQuery(portal, + NULL, spiplan->query, "SELECT", /* don't have the raw parse tree... */ list_make1(queryTree), diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index bc45c58612..5a2beeaef5 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.495 2006/08/06 02:00:52 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.496 2006/08/08 01:23:15 momjian Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -955,6 +955,7 @@ exec_simple_query(const char *query_string) portal->visible = false; PortalDefineQuery(portal, + NULL, query_string, commandTag, querytree_list, @@ -1146,7 +1147,7 @@ exec_parse_message(const char *query_string, /* string to execute */ if (log_statement == LOGSTMT_ALL) ereport(LOG, - (errmsg("statement: PREPARE %s AS %s", + (errmsg("prepare %s: %s", *stmt_name ? stmt_name : "", query_string))); @@ -1367,6 +1368,7 @@ exec_bind_message(StringInfo input_message) PreparedStatement *pstmt; Portal portal; ParamListInfo params; + StringInfoData str; pgstat_report_activity(""); @@ -1382,6 +1384,9 @@ exec_bind_message(StringInfo input_message) /* Switch back to message context */ MemoryContextSwitchTo(MessageContext); + if (log_statement == LOGSTMT_ALL) + initStringInfo(&str); + /* Get the fixed part of the message */ portal_name = pq_getmsgstring(input_message); stmt_name = pq_getmsgstring(input_message); @@ -1450,13 +1455,6 @@ exec_bind_message(StringInfo input_message) else portal = CreatePortal(portal_name, false, false); - /* We need to output the parameter values someday */ - if (log_statement == LOGSTMT_ALL) - ereport(LOG, - (errmsg("statement: %s [PREPARE: %s]", - *portal_name ? portal_name : "", - portal->sourceText ? portal->sourceText : ""))); - /* * Fetch parameters, if any, and store in the portal's memory context. */ @@ -1519,7 +1517,7 @@ exec_bind_message(StringInfo input_message) else pformat = 0; /* default = text */ - if (pformat == 0) + if (pformat == 0) /* text mode */ { Oid typinput; Oid typioparam; @@ -1540,11 +1538,16 @@ exec_bind_message(StringInfo input_message) pstring, typioparam, -1); + + if (log_statement == LOGSTMT_ALL) + appendStringInfo(&str, "%s$%d = \"%s\"", + *str.data ? ", " : "", paramno + 1, pstring); + /* Free result of encoding conversion, if any */ if (pstring && pstring != pbuf.data) pfree(pstring); } - else if (pformat == 1) + else if (pformat == 1) /* binary mode */ { Oid typreceive; Oid typioparam; @@ -1595,6 +1598,26 @@ exec_bind_message(StringInfo input_message) else params = NULL; + if (log_statement == LOGSTMT_ALL) + { + if (*str.data) + ereport(LOG, + (errmsg("bind %s%s%s: %s", + *stmt_name ? stmt_name : "", + *portal->name ? "/" : "", + *portal->name ? portal->name : "", + pstmt->query_string ? pstmt->query_string : ""), + errdetail(str.data))); + else + ereport(LOG, + (errmsg("bind %s%s%s: %s", + *stmt_name ? stmt_name : "", + *portal->name ? "/" : "", + *portal->name ? portal->name : "", + pstmt->query_string ? pstmt->query_string : ""))); + pfree(str.data); + } + /* Get the result format codes */ numRFormats = pq_getmsgint(input_message, 2); if (numRFormats > 0) @@ -1628,6 +1651,7 @@ exec_bind_message(StringInfo input_message) * Define portal and start execution. */ PortalDefineQuery(portal, + *stmt_name ? pstrdup(stmt_name) : NULL, pstmt->query_string, pstmt->commandTag, pstmt->query_list, @@ -1724,9 +1748,11 @@ exec_execute_message(const char *portal_name, long max_rows) if (log_statement == LOGSTMT_ALL) /* We have the portal, so output the source query. */ ereport(LOG, - (errmsg("statement: %sEXECUTE %s [PREPARE: %s]", - execute_is_fetch ? "FETCH from " : "", - *portal_name ? portal_name : "", + (errmsg("execute %s%s%s%s: %s", + execute_is_fetch ? "fetch from " : "", + portal->prepStmtName ? portal->prepStmtName : "", + *portal->name ? "/" : "", + *portal->name ? portal->name : "", portal->sourceText ? portal->sourceText : ""))); BeginCommand(portal->commandTag, dest); @@ -1832,10 +1858,12 @@ exec_execute_message(const char *portal_name, long max_rows) secs, msecs))); else ereport(LOG, - (errmsg("duration: %ld.%03d ms statement: %sEXECUTE %s [PREPARE: %s]", + (errmsg("duration: %ld.%03d ms execute %s%s%s%s: %s", secs, msecs, - execute_is_fetch ? "FETCH from " : "", - *portal_name ? portal_name : "", + execute_is_fetch ? "fetch from " : "", + portal->prepStmtName ? portal->prepStmtName : "", + *portal->name ? "/" : "", + *portal->name ? portal->name : "", portal->sourceText ? portal->sourceText : ""))); } } diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 1be86efe2f..da4aee4d16 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -12,7 +12,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.90 2006/07/14 14:52:25 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.91 2006/08/08 01:23:15 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -244,6 +244,7 @@ CreateNewPortal(void) */ void PortalDefineQuery(Portal portal, + const char *prepStmtName, const char *sourceText, const char *commandTag, List *parseTrees, @@ -257,6 +258,7 @@ PortalDefineQuery(Portal portal, Assert(commandTag != NULL || parseTrees == NIL); + portal->prepStmtName = prepStmtName; portal->sourceText = sourceText; portal->commandTag = commandTag; portal->parseTrees = parseTrees; diff --git a/src/include/utils/portal.h b/src/include/utils/portal.h index 059948f2ae..3704240ff5 100644 --- a/src/include/utils/portal.h +++ b/src/include/utils/portal.h @@ -39,7 +39,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/portal.h,v 1.63 2006/07/13 18:01:02 momjian Exp $ + * $PostgreSQL: pgsql/src/include/utils/portal.h,v 1.64 2006/08/08 01:23:15 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -100,6 +100,7 @@ typedef struct PortalData { /* Bookkeeping data */ const char *name; /* portal's name */ + const char *prepStmtName; /* protocol prepare name */ MemoryContext heap; /* subsidiary memory for portal */ ResourceOwner resowner; /* resources owned by portal */ void (*cleanup) (Portal portal); /* cleanup hook */ @@ -202,6 +203,7 @@ extern void PortalDrop(Portal portal, bool isTopCommit); extern void DropDependentPortals(MemoryContext queryContext); extern Portal GetPortalByName(const char *name); extern void PortalDefineQuery(Portal portal, + const char *prepStmtName, const char *sourceText, const char *commandTag, List *parseTrees, -- GitLab