*** a/src/backend/utils/adt/formatting.c --- b/src/backend/utils/adt/formatting.c *************** *** 59,64 **** --- 59,65 ---- * ----------------------------------------------------------------------- */ + /* XXX: DEBUG_TO_FROM_CHAR may access uninitialized memory */ #ifdef DEBUG_TO_FROM_CHAR #define DEBUG_elog_output DEBUG3 #endif *************** float8_to_char(PG_FUNCTION_ARGS) *** 5427,5440 **** Num.pre += Num.multi; } orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1); ! len = snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.0f", fabs(val)); ! if (Num.pre > len) ! plen = Num.pre - len; ! if (len >= DBL_DIG) ! Num.post = 0; ! else if (Num.post + len > DBL_DIG) ! Num.post = DBL_DIG - len; ! snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.*f", Num.post, val); if (*orgnum == '-') { /* < 0 */ --- 5428,5439 ---- Num.pre += Num.multi; } orgnum = (char *) palloc(MAXDOUBLEWIDTH + 1); ! ! len = snprintf(orgnum, MAXDOUBLEWIDTH + 1, "%.*f", Num.post, val); ! ! /* Defensive */ ! if (len >= MAXDOUBLEWIDTH + 1) ! elog(ERROR, "double precision for character conversion is too wide"); if (*orgnum == '-') { /* < 0 */ *** a/src/test/regress/expected/window.out --- b/src/test/regress/expected/window.out *************** SELECT to_char(SUM(n::float8) OVER (ORDE *** 1765,1771 **** FROM (VALUES(1,1e20),(2,1)) n(i,n); to_char -------------------------- ! 100000000000000000000 1.0 (2 rows) --- 1765,1771 ---- FROM (VALUES(1,1e20),(2,1)) n(i,n); to_char -------------------------- ! 100000000000000000000.0 1.0 (2 rows)