This is an automated email from the ASF dual-hosted git repository.

ztao1987 pushed a commit to branch ztao
in repository https://gitbox.apache.org/repos/asf/hawq.git

commit f2c1dafe1755e50308a6d96375f603d4c6a769de
Author: ztao1987 <[email protected]>
AuthorDate: Sat Dec 4 17:05:22 2021 +0800

    HAWQ-1816. fix float precision issue in text/csv
---
 contrib/extfmtcsv/extfmtcsv.c                 | 5 +++++
 src/backend/utils/adt/geo_ops.c               | 4 ++--
 src/backend/utils/misc/guc.c                  | 2 +-
 src/backend/utils/misc/postgresql.conf.sample | 2 +-
 src/bin/pg_dump/cdb/cdb_dump_agent.c          | 2 +-
 src/bin/pg_dump/pg_dump.c                     | 2 +-
 6 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/contrib/extfmtcsv/extfmtcsv.c b/contrib/extfmtcsv/extfmtcsv.c
index 4ad3189..bfd4541 100644
--- a/contrib/extfmtcsv/extfmtcsv.c
+++ b/contrib/extfmtcsv/extfmtcsv.c
@@ -24,6 +24,7 @@
 #include "funcapi.h"
 #include "c.h"
 #include "access/filesplit.h"
+#include "utils/builtins.h"
 #include "utils/uri.h"
 #include "cdb/cdbvars.h"
 #include "cdb/cdbfilesystemcredential.h"
@@ -387,9 +388,13 @@ Datum extfmtcommon_out(PG_FUNCTION_ARGS)
                {
                        continue;
                }
+               /* workaround for preserving float precision */
+               int bak_extra_float_digits = extra_float_digits;
+               extra_float_digits = 3;
                userData->colRawValues[i] = OutputFunctionCall(
                                &(FORMATTER_GET_CONVERSION_FUNCS(fcinfo)[i]),
                                userData->colValues[i]);
+               extra_float_digits = bak_extra_float_digits;
                if (((FormatterData *) 
(fcinfo->context))->fmt_needs_transcoding)
                {
                        char *cvt = NULL;
diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c
index a939e99..13af06a 100644
--- a/src/backend/utils/adt/geo_ops.c
+++ b/src/backend/utils/adt/geo_ops.c
@@ -83,8 +83,8 @@ static Point *line_interpt_internal(LINE *l1, LINE *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)
 
 
 /*
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 6dbb897..d1bb6c1 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -5429,7 +5429,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
        },
 
        {
diff --git a/src/backend/utils/misc/postgresql.conf.sample 
b/src/backend/utils/misc/postgresql.conf.sample
index 880ae06..84b0b98 100755
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -395,7 +395,7 @@ log_autostats=off   # print additional autostats information
                                        #   Asia
                                        # 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
 
diff --git a/src/bin/pg_dump/cdb/cdb_dump_agent.c 
b/src/bin/pg_dump/cdb/cdb_dump_agent.c
index e6ccd5d..ba64731 100644
--- a/src/bin/pg_dump/cdb/cdb_dump_agent.c
+++ b/src/bin/pg_dump/cdb/cdb_dump_agent.c
@@ -1004,7 +1004,7 @@ dumpMain(bool oids, const char *dumpencoding, int 
outputBlobs, int plainText, Re
         * If supported, set extra_float_digits so that we can dump float data
         * exactly (given correctly implemented float I/O code, anyway)
         */
-       do_sql_command(g_conn, "SET extra_float_digits TO 2");
+       do_sql_command(g_conn, "SET extra_float_digits TO 3");
 
        /*
         * Let cdb_dump_include functions know whether or not to include
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 50991b8..d885d72 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -769,7 +769,7 @@ 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)
         */
-       do_sql_command(g_conn, "SET extra_float_digits TO 2");
+       do_sql_command(g_conn, "SET extra_float_digits TO 3");
 
        /*
         * Remember whether or not this GP database supports partitioning.

Reply via email to