]> granicus.if.org Git - postgresql/commitdiff
For protocol-level prepare/bind/execute:
authorBruce Momjian <bruce@momjian.us>
Tue, 8 Aug 2006 01:23:15 +0000 (01:23 +0000)
committerBruce Momjian <bruce@momjian.us>
Tue, 8 Aug 2006 01:23:15 +0000 (01:23 +0000)
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
src/backend/commands/portalcmds.c
src/backend/commands/prepare.c
src/backend/executor/spi.c
src/backend/tcop/postgres.c
src/backend/utils/mmgr/portalmem.c
src/include/utils/portal.h

index 0acdd27507865fd6c33dca47c5698facb9553357..c1c42656ad74aee600b495a31695d33afbb71aa5 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.71 2006/07/27 08:30:41 petere Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.72 2006/08/08 01:23:15 momjian Exp $ -->
 
 <chapter Id="runtime-config">
   <title>Server Configuration</title>
@@ -2808,7 +2808,11 @@ SELECT * FROM parent WHERE key = 2400;
         <literal>UPDATE</>, <literal>DELETE</>, <literal>TRUNCATE</>,
         and <literal>COPY FROM</>. <literal>PREPARE</> and
         <literal>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
+        <varname>log_statement</> is <literal>all</>.  Bind parameter 
+        values are also logged if they are supplied in <literal>text</>
+        format.
        </para>
        <para>
         The default is <literal>none</>. Only superusers can change this
index 7b7d9a1ccf5b77dbf305c4236deee914f370f1cb..8b9dd99d4e4ff428cdcbced65fd327fe32721d79 100644 (file)
@@ -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),
index bb367c171871393d31ea0b61b8b825e2527186cf..b49069dc2a26cb4f437d7cb79bd7f4e67fee3a40 100644 (file)
@@ -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,
index 18393482d1b3e3ecec9abddb44af1b0777c1471c..93394e2fa10c9e32427c42fbc162ea612d7a68f3 100644 (file)
@@ -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),
index bc45c58612f20f6d16db074f133ebea3eae5b8b4..5a2beeaef5f4018db65e279b5f0d06da172febfc 100644 (file)
@@ -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: <protocol> PREPARE %s AS %s",
+                               (errmsg("prepare %s:  %s",
                                                *stmt_name ? stmt_name : "<unnamed>",
                                                query_string)));
 
@@ -1367,6 +1368,7 @@ exec_bind_message(StringInfo input_message)
        PreparedStatement *pstmt;
        Portal          portal;
        ParamListInfo params;
+       StringInfoData str;
 
        pgstat_report_activity("<BIND>");
 
@@ -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: <protocol> <BIND> %s  [PREPARE:  %s]",
-                                               *portal_name ? portal_name : "<unnamed>",
-                                               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 : "<unnamed>",
+                                                       *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 : "<unnamed>",
+                                                       *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: <protocol> %sEXECUTE %s  [PREPARE:  %s]",
-                                               execute_is_fetch ? "FETCH from " : "",
-                                               *portal_name ? portal_name : "<unnamed>",
+                               (errmsg("execute %s%s%s%s:  %s",
+                                               execute_is_fetch ? "fetch from " : "",
+                                               portal->prepStmtName ? portal->prepStmtName : "<unnamed>",
+                                               *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: <protocol> %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 : "<unnamed>",
+                                                               execute_is_fetch ? "fetch from " : "",
+                                                               portal->prepStmtName ? portal->prepStmtName : "<unnamed>",
+                                                               *portal->name ? "/" : "",
+                                   *portal->name ? portal->name : "",
                                                                portal->sourceText ? portal->sourceText : "")));
                }
        }
index 1be86efe2f3bee21a4b9c124c7a5d8f24ab2abb9..da4aee4d1626286d2a2496e56aee2ba9899665a0 100644 (file)
@@ -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;
index 059948f2aecd56435873f312becd3cb2addd882d..3704240ff502e99815a8c2cd1ecc625d8b1bbaed 100644 (file)
@@ -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,