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 6a7b89e15e714116b7a133241b940324bd97db7f..ea9f4390661ed5b89c0ecb6b562b8db0e4f99ab9 100644 (file)
@@ -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 900ccfbba4e05d758e8f772f5c8f5f4a53dbe771..b79ab1cc2ce3581b4668a152882e8a06188b9634 100644 (file)
@@ -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 d6cd3daa08710e802492ff6bcfc85c5149ec05c0..ef12d9de3ae0838ed7464ee750ab4b42394d08a2 100644 (file)
@@ -201,6 +201,7 @@ ExecuteQuery(ExecuteStmt *stmt, ParamListInfo params,
        }
 
        PortalDefineQuery(portal,
+                                         NULL,
                                          query_string,
                                          entry->commandTag,
                                          query_list,
index d2d9cfd0d468e3cffd5e2703a68a3d9ba1f00fdb..650566e9337b078d8a0ba9494d92d839896287b7 100644 (file)
@@ -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 be9d4d12c86f4d50e6c09c7a7beb0faaeb9614cf..420e68664b84d1aa82a6233d04ca767e1089b76b 100644 (file)
@@ -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 9a92b3ec499f894bbc08c94546c303191a1a90e0..bfa87ddead0f7ef88f6d924c2c8c0b1f9a30750f 100644 (file)
@@ -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 a6e4f665d3404d94c4c76a3b86520efc0d32565a..01adb0adbfd7df106186f5dab30f5390414e8d56 100644 (file)
@@ -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,