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, '\'');
