]> granicus.if.org Git - postgresql/commitdiff
De-support floating-point timestamps.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Feb 2017 16:40:12 +0000 (11:40 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Feb 2017 16:40:20 +0000 (11:40 -0500)
Per discussion, the time has come to do this.  The handwriting has been
on the wall at least since 9.0 that this would happen someday, whenever
it got to be too much of a burden to support the float-timestamp option.
The triggering factor now is the discovery that there are multiple bugs
in the code that attempts to implement use of integer timestamps in the
replication protocol even when the server is built for float timestamps.
The internal float timestamps leak into the protocol fields in places.
While we could fix the identified bugs, there's a very high risk of
introducing more.  Trying to build a wall that would positively prevent
mixing integer and float timestamps is more complexity than we want to
undertake to maintain a long-deprecated option.  The fact that these
bugs weren't found through testing also indicates a lack of interest
in float timestamps.

This commit disables configure's --disable-integer-datetimes switch
(it'll still accept --enable-integer-datetimes, though), removes direct
references to USE_INTEGER_DATETIMES, and removes discussion of float
timestamps from the user documentation.  A considerable amount of code is
rendered dead by this, but removing that will occur as separate mop-up.

Discussion: https://postgr.es/m/26788.1487455319@sss.pgh.pa.us

15 files changed:
configure
configure.in
doc/src/sgml/config.sgml
doc/src/sgml/datatype.sgml
doc/src/sgml/installation.sgml
src/include/c.h
src/include/pg_config.h.in
src/include/pg_config.h.win32
src/interfaces/ecpg/include/ecpg_config.h.in
src/interfaces/ecpg/include/pgtypes_interval.h
src/interfaces/ecpg/test/expected/pgtypeslib-dt_test2.c
src/interfaces/ecpg/test/expected/pgtypeslib-dt_test2.stdout
src/interfaces/ecpg/test/pgtypeslib/dt_test2.pgc
src/tools/msvc/Solution.pm
src/tools/msvc/config_default.pl

index 6a8db7ce2c84ba280b5fb3a21acf046ee3d97fa0..bbbe81170acae429c3b86847125e555813c25f8f 100755 (executable)
--- a/configure
+++ b/configure
@@ -1473,7 +1473,7 @@ Optional Features:
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --disable-integer-datetimes
-                          disable 64-bit integer date/time support
+                          obsolete option, no longer supported
   --enable-nls[=LANGUAGES]
                           enable Native Language Support
   --disable-rpath         do not embed shared library search path in
@@ -2984,10 +2984,10 @@ fi
 
 
 #
-# 64-bit integer date/time storage: enabled by default.
+# 64-bit integer date/time storage is now the only option, but to avoid
+# unnecessary breakage of build scripts, continue to accept an explicit
+# "--enable-integer-datetimes" switch.
 #
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build with 64-bit integer date/time support" >&5
-$as_echo_n "checking whether to build with 64-bit integer date/time support... " >&6; }
 
 
 # Check whether --enable-integer-datetimes was given.
@@ -2995,12 +2995,10 @@ if test "${enable_integer_datetimes+set}" = set; then :
   enableval=$enable_integer_datetimes;
   case $enableval in
     yes)
-
-$as_echo "#define USE_INTEGER_DATETIMES 1" >>confdefs.h
-
+      :
       ;;
     no)
-      :
+      as_fn_error $? "--disable-integer-datetimes is no longer supported" "$LINENO" 5
       ;;
     *)
       as_fn_error $? "no argument expected for --enable-integer-datetimes option" "$LINENO" 5
@@ -3010,13 +3008,9 @@ $as_echo "#define USE_INTEGER_DATETIMES 1" >>confdefs.h
 else
   enable_integer_datetimes=yes
 
-$as_echo "#define USE_INTEGER_DATETIMES 1" >>confdefs.h
-
 fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_integer_datetimes" >&5
-$as_echo "$enable_integer_datetimes" >&6; }
 
 
 #
index 01b618c931ddd44e7d40460d86377ef0e27fb394..dab8ab3b328ba9fe749a241cb70421dd7b68fc64 100644 (file)
@@ -122,13 +122,13 @@ PGAC_ARG_REQ(with, libs,      [DIRS], [alternative spelling of --with-libraries]
 
 
 #
-# 64-bit integer date/time storage: enabled by default.
+# 64-bit integer date/time storage is now the only option, but to avoid
+# unnecessary breakage of build scripts, continue to accept an explicit
+# "--enable-integer-datetimes" switch.
 #
-AC_MSG_CHECKING([whether to build with 64-bit integer date/time support])
-PGAC_ARG_BOOL(enable, integer-datetimes, yes, [disable 64-bit integer date/time support],
-              [AC_DEFINE([USE_INTEGER_DATETIMES], 1,
-                         [Define to 1 if you want 64-bit integer timestamp and interval support. (--enable-integer-datetimes)])])
-AC_MSG_RESULT([$enable_integer_datetimes])
+PGAC_ARG_BOOL(enable, integer-datetimes, yes, [obsolete option, no longer supported],
+              [],
+              [AC_MSG_ERROR([--disable-integer-datetimes is no longer supported])])
 
 
 #
index 95afc2c483d5e16caaf7665267815f3976aa9e8b..1b390a257ae793410f79920f07ad986b3625f17f 100644 (file)
@@ -7695,11 +7695,9 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'
       </term>
       <listitem>
        <para>
-        Reports whether <productname>PostgreSQL</> was built with
-        support for 64-bit-integer dates and times.  This can be
-        disabled by configuring with <literal>--disable-integer-datetimes</>
-        when building <productname>PostgreSQL</>.  The default value is
-        <literal>on</literal>.
+        Reports whether <productname>PostgreSQL</> was built with support for
+        64-bit-integer dates and times.  As of <productname>PostgreSQL</> 10,
+        this is always <literal>on</literal>.
        </para>
       </listitem>
      </varlistentry>
index 387ba53ef091cd8c0e32b14c8350fba3045f92c0..35610307d9a4b0c4ba98971555620b9f67e57a7e 100644 (file)
@@ -1580,7 +1580,7 @@ SELECT E'\\xDEADBEEF';
         <entry>both date and time (no time zone)</entry>
         <entry>4713 BC</entry>
         <entry>294276 AD</entry>
-        <entry>1 microsecond / 14 digits</entry>
+        <entry>1 microsecond</entry>
        </row>
        <row>
         <entry><type>timestamp [ (<replaceable>p</replaceable>) ] with time zone</type></entry>
@@ -1588,7 +1588,7 @@ SELECT E'\\xDEADBEEF';
         <entry>both date and time, with time zone</entry>
         <entry>4713 BC</entry>
         <entry>294276 AD</entry>
-        <entry>1 microsecond / 14 digits</entry>
+        <entry>1 microsecond</entry>
        </row>
        <row>
         <entry><type>date</type></entry>
@@ -1604,15 +1604,15 @@ SELECT E'\\xDEADBEEF';
         <entry>time of day (no date)</entry>
         <entry>00:00:00</entry>
         <entry>24:00:00</entry>
-        <entry>1 microsecond / 14 digits</entry>
+        <entry>1 microsecond</entry>
        </row>
        <row>
         <entry><type>time [ (<replaceable>p</replaceable>) ] with time zone</type></entry>
         <entry>12 bytes</entry>
-        <entry>times of day only, with time zone</entry>
+        <entry>time of day (no date), with time zone</entry>
         <entry>00:00:00+1459</entry>
         <entry>24:00:00-1459</entry>
-        <entry>1 microsecond / 14 digits</entry>
+        <entry>1 microsecond</entry>
        </row>
        <row>
         <entry><type>interval [ <replaceable>fields</replaceable> ] [ (<replaceable>p</replaceable>) ]</type></entry>
@@ -1620,7 +1620,7 @@ SELECT E'\\xDEADBEEF';
         <entry>time interval</entry>
         <entry>-178000000 years</entry>
         <entry>178000000 years</entry>
-        <entry>1 microsecond / 14 digits</entry>
+        <entry>1 microsecond</entry>
        </row>
       </tbody>
      </tgroup>
@@ -1643,41 +1643,7 @@ SELECT E'\\xDEADBEEF';
     <replaceable>p</replaceable> which specifies the number of
     fractional digits retained in the seconds field. By default, there
     is no explicit bound on precision.  The allowed range of
-    <replaceable>p</replaceable> is from 0 to 6 for the
-    <type>timestamp</type> and <type>interval</type> types.
-   </para>
-
-   <note>
-   <para>
-    When <type>timestamp</> values are stored as eight-byte integers
-    (currently the default), microsecond precision is available over
-    the full range of values.  In this case, the internal representation
-    is the number of microseconds before or after midnight 2000-01-01.
-    When <type>timestamp</> values are stored as double precision
-    floating-point numbers (a deprecated compile-time option), the
-    internal representation is the number of seconds before or after
-    midnight 2000-01-01.  With this representation, the effective limit
-    of precision might be less than 6; in practice,
-    microsecond precision is achieved for dates within a few
-    years of 2000-01-01, but the precision degrades for dates further
-    away. Note that using floating-point datetimes allows a larger
-    range of <type>timestamp</type> values to be represented than
-    shown above: from 4713 BC up to 5874897 AD.
-   </para>
-
-   <para>
-    The same compile-time option also determines whether
-    <type>time</type> and <type>interval</type> values are stored as
-    floating-point numbers or eight-byte integers.  In the
-    floating-point case, large <type>interval</type> values degrade in
-    precision as the size of the interval increases.
-   </para>
-   </note>
-
-   <para>
-    For the <type>time</type> types, the allowed range of
-    <replaceable>p</replaceable> is from 0 to 6 when eight-byte integer
-    storage is used, or from 0 to 10 when floating-point storage is used.
+    <replaceable>p</replaceable> is from 0 to 6.
    </para>
 
    <para>
@@ -1760,9 +1726,10 @@ MINUTE TO SECOND
      specification giving the number of
      fractional digits in the seconds field. Precision can be
      specified for <type>time</type>, <type>timestamp</type>, and
-     <type>interval</type> types.  The allowed values are mentioned
-     above.  If no precision is specified in a constant specification,
-     it defaults to the precision of the literal value.
+     <type>interval</type> types, and can range from 0 to 6.
+     If no precision is specified in a constant specification,
+     it defaults to the precision of the literal value (but not
+     more than 6 digits).
     </para>
 
     <sect3>
index be0931326bc773da681655f9c2ae87fb601e19aa..568995c9f2f160ec623bc85dfe64d6e9c60f19f0 100644 (file)
@@ -955,28 +955,6 @@ su - postgres
        </listitem>
       </varlistentry>
 
-      <varlistentry>
-       <term><option>--disable-integer-datetimes</option></term>
-       <listitem>
-        <para>
-         Disable support for 64-bit integer storage for timestamps and
-         intervals, and store datetime values as floating-point
-         numbers instead. Floating-point datetime storage was the
-         default in <productname>PostgreSQL</productname> releases
-         prior to 8.4, but it is now deprecated, because it does not
-         support microsecond precision for the full range of
-         <type>timestamp</type> values. However, integer-based
-         datetime storage requires a 64-bit integer type. Therefore,
-         this option can be used when no such type is available, or
-         for compatibility with applications written for prior
-         versions of <productname>PostgreSQL</productname>. See
-         <![%standalone-include[the documentation about datetime datatypes]]>
-         <![%standalone-ignore[<xref linkend="datatype-datetime">]]>
-         for more information.
-        </para>
-       </listitem>
-      </varlistentry>
-
       <varlistentry>
        <term><option>--disable-float4-byval</option></term>
        <listitem>
index 91e5baa969229116b706c33530986b63943cf9a4..947bd980672230fb48600edc98932d8720a249b3 100644 (file)
@@ -340,10 +340,11 @@ typedef unsigned PG_INT128_TYPE uint128;
 #define PG_INT64_MAX   INT64CONST(0x7FFFFFFFFFFFFFFF)
 #define PG_UINT64_MAX  UINT64CONST(0xFFFFFFFFFFFFFFFF)
 
-/* Select timestamp representation (float8 or int64) */
-#ifdef USE_INTEGER_DATETIMES
+/*
+ * We now always use int64 timestamps, but keep this symbol defined for the
+ * benefit of external code that might test it.
+ */
 #define HAVE_INT64_TIMESTAMP
-#endif
 
 /*
  * Size
index b9dfdd41c1a3f3e74f0e919f4bfd4d829817d287..8dd73f1d91576ff90aea3db49b689b52a3ab794c 100644 (file)
    (--enable-float8-byval) */
 #undef USE_FLOAT8_BYVAL
 
-/* Define to 1 if you want 64-bit integer timestamp and interval support.
-   (--enable-integer-datetimes) */
-#undef USE_INTEGER_DATETIMES
-
 /* Define to 1 to build with LDAP support. (--with-ldap) */
 #undef USE_LDAP
 
index 199668c18764025dd78d222469327f0269839531..fd1af59839d43939911d3c1423f40cb94347f080 100644 (file)
 /* Define to use /dev/urandom for random number generation */
 /* #undef USE_DEV_URANDOM */
 
-/* Define to 1 if you want 64-bit integer timestamp and interval support.
-   (--enable-integer-datetimes) */
-/* #undef USE_INTEGER_DATETIMES */
-
 /* Define to 1 to build with LDAP support. (--with-ldap) */
 /* #undef USE_LDAP */
 
index bf99a5e7930cefa10bb0d2536ca246f5fbf24e74..736fb08dba3c162a70e8473fb1df9892be40af5e 100644 (file)
 /* Define to 1 if `long long int' works and is 64 bits. */
 #undef HAVE_LONG_LONG_INT_64
 
-/* Define to 1 if you want 64-bit integer timestamp and interval support.
-   (--enable-integer-datetimes) */
-#undef USE_INTEGER_DATETIMES
-
 /* Define to 1 to build client libraries as thread-safe code.
  *    (--enable-thread-safety) */
 #undef ENABLE_THREAD_SAFETY
index deac6a2e01a1415a42f85c2c265f3c08608f9734..5118ec784d101643cc0c17364dc9fafc2dd18597 100644 (file)
@@ -20,9 +20,7 @@ typedef long long int int64;
 #error must have a working 64-bit integer datatype
 #endif
 
-#ifdef USE_INTEGER_DATETIMES
 #define HAVE_INT64_TIMESTAMP
-#endif
 #endif   /* C_H */
 
 typedef struct
index 4277c2615dac7015e91f2b9cf22acc6f263e954a..b6e77562b2434f9226b744c27dbdd646c7d61ecf 100644 (file)
@@ -145,10 +145,8 @@ main(void)
                                sprintf(t, "%s %s", dates[i], times[j]);
                                ts1 = PGTYPEStimestamp_from_asc(t, NULL);
                                text = PGTYPEStimestamp_to_asc(ts1);
-                               /* skip outputs sensitive to USE_INTEGER_DATETIMES */
-                               if (i != 19 || (j != 3 && j != 4))
-                                       printf("TS[%d,%d]: %s\n",
-                                               i, j, errno ? "-" : text);
+                               printf("TS[%d,%d]: %s\n",
+                                      i, j, errno ? "-" : text);
                                free(text);
                                free(t);
                        }
index 941bffbd8158867d40f4ecece7aa6bc7053517b8..0fbcce67b6895941c92da81ff37d58b74195d95f 100644 (file)
@@ -103,6 +103,8 @@ Date[19]: 0099-01-08 BC (N - F)
 TS[19,0]: 0099-01-08 00:04:00 BC
 TS[19,1]: 0099-01-08 01:59:00 BC
 TS[19,2]: 0099-01-08 13:24:40 BC
+TS[19,3]: 0099-01-08 13:24:40.495 BC
+TS[19,4]: 0099-01-08 13:24:40.123456 BC
 Date[20]: - (N - T)
 Date[21]: - (N - T)
 interval[0]: @ 1 min
index 0bd1fec109db9ef6b5323b6ae8ea509d862764df..d519305e1881224db039dc0c6e4098bdc6dd82ce 100644 (file)
@@ -110,10 +110,8 @@ main(void)
                                sprintf(t, "%s %s", dates[i], times[j]);
                                ts1 = PGTYPEStimestamp_from_asc(t, NULL);
                                text = PGTYPEStimestamp_to_asc(ts1);
-                               /* skip outputs sensitive to USE_INTEGER_DATETIMES */
-                               if (i != 19 || (j != 3 && j != 4))
-                                       printf("TS[%d,%d]: %s\n",
-                                               i, j, errno ? "-" : text);
+                               printf("TS[%d,%d]: %s\n",
+                                      i, j, errno ? "-" : text);
                                free(text);
                                free(t);
                        }
index fbf4da3d68fa085595a8e4fca4ada4e60e30e3a2..ff9064f923d040853449bbca5b3698647918381c 100644 (file)
@@ -28,9 +28,6 @@ sub _new
        $self->DeterminePlatform();
        my $bits = $self->{platform} eq 'Win32' ? 32 : 64;
 
-       # integer_datetimes is now the default
-       $options->{integer_datetimes} = 1
-         unless exists $options->{integer_datetimes};
        $options->{float4byval} = 1
          unless exists $options->{float4byval};
        $options->{float8byval} = ($bits == 64)
@@ -169,8 +166,6 @@ s{PG_VERSION_STR "[^"]+"}{__STRINGIFY(x) #x\n#define __STRINGIFY2(z) __STRINGIFY
                print O "#ifndef IGNORE_CONFIGURED_SETTINGS\n";
                print O "#define USE_ASSERT_CHECKING 1\n"
                  if ($self->{options}->{asserts});
-               print O "#define USE_INTEGER_DATETIMES 1\n"
-                 if ($self->{options}->{integer_datetimes});
                print O "#define USE_LDAP 1\n"    if ($self->{options}->{ldap});
                print O "#define HAVE_LIBZ 1\n"   if ($self->{options}->{zlib});
                print O "#define USE_OPENSSL 1\n" if ($self->{options}->{openssl});
@@ -427,8 +422,6 @@ s{PG_VERSION_STR "[^"]+"}{__STRINGIFY(x) #x\n#define __STRINGIFY2(z) __STRINGIFY
 #define HAVE_LONG_LONG_INT_64
 #define ENABLE_THREAD_SAFETY 1
 EOF
-               print O "#define USE_INTEGER_DATETIMES 1\n"
-                 if ($self->{options}->{integer_datetimes});
                print O "#endif\n";
                close(O);
        }
@@ -661,8 +654,6 @@ sub GetFakeConfigure
 
        my $cfg = '--enable-thread-safety';
        $cfg .= ' --enable-cassert' if ($self->{options}->{asserts});
-       $cfg .= ' --enable-integer-datetimes'
-         if ($self->{options}->{integer_datetimes});
        $cfg .= ' --enable-nls'       if ($self->{options}->{nls});
        $cfg .= ' --enable-tap-tests' if ($self->{options}->{tap_tests});
        $cfg .= ' --with-ldap'        if ($self->{options}->{ldap});
index f046687bd0695207cb92f8ddbe06ccaa34bc7674..97f1af8b49ef3b03df1933023f0eaef59756fd67 100644 (file)
@@ -4,7 +4,6 @@ use warnings;
 
 our $config = {
        asserts => 0,    # --enable-cassert
-         # integer_datetimes=>1,   # --enable-integer-datetimes - on is now default
          # float4byval=>1,         # --disable-float4-byval, on by default
 
        # float8byval=> $platformbits == 64, # --disable-float8-byval,