Index: src/bin/pg_dump/dumputils.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/pg_dump/dumputils.c,v retrieving revision 1.17 diff -c -c -r1.17 dumputils.c *** src/bin/pg_dump/dumputils.c 30 Apr 2005 08:08:51 -0000 1.17 --- src/bin/pg_dump/dumputils.c 1 Jul 2005 20:57:27 -0000 *************** *** 111,116 **** --- 111,137 ---- void appendStringLiteral(PQExpBuffer buf, const char *str, bool escapeAll) { + bool has_escapes = false; + const char *str2 = str; + + while (*str2) + { + char ch = *str2++; + + if (ch == '\\' || + ((unsigned char) ch < (unsigned char) ' ' && + (escapeAll || + (ch != '\t' && ch != '\n' && ch != '\v' && + ch != '\f' && ch != '\r')))) + { + has_escapes = true; + break; + } + } + + if (has_escapes) + appendPQExpBufferChar(buf, 'E'); + appendPQExpBufferChar(buf, '\''); while (*str) { *************** *** 122,130 **** appendPQExpBufferChar(buf, ch); } else if ((unsigned char) ch < (unsigned char) ' ' && ! (escapeAll ! || (ch != '\t' && ch != '\n' && ch != '\v' && ch != '\f' && ch != '\r') ! )) { /* * generate octal escape for control chars other than --- 143,151 ---- appendPQExpBufferChar(buf, ch); } else if ((unsigned char) ch < (unsigned char) ' ' && ! (escapeAll || ! (ch != '\t' && ch != '\n' && ch != '\v' && ! ch != '\f' && ch != '\r'))) { /* * generate octal escape for control chars other than Index: src/bin/pg_dump/pg_backup_db.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v retrieving revision 1.62 diff -c -c -r1.62 pg_backup_db.c *** src/bin/pg_dump/pg_backup_db.c 21 Jun 2005 20:45:44 -0000 1.62 --- src/bin/pg_dump/pg_backup_db.c 1 Jul 2005 20:57:28 -0000 *************** *** 597,603 **** } else { - if (qry[pos] == '\\') { if (AH->sqlparse.lastChar == '\\') --- 597,602 ---- Index: src/bin/pg_dump/pg_dump.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v retrieving revision 1.411 diff -c -c -r1.411 pg_dump.c *** src/bin/pg_dump/pg_dump.c 30 Jun 2005 03:02:56 -0000 1.411 --- src/bin/pg_dump/pg_dump.c 1 Jul 2005 20:57:35 -0000 *************** *** 7767,7774 **** p = tginfo->tgargs; for (findx = 0; findx < tginfo->tgnargs; findx++) { ! const char *s = p; for (;;) { p = strchr(p, '\\'); --- 7767,7775 ---- p = tginfo->tgargs; for (findx = 0; findx < tginfo->tgnargs; findx++) { ! const char *s = p, *s2 = p; + /* Set 'p' to end of arg string. marked by '\000' */ for (;;) { p = strchr(p, '\\'); *************** *** 7781,7800 **** exit_nicely(); } p++; ! if (*p == '\\') { p++; continue; } ! if (p[0] == '0' && p[1] == '0' && p[2] == '0') break; } p--; appendPQExpBufferChar(query, '\''); while (s < p) { if (*s == '\'') ! appendPQExpBufferChar(query, '\\'); appendPQExpBufferChar(query, *s++); } appendPQExpBufferChar(query, '\''); --- 7782,7810 ---- exit_nicely(); } p++; ! if (*p == '\\') /* is it '\\'? */ { p++; continue; } ! if (p[0] == '0' && p[1] == '0' && p[2] == '0') /* is it '\000'? */ break; } p--; + + /* do we need E''? */ + while (s2 < p) + if (*s2++ == '\\') + { + appendPQExpBufferChar(query, 'E'); + break; + } + appendPQExpBufferChar(query, '\''); while (s < p) { if (*s == '\'') ! appendPQExpBufferChar(query, '\''); appendPQExpBufferChar(query, *s++); } appendPQExpBufferChar(query, '\'');