Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hC9sM-0002vq-3B for pgsql-hackers@arkaria.postgresql.org; Thu, 04 Apr 2019 21:26:22 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1hC9sK-0002wr-Ma for pgsql-hackers@arkaria.postgresql.org; Thu, 04 Apr 2019 21:26:20 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hC9sK-0002oa-3m for pgsql-hackers@lists.postgresql.org; Thu, 04 Apr 2019 21:26:20 +0000 Received: from mail-it1-x143.google.com ([2607:f8b0:4864:20::143]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hC9sH-0003nA-0U for pgsql-hackers@postgresql.org; Thu, 04 Apr 2019 21:26:18 +0000 Received: by mail-it1-x143.google.com with SMTP id s3so6236564itk.1 for ; Thu, 04 Apr 2019 14:26:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=telsasoft-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:mime-version:content-disposition :in-reply-to:user-agent; bh=8gAiM/AvLFDZWBc8xL7oPC3bvGjQ0wNCiyHtiT/VVRw=; b=OIlwSmXc1v1koIi1Gmgd3WT5E7rPMcUh7IdTHHz6Rs5/gYEDf/7w1uVxvZ7I+UuwXy +1PdXm48/FJ/ytHUGhUDnjgAkCZglFYK/erhDNTpniG0PwQPxodZekHyLfCpzXvQHY2m xBzJJA2QOn3CTPLwwR9gQDlkycsCEB7jBZlaR/25cEZQpY/Am6eNJiclJqrVPdJdAQqL 298y6litMw95WeCL5KU5CdNP+zwpepGAxtGU1yE2LWI1zA5GY8LxqHVbvEmkPRyr9kTi 6jZ48GGnv8vAPg9QwT8oO7riPdQTNMWmKuZzONAIjlV8errTS4HrtS41oQ+Ho4C5aDaS VA8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:in-reply-to:user-agent; bh=8gAiM/AvLFDZWBc8xL7oPC3bvGjQ0wNCiyHtiT/VVRw=; b=NeaQBb6dEfgCfXnzvx0Ab6imNuMvaMqAbS2F+GLdWo6tLkI4GbtuoZZhqVBfqPmkHL jPYQ+SK1cVvg5Pk51lyh9PFs56vrGDNwkatJviB9EC0hrkmVDdAU0sASgiZJomdpDqqA Kb57rgaIGzRiBavs7lqakUrXVBbsKID1oEUf8sQisXVO5YYZArBisE0J+BScLZutv6ct cVLNRaF2Fv+f9qnU2SLdDIBNKnkaYQYnlWPsGb3ayYwQdK6igkaY3NIE9lROr7hzOEHw RJ672e3KaITkgwTs9d/jW5NXZdnXt2szmu6H1ZWTCKB31P74sXIUcR2Cqdh8eLG5KEIg uP0A== X-Gm-Message-State: APjAAAXGXds2usRWADyhvHe7KEE4HeNJiDmVknGCeHgXDhzIPmNzmspp lOZbQ7o7z61tv/ISFzRnOulpiw== X-Google-Smtp-Source: APXvYqy8tsyeKquKC43PHjqm3CoiYgenl4Sj7vFifNK7MZw2sZ8GKOxHuVRYpRGG1QzJR50wh8kXgg== X-Received: by 2002:a24:4d12:: with SMTP id l18mr5968594itb.66.1554413175964; Thu, 04 Apr 2019 14:26:15 -0700 (PDT) Received: from pryzbyj (charmander.telsasoft.com. [50.244.222.1]) by smtp.gmail.com with ESMTPSA id q2sm8203099ioh.4.2019.04.04.14.26.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Apr 2019 14:26:14 -0700 (PDT) Received: by pryzbyj (Postfix, from userid 1000) id 481F98012A7; Thu, 4 Apr 2019 16:26:13 -0500 (CDT) Date: Thu, 4 Apr 2019 16:26:13 -0500 From: Justin Pryzby To: Alvaro Herrera Cc: Arthur Zakirov , pgsql-hackers@postgresql.org Subject: Re: query logging of prepared statements Message-ID: <20190404212613.GA16096@telsasoft.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="7AUc2qLy4jB3hD7Z" Content-Disposition: inline In-Reply-To: <20190404182630.GA4305@alvherre.pgsql> <20190404180704.GA31569@alvherre.pgsql> User-Agent: Mutt/1.5.23 (2014-03-12) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --7AUc2qLy4jB3hD7Z Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Apr 04, 2019 at 03:07:04PM -0300, Alvaro Herrera wrote: > which does not look good -- the statement is nowhere to be seen. The commit > message quotes this as desirable output: Good catch. Unnamed statements sent behind the scenes by pqExecParams weren't being logged. I specifically handled unnamed statements in my v1 patch, and tested that in 20190215145704.GW30291@telsasoft.com, but for some reason dropped that logic in v2, which was intended to only remove behavior conditional on log_error_verbosity. Previous patches also never logged pqPrepare with named prepared statements (unnamed prepared statements were handled in v1 and SQL PREPARE was handled as a simple statement). On Thu, Apr 04, 2019 at 03:26:30PM -0300, Alvaro Herrera wrote: > With this patch (pretty much equivalent to reinstanting the > errdetail_execute for that line), That means the text of the prepared statement is duplicated for each execute, which is what we're trying to avoid, no ? Attached patch promotes message to LOG in exec_parse_message. Parse is a protocol-layer message, and I think it's used by (only) pqPrepare and pqExecParams. testlibpq3 now shows: |LOG: parse : SELECT * FROM test1 WHERE t = $1 |LOG: execute |DETAIL: parameters: $1 = 'joe''s place' |LOG: parse : SELECT * FROM test1 WHERE i = $1::int4 |LOG: execute |DETAIL: parameters: $1 = '2' Compare unpatched v11.2 , the text of the prepared statement was shown in "parse" phase rather than in each execute: |LOG: execute : SELECT * FROM test1 WHERE t = $1 |DETAIL: parameters: $1 = 'joe''s place' |LOG: execute : SELECT * FROM test1 WHERE i = $1::int4 |DETAIL: parameters: $1 = '2' Justin --7AUc2qLy4jB3hD7Z Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="v4-0001-Avoid-repetitive-log-of-PREPARE-during-EXECUTE-of.patch" From 0826f7f90eb8f169244140a22db0bbbcb0d2b269 Mon Sep 17 00:00:00 2001 From: Justin Pryzby Date: Sat, 9 Feb 2019 19:20:43 -0500 Subject: [PATCH v4] Avoid repetitive log of PREPARE during EXECUTE of prepared statements --- src/backend/tcop/postgres.c | 70 ++++++++++++--------------------------------- 1 file changed, 18 insertions(+), 52 deletions(-) diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 44a59e1..348343c 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -182,7 +182,6 @@ static int ReadCommand(StringInfo inBuf); static void forbidden_in_wal_sender(char firstchar); static List *pg_rewrite_query(Query *query); static bool check_log_statement(List *stmt_list); -static int errdetail_execute(List *raw_parsetree_list); static int errdetail_params(ParamListInfo params); static int errdetail_abort(void); static int errdetail_recovery_conflict(void); @@ -1041,8 +1040,7 @@ exec_simple_query(const char *query_string) { ereport(LOG, (errmsg("statement: %s", query_string), - errhidestmt(true), - errdetail_execute(parsetree_list))); + errhidestmt(true))); was_logged = true; } @@ -1292,8 +1290,7 @@ exec_simple_query(const char *query_string) ereport(LOG, (errmsg("duration: %s ms statement: %s", msec_str, query_string), - errhidestmt(true), - errdetail_execute(parsetree_list))); + errhidestmt(true))); break; } @@ -1326,6 +1323,7 @@ exec_parse_message(const char *query_string, /* string to execute */ bool is_named; bool save_log_statement_stats = log_statement_stats; char msec_str[32]; + bool was_logged = false; /* * Report query to various monitoring facilities. @@ -1339,11 +1337,6 @@ exec_parse_message(const char *query_string, /* string to execute */ if (save_log_statement_stats) ResetUsage(); - ereport(DEBUG2, - (errmsg("parse %s: %s", - *stmt_name ? stmt_name : "", - query_string))); - /* * Start up a transaction command so we can run parse analysis etc. (Note * that this will normally change current memory context.) Nothing happens @@ -1404,6 +1397,14 @@ exec_parse_message(const char *query_string, /* string to execute */ Query *query; bool snapshot_set = false; + if (check_log_statement(parsetree_list)) { + ereport( LOG, // else log as DEBUG2 ? + (errmsg("parse %s: %s", + *stmt_name ? stmt_name : "", + query_string))); + was_logged = true; + } + raw_parse_tree = linitial_node(RawStmt, parsetree_list); /* @@ -1544,7 +1545,7 @@ exec_parse_message(const char *query_string, /* string to execute */ /* * Emit duration logging if appropriate. */ - switch (check_log_duration(msec_str, false)) + switch (check_log_duration(msec_str, was_logged)) { case 1: ereport(LOG, @@ -1920,12 +1921,11 @@ exec_bind_message(StringInfo input_message) break; case 2: ereport(LOG, - (errmsg("duration: %s ms bind %s%s%s: %s", + (errmsg("duration: %s ms bind %s%s%s", msec_str, *stmt_name ? stmt_name : "", *portal_name ? "/" : "", - *portal_name ? portal_name : "", - psrc->query_string), + *portal_name ? portal_name : ""), errhidestmt(true), errdetail_params(params))); break; @@ -2053,14 +2053,13 @@ exec_execute_message(const char *portal_name, long max_rows) if (check_log_statement(portal->stmts)) { ereport(LOG, - (errmsg("%s %s%s%s: %s", + (errmsg("%s %s%s%s", execute_is_fetch ? _("execute fetch from") : _("execute"), prepStmtName, *portal_name ? "/" : "", - *portal_name ? portal_name : "", - sourceText), + *portal_name ? portal_name : ""), errhidestmt(true), errdetail_params(portalParams))); was_logged = true; @@ -2141,15 +2140,14 @@ exec_execute_message(const char *portal_name, long max_rows) break; case 2: ereport(LOG, - (errmsg("duration: %s ms %s %s%s%s: %s", + (errmsg("duration: %s ms %s %s%s%s", msec_str, execute_is_fetch ? _("execute fetch from") : _("execute"), prepStmtName, *portal_name ? "/" : "", - *portal_name ? portal_name : "", - sourceText), + *portal_name ? portal_name : ""), errhidestmt(true), errdetail_params(portalParams))); break; @@ -2260,38 +2258,6 @@ check_log_duration(char *msec_str, bool was_logged) } /* - * errdetail_execute - * - * Add an errdetail() line showing the query referenced by an EXECUTE, if any. - * The argument is the raw parsetree list. - */ -static int -errdetail_execute(List *raw_parsetree_list) -{ - ListCell *parsetree_item; - - foreach(parsetree_item, raw_parsetree_list) - { - RawStmt *parsetree = lfirst_node(RawStmt, parsetree_item); - - if (IsA(parsetree->stmt, ExecuteStmt)) - { - ExecuteStmt *stmt = (ExecuteStmt *) parsetree->stmt; - PreparedStatement *pstmt; - - pstmt = FetchPreparedStatement(stmt->name, false); - if (pstmt) - { - errdetail("prepare: %s", pstmt->plansource->query_string); - return 0; - } - } - } - - return 0; -} - -/* * errdetail_params * * Add an errdetail() line showing bind-parameter data, if available. -- 2.1.4 --7AUc2qLy4jB3hD7Z--