Hi,

tiny scroll-through review.

On 2019-01-28 00:15:51 +0000, Alexey Bashtanov wrote:
> diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
> index b6f5822..997e6e8 100644
> --- a/doc/src/sgml/config.sgml
> +++ b/doc/src/sgml/config.sgml
> @@ -6274,6 +6274,23 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
>        </listitem>
>       </varlistentry>
>  
> +     <varlistentry id="guc-log-parameters-on-error" 
> xreflabel="log_parameters_on_error">
> +      <term><varname>log_parameters_on_error</varname> (<type>boolean</type>)
> +      <indexterm>
> +       <primary><varname>log_parameters_on_error</varname> configuration 
> parameter</primary>
> +      </indexterm>
> +      </term>
> +      <listitem>
> +       <para>
> +        Controls whether the statement is logged with bind parameter values. 
> +        It adds some overhead, as postgres will cache textual
> +        representations of parameter values in memory for all statements,
> +        even if they eventually do not get logged. The default is
> +        <literal>off</literal>. Only superusers can change this setting.
> +       </para>
> +      </listitem>
> +     </varlistentry>

This needs a bit of language polishing.



> @@ -31,6 +31,8 @@
>   * set of parameter values.  If dynamic parameter hooks are present, we
>   * intentionally do not copy them into the result.  Rather, we forcibly
>   * instantiate all available parameter values and copy the datum values.
> + *
> + * We don't copy textual representations here.
>   */

That probably needs to be expanded on. Including a comment about what
guarantees that there are no memory lifetime issues.


> -                             /* Free result of encoding conversion, if any */
> -                             if (pstring && pstring != pbuf.data)
> -                                     pfree(pstring);
> +                             if (pstring)
> +                             {
> +                                     if (need_text_values)
> +                                     {
> +                                             if (pstring == pbuf.data)
> +                                             {
> +                                                     /*
> +                                                      * Copy textual 
> representation to portal context.
> +                                                      */
> +                                                     
> params->params[paramno].textValue =
> +                                                                             
>                                         pstrdup(pstring);
> +                                             }
> +                                             else
> +                                             {
> +                                                     /* Reuse the result of 
> encoding conversion for it */
> +                                                     
> params->params[paramno].textValue = pstring;
> +                                             }
> +                                     }
> +                                     else
> +                                     {
> +                                             /* Free result of encoding 
> conversion */
> +                                             if (pstring != pbuf.data)
> +                                                     pfree(pstring);
> +                                     }
> +                             }

So the parameters we log here haven't actually gone through the output
function? Isn't that an issue? I mean that'll cause the contents to
differ from the non-error case, no? And differs from the binary protocol
case?
>       else
>       {
> +             /*
> +              * We do it for non-xact commands only, as an xact command
> +              * 1) shouldn't have any parameters to log;
> +              * 2) may have the portal dropped early.
> +              */
> +             Assert(current_top_portal == NULL);
> +             current_top_portal = portal;
> +             portalParams = NULL;
> +

"it"? ISTM the comment doesn't really stand on its own?



> +/*
> + * get_portal_bind_parameters
> + *           Get the string containing parameters data, is used for logging.
> + *
> + * Can return NULL if there are no parameters in the portal
> + * or the portal is not valid, or the text representations of the parameters 
> are
> + * not available. If returning a non-NULL value, it allocates memory
> + * for the returned string in the current context, and it's the caller's
> + * responsibility to pfree() it if needed.
> + */
> +char *
> +get_portal_bind_parameters(ParamListInfo params)
> +{
> +     StringInfoData param_str;
> +
> +     /* No parameters to format */
> +     if (!params || params->numParams == 0)
> +             return NULL;
> +
> +                     elog(WARNING, "params->hasTextValues=%d, 
> IsAbortedTransactionBlockState()=%d",
> +                                        params->hasTextValues && 
> IsAbortedTransactionBlockState());

Err, huh?


Greetings,

Andres Freund

Reply via email to