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.
