pg_dump -d or -D didn't quote special characters in INSERT data

correctly.  -D had problems with tables with inherited fields, also.
This commit is contained in:
Tom Lane 1999-02-08 01:46:28 +00:00
parent 566c712c58
commit 07c33ba79e
1 changed files with 43 additions and 50 deletions

View File

@ -21,7 +21,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.100 1999/01/21 22:53:36 momjian Exp $
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.101 1999/02/08 01:46:28 tgl Exp $
*
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
*
@ -321,51 +321,41 @@ static void
dumpClasses_dumpData(FILE *fout, const char *classname,
const TableInfo tblinfo, bool oids)
{
PGresult *res;
char query[255];
int actual_atts; /* number of attrs in this a table */
char expandbuf[COPYBUFSIZ];
char q[MAXQUERYLEN];
int tuple;
int field;
int tuple;
int field;
char *expsrc;
char *expdest;
sprintf(query, "SELECT * FROM %s", fmtId(classname, force_quotes));
res = PQexec(g_conn, query);
sprintf(q, "SELECT * FROM %s", fmtId(classname, force_quotes));
res = PQexec(g_conn, q);
if (!res ||
PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "dumpClasses(): command failed\n");
exit_nicely(g_conn);
}
tuple = 0;
while (tuple < PQntuples(res))
for (tuple = 0; tuple < PQntuples(res); tuple++)
{
fprintf(fout, "INSERT INTO %s ", fmtId(classname, force_quotes));
if (attrNames)
{
int j;
actual_atts = 0;
sprintf(q, "(");
for (j = 0; j < tblinfo.numatts; j++)
for (field = 0; field < PQnfields(res); field++)
{
if (tblinfo.inhAttrs[j] == 0)
{
sprintf(q, "%s%s%s",
q,
(actual_atts > 0) ? "," : "",
fmtId(tblinfo.attnames[j], force_quotes));
actual_atts++;
}
if (field > 0)
strcat(q, ",");
strcat(q, fmtId(PQfname(res, field), force_quotes));
}
sprintf(q, "%s%s", q, ") ");
fprintf(fout, q);
strcat(q, ") ");
fprintf(fout, "%s", q);
}
fprintf(fout, "values (");
field = 0;
do
for (field = 0; field < PQnfields(res); field++)
{
if (field > 0)
fprintf(fout, ",");
if (PQgetisnull(res, tuple, field))
fprintf(fout, "NULL");
else
@ -377,41 +367,44 @@ dumpClasses_dumpData(FILE *fout, const char *classname,
case OIDOID: /* int types */
case FLOAT4OID:
case FLOAT8OID: /* float types */
/* These types are printed without quotes */
fprintf(fout, "%s",
PQgetvalue(res, tuple, field));
break;
default:
/* All other types are printed as string literals,
* with appropriate escaping of special characters.
* Quote mark ' goes to '' per SQL standard,
* other stuff goes to \ sequences.
*/
expsrc = PQgetvalue(res, tuple, field);
expdest = q;
for (; *expsrc; expsrc++)
{
char *expsrc,
*expdest;
/*
* Before outputting string value, expand all
* single quotes to twin single quotes - dhb -
* 6/11/96
*/
expsrc = PQgetvalue(res, tuple, field);
expdest = expandbuf;
while (*expsrc)
char ch = *expsrc;
if (ch == '\\' || ch == '\'')
{
*expdest++ = *expsrc;
if (*expsrc == (char) 0x27) /* single quote */
*expdest++ = *expsrc;
expsrc++;
*expdest++ = ch; /* double it */
*expdest++ = ch;
}
*expdest = *expsrc; /* null term. */
fprintf(fout, "'%s'", expandbuf);
else if (ch < '\040')
{
/* generate octal escape for control chars */
*expdest++ = '\\';
*expdest++ = ((ch >> 6) & 3) + '0';
*expdest++ = ((ch >> 3) & 7) + '0';
*expdest++ = (ch & 7) + '0';
}
else
*expdest++ = ch;
}
*expdest = '\0';
fprintf(fout, "'%s'", q);
break;
}
}
field++;
if (field != PQnfields(res))
fprintf(fout, ",");
} while (field < PQnfields(res));
}
fprintf(fout, ");\n");
tuple++;
}
PQclear(res);
}