From 539bc9fc91cc283d4d7dc6fee7ce10b0874b4ea4 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 1 Jul 2005 21:03:25 +0000 Subject: [PATCH] Add code to pg_dump to use E'' strings when backslashes are used in dump files. --- src/bin/pg_dump/dumputils.c | 29 +++++++++++++++++++++++++---- src/bin/pg_dump/pg_backup_db.c | 3 +-- src/bin/pg_dump/pg_dump.c | 20 +++++++++++++++----- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c index f3cece132d..b1622d55ae 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/bin/pg_dump/dumputils.c,v 1.17 2005/04/30 08:08:51 neilc Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/dumputils.c,v 1.18 2005/07/01 21:03:25 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -111,6 +111,27 @@ fmtId(const char *rawid) 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,9 +143,9 @@ appendStringLiteral(PQExpBuffer buf, const char *str, bool escapeAll) appendPQExpBufferChar(buf, ch); } else if ((unsigned char) ch < (unsigned char) ' ' && - (escapeAll - || (ch != '\t' && ch != '\n' && ch != '\v' && ch != '\f' && ch != '\r') - )) + (escapeAll || + (ch != '\t' && ch != '\n' && ch != '\v' && + ch != '\f' && ch != '\r'))) { /* * generate octal escape for control chars other than diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c index af50cb9e9d..047a1aa918 100644 --- a/src/bin/pg_dump/pg_backup_db.c +++ b/src/bin/pg_dump/pg_backup_db.c @@ -5,7 +5,7 @@ * Implements the basic DB functions used by the archiver. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.62 2005/06/21 20:45:44 tgl Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.63 2005/07/01 21:03:25 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -597,7 +597,6 @@ _sendSQLLine(ArchiveHandle *AH, char *qry, char *eos) } else { - if (qry[pos] == '\\') { if (AH->sqlparse.lastChar == '\\') diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index d40b01a266..7708083f35 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -12,7 +12,7 @@ * by PostgreSQL * * IDENTIFICATION - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.411 2005/06/30 03:02:56 tgl Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.412 2005/07/01 21:03:25 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -7767,8 +7767,9 @@ dumpTrigger(Archive *fout, TriggerInfo *tginfo) p = tginfo->tgargs; for (findx = 0; findx < tginfo->tgnargs; findx++) { - const char *s = p; + const char *s = p, *s2 = p; + /* Set 'p' to end of arg string. marked by '\000' */ for (;;) { p = strchr(p, '\\'); @@ -7781,20 +7782,29 @@ dumpTrigger(Archive *fout, TriggerInfo *tginfo) exit_nicely(); } p++; - if (*p == '\\') + if (*p == '\\') /* is it '\\'? */ { p++; continue; } - if (p[0] == '0' && p[1] == '0' && p[2] == '0') + 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, '\''); appendPQExpBufferChar(query, *s++); } appendPQExpBufferChar(query, '\''); -- 2.40.0