For protocol-level prepare/bind/execute:
authorBruce Momjian
Tue, 8 Aug 2006 01:23:15 +0000 (01:23 +0000)
committerBruce Momjian
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 @@
-
+
 
 
   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
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:  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 : "")));
        }
    }
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,