mirror of
https://github.com/postgres/postgres.git
synced 2025-12-01 12:18:01 +03:00
Clean up logging for extended-query-protocol operations, as per my recent
proposal. Parameter logging works even for binary-format parameters, and logging overhead is avoided when disabled. log_statement = all output for the src/test/examples/testlibpq3.c example now looks like LOG: statement: execute <unnamed>: SELECT * FROM test1 WHERE t = $1 DETAIL: parameters: $1 = 'joe''s place' LOG: statement: execute <unnamed>: SELECT * FROM test1 WHERE i = $1::int4 DETAIL: parameters: $1 = '2' and log_min_duration_statement = 0 results in LOG: duration: 2.431 ms parse <unnamed>: SELECT * FROM test1 WHERE t = $1 LOG: duration: 2.335 ms bind <unnamed> to <unnamed>: SELECT * FROM test1 WHERE t = $1 DETAIL: parameters: $1 = 'joe''s place' LOG: duration: 0.394 ms execute <unnamed>: SELECT * FROM test1 WHERE t = $1 DETAIL: parameters: $1 = 'joe''s place' LOG: duration: 1.251 ms parse <unnamed>: SELECT * FROM test1 WHERE i = $1::int4 LOG: duration: 0.566 ms bind <unnamed> to <unnamed>: SELECT * FROM test1 WHERE i = $1::int4 DETAIL: parameters: $1 = '2' LOG: duration: 0.173 ms execute <unnamed>: SELECT * FROM test1 WHERE i = $1::int4 DETAIL: parameters: $1 = '2' (This example demonstrates the folly of ignoring parse/bind steps for duration logging purposes, BTW.) Along the way, create a less ad-hoc mechanism for determining which commands are logged by log_statement = mod and log_statement = ddl. The former coding was actually missing quite a few things that look like ddl to me, and it did not handle EXECUTE or extended query protocol correctly at all. This commit does not do anything about the question of whether log_duration should be removed or made less redundant with log_min_duration_statement.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
$PostgreSQL: pgsql/src/backend/utils/mmgr/README,v 1.8 2004/08/04 21:34:04 tgl Exp $
|
||||
$PostgreSQL: pgsql/src/backend/utils/mmgr/README,v 1.9 2006/09/07 22:52:01 tgl Exp $
|
||||
|
||||
Notes about memory allocation redesign
|
||||
--------------------------------------
|
||||
@@ -202,13 +202,13 @@ data kept here is pending NOTIFY messages, which are sent at top-level commit,
|
||||
but only if the generating subtransaction did not abort.
|
||||
|
||||
QueryContext --- this is not actually a separate context, but a global
|
||||
variable pointing to the context that holds the current command's parse
|
||||
and plan trees. (In simple-Query mode this points to MessageContext;
|
||||
when executing a prepared statement it will point at the prepared
|
||||
statement's private context.) Generally it is not appropriate for any
|
||||
code to use QueryContext as an allocation target --- from the point of
|
||||
view of any code that would be referencing the QueryContext variable,
|
||||
it's a read-only context.
|
||||
variable pointing to the context that holds the current command's parse tree.
|
||||
(In simple-Query mode this points to MessageContext; when executing a
|
||||
prepared statement it will point to the prepared statement's private context.
|
||||
Note that the plan tree may or may not be in this same context.)
|
||||
Generally it is not appropriate for any code to use QueryContext as an
|
||||
allocation target --- from the point of view of any code that would be
|
||||
referencing the QueryContext variable, it's a read-only context.
|
||||
|
||||
PortalContext --- this is not actually a separate context either, but a
|
||||
global variable pointing to the per-portal context of the currently active
|
||||
|
||||
@@ -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.93 2006/08/29 02:11:30 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.94 2006/09/07 22:52:01 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -266,15 +266,14 @@ CreateNewPortal(void)
|
||||
* Notes: commandTag shall be NULL if and only if the original query string
|
||||
* (before rewriting) was an empty string. Also, the passed commandTag must
|
||||
* be a pointer to a constant string, since it is not copied. The caller is
|
||||
* responsible for ensuring that the passed sourceText (if any), parse and
|
||||
* plan trees have adequate lifetime. Also, queryContext must accurately
|
||||
* describe the location of the parse and plan trees.
|
||||
* responsible for ensuring that the passed prepStmtName (if any), sourceText
|
||||
* (if any), parse and plan trees have adequate lifetime. Also, queryContext
|
||||
* must accurately describe the location of the parse trees.
|
||||
*/
|
||||
void
|
||||
PortalDefineQuery(Portal portal,
|
||||
const char *prepStmtName,
|
||||
const char *sourceText,
|
||||
const char *bindText,
|
||||
const char *commandTag,
|
||||
List *parseTrees,
|
||||
List *planTrees,
|
||||
@@ -289,7 +288,6 @@ PortalDefineQuery(Portal portal,
|
||||
|
||||
portal->prepStmtName = prepStmtName;
|
||||
portal->sourceText = sourceText;
|
||||
portal->bindText = bindText;
|
||||
portal->commandTag = commandTag;
|
||||
portal->parseTrees = parseTrees;
|
||||
portal->planTrees = planTrees;
|
||||
|
||||
Reference in New Issue
Block a user