Index: src/backend/utils/adt/quote.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/adt/quote.c,v retrieving revision 1.15 retrieving revision 1.16 diff -c -r1.15 -r1.16 *** src/backend/utils/adt/quote.c 21 Mar 2005 16:29:20 -0000 1.15 --- src/backend/utils/adt/quote.c 2 Jul 2005 17:01:50 -0000 1.16 *************** *** 7,13 **** * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/utils/adt/quote.c,v 1.15 2005/03/21 16:29:20 tgl Exp $ * *------------------------------------------------------------------------- */ --- 7,13 ---- * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/utils/adt/quote.c,v 1.16 2005/07/02 17:01:50 momjian Exp $ * *------------------------------------------------------------------------- */ *************** *** 60,78 **** len = VARSIZE(t) - VARHDRSZ; /* We make a worst-case result area; wasting a little space is OK */ ! result = (text *) palloc(len * 2 + 2 + VARHDRSZ); cp1 = VARDATA(t); cp2 = VARDATA(result); *cp2++ = '\''; while (len-- > 0) { ! if (*cp1 == '\'') ! *cp2++ = '\''; ! else if (*cp1 == '\\') ! *cp2++ = '\\'; ! *cp2++ = *cp1++; } *cp2++ = '\''; --- 60,84 ---- len = VARSIZE(t) - VARHDRSZ; /* We make a worst-case result area; wasting a little space is OK */ ! result = (text *) palloc(len * 2 + 3 + VARHDRSZ); cp1 = VARDATA(t); cp2 = VARDATA(result); + for(; len-- > 0; cp1++) + if (*cp1 == '\\') + { + *cp2++ = ESCAPE_STRING_SYNTAX; + break; + } + + len = VARSIZE(t) - VARHDRSZ; + cp1 = VARDATA(t); *cp2++ = '\''; while (len-- > 0) { ! if (SQL_STR_DOUBLE(*cp1)) ! *cp2++ = *cp1; *cp2++ = *cp1++; } *cp2++ = '\''; Index: src/backend/utils/adt/ruleutils.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v retrieving revision 1.202 retrieving revision 1.203 diff -c -r1.202 -r1.203 *** src/backend/utils/adt/ruleutils.c 28 Jun 2005 05:09:01 -0000 1.202 --- src/backend/utils/adt/ruleutils.c 2 Jul 2005 17:01:50 -0000 1.203 *************** *** 3,9 **** * back to source text * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.202 2005/06/28 05:09:01 tgl Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * --- 3,9 ---- * back to source text * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.203 2005/07/02 17:01:50 momjian Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * *************** *** 564,575 **** { if (i > 0) appendStringInfo(&buf, ", "); appendStringInfoChar(&buf, '\''); while (*p) { ! /* escape quotes and backslashes */ ! if (*p == '\'' || *p == '\\') ! appendStringInfoChar(&buf, '\\'); appendStringInfoChar(&buf, *p++); } p++; --- 564,577 ---- { if (i > 0) appendStringInfo(&buf, ", "); + if (strchr(p, '\\') != NULL) + appendStringInfoChar(&buf, ESCAPE_STRING_SYNTAX); appendStringInfoChar(&buf, '\''); + while (*p) { ! if (SQL_STR_DOUBLE(*p)) ! appendStringInfoChar(&buf, *p); appendStringInfoChar(&buf, *p++); } p++; *************** *** 3869,3890 **** break; default: - /* * We must quote any funny characters in the constant's * representation. XXX Any MULTIBYTE considerations here? */ appendStringInfoChar(buf, '\''); for (valptr = extval; *valptr; valptr++) { char ch = *valptr; ! if (ch == '\'' || ch == '\\') { ! appendStringInfoChar(buf, '\\'); appendStringInfoChar(buf, ch); } ! else if (((unsigned char) ch) < ((unsigned char) ' ')) appendStringInfo(buf, "\\%03o", (int) ch); else appendStringInfoChar(buf, ch); --- 3871,3899 ---- break; default: /* * We must quote any funny characters in the constant's * representation. XXX Any MULTIBYTE considerations here? */ + for (valptr = extval; *valptr; valptr++) + if (*valptr == '\\' || + (unsigned char)*valptr < (unsigned char)' ') + { + appendStringInfoChar(buf, ESCAPE_STRING_SYNTAX); + break; + } + appendStringInfoChar(buf, '\''); for (valptr = extval; *valptr; valptr++) { char ch = *valptr; ! if (SQL_STR_DOUBLE(ch)) { ! appendStringInfoChar(buf, ch); appendStringInfoChar(buf, ch); } ! else if ((unsigned char)ch < (unsigned char)' ') appendStringInfo(buf, "\\%03o", (int) ch); else appendStringInfoChar(buf, ch); Index: src/bin/initdb/initdb.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/initdb/initdb.c,v retrieving revision 1.89 retrieving revision 1.90 diff -c -r1.89 -r1.90 *** src/bin/initdb/initdb.c 1 Jul 2005 17:40:28 -0000 1.89 --- src/bin/initdb/initdb.c 2 Jul 2005 17:01:50 -0000 1.90 *************** *** 42,48 **** * Portions Copyright (c) 1994, Regents of the University of California * Portions taken from FreeBSD. * ! * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.89 2005/07/01 17:40:28 momjian Exp $ * *------------------------------------------------------------------------- */ --- 42,48 ---- * Portions Copyright (c) 1994, Regents of the University of California * Portions taken from FreeBSD. * ! * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.90 2005/07/02 17:01:50 momjian Exp $ * *------------------------------------------------------------------------- */ *************** *** 1986,1993 **** for (i = 0, j = 0; i < len; i++) { ! if (src[i] == '\\' || src[i] == '\'') ! result[j++] = src[i]; /* double these */ result[j++] = src[i]; } result[j] = '\0'; --- 1986,1993 ---- for (i = 0, j = 0; i < len; i++) { ! if (SQL_STR_DOUBLE(src[i])) ! result[j++] = src[i]; result[j++] = src[i]; } result[j] = '\0'; Index: src/bin/pg_dump/dumputils.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/pg_dump/dumputils.c,v retrieving revision 1.18 retrieving revision 1.19 diff -c -r1.18 -r1.19 *** src/bin/pg_dump/dumputils.c 1 Jul 2005 21:03:25 -0000 1.18 --- src/bin/pg_dump/dumputils.c 2 Jul 2005 17:01:51 -0000 1.19 *************** *** 7,13 **** * 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.18 2005/07/01 21:03:25 momjian Exp $ * *------------------------------------------------------------------------- */ --- 7,13 ---- * 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.19 2005/07/02 17:01:51 momjian Exp $ * *------------------------------------------------------------------------- */ *************** *** 111,148 **** 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) { ! char ch = *str++; ! ! if (ch == '\\' || ch == '\'') { ! appendPQExpBufferChar(buf, ch); /* double these */ appendPQExpBufferChar(buf, ch); } ! else if ((unsigned char) ch < (unsigned char) ' ' && (escapeAll || (ch != '\t' && ch != '\n' && ch != '\v' && ch != '\f' && ch != '\r'))) --- 111,143 ---- void appendStringLiteral(PQExpBuffer buf, const char *str, bool escapeAll) { ! char ch; ! const char *p; ! for (p = str; *p; p++) { ! ch = *p; if (ch == '\\' || ! ((unsigned char)ch < (unsigned char)' ' && (escapeAll || (ch != '\t' && ch != '\n' && ch != '\v' && ch != '\f' && ch != '\r')))) { ! appendPQExpBufferChar(buf, ESCAPE_STRING_SYNTAX); break; } } appendPQExpBufferChar(buf, '\''); ! for (p = str; *p; p++) { ! ch = *p; ! if (SQL_STR_DOUBLE(ch)) { ! appendPQExpBufferChar(buf, ch); appendPQExpBufferChar(buf, ch); } ! else if ((unsigned char)ch < (unsigned char)' ' && (escapeAll || (ch != '\t' && ch != '\n' && ch != '\v' && ch != '\f' && ch != '\r'))) Index: src/bin/pg_dump/pg_dump.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v retrieving revision 1.412 retrieving revision 1.413 diff -c -r1.412 -r1.413 *** src/bin/pg_dump/pg_dump.c 1 Jul 2005 21:03:25 -0000 1.412 --- src/bin/pg_dump/pg_dump.c 2 Jul 2005 17:01:51 -0000 1.413 *************** *** 12,18 **** * by PostgreSQL * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.412 2005/07/01 21:03:25 momjian Exp $ * *------------------------------------------------------------------------- */ --- 12,18 ---- * by PostgreSQL * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.413 2005/07/02 17:01:51 momjian Exp $ * *------------------------------------------------------------------------- */ *************** *** 7792,7809 **** } 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++); } --- 7792,7808 ---- } p--; while (s2 < p) if (*s2++ == '\\') { ! appendPQExpBufferChar(query, ESCAPE_STRING_SYNTAX); break; } appendPQExpBufferChar(query, '\''); while (s < p) { ! if (*s == '\'') /* bytea already doubles backslashes */ appendPQExpBufferChar(query, '\''); appendPQExpBufferChar(query, *s++); } Index: src/bin/psql/describe.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/describe.c,v retrieving revision 1.119 retrieving revision 1.120 diff -c -r1.119 -r1.120 *** src/bin/psql/describe.c 1 Jul 2005 17:40:28 -0000 1.119 --- src/bin/psql/describe.c 2 Jul 2005 17:01:52 -0000 1.120 *************** *** 3,9 **** * * Copyright (c) 2000-2005, PostgreSQL Global Development Group * ! * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.119 2005/07/01 17:40:28 momjian Exp $ */ #include "postgres_fe.h" #include "describe.h" --- 3,9 ---- * * Copyright (c) 2000-2005, PostgreSQL Global Development Group * ! * $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.120 2005/07/02 17:01:52 momjian Exp $ */ #include "postgres_fe.h" #include "describe.h" *************** *** 1898,1905 **** appendPQExpBuffer(&namebuf, "\\\\"); /* Ensure chars special to string literals are passed properly */ ! if (*cp == '\'' || *cp == '\\') ! appendPQExpBufferChar(&namebuf, *cp); /* double these */ i = PQmblen(cp, pset.encoding); while (i--) --- 1898,1905 ---- appendPQExpBuffer(&namebuf, "\\\\"); /* Ensure chars special to string literals are passed properly */ ! if (SQL_STR_DOUBLE(*cp)) ! appendPQExpBufferChar(&namebuf, *cp); i = PQmblen(cp, pset.encoding); while (i--) Index: src/bin/psql/large_obj.c =================================================================== RCS file: /cvsroot/pgsql/src/bin/psql/large_obj.c,v retrieving revision 1.38 retrieving revision 1.39 diff -c -r1.38 -r1.39 *** src/bin/psql/large_obj.c 1 Jul 2005 17:40:28 -0000 1.38 --- src/bin/psql/large_obj.c 2 Jul 2005 17:01:52 -0000 1.39 *************** *** 3,9 **** * * Copyright (c) 2000-2005, PostgreSQL Global Development Group * ! * $PostgreSQL: pgsql/src/bin/psql/large_obj.c,v 1.38 2005/07/01 17:40:28 momjian Exp $ */ #include "postgres_fe.h" #include "large_obj.h" --- 3,9 ---- * * Copyright (c) 2000-2005, PostgreSQL Global Development Group * ! * $PostgreSQL: pgsql/src/bin/psql/large_obj.c,v 1.39 2005/07/02 17:01:52 momjian Exp $ */ #include "postgres_fe.h" #include "large_obj.h" *************** *** 172,184 **** if (!cmdbuf) return fail_lo_xact("\\lo_import", own_transaction); sprintf(cmdbuf, ! "COMMENT ON LARGE OBJECT %u IS '", loid); bufptr = cmdbuf + strlen(cmdbuf); for (i = 0; i < slen; i++) { ! if (comment_arg[i] == '\'' || comment_arg[i] == '\\') ! *bufptr++ = comment_arg[i]; /* double these */ *bufptr++ = comment_arg[i]; } strcpy(bufptr, "'"); --- 172,188 ---- if (!cmdbuf) return fail_lo_xact("\\lo_import", own_transaction); sprintf(cmdbuf, ! "COMMENT ON LARGE OBJECT %u IS ", loid); bufptr = cmdbuf + strlen(cmdbuf); + + if (strchr(comment_arg, '\\') != NULL) + *bufptr++ = ESCAPE_STRING_SYNTAX; + *bufptr++ = '\''; for (i = 0; i < slen; i++) { ! if (SQL_STR_DOUBLE(comment_arg[i])) ! *bufptr++ = comment_arg[i]; *bufptr++ = comment_arg[i]; } strcpy(bufptr, "'"); Index: src/include/c.h =================================================================== RCS file: /cvsroot/pgsql/src/include/c.h,v retrieving revision 1.186 retrieving revision 1.187 diff -c -r1.186 -r1.187 *** src/include/c.h 28 Jun 2005 05:09:04 -0000 1.186 --- src/include/c.h 2 Jul 2005 17:01:52 -0000 1.187 *************** *** 12,18 **** * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * ! * $PostgreSQL: pgsql/src/include/c.h,v 1.186 2005/06/28 05:09:04 tgl Exp $ * *------------------------------------------------------------------------- */ --- 12,18 ---- * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * ! * $PostgreSQL: pgsql/src/include/c.h,v 1.187 2005/07/02 17:01:52 momjian Exp $ * *------------------------------------------------------------------------- */ *************** *** 479,484 **** --- 479,486 ---- #define NameStr(name) ((name).data) + #define SQL_STR_DOUBLE(ch) ((ch) == '\'' || (ch) == '\\') + #define ESCAPE_STRING_SYNTAX 'E' /* ---------------------------------------------------------------- * Section 4: IsValid macros for system types Index: src/interfaces/ecpg/ecpglib/execute.c =================================================================== RCS file: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/execute.c,v retrieving revision 1.40 retrieving revision 1.41 diff -c -r1.40 -r1.41 *** src/interfaces/ecpg/ecpglib/execute.c 2 Jun 2005 12:35:11 -0000 1.40 --- src/interfaces/ecpg/ecpglib/execute.c 2 Jul 2005 17:01:53 -0000 1.41 *************** *** 1,4 **** ! /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.40 2005/06/02 12:35:11 meskes Exp $ */ /* * The aim is to get a simpler inteface to the database routines. --- 1,4 ---- ! /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.41 2005/07/02 17:01:53 momjian Exp $ */ /* * The aim is to get a simpler inteface to the database routines. *************** *** 45,65 **** if (!res) return (res); res[ri++] = '\''; for (i = 0; arg[i]; i++, ri++) { ! switch (arg[i]) ! { ! case '\'': ! res[ri++] = '\''; ! break; ! case '\\': ! res[ri++] = '\\'; ! break; ! default: ! ; ! } res[ri] = arg[i]; } --- 45,58 ---- if (!res) return (res); + if (strchr(arg, '\\') != NULL) + res[ri++] = ESCAPE_STRING_SYNTAX; res[ri++] = '\''; for (i = 0; arg[i]; i++, ri++) { ! if (SQL_STR_DOUBLE(arg[i])) ! res[ri++] = arg[i]; res[ri] = arg[i]; } Index: src/interfaces/ecpg/preproc/preproc.y =================================================================== RCS file: /cvsroot/pgsql/src/interfaces/ecpg/preproc/preproc.y,v retrieving revision 1.307 retrieving revision 1.308 diff -c -r1.307 -r1.308 *** src/interfaces/ecpg/preproc/preproc.y 10 Feb 2005 08:06:35 -0000 1.307 --- src/interfaces/ecpg/preproc/preproc.y 2 Jul 2005 17:01:53 -0000 1.308 *************** *** 1,4 **** ! /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.307 2005/02/10 08:06:35 meskes Exp $ */ /* Copyright comment */ %{ --- 1,4 ---- ! /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.308 2005/07/02 17:01:53 momjian Exp $ */ /* Copyright comment */ %{ *************** *** 4216,4226 **** Xconst: XCONST { $$ = make_name();}; Sconst: SCONST { ! $$ = (char *)mm_alloc(strlen($1) + 3); ! $$[0]='\''; ! strcpy($$+1, $1); ! $$[strlen($1)+2]='\0'; ! $$[strlen($1)+1]='\''; free($1); } ; --- 4216,4231 ---- Xconst: XCONST { $$ = make_name();}; Sconst: SCONST { ! char *ret; ! ! $$ = ret = (char *)mm_alloc(strlen($1) + 4); ! if (strchr($1, '\\') != NULL) ! *ret++ = ESCAPE_STRING_SYNTAX; ! *ret++ = '\''; ! strcpy(ret, $1); ! ret += strlen($1); ! *ret++ = '\''; ! *ret++ = '\0'; free($1); } ; Index: src/interfaces/libpq/fe-exec.c =================================================================== RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v retrieving revision 1.169 retrieving revision 1.170 diff -c -r1.169 -r1.170 *** src/interfaces/libpq/fe-exec.c 12 Jun 2005 00:00:21 -0000 1.169 --- src/interfaces/libpq/fe-exec.c 2 Jul 2005 17:01:54 -0000 1.170 *************** *** 8,14 **** * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.169 2005/06/12 00:00:21 neilc Exp $ * *------------------------------------------------------------------------- */ --- 8,14 ---- * * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/interfaces/libpq/fe-exec.c,v 1.170 2005/07/02 17:01:54 momjian Exp $ * *------------------------------------------------------------------------- */ *************** *** 2368,2390 **** while (remaining > 0 && *source != '\0') { ! switch (*source) ! { ! case '\\': ! *target++ = '\\'; ! *target++ = '\\'; ! break; ! ! case '\'': ! *target++ = '\''; ! *target++ = '\''; ! break; ! ! default: ! *target++ = *source; ! break; ! } ! source++; remaining--; } --- 2368,2376 ---- while (remaining > 0 && *source != '\0') { ! if (SQL_STR_DOUBLE(*source)) ! *target++ = *source; ! *target++ = *source++; remaining--; } *************** *** 2449,2455 **** } else if (*vp == '\'') { ! rp[0] = '\\'; rp[1] = '\''; rp += 2; } --- 2435,2441 ---- } else if (*vp == '\'') { ! rp[0] = '\''; rp[1] = '\''; rp += 2; } Index: src/pl/plpgsql/src/gram.y =================================================================== RCS file: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v retrieving revision 1.79 retrieving revision 1.80 diff -c -r1.79 -r1.80 *** src/pl/plpgsql/src/gram.y 2 Jul 2005 08:59:47 -0000 1.79 --- src/pl/plpgsql/src/gram.y 2 Jul 2005 17:01:59 -0000 1.80 *************** *** 4,10 **** * procedural language * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.79 2005/07/02 08:59:47 neilc Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * --- 4,10 ---- * procedural language * * IDENTIFICATION ! * $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.80 2005/07/02 17:01:59 momjian Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * *************** *** 389,401 **** curname_def = palloc0(sizeof(PLpgSQL_expr)); curname_def->dtype = PLPGSQL_DTYPE_EXPR; ! strcpy(buf, "SELECT '"); cp1 = new->refname; cp2 = buf + strlen(buf); ! while (*cp1 != '\0') { ! if (*cp1 == '\\' || *cp1 == '\'') ! *cp2++ = *cp1; /* double these */ *cp2++ = *cp1++; } strcpy(cp2, "'::refcursor"); --- 389,404 ---- curname_def = palloc0(sizeof(PLpgSQL_expr)); curname_def->dtype = PLPGSQL_DTYPE_EXPR; ! strcpy(buf, "SELECT "); cp1 = new->refname; cp2 = buf + strlen(buf); ! if (strchr(cp1, '\\') != NULL) ! *cp2++ = ESCAPE_STRING_SYNTAX; ! *cp2++ = '\''; ! while (*cp1) { ! if (SQL_STR_DOUBLE(*cp1)) ! *cp2++ = *cp1; *cp2++ = *cp1++; } strcpy(cp2, "'::refcursor");