PGresult   *res;
    int         i;
    int64       k;
+   int         chars = 0;
+   int         prev_chars = 0;
    char       *copy_statement;
 
    /* used to track elapsed time and estimate of the remaining time */
            double      elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start);
            double      remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j;
 
-           fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c",
-                   j, (int64) naccounts * scale,
-                   (int) (((int64) j * 100) / (naccounts * (int64) scale)),
-                   elapsed_sec, remaining_sec, eol);
+           chars = fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)",
+                           j, (int64) naccounts * scale,
+                           (int) (((int64) j * 100) / (naccounts * (int64) scale)),
+                           elapsed_sec, remaining_sec);
        }
        /* let's not call the timing for each row, but only each 100 rows */
        else if (use_quiet && (j % 100 == 0))
            /* have we reached the next interval (or end)? */
            if ((j == scale * naccounts) || (elapsed_sec >= log_interval * LOG_STEP_SECONDS))
            {
-               fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c",
-                       j, (int64) naccounts * scale,
-                       (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec, eol);
+               chars = fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)",
+                               j, (int64) naccounts * scale,
+                               (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec);
 
                /* skip to the next interval */
                log_interval = (int) ceil(elapsed_sec / LOG_STEP_SECONDS);
            }
        }
+
+       /*
+        * If the previous progress message is longer than the current one,
+        * add spaces to the current line to fully overwrite any remaining
+        * characters from the previous message.
+        */
+       if (prev_chars > chars)
+           fprintf(stderr, "%*c", prev_chars - chars, ' ');
+       fputc(eol, stderr);
+       prev_chars = chars;
    }
 
    if (eol != '\n')