diff options
Diffstat (limited to 'src/bin/pg_dump/pg_dump.c')
-rw-r--r-- | src/bin/pg_dump/pg_dump.c | 116 |
1 files changed, 88 insertions, 28 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 42af06ba5e2..950d47a44cb 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.433 2006/03/05 15:58:50 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.434 2006/05/26 23:48:54 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -82,6 +82,7 @@ bool g_verbose; /* User wants verbose narration of our * activities. */ Archive *g_fout; /* the script file */ PGconn *g_conn; /* the database connection */ +bool std_strings = false; /* GUC variable */ /* various user-settable parameters */ bool dumpInserts; /* dump data using proper insert strings */ @@ -174,6 +175,7 @@ static int dumpBlobs(Archive *AH, void *arg); static int dumpBlobComments(Archive *AH, void *arg); static void dumpDatabase(Archive *AH); static void dumpEncoding(Archive *AH); +static void dumpStdStrings(Archive *AH); static const char *getAttrName(int attrnum, TableInfo *tblInfo); static const char *fmtCopyColumnList(const TableInfo *ti); static void do_sql_command(PGconn *conn, const char *query); @@ -619,6 +621,8 @@ main(int argc, char **argv) /* First the special encoding entry. */ dumpEncoding(g_fout); + dumpStdStrings(g_fout); + /* The database item is always second, unless we don't want it at all */ if (!dataOnly && selectTableName == NULL && selectSchemaName == NULL) dumpDatabase(g_fout); @@ -1084,7 +1088,7 @@ dumpTableData_insert(Archive *fout, void *dcontext) default: /* All other types are printed as string literals. */ resetPQExpBuffer(q); - appendStringLiteral(q, PQgetvalue(res, tuple, field), false); + appendStringLiteral(q, PQgetvalue(res, tuple, field), false, !std_strings); archputs(q->data, fout); break; } @@ -1236,7 +1240,7 @@ dumpDatabase(Archive *AH) "FROM pg_database " "WHERE datname = ", username_subquery); - appendStringLiteral(dbQry, datname, true); + appendStringLiteral(dbQry, datname, true, !std_strings); } else if (g_fout->remoteVersion >= 80000) { @@ -1247,7 +1251,7 @@ dumpDatabase(Archive *AH) "FROM pg_database " "WHERE datname = ", username_subquery); - appendStringLiteral(dbQry, datname, true); + appendStringLiteral(dbQry, datname, true, !std_strings); } else if (g_fout->remoteVersion >= 70100) { @@ -1258,7 +1262,7 @@ dumpDatabase(Archive *AH) "FROM pg_database " "WHERE datname = ", username_subquery); - appendStringLiteral(dbQry, datname, true); + appendStringLiteral(dbQry, datname, true, !std_strings); } else { @@ -1271,7 +1275,7 @@ dumpDatabase(Archive *AH) "FROM pg_database " "WHERE datname = ", username_subquery); - appendStringLiteral(dbQry, datname, true); + appendStringLiteral(dbQry, datname, true, !std_strings); } res = PQexec(g_conn, dbQry->data); @@ -1310,7 +1314,7 @@ dumpDatabase(Archive *AH) if (strlen(encoding) > 0) { appendPQExpBuffer(creaQry, " ENCODING = "); - appendStringLiteral(creaQry, encoding, true); + appendStringLiteral(creaQry, encoding, true, !std_strings); } if (strlen(tablespace) > 0 && strcmp(tablespace, "pg_default") != 0) appendPQExpBuffer(creaQry, " TABLESPACE = %s", @@ -1349,7 +1353,7 @@ dumpDatabase(Archive *AH) if (comment && strlen(comment)) { resetPQExpBuffer(dbQry); appendPQExpBuffer(dbQry, "COMMENT ON DATABASE %s IS ", fmtId(datname)); - appendStringLiteral(dbQry, comment, false); + appendStringLiteral(dbQry, comment, false, !std_strings); appendPQExpBuffer(dbQry, ";\n"); ArchiveEntry(AH, dbCatId, createDumpId(), datname, NULL, NULL, @@ -1398,7 +1402,7 @@ dumpEncoding(Archive *AH) resetPQExpBuffer(qry); appendPQExpBuffer(qry, "SET client_encoding = "); - appendStringLiteral(qry, PQgetvalue(res, 0, 0), true); + appendStringLiteral(qry, PQgetvalue(res, 0, 0), true, !std_strings); appendPQExpBuffer(qry, ";\n"); ArchiveEntry(AH, nilCatalogId, createDumpId(), @@ -1414,6 +1418,56 @@ dumpEncoding(Archive *AH) /* + * dumpStdStrings: put the correct escape string behavior into the archive + */ +static void +dumpStdStrings(Archive *AH) +{ + PQExpBuffer qry; + PGresult *res; + + if (g_verbose) + write_msg(NULL, "saving standard_conforming_strings setting\n"); + + qry = createPQExpBuffer(); + + /* standard_conforming_strings not used in pre-8.2 servers */ + if (AH->remoteVersion < 80200) + { + appendPQExpBuffer(qry, "SET standard_conforming_strings = 'off';\n"); + std_strings = false; + } + else + { + appendPQExpBuffer(qry, "SHOW standard_conforming_strings"); + + res = PQexec(g_conn, qry->data); + + check_sql_result(res, g_conn, qry->data, PGRES_TUPLES_OK); + + PQclear(res); + + resetPQExpBuffer(qry); + + std_strings = (strcmp(PQgetvalue(res, 0, 0), "on") == 0); + appendPQExpBuffer(qry, "SET standard_conforming_strings = "); + appendStringLiteral(qry, PQgetvalue(res, 0, 0), true, !std_strings); + appendPQExpBuffer(qry, ";\n"); + puts(PQgetvalue(res, 0, 0)); + + } + + ArchiveEntry(AH, nilCatalogId, createDumpId(), + "STDSTRINGS", NULL, NULL, "", + false, "STDSTRINGS", qry->data, "", NULL, + NULL, 0, + NULL, NULL); + + destroyPQExpBuffer(qry); +} + + +/* * hasBlobs: * Test whether database contains any large objects */ @@ -1586,7 +1640,7 @@ dumpBlobComments(Archive *AH, void *arg) printfPQExpBuffer(commentcmd, "COMMENT ON LARGE OBJECT %u IS ", blobOid); - appendStringLiteral(commentcmd, comment, false); + appendStringLiteral(commentcmd, comment, false, !std_strings); appendPQExpBuffer(commentcmd, ";\n"); archputs(commentcmd->data, AH); @@ -4340,7 +4394,7 @@ dumpComment(Archive *fout, const char *target, PQExpBuffer query = createPQExpBuffer(); appendPQExpBuffer(query, "COMMENT ON %s IS ", target); - appendStringLiteral(query, comments->descr, false); + appendStringLiteral(query, comments->descr, false, !std_strings); appendPQExpBuffer(query, ";\n"); ArchiveEntry(fout, nilCatalogId, createDumpId(), @@ -4398,7 +4452,7 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo, resetPQExpBuffer(query); appendPQExpBuffer(query, "COMMENT ON %s IS ", target->data); - appendStringLiteral(query, descr, false); + appendStringLiteral(query, descr, false, !std_strings); appendPQExpBuffer(query, ";\n"); ArchiveEntry(fout, nilCatalogId, createDumpId(), @@ -4420,7 +4474,7 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo, resetPQExpBuffer(query); appendPQExpBuffer(query, "COMMENT ON %s IS ", target->data); - appendStringLiteral(query, descr, false); + appendStringLiteral(query, descr, false, !std_strings); appendPQExpBuffer(query, ";\n"); ArchiveEntry(fout, nilCatalogId, createDumpId(), @@ -4986,7 +5040,7 @@ dumpBaseType(Archive *fout, TypeInfo *tinfo) { appendPQExpBuffer(q, ",\n DEFAULT = "); if (typdefault_is_literal) - appendStringLiteral(q, typdefault, true); + appendStringLiteral(q, typdefault, true, !std_strings); else appendPQExpBufferStr(q, typdefault); } @@ -5005,7 +5059,7 @@ dumpBaseType(Archive *fout, TypeInfo *tinfo) if (typdelim && strcmp(typdelim, ",") != 0) { appendPQExpBuffer(q, ",\n DELIMITER = "); - appendStringLiteral(q, typdelim, true); + appendStringLiteral(q, typdelim, true, !std_strings); } if (strcmp(typalign, "c") == 0) @@ -5120,7 +5174,7 @@ dumpDomain(Archive *fout, TypeInfo *tinfo) { appendPQExpBuffer(q, " DEFAULT "); if (typdefault_is_literal) - appendStringLiteral(q, typdefault, true); + appendStringLiteral(q, typdefault, true, !std_strings); else appendPQExpBufferStr(q, typdefault); } @@ -5690,7 +5744,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo) if (strcmp(probin, "-") != 0) { appendPQExpBuffer(asPart, "AS "); - appendStringLiteral(asPart, probin, true); + appendStringLiteral(asPart, probin, true, !std_strings); if (strcmp(prosrc, "-") != 0) { appendPQExpBuffer(asPart, ", "); @@ -5700,7 +5754,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo) * contains quote or backslash; else use regular quoting. */ if (disable_dollar_quoting) - appendStringLiteral(asPart, prosrc, false); + appendStringLiteral(asPart, prosrc, false, !std_strings); else appendStringLiteralDQOpt(asPart, prosrc, false, NULL); } @@ -5712,7 +5766,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo) appendPQExpBuffer(asPart, "AS "); /* with no bin, dollar quote src unconditionally if allowed */ if (disable_dollar_quoting) - appendStringLiteral(asPart, prosrc, false); + appendStringLiteral(asPart, prosrc, false, !std_strings); else appendStringLiteralDQ(asPart, prosrc, NULL); } @@ -6628,9 +6682,9 @@ dumpConversion(Archive *fout, ConvInfo *convinfo) appendPQExpBuffer(q, "CREATE %sCONVERSION %s FOR ", (condefault) ? "DEFAULT " : "", fmtId(convinfo->dobj.name)); - appendStringLiteral(q, conforencoding, true); + appendStringLiteral(q, conforencoding, true, !std_strings); appendPQExpBuffer(q, " TO "); - appendStringLiteral(q, contoencoding, true); + appendStringLiteral(q, contoencoding, true, !std_strings); /* regproc is automatically quoted in 7.3 and above */ appendPQExpBuffer(q, " FROM %s;\n", conproc); @@ -6871,7 +6925,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo) if (!PQgetisnull(res, 0, i_agginitval)) { appendPQExpBuffer(details, ",\n INITCOND = "); - appendStringLiteral(details, agginitval, true); + appendStringLiteral(details, agginitval, true, !std_strings); } if (strcmp(aggfinalfn, "-") != 0) @@ -7058,7 +7112,7 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) { appendPQExpBuffer(query, "SELECT definition as viewdef " " from pg_views where viewname = "); - appendStringLiteral(query, tbinfo->dobj.name, true); + appendStringLiteral(query, tbinfo->dobj.name, true, !std_strings); appendPQExpBuffer(query, ";"); } @@ -7707,7 +7761,7 @@ findLastBuiltinOid_V71(const char *dbname) resetPQExpBuffer(query); appendPQExpBuffer(query, "SELECT datlastsysoid from pg_database where datname = "); - appendStringLiteral(query, dbname, true); + appendStringLiteral(query, dbname, true, !std_strings); res = PQexec(g_conn, query->data); check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK); @@ -7908,13 +7962,13 @@ dumpSequence(Archive *fout, TableInfo *tbinfo) (owning_tab = findTableByOid(tbinfo->owning_tab)) != NULL) { appendPQExpBuffer(query, "pg_catalog.pg_get_serial_sequence("); - appendStringLiteral(query, fmtId(owning_tab->dobj.name), true); + appendStringLiteral(query, fmtId(owning_tab->dobj.name), true, !std_strings); appendPQExpBuffer(query, ", "); - appendStringLiteral(query, owning_tab->attnames[tbinfo->owning_col - 1], true); + appendStringLiteral(query, owning_tab->attnames[tbinfo->owning_col - 1], true, !std_strings); appendPQExpBuffer(query, ")"); } else - appendStringLiteral(query, fmtId(tbinfo->dobj.name), true); + appendStringLiteral(query, fmtId(tbinfo->dobj.name), true, !std_strings); appendPQExpBuffer(query, ", %s, %s);\n", last, (called ? "true" : "false")); @@ -8083,8 +8137,14 @@ dumpTrigger(Archive *fout, TriggerInfo *tginfo) appendPQExpBufferChar(query, '\''); while (s < p) { - if (*s == '\'') /* bytea already doubles backslashes */ + if (*s == '\'') appendPQExpBufferChar(query, '\''); + /* + * bytea unconditionally doubles backslashes, so we suppress + * the doubling for standard_conforming_strings. + */ + if (std_strings && *s == '\\') + s++; appendPQExpBufferChar(query, *s++); } appendPQExpBufferChar(query, '\''); |