]> granicus.if.org Git - postgresql/commitdiff
Increase the maximum value of extra_float_digits to 3, and have pg_dump
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 11 Sep 2009 19:17:04 +0000 (19:17 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 11 Sep 2009 19:17:04 +0000 (19:17 +0000)
use that value when the backend is new enough to allow it.  This responds
to bug report from Keh-Cheng Chu pointing out that although 2 extra digits
should be sufficient to dump and restore float8 exactly, it is possible to
need 3 extra digits for float4 values.

doc/src/sgml/config.sgml
src/backend/utils/adt/float.c
src/backend/utils/adt/geo_ops.c
src/backend/utils/misc/guc.c
src/backend/utils/misc/postgresql.conf.sample
src/bin/pg_dump/pg_dump.c

index c9603419ae4c8de0375a5515a4a579cdee6fe0e5..f995b655b6bd9fff2322fad0fc96e1914c6347a8 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.226 2009/09/10 15:02:46 alvherre Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.227 2009/09/11 19:17:03 tgl Exp $ -->
 
 <chapter Id="runtime-config">
   <title>Server Configuration</title>
@@ -4291,7 +4291,7 @@ SET XML OPTION { DOCUMENT | CONTENT };
         floating-point values, including <type>float4</>, <type>float8</>,
         and geometric data types.  The parameter value is added to the
         standard number of digits (<literal>FLT_DIG</> or <literal>DBL_DIG</>
-        as appropriate).  The value can be set as high as 2, to include
+        as appropriate).  The value can be set as high as 3, to include
         partially-significant digits; this is especially useful for dumping
         float data that needs to be restored exactly.  Or it can be set
         negative to suppress unwanted digits.
index 4547240be1f74f86292492c547e6a0598c0e373e..d30fcc016326f3c3671d4b2d04813be962d168ca 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.162 2009/06/11 14:49:03 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.163 2009/09/11 19:17:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -334,7 +334,7 @@ float4out(PG_FUNCTION_ARGS)
                                if (ndig < 1)
                                        ndig = 1;
 
-                               sprintf(ascii, "%.*g", ndig, num);
+                               snprintf(ascii, MAXFLOATWIDTH + 1, "%.*g", ndig, num);
                        }
        }
 
@@ -523,7 +523,7 @@ float8out(PG_FUNCTION_ARGS)
                                if (ndig < 1)
                                        ndig = 1;
 
-                               sprintf(ascii, "%.*g", ndig, num);
+                               snprintf(ascii, MAXDOUBLEWIDTH + 1, "%.*g", ndig, num);
                        }
        }
 
index dcc9656dfb4c811ee33b3b23ebd0083ccc2cb344..59582f14104405ffb1d865ac8cb890f577fc2ed6 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/geo_ops.c,v 1.104 2009/08/27 15:59:22 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/geo_ops.c,v 1.105 2009/09/11 19:17:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -85,8 +85,8 @@ static Point* lseg_interpt_internal(LSEG *l1, LSEG *l2);
 #define RDELIM_C               '>'
 
 /* Maximum number of characters printed by pair_encode() */
-/* ...+2+7 : 2 accounts for extra_float_digits max value */
-#define P_MAXLEN (2*(DBL_DIG+2+7)+1)
+/* ...+3+7 : 3 accounts for extra_float_digits max value */
+#define P_MAXLEN (2*(DBL_DIG+3+7)+1)
 
 
 /*
index 608378cb4b72b1dde84a9ee656d0732c244534a3..cfa71e0cc11ab8701c3e81b0779ef5616489434c 100644 (file)
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.516 2009/09/08 17:08:36 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.517 2009/09/11 19:17:03 tgl Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -1684,7 +1684,7 @@ static struct config_int ConfigureNamesInt[] =
                                                 "(FLT_DIG or DBL_DIG as appropriate).")
                },
                &extra_float_digits,
-               0, -15, 2, NULL, NULL
+               0, -15, 3, NULL, NULL
        },
 
        {
index 4a361391f2c7b6c33e07cb2a864326d9a933ae16..b10775cc2df8de67966a7cfb29e83368e9639a90 100644 (file)
                                        #   India
                                        # You can create your own file in
                                        # share/timezonesets/.
-#extra_float_digits = 0                        # min -15, max 2
+#extra_float_digits = 0                        # min -15, max 3
 #client_encoding = sql_ascii           # actually, defaults to database
                                        # encoding
 
index c5f97ca053c06edd0028c98bfdcfe1fccb530c2b..5856dc7049a0fd3a9cb5ab5322d04002f13841d5 100644 (file)
@@ -12,7 +12,7 @@
  *     by PostgreSQL
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.546 2009/08/04 19:46:51 tgl Exp $
+ *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.547 2009/09/11 19:17:04 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -595,7 +595,9 @@ main(int argc, char **argv)
         * If supported, set extra_float_digits so that we can dump float data
         * exactly (given correctly implemented float I/O code, anyway)
         */
-       if (g_fout->remoteVersion >= 70400)
+       if (g_fout->remoteVersion >= 80500)
+               do_sql_command(g_conn, "SET extra_float_digits TO 3");
+       else if (g_fout->remoteVersion >= 70400)
                do_sql_command(g_conn, "SET extra_float_digits TO 2");
 
        /*