Thread: Add GUC_REPORT to server_encoding, integer_datetimes

Add GUC_REPORT to server_encoding, integer_datetimes

From
Oliver Jowett
Date:
This adds GUC_REPORT to server_encoding and integer_datetimes so they
are reported in the V3 protocol startup packet. Also some related doc
updates.

Rationale:

1) server_encoding is useful to allow clients to detect bad
server/client encoding pairs. The one that bites JDBC regularly is
client_encoding = UNICODE with server_encoding = SQL_ASCII. I'd prefer
for the server to reject that combination entirely, but failing that
clients can implement such a policy themselves by inspecting
server_encoding when establishing a connection.

2) integer_datetimes affects the binary representation of date/time
types. A client that wants to use binary parameters or resultsets that
involve those types needs to know the value of this setting before
dealing with the binary data.

In both cases, it's good to have it in the startup packet to avoid an
extra round-trip on connection establishment.

Any chance that this can go into 8.0?

-O
? GNUmakefile
? config.log
? config.status
? src/Makefile.global
? src/include/pg_config.h
? src/include/stamp-h
Index: doc/src/sgml/libpq.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/libpq.sgml,v
retrieving revision 1.158
diff -u -c -r1.158 libpq.sgml
*** doc/src/sgml/libpq.sgml    11 Aug 2004 18:06:00 -0000    1.158
--- doc/src/sgml/libpq.sgml    13 Aug 2004 03:29:45 -0000
***************
*** 854,864 ****

  <para>
  Parameters reported as of the current release include
! <literal>server_version</> (cannot change after startup);
! <literal>client_encoding</>,
  <literal>is_superuser</>,
! <literal>session_authorization</literal>, and
! <literal>DateStyle</>.
  </para>

  <para>
--- 854,866 ----

  <para>
  Parameters reported as of the current release include
! <xref linkend="guc-server-version">,
! <xref linkend="guc-server-encoding">,
! <xref linkend="guc-client-encoding">,
  <literal>is_superuser</>,
! <literal>session_authorization</>,
! <xref linkend="guc-datestyle">, and
! <xref linkend="guc-integer-datetimes">.
  </para>

  <para>
Index: doc/src/sgml/protocol.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/protocol.sgml,v
retrieving revision 1.52
diff -u -c -r1.52 protocol.sgml
*** doc/src/sgml/protocol.sgml    11 Jun 2004 01:08:33 -0000    1.52
--- doc/src/sgml/protocol.sgml    13 Aug 2004 03:29:46 -0000
***************
*** 1046,1057 ****
     <para>
      At present there is a hard-wired set of parameters for which
      ParameterStatus will be generated: they are
!     <literal>server_version</> (a pseudo-parameter that cannot change after
!     startup);
!     <literal>client_encoding</>,
      <literal>is_superuser</>,
!     <literal>session_authorization</literal>, and
!     <literal>DateStyle</>.
      This set might change in the future, or even become configurable.
      Accordingly, a frontend should simply ignore ParameterStatus for
      parameters that it does not understand or care about.
--- 1046,1058 ----
     <para>
      At present there is a hard-wired set of parameters for which
      ParameterStatus will be generated: they are
!     <xref linkend="guc-server-version">,
!     <xref linkend="guc-server-encoding">,
!     <xref linkend="guc-client-encoding">,
      <literal>is_superuser</>,
!     <literal>session_authorization</>,
!     <xref linkend="guc-datestyle">, and
!     <xref linkend="guc-integer-datetimes">.
      This set might change in the future, or even become configurable.
      Accordingly, a frontend should simply ignore ParameterStatus for
      parameters that it does not understand or care about.
Index: doc/src/sgml/runtime.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/runtime.sgml,v
retrieving revision 1.276
diff -u -c -r1.276 runtime.sgml
*** doc/src/sgml/runtime.sgml    12 Aug 2004 19:03:17 -0000    1.276
--- doc/src/sgml/runtime.sgml    13 Aug 2004 03:29:46 -0000
***************
*** 2674,2681 ****

       <variablelist>

!      <varlistentry id="guc-datestyle" xreflabel="datestyle">
!       <term><varname>datestyle</varname> (<type>string</type>)</term>
        <indexterm><primary>date style</></>
        <listitem>
         <para>
--- 2674,2681 ----

       <variablelist>

!      <varlistentry id="guc-datestyle" xreflabel="DateStyle">
!       <term><varname>DateStyle</varname> (<type>string</type>)</term>
        <indexterm><primary>date style</></>
        <listitem>
         <para>
***************
*** 2747,2752 ****
--- 2747,2763 ----
        </listitem>
       </varlistentry>

+      <varlistentry id="guc-server-encoding" xreflabel="server_encoding">
+       <term><varname>server_encoding</varname> (<type>string</type>)</term>
+       <indexterm><primary>character set</></>
+       <listitem>
+        <para>
+         This parameter shows the database encoding (character set).
+         It is determined when the database is created, and is read-only.
+        </para>
+       </listitem>
+      </varlistentry>
+
       <varlistentry id="guc-client-encoding" xreflabel="client_encoding">
        <term><varname>client_encoding</varname> (<type>string</type>)</term>
        <indexterm><primary>character set</></>
***************
*** 3105,3110 ****
--- 3116,3131 ----

      <variablelist>

+      <varlistentry id="guc-server-version" xreflabel="server_version">
+       <term><varname>server_version</varname> (<type>string</type>)</term>
+       <listitem>
+        <para>
+         Shows the version number of the server. It is determined by the
+         value of <literal>PG_VERSION</> when building the server.
+        </para>
+       </listitem>
+      </varlistentry>
+
       <varlistentry id="guc-block-size" xreflabel="block_size">
        <term><varname>block_size</varname> (<type>integer</type>)</term>
        <listitem>
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.231
diff -u -c -r1.231 guc.c
*** src/backend/utils/misc/guc.c    11 Aug 2004 21:10:37 -0000    1.231
--- src/backend/utils/misc/guc.c    13 Aug 2004 03:29:47 -0000
***************
*** 828,834 ****
          {"integer_datetimes", PGC_INTERNAL, COMPILE_OPTIONS,
              gettext_noop("Datetimes are integer based"),
              NULL,
!             GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
          },
          &integer_datetimes,
  #ifdef HAVE_INT64_TIMESTAMP
--- 828,834 ----
          {"integer_datetimes", PGC_INTERNAL, COMPILE_OPTIONS,
              gettext_noop("Datetimes are integer based"),
              NULL,
!             GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
          },
          &integer_datetimes,
  #ifdef HAVE_INT64_TIMESTAMP
***************
*** 1624,1630 ****
          {"server_encoding", PGC_INTERNAL, CLIENT_CONN_LOCALE,
              gettext_noop("Sets the server (database) character set encoding."),
              NULL,
!             GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
          },
          &server_encoding_string,
          "SQL_ASCII", NULL, NULL
--- 1624,1630 ----
          {"server_encoding", PGC_INTERNAL, CLIENT_CONN_LOCALE,
              gettext_noop("Sets the server (database) character set encoding."),
              NULL,
!             GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
          },
          &server_encoding_string,
          "SQL_ASCII", NULL, NULL

Re: Add GUC_REPORT to server_encoding, integer_datetimes

From
Oliver Jowett
Date:
Oliver Jowett wrote:
> This adds GUC_REPORT to server_encoding and integer_datetimes so they
> are reported in the V3 protocol startup packet.

s/startup packet/startup process/

-O

Re: Add GUC_REPORT to server_encoding, integer_datetimes

From
Tom Lane
Date:
Oliver Jowett <oliver@opencloud.com> writes:
> This adds GUC_REPORT to server_encoding and integer_datetimes so they
> are reported in the V3 protocol startup packet. Also some related doc
> updates.

Applied (with some further hacking on the docs).

            regards, tom lane

Re: Add GUC_REPORT to server_encoding, integer_datetimes

From
Bruce Momjian
Date:
Is this 8.0 material?

---------------------------------------------------------------------------

Oliver Jowett wrote:
> This adds GUC_REPORT to server_encoding and integer_datetimes so they
> are reported in the V3 protocol startup packet. Also some related doc
> updates.
>
> Rationale:
>
> 1) server_encoding is useful to allow clients to detect bad
> server/client encoding pairs. The one that bites JDBC regularly is
> client_encoding = UNICODE with server_encoding = SQL_ASCII. I'd prefer
> for the server to reject that combination entirely, but failing that
> clients can implement such a policy themselves by inspecting
> server_encoding when establishing a connection.
>
> 2) integer_datetimes affects the binary representation of date/time
> types. A client that wants to use binary parameters or resultsets that
> involve those types needs to know the value of this setting before
> dealing with the binary data.
>
> In both cases, it's good to have it in the startup packet to avoid an
> extra round-trip on connection establishment.
>
> Any chance that this can go into 8.0?
>
> -O

> ? GNUmakefile
> ? config.log
> ? config.status
> ? src/Makefile.global
> ? src/include/pg_config.h
> ? src/include/stamp-h
> Index: doc/src/sgml/libpq.sgml
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/libpq.sgml,v
> retrieving revision 1.158
> diff -u -c -r1.158 libpq.sgml
> *** doc/src/sgml/libpq.sgml    11 Aug 2004 18:06:00 -0000    1.158
> --- doc/src/sgml/libpq.sgml    13 Aug 2004 03:29:45 -0000
> ***************
> *** 854,864 ****
>
>   <para>
>   Parameters reported as of the current release include
> ! <literal>server_version</> (cannot change after startup);
> ! <literal>client_encoding</>,
>   <literal>is_superuser</>,
> ! <literal>session_authorization</literal>, and
> ! <literal>DateStyle</>.
>   </para>
>
>   <para>
> --- 854,866 ----
>
>   <para>
>   Parameters reported as of the current release include
> ! <xref linkend="guc-server-version">,
> ! <xref linkend="guc-server-encoding">,
> ! <xref linkend="guc-client-encoding">,
>   <literal>is_superuser</>,
> ! <literal>session_authorization</>,
> ! <xref linkend="guc-datestyle">, and
> ! <xref linkend="guc-integer-datetimes">.
>   </para>
>
>   <para>
> Index: doc/src/sgml/protocol.sgml
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/protocol.sgml,v
> retrieving revision 1.52
> diff -u -c -r1.52 protocol.sgml
> *** doc/src/sgml/protocol.sgml    11 Jun 2004 01:08:33 -0000    1.52
> --- doc/src/sgml/protocol.sgml    13 Aug 2004 03:29:46 -0000
> ***************
> *** 1046,1057 ****
>      <para>
>       At present there is a hard-wired set of parameters for which
>       ParameterStatus will be generated: they are
> !     <literal>server_version</> (a pseudo-parameter that cannot change after
> !     startup);
> !     <literal>client_encoding</>,
>       <literal>is_superuser</>,
> !     <literal>session_authorization</literal>, and
> !     <literal>DateStyle</>.
>       This set might change in the future, or even become configurable.
>       Accordingly, a frontend should simply ignore ParameterStatus for
>       parameters that it does not understand or care about.
> --- 1046,1058 ----
>      <para>
>       At present there is a hard-wired set of parameters for which
>       ParameterStatus will be generated: they are
> !     <xref linkend="guc-server-version">,
> !     <xref linkend="guc-server-encoding">,
> !     <xref linkend="guc-client-encoding">,
>       <literal>is_superuser</>,
> !     <literal>session_authorization</>,
> !     <xref linkend="guc-datestyle">, and
> !     <xref linkend="guc-integer-datetimes">.
>       This set might change in the future, or even become configurable.
>       Accordingly, a frontend should simply ignore ParameterStatus for
>       parameters that it does not understand or care about.
> Index: doc/src/sgml/runtime.sgml
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/runtime.sgml,v
> retrieving revision 1.276
> diff -u -c -r1.276 runtime.sgml
> *** doc/src/sgml/runtime.sgml    12 Aug 2004 19:03:17 -0000    1.276
> --- doc/src/sgml/runtime.sgml    13 Aug 2004 03:29:46 -0000
> ***************
> *** 2674,2681 ****
>
>        <variablelist>
>
> !      <varlistentry id="guc-datestyle" xreflabel="datestyle">
> !       <term><varname>datestyle</varname> (<type>string</type>)</term>
>         <indexterm><primary>date style</></>
>         <listitem>
>          <para>
> --- 2674,2681 ----
>
>        <variablelist>
>
> !      <varlistentry id="guc-datestyle" xreflabel="DateStyle">
> !       <term><varname>DateStyle</varname> (<type>string</type>)</term>
>         <indexterm><primary>date style</></>
>         <listitem>
>          <para>
> ***************
> *** 2747,2752 ****
> --- 2747,2763 ----
>         </listitem>
>        </varlistentry>
>
> +      <varlistentry id="guc-server-encoding" xreflabel="server_encoding">
> +       <term><varname>server_encoding</varname> (<type>string</type>)</term>
> +       <indexterm><primary>character set</></>
> +       <listitem>
> +        <para>
> +         This parameter shows the database encoding (character set).
> +         It is determined when the database is created, and is read-only.
> +        </para>
> +       </listitem>
> +      </varlistentry>
> +
>        <varlistentry id="guc-client-encoding" xreflabel="client_encoding">
>         <term><varname>client_encoding</varname> (<type>string</type>)</term>
>         <indexterm><primary>character set</></>
> ***************
> *** 3105,3110 ****
> --- 3116,3131 ----
>
>       <variablelist>
>
> +      <varlistentry id="guc-server-version" xreflabel="server_version">
> +       <term><varname>server_version</varname> (<type>string</type>)</term>
> +       <listitem>
> +        <para>
> +         Shows the version number of the server. It is determined by the
> +         value of <literal>PG_VERSION</> when building the server.
> +        </para>
> +       </listitem>
> +      </varlistentry>
> +
>        <varlistentry id="guc-block-size" xreflabel="block_size">
>         <term><varname>block_size</varname> (<type>integer</type>)</term>
>         <listitem>
> Index: src/backend/utils/misc/guc.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v
> retrieving revision 1.231
> diff -u -c -r1.231 guc.c
> *** src/backend/utils/misc/guc.c    11 Aug 2004 21:10:37 -0000    1.231
> --- src/backend/utils/misc/guc.c    13 Aug 2004 03:29:47 -0000
> ***************
> *** 828,834 ****
>           {"integer_datetimes", PGC_INTERNAL, COMPILE_OPTIONS,
>               gettext_noop("Datetimes are integer based"),
>               NULL,
> !             GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
>           },
>           &integer_datetimes,
>   #ifdef HAVE_INT64_TIMESTAMP
> --- 828,834 ----
>           {"integer_datetimes", PGC_INTERNAL, COMPILE_OPTIONS,
>               gettext_noop("Datetimes are integer based"),
>               NULL,
> !             GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
>           },
>           &integer_datetimes,
>   #ifdef HAVE_INT64_TIMESTAMP
> ***************
> *** 1624,1630 ****
>           {"server_encoding", PGC_INTERNAL, CLIENT_CONN_LOCALE,
>               gettext_noop("Sets the server (database) character set encoding."),
>               NULL,
> !             GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
>           },
>           &server_encoding_string,
>           "SQL_ASCII", NULL, NULL
> --- 1624,1630 ----
>           {"server_encoding", PGC_INTERNAL, CLIENT_CONN_LOCALE,
>               gettext_noop("Sets the server (database) character set encoding."),
>               NULL,
> !             GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
>           },
>           &server_encoding_string,
>           "SQL_ASCII", NULL, NULL

>
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Add GUC_REPORT to server_encoding, integer_datetimes

From
Oliver Jowett
Date:
Bruce Momjian wrote:
> Is this 8.0 material?

Tom's already applied it..

-O

Re: Add GUC_REPORT to server_encoding, integer_datetimes

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> Is this 8.0 material?

Quite ... in fact it's applied already ...

            regards, tom lane