diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index 2f5085a52d59e8938bc894c6f418ac7a5963124b..e96a443e0c31ec23ea9cd19e2d99102e6eb3be68 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.47 2002/08/10 16:57:31 petere Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dump.sgml,v 1.48 2002/08/18 09:36:25 petere Exp $ PostgreSQL documentation --> @@ -29,7 +29,6 @@ PostgreSQL documentation <arg>-f <replaceable>file</replaceable></arg> <arg>-F <replaceable>format</replaceable></arg> <arg>-i</arg> - <group> <arg>-n</arg> <arg>-N</arg> </group> <arg>-o</arg> <arg>-O</arg> <arg>-R</arg> @@ -302,31 +301,6 @@ PostgreSQL documentation </listitem> </varlistentry> - <varlistentry> - <term><option>-n</></term> - <term><option>--no-quotes</></term> - <listitem> - <para> - Suppress double quotes around identifiers unless absolutely necessary. - This may cause trouble loading this dumped data if there are reserved words - used for identifiers. - This was the default behavior for - <command>pg_dump</command> prior to version 6.4. - </para> - </listitem> - </varlistentry> - - <varlistentry> - <term><option>-N</></term> - <term><option>--quotes</></term> - <listitem> - <para> - Include double quotes around identifiers. - This is the default. - </para> - </listitem> - </varlistentry> - <varlistentry> <term><option>-o</></term> <term><option>--oids</></term> diff --git a/doc/src/sgml/release.sgml b/doc/src/sgml/release.sgml index 8e06e8af13f8fa47b96e6734f2f0a23a03c3876d..9bfc6de17b05fc262784f8427f84d1cbe36ddfa5 100644 --- a/doc/src/sgml/release.sgml +++ b/doc/src/sgml/release.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/release.sgml,v 1.146 2002/08/11 21:17:34 tgl Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/release.sgml,v 1.147 2002/08/18 09:36:25 petere Exp $ --> <appendix id="release"> @@ -24,6 +24,7 @@ CDATA means the content is "SGML-free", so you can write without worries about funny characters. --> <literallayout><![CDATA[ +pg_dump -n and -N options have been removed. The new behavior is like -n but knows about key words. CLUSTER is no longer hazardous to your schema COPY accepts a list of columns to copy ALTER TABLE DROP COLUMN diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c index 2ae62ac18d9fdb42ab14444af9082d0ecce83bf4..2bb6772054ad26d29305bd17d9c244806fe35edb 100644 --- a/src/backend/parser/keywords.c +++ b/src/backend/parser/keywords.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.124 2002/08/06 05:40:45 ishii Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.125 2002/08/18 09:36:25 petere Exp $ * *------------------------------------------------------------------------- */ @@ -20,6 +20,8 @@ #include "parser/keywords.h" #include "parser/parse.h" +/* NB: This file is also used by pg_dump. */ + /* * List of (keyword-name, keyword-token-value) pairs. * diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index ec711e9959f2a0367682885391a7136c7e88277e..0f5d0fca86bcf6d1b3d410c6a1fe4895a6e4796c 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -3,7 +3,7 @@ * back to source text * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.116 2002/08/16 23:01:19 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.117 2002/08/18 09:36:25 petere Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -2529,14 +2529,42 @@ get_const_expr(Const *constval, deparse_context *context) { case INT2OID: case INT4OID: - case OIDOID: /* int types */ + case INT8OID: + case OIDOID: case FLOAT4OID: - case FLOAT8OID: /* float types */ - /* These types are printed without quotes */ - appendStringInfo(buf, extval); + case FLOAT8OID: + case NUMERICOID: + { + /* + * These types are printed without quotes unless they + * contain values that aren't accepted by the scanner + * unquoted (e.g., 'NaN'). Note that strtod() and friends + * might accept NaN, so we can't use that to test. + * + * In reality we only need to defend against infinity and + * NaN, so we need not get too crazy about pattern + * matching here. + */ + if (strspn(extval, "0123456789 +-eE.") == strlen(extval)) + appendStringInfo(buf, extval); + else + appendStringInfo(buf, "'%s'", extval); + } + break; + + case BITOID: + case VARBITOID: + appendStringInfo(buf, "B'%s'", extval); break; - default: + case BOOLOID: + if (strcmp(extval, "t")==0) + appendStringInfo(buf, "true"); + else + appendStringInfo(buf, "false"); + break; + + default: /* * We must quote any funny characters in the constant's * representation. XXX Any MULTIBYTE considerations here? @@ -2564,6 +2592,7 @@ get_const_expr(Const *constval, deparse_context *context) switch (constval->consttype) { + case BOOLOID: case INT4OID: case FLOAT8OID: case UNKNOWNOID: diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile index eff79981866683b035e9b48dd87a879e0ba748a3..069fd45d3ecd8f4cd549dcedfb0b0f72b16088ed 100644 --- a/src/bin/pg_dump/Makefile +++ b/src/bin/pg_dump/Makefile @@ -5,7 +5,7 @@ # Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # -# $Header: /cvsroot/pgsql/src/bin/pg_dump/Makefile,v 1.36 2002/07/27 20:10:05 petere Exp $ +# $Header: /cvsroot/pgsql/src/bin/pg_dump/Makefile,v 1.37 2002/08/18 09:36:25 petere Exp $ # #------------------------------------------------------------------------- @@ -16,15 +16,18 @@ include $(top_builddir)/src/Makefile.global OBJS= pg_backup_archiver.o pg_backup_db.o pg_backup_custom.o \ pg_backup_files.o pg_backup_null.o pg_backup_tar.o sprompt.o +EXTRA_OBJS = $(top_builddir)/src/backend/parser/keywords.o + override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) -all: submake-libpq submake-libpgport pg_dump pg_restore pg_dumpall + +all: submake-libpq submake-libpgport submake-backend pg_dump pg_restore pg_dumpall pg_dump: pg_dump.o common.o $(OBJS) $(libpq_builddir)/libpq.a - $(CC) $(CFLAGS) pg_dump.o common.o $(OBJS) $(libpq) $(LDFLAGS) $(LIBS) -o $@ + $(CC) $(CFLAGS) pg_dump.o common.o $(OBJS) $(EXTRA_OBJS) $(libpq) $(LDFLAGS) $(LIBS) -o $@ pg_restore: pg_restore.o $(OBJS) $(libpq_builddir)/libpq.a - $(CC) $(CFLAGS) pg_restore.o $(OBJS) $(libpq) $(LDFLAGS) $(LIBS) -o $@ + $(CC) $(CFLAGS) pg_restore.o $(OBJS) $(EXTRA_OBJS) $(libpq) $(LDFLAGS) $(LIBS) -o $@ pg_dumpall: pg_dumpall.sh sed -e 's,@VERSION@,$(VERSION),g' \ @@ -33,6 +36,11 @@ pg_dumpall: pg_dumpall.sh $< >$@ chmod a+x $@ +.PHONY: submake-backend +submake-backend: + $(MAKE) -C $(top_builddir)/src/backend/parser + + install: all installdirs $(INSTALL_PROGRAM) pg_dump$(X) $(DESTDIR)$(bindir)/pg_dump$(X) $(INSTALL_PROGRAM) pg_restore$(X) $(DESTDIR)$(bindir)/pg_restore$(X) diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index 4d0d21718b56f0eb5e3c536dd59196b842f2c357..546b3a6b25e4eb9a639bd0ffebf2f8ea7407a8ee 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup.h,v 1.20 2002/07/04 15:35:07 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup.h,v 1.21 2002/08/18 09:36:25 petere Exp $ * *------------------------------------------------------------------------- */ @@ -26,6 +26,7 @@ #include "postgres_fe.h" #include "libpq-fe.h" +#include "pqexpbuffer.h" #define atooid(x) ((Oid) strtoul((x), NULL, 10)) #define oidcmp(x,y) ( ((x) < (y) ? -1 : ((x) > (y)) ? 1 : 0) ) @@ -119,7 +120,9 @@ __attribute__((format(printf, 3, 4))); extern char *simple_prompt(const char *prompt, int maxlen, bool echo); -extern const char *fmtId(const char *identifier, bool force_quotes); +extern const char *fmtId(const char *identifier); +extern void appendStringLiteral(PQExpBuffer buf, const char *str, bool escapeAll); + /* Lets the archive know we have a DB connection to shutdown if it dies */ diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index b058500e862609f5a79070b177a76cf9eb9a32c8..5fcfc0c99fd00ca707d2e5569b1c35cdd3d76bc0 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -15,12 +15,13 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.53 2002/08/10 16:57:31 petere Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.54 2002/08/18 09:36:25 petere Exp $ * *------------------------------------------------------------------------- */ #include "pg_backup.h" +#include "pg_dump.h" #include "pg_backup_archiver.h" #include "pg_backup_db.h" @@ -30,6 +31,8 @@ #include "pqexpbuffer.h" #include "libpq/libpq-fs.h" +#include "parser/keywords.h" + typedef enum _teReqs_ { @@ -45,7 +48,7 @@ static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt, const int compression, ArchiveMode mode); static int _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData); -static void _doSetSessionAuth(ArchiveHandle *AH, const char *autharg); +static void _doSetSessionAuth(ArchiveHandle *AH, const char *user); static void _reconnectAsOwner(ArchiveHandle *AH, const char *dbname, TocEntry *te); static void _reconnectAsUser(ArchiveHandle *AH, const char *dbname, const char *user); static void _selectOutputSchema(ArchiveHandle *AH, const char *schemaName); @@ -202,7 +205,7 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt) if (ropt->filename || ropt->compression) sav = SetOutput(AH, ropt->filename, ropt->compression); - ahprintf(AH, "--\n-- Selected TOC Entries:\n--\n"); + ahprintf(AH, "--\n-- PostgreSQL database dump\n--\n\n"); /* * Drop the items at the start, in reverse order @@ -233,7 +236,6 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt) te = AH->toc->next; while (te != AH->toc) { - /* Work out what, if anything, we want from this entry */ reqs = _tocEntryRequired(te, ropt); @@ -464,7 +466,7 @@ _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop } else if (AH->ropt->use_setsessauth) { - _doSetSessionAuth(AH, "DEFAULT"); + _doSetSessionAuth(AH, NULL); } ahlog(AH, 1, "disabling triggers\n"); @@ -482,7 +484,7 @@ _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop if (te && te->tag && strlen(te->tag) > 0) ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = 0 " "WHERE oid = '%s'::pg_catalog.regclass;\n\n", - fmtId(te->tag, false)); + fmtId(te->tag)); else ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = 0 FROM pg_catalog.pg_namespace " "WHERE relnamespace = pg_namespace.oid AND nspname !~ '^pg_';\n\n"); @@ -498,7 +500,7 @@ _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *rop } else if (AH->ropt->use_setsessauth) { - _doSetSessionAuth(AH, fmtId(oldUser, false)); + _doSetSessionAuth(AH, oldUser); } free(oldUser); free(oldSchema); @@ -531,7 +533,7 @@ _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt } else if (AH->ropt->use_setsessauth) { - _doSetSessionAuth(AH, "DEFAULT"); + _doSetSessionAuth(AH, NULL); } ahlog(AH, 1, "enabling triggers\n"); @@ -550,7 +552,7 @@ _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = " "(SELECT pg_catalog.count(*) FROM pg_catalog.pg_trigger where pg_class.oid = tgrelid) " "WHERE oid = '%s'::pg_catalog.regclass;\n\n", - fmtId(te->tag, false)); + fmtId(te->tag)); else ahprintf(AH, "UPDATE pg_catalog.pg_class SET reltriggers = " "(SELECT pg_catalog.count(*) FROM pg_catalog.pg_trigger where pg_class.oid = tgrelid) " @@ -568,7 +570,7 @@ _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt } else if (AH->ropt->use_setsessauth) { - _doSetSessionAuth(AH, fmtId(oldUser, false)); + _doSetSessionAuth(AH, oldUser); } free(oldUser); free(oldSchema); @@ -1942,29 +1944,38 @@ _tocEntryRequired(TocEntry *te, RestoreOptions *ropt) /* * Issue a SET SESSION AUTHORIZATION command. Caller is responsible - * for updating state if appropriate. Note that caller must also quote - * the argument if it's a username (it might be DEFAULT, too). + * for updating state if appropriate. If user is NULL, the + * specification DEFAULT will be used. */ static void -_doSetSessionAuth(ArchiveHandle *AH, const char *autharg) -{ +_doSetSessionAuth(ArchiveHandle *AH, const char *user) +{ + PQExpBuffer cmd = createPQExpBuffer(); + appendPQExpBuffer(cmd, "SET SESSION AUTHORIZATION "); + if (user) + /* SQL requires a string literal here. Might as well be + * correct. */ + appendStringLiteral(cmd, user, false); + else + appendPQExpBuffer(cmd, "DEFAULT"); + appendPQExpBuffer(cmd, ";"); + if (RestoringToDB(AH)) { - PQExpBuffer qry = createPQExpBuffer(); PGresult *res; - appendPQExpBuffer(qry, "SET SESSION AUTHORIZATION %s;", autharg); - res = PQexec(AH->connection, qry->data); + res = PQexec(AH->connection, cmd->data); if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) die_horribly(AH, modulename, "could not set session user to %s: %s", - autharg, PQerrorMessage(AH->connection)); + user, PQerrorMessage(AH->connection)); PQclear(res); - destroyPQExpBuffer(qry); } else - ahprintf(AH, "SET SESSION AUTHORIZATION %s;\n\n", autharg); + ahprintf(AH, "%s\n\n", cmd->data); + + destroyPQExpBuffer(cmd); } @@ -1991,7 +2002,7 @@ _reconnectAsUser(ArchiveHandle *AH, const char *dbname, const char *user) */ if (!dbname && AH->ropt->use_setsessauth) { - _doSetSessionAuth(AH, fmtId(user, false)); + _doSetSessionAuth(AH, user); } else if (AH->ropt && AH->ropt->noReconnect) { @@ -2005,9 +2016,9 @@ _reconnectAsUser(ArchiveHandle *AH, const char *dbname, const char *user) PQExpBuffer qry = createPQExpBuffer(); appendPQExpBuffer(qry, "\\connect %s", - dbname ? fmtId(dbname, false) : "-"); + dbname ? fmtId(dbname) : "-"); appendPQExpBuffer(qry, " %s\n\n", - fmtId(user, false)); + fmtId(user)); ahprintf(AH, qry->data); @@ -2061,7 +2072,7 @@ _selectOutputSchema(ArchiveHandle *AH, const char *schemaName) qry = createPQExpBuffer(); appendPQExpBuffer(qry, "SET search_path = %s", - fmtId(schemaName, false)); + fmtId(schemaName)); if (strcmp(schemaName, "pg_catalog") != 0) appendPQExpBuffer(qry, ", pg_catalog"); @@ -2089,48 +2100,48 @@ _selectOutputSchema(ArchiveHandle *AH, const char *schemaName) /* - * fmtId - * - * Quotes input string if it's not a legitimate SQL identifier as-is, - * or all the time if force_quotes is true. + * Quotes input string if it's not a legitimate SQL identifier as-is. * * Note that the returned string must be used before calling fmtId again, * since we re-use the same return buffer each time. Non-reentrant but * avoids memory leakage. */ const char * -fmtId(const char *rawid, bool force_quotes) +fmtId(const char *rawid) { static PQExpBuffer id_return = NULL; const char *cp; + bool need_quotes = false; if (id_return) /* first time through? */ resetPQExpBuffer(id_return); else id_return = createPQExpBuffer(); - if (!force_quotes) + /* These checks need to match the identifier production in scan.l. + * Don't use islower() etc. */ + + if (ScanKeywordLookup(rawid)) + need_quotes = true; + /* slightly different rules for first character */ + else if (!((rawid[0] >= 'a' && rawid[0] <= 'z') || rawid[0] == '_')) + need_quotes = true; + else { - /* do a quick check on the first character... */ - if (!islower((unsigned char) *rawid) && *rawid != '_') - force_quotes = true; - else + /* otherwise check the entire string */ + for (cp = rawid; *cp; cp++) { - /* otherwise check the entire string */ - for (cp = rawid; *cp; cp++) + if (!((*cp >= 'a' && *cp <= 'z') + || (*cp >= '0' && *cp <= '9') + || (*cp == '_'))) { - if (!(islower((unsigned char) *cp) || - isdigit((unsigned char) *cp) || - (*cp == '_'))) - { - force_quotes = true; - break; - } + need_quotes = true; + break; } } } - if (!force_quotes) + if (!need_quotes) { /* no quoting needed */ appendPQExpBufferStr(id_return, rawid); @@ -2156,6 +2167,50 @@ fmtId(const char *rawid, bool force_quotes) } +/* + * Convert a string value to an SQL string literal and append it to + * the given buffer. + * + * Special characters are escaped. Quote mark ' goes to '' per SQL + * standard, other stuff goes to \ sequences. If escapeAll is false, + * whitespace characters are not escaped (tabs, newlines, etc.). This + * is appropriate for dump file output. + */ +void +appendStringLiteral(PQExpBuffer buf, const char *str, bool escapeAll) +{ + 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') + )) + { + /* + * generate octal escape for control chars other than + * whitespace + */ + appendPQExpBufferChar(buf, '\\'); + appendPQExpBufferChar(buf, ((ch >> 6) & 3) + '0'); + appendPQExpBufferChar(buf, ((ch >> 3) & 7) + '0'); + appendPQExpBufferChar(buf, (ch & 7) + '0'); + } + else + appendPQExpBufferChar(buf, ch); + } + appendPQExpBufferChar(buf, '\''); +} + + + static int _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData) { @@ -2170,7 +2225,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isDat else pfx = ""; - ahprintf(AH, "--\n-- %sTOC Entry ID %d (OID %s)\n--\n-- Name: %s Type: %s Schema: %s Owner: %s\n", + ahprintf(AH, "--\n-- %sTOC entry %d (OID %s)\n-- Name: %s; Type: %s; Schema: %s; Owner: %s\n", pfx, te->id, te->oid, te->tag, te->desc, te->namespace ? te->namespace : "-", te->owner); @@ -2178,7 +2233,8 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isDat (*AH->PrintExtraTocPtr) (AH, te); ahprintf(AH, "--\n\n"); - ahprintf(AH, "%s\n", te->defn); + if (strlen(te->defn) > 0) + ahprintf(AH, "%s\n\n", te->defn); return 1; } diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c index 03c382d14d8ff986cba71507e65163073def37a7..9c63e36b01eeb4ed15223d64abc3d17f829bae6e 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 - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.36 2002/08/10 16:57:31 petere Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.37 2002/08/18 09:36:25 petere Exp $ * *------------------------------------------------------------------------- */ @@ -590,9 +590,9 @@ FixupBlobRefs(ArchiveHandle *AH, TocEntry *te) if (te->namespace && strlen(te->namespace) > 0) appendPQExpBuffer(tblName, "%s.", - fmtId(te->namespace, false)); + fmtId(te->namespace)); appendPQExpBuffer(tblName, "%s", - fmtId(te->tag, false)); + fmtId(te->tag)); appendPQExpBuffer(tblQry, "SELECT a.attname FROM " @@ -624,13 +624,13 @@ FixupBlobRefs(ArchiveHandle *AH, TocEntry *te) /* Can't use fmtId twice in one call... */ appendPQExpBuffer(tblQry, "UPDATE %s SET %s = %s.newOid", - tblName->data, fmtId(attr, false), + tblName->data, fmtId(attr), BLOB_XREF_TABLE); appendPQExpBuffer(tblQry, " FROM %s WHERE %s.oldOid = %s.%s", BLOB_XREF_TABLE, BLOB_XREF_TABLE, - tblName->data, fmtId(attr, false)); + tblName->data, fmtId(attr)); ahlog(AH, 10, "SQL: %s\n", tblQry->data); diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index d677d1eccbffd20cc5f3802ede7bb26ee1010248..05d90e648397f3a0b722a7311f82c7b17f27f523 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -22,7 +22,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.284 2002/08/16 23:01:19 tgl Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.285 2002/08/18 09:36:25 petere Exp $ * *------------------------------------------------------------------------- */ @@ -34,7 +34,7 @@ */ #include "postgres.h" -#include <unistd.h> /* for getopt() */ +#include <unistd.h> #include <ctype.h> #ifdef ENABLE_NLS #include <locale.h> @@ -65,16 +65,6 @@ #include "pg_backup_archiver.h" -typedef enum _formatLiteralOptions -{ - CONV_ALL = 0, - PASS_LFTAB = 3 /* NOTE: 1 and 2 are reserved in case we - * want to make a mask. */ - /* We could make this a bit mask for control chars, but I don't */ - /* see any value in making it more complex...the current code */ - /* only checks for 'opts == CONV_ALL' anyway. */ -} formatLiteralOptions; - typedef struct _dumpContext { TableInfo *tblinfo; @@ -111,8 +101,6 @@ static void dumpACL(Archive *fout, const char *type, const char *name, static void dumpConstraints(Archive *fout, TableInfo *tblinfo, int numTables); static void dumpTriggers(Archive *fout, TableInfo *tblinfo, int numTables); static void dumpRules(Archive *fout, TableInfo *tblinfo, int numTables); -static void formatStringLiteral(PQExpBuffer buf, const char *str, - const formatLiteralOptions opts); static char *format_function_signature(FuncInfo *finfo, bool honor_quotes); static void dumpOneFunc(Archive *fout, FuncInfo *finfo); static void dumpOneOpr(Archive *fout, OprInfo *oprinfo, @@ -149,7 +137,6 @@ Archive *g_fout; /* the script file */ PGconn *g_conn; /* the database connection */ /* various user-settable parameters */ -bool force_quotes; /* User wants to suppress double-quotes */ bool dumpData; /* dump data using proper insert strings */ bool attrNames; /* put attr names into insert strings */ bool schemaOnly; @@ -214,8 +201,6 @@ main(int argc, char **argv) {"host", required_argument, NULL, 'h'}, {"ignore-version", no_argument, NULL, 'i'}, {"no-reconnect", no_argument, NULL, 'R'}, - {"no-quotes", no_argument, NULL, 'n'}, - {"quotes", no_argument, NULL, 'N'}, {"oids", no_argument, NULL, 'o'}, {"no-owner", no_argument, NULL, 'O'}, {"port", required_argument, NULL, 'p'}, @@ -250,7 +235,6 @@ main(int argc, char **argv) #endif g_verbose = false; - force_quotes = true; strcpy(g_comment_start, "-- "); g_comment_end[0] = '\0'; @@ -285,9 +269,9 @@ main(int argc, char **argv) } #ifdef HAVE_GETOPT_LONG - while ((c = getopt_long(argc, argv, "abcCdDf:F:h:inNoOp:RsS:t:uU:vWxX:zZ:V?", long_options, &optindex)) != -1) + while ((c = getopt_long(argc, argv, "abcCdDf:F:h:ioOp:RsS:t:uU:vWxX:zZ:V?", long_options, &optindex)) != -1) #else - while ((c = getopt(argc, argv, "abcCdDf:F:h:inNoOp:RsS:t:uU:vWxX:zZ:V?-")) != -1) + while ((c = getopt(argc, argv, "abcCdDf:F:h:ioOp:RsS:t:uU:vWxX:zZ:V?-")) != -1) #endif { @@ -337,15 +321,6 @@ main(int argc, char **argv) ignore_version = true; break; - case 'n': /* Do not force double-quotes on - * identifiers */ - force_quotes = false; - break; - - case 'N': /* Force double-quotes on identifiers */ - force_quotes = true; - break; - case 'o': /* Dump oids */ oids = true; break; @@ -962,7 +937,7 @@ dumpClasses_nodumpData(Archive *fout, char *oid, void *dctxv) * save the 'last sleep time'. */ } - archprintf(fout, "\\.\n"); + archprintf(fout, "\\.\n\n\n"); ret = PQendcopy(g_conn); if (ret != 0) @@ -1038,7 +1013,7 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv) for (tuple = 0; tuple < PQntuples(res); tuple++) { - archprintf(fout, "INSERT INTO %s ", fmtId(classname, force_quotes)); + archprintf(fout, "INSERT INTO %s ", fmtId(classname)); if (attrNames == true) { resetPQExpBuffer(q); @@ -1046,8 +1021,8 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv) for (field = 0; field < PQnfields(res); field++) { if (field > 0) - appendPQExpBuffer(q, ","); - appendPQExpBuffer(q, fmtId(PQfname(res, field), force_quotes)); + appendPQExpBuffer(q, ", "); + appendPQExpBuffer(q, fmtId(PQfname(res, field))); } appendPQExpBuffer(q, ") "); archprintf(fout, "%s", q->data); @@ -1056,37 +1031,62 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv) for (field = 0; field < PQnfields(res); field++) { if (field > 0) - archprintf(fout, ","); + archprintf(fout, ", "); if (PQgetisnull(res, tuple, field)) { archprintf(fout, "NULL"); continue; } + + /* XXX This code is partially duplicated in ruleutils.c */ switch (PQftype(res, field)) { case INT2OID: case INT4OID: - case OIDOID: /* int types */ + case INT8OID: + case OIDOID: case FLOAT4OID: - case FLOAT8OID: /* float types */ - /* These types are printed without quotes */ - archprintf(fout, "%s", - PQgetvalue(res, tuple, field)); - break; + case FLOAT8OID: + case NUMERICOID: + { + /* + * These types are printed without quotes + * unless they contain values that aren't + * accepted by the scanner unquoted (e.g., + * 'NaN'). Note that strtod() and friends + * might accept NaN, so we can't use that to + * test. + * + * In reality we only need to defend against + * infinity and NaN, so we need not get too + * crazy about pattern matching here. + */ + const char *s = PQgetvalue(res, tuple, field); + + if (strspn(s, "0123456789 +-eE.") == strlen(s)) + archprintf(fout, "%s", s); + else + archprintf(fout, "'%s'", s); + } + break; + case BITOID: case VARBITOID: archprintf(fout, "B'%s'", PQgetvalue(res, tuple, field)); break; - default: - /* - * All other types are printed as string literals, - * with appropriate escaping of special - * characters. - */ + case BOOLOID: + if (strcmp(PQgetvalue(res, tuple, field), "t")==0) + archprintf(fout, "true"); + else + archprintf(fout, "false"); + break; + + default: + /* All other types are printed as string literals. */ resetPQExpBuffer(q); - formatStringLiteral(q, PQgetvalue(res, tuple, field), CONV_ALL); + appendStringLiteral(q, PQgetvalue(res, tuple, field), false); archprintf(fout, "%s", q->data); break; } @@ -1095,6 +1095,8 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv) } } while (PQntuples(res) > 0); + + archprintf(fout, "\n\n"); PQclear(res); res = PQexec(g_conn, "CLOSE _pg_dump_cursor"); @@ -1112,45 +1114,6 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv) return 1; } -/* - * Convert a string value to an SQL string literal, - * with appropriate escaping of special characters. - * Quote mark ' goes to '' per SQL standard, other - * stuff goes to \ sequences. - * The literal is appended to the given PQExpBuffer. - */ -static void -formatStringLiteral(PQExpBuffer buf, const char *str, const formatLiteralOptions opts) -{ - 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) ' ' && - (opts == CONV_ALL - || (ch != '\n' && ch != '\t') - )) - { - /* - * generate octal escape for control chars other than - * whitespace - */ - appendPQExpBufferChar(buf, '\\'); - appendPQExpBufferChar(buf, ((ch >> 6) & 3) + '0'); - appendPQExpBufferChar(buf, ((ch >> 3) & 7) + '0'); - appendPQExpBufferChar(buf, (ch & 7) + '0'); - } - else - appendPQExpBufferChar(buf, ch); - } - appendPQExpBufferChar(buf, '\''); -} /* * DumpClasses - @@ -1200,7 +1163,7 @@ dumpClasses(const TableInfo *tblinfo, const int numTables, Archive *fout, dumpFn = dumpClasses_nodumpData; column_list = fmtCopyColumnList(&(tblinfo[i])); sprintf(copyBuf, "COPY %s %s %sFROM stdin;\n", - fmtId(tblinfo[i].relname, force_quotes), + fmtId(tblinfo[i].relname), column_list, (oids && tblinfo[i].hasoids) ? "WITH OIDS " : ""); copyStmt = copyBuf; @@ -1253,7 +1216,7 @@ dumpDatabase(Archive *AH) appendPQExpBuffer(dbQry, "select (select usename from pg_user where usesysid = datdba) as dba," " encoding, datpath from pg_database" " where datname = "); - formatStringLiteral(dbQry, datname, CONV_ALL); + appendStringLiteral(dbQry, datname, true); res = PQexec(g_conn, dbQry->data); if (!res || @@ -1289,7 +1252,7 @@ dumpDatabase(Archive *AH) datpath = PQgetvalue(res, 0, i_datpath); appendPQExpBuffer(creaQry, "CREATE DATABASE %s WITH TEMPLATE = template0", - fmtId(datname, force_quotes)); + fmtId(datname)); if (strlen(encoding) > 0) appendPQExpBuffer(creaQry, " ENCODING = %s", encoding); if (strlen(datpath) > 0) @@ -1297,7 +1260,7 @@ dumpDatabase(Archive *AH) appendPQExpBuffer(creaQry, ";\n"); appendPQExpBuffer(delQry, "DROP DATABASE %s;\n", - fmtId(datname, force_quotes)); + fmtId(datname)); ArchiveEntry(AH, "0", /* OID */ datname, /* Name */ @@ -2628,8 +2591,7 @@ dumpComment(Archive *fout, const char *target, i_description = PQfnumber(res, "description"); resetPQExpBuffer(query); appendPQExpBuffer(query, "COMMENT ON %s IS ", target); - formatStringLiteral(query, PQgetvalue(res, 0, i_description), - PASS_LFTAB); + appendStringLiteral(query, PQgetvalue(res, 0, i_description), false); appendPQExpBuffer(query, ";\n"); ArchiveEntry(fout, oid, target, namespace, owner, @@ -2720,11 +2682,11 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo, { resetPQExpBuffer(target); appendPQExpBuffer(target, "%s %s", reltypename, - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); resetPQExpBuffer(query); appendPQExpBuffer(query, "COMMENT ON %s IS ", target->data); - formatStringLiteral(query, descr, PASS_LFTAB); + appendStringLiteral(query, descr, false); appendPQExpBuffer(query, ";\n"); ArchiveEntry(fout, tbinfo->oid, target->data, @@ -2736,14 +2698,13 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo, { resetPQExpBuffer(target); appendPQExpBuffer(target, "COLUMN %s.", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); appendPQExpBuffer(target, "%s", - fmtId(tbinfo->attnames[objsubid-1], - force_quotes)); + fmtId(tbinfo->attnames[objsubid-1])); resetPQExpBuffer(query); appendPQExpBuffer(query, "COMMENT ON %s IS ", target->data); - formatStringLiteral(query, descr, PASS_LFTAB); + appendStringLiteral(query, descr, false); appendPQExpBuffer(query, ";\n"); ArchiveEntry(fout, tbinfo->oid, target->data, @@ -2778,7 +2739,7 @@ dumpDBComment(Archive *fout) query = createPQExpBuffer(); appendPQExpBuffer(query, "SELECT oid FROM pg_database WHERE datname = "); - formatStringLiteral(query, PQdb(g_conn), CONV_ALL); + appendStringLiteral(query, PQdb(g_conn), true); /*** Execute query ***/ @@ -2796,7 +2757,7 @@ dumpDBComment(Archive *fout) { i_oid = PQfnumber(res, "oid"); resetPQExpBuffer(query); - appendPQExpBuffer(query, "DATABASE %s", fmtId(PQdb(g_conn), force_quotes)); + appendPQExpBuffer(query, "DATABASE %s", fmtId(PQdb(g_conn))); dumpComment(fout, query->data, NULL, "", PQgetvalue(res, 0, i_oid), "pg_database", 0, NULL); } @@ -2829,7 +2790,7 @@ dumpNamespaces(Archive *fout, NamespaceInfo *nsinfo, int numNamespaces) if (strlen(nspinfo->nspname) == 0) continue; - qnspname = strdup(fmtId(nspinfo->nspname, force_quotes)); + qnspname = strdup(fmtId(nspinfo->nspname)); /* * If it's the PUBLIC namespace, don't emit a CREATE SCHEMA @@ -2998,36 +2959,36 @@ dumpOneBaseType(Archive *fout, TypeInfo *tinfo, /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "DROP TYPE %s.", - fmtId(tinfo->typnamespace->nspname, force_quotes)); + fmtId(tinfo->typnamespace->nspname)); appendPQExpBuffer(delq, "%s;\n", - fmtId(tinfo->typname, force_quotes)); + fmtId(tinfo->typname)); appendPQExpBuffer(q, - "CREATE TYPE %s " - "( internallength = %s,", - fmtId(tinfo->typname, force_quotes), + "CREATE TYPE %s (\n" + " INTERNALLENGTH = %s,\n", + fmtId(tinfo->typname), (strcmp(typlen, "-1") == 0) ? "variable" : typlen); if (fout->remoteVersion >= 70300) { /* regproc result is correctly quoted in 7.3 */ - appendPQExpBuffer(q, " input = %s, output = %s", + appendPQExpBuffer(q, " INPUT = %s,\n OUTPUT = %s", typinput, typoutput); } else { /* regproc delivers an unquoted name before 7.3 */ /* cannot combine these because fmtId uses static result area */ - appendPQExpBuffer(q, " input = %s,", - fmtId(typinput, force_quotes)); - appendPQExpBuffer(q, " output = %s", - fmtId(typoutput, force_quotes)); + appendPQExpBuffer(q, " INPUT = %s,\n", + fmtId(typinput)); + appendPQExpBuffer(q, " OUTPUT = %s", + fmtId(typoutput)); } if (typdefault != NULL) { - appendPQExpBuffer(q, ", default = "); - formatStringLiteral(q, typdefault, CONV_ALL); + appendPQExpBuffer(q, ",\n DEFAULT = "); + appendStringLiteral(q, typdefault, true); } if (tinfo->isArray) @@ -3037,35 +2998,35 @@ dumpOneBaseType(Archive *fout, TypeInfo *tinfo, /* reselect schema in case changed by function dump */ selectSourceSchema(tinfo->typnamespace->nspname); elemType = getFormattedTypeName(tinfo->typelem, zeroAsOpaque); - appendPQExpBuffer(q, ", element = %s, delimiter = ", elemType); - formatStringLiteral(q, typdelim, CONV_ALL); + appendPQExpBuffer(q, ",\n ELEMENT = %s,\n DELIMITER = ", elemType); + appendStringLiteral(q, typdelim, true); free(elemType); (*deps)[depIdx++] = strdup(tinfo->typelem); } if (strcmp(typalign, "c") == 0) - appendPQExpBuffer(q, ", alignment = char"); + appendPQExpBuffer(q, ",\n ALIGNMENT = char"); else if (strcmp(typalign, "s") == 0) - appendPQExpBuffer(q, ", alignment = int2"); + appendPQExpBuffer(q, ",\n ALIGNMENT = int2"); else if (strcmp(typalign, "i") == 0) - appendPQExpBuffer(q, ", alignment = int4"); + appendPQExpBuffer(q, ",\n ALIGNMENT = int4"); else if (strcmp(typalign, "d") == 0) - appendPQExpBuffer(q, ", alignment = double"); + appendPQExpBuffer(q, ",\n ALIGNMENT = double"); if (strcmp(typstorage, "p") == 0) - appendPQExpBuffer(q, ", storage = plain"); + appendPQExpBuffer(q, ",\n STORAGE = plain"); else if (strcmp(typstorage, "e") == 0) - appendPQExpBuffer(q, ", storage = external"); + appendPQExpBuffer(q, ",\n STORAGE = external"); else if (strcmp(typstorage, "x") == 0) - appendPQExpBuffer(q, ", storage = extended"); + appendPQExpBuffer(q, ",\n STORAGE = extended"); else if (strcmp(typstorage, "m") == 0) - appendPQExpBuffer(q, ", storage = main"); + appendPQExpBuffer(q, ",\n STORAGE = main"); if (strcmp(typbyval, "t") == 0) - appendPQExpBuffer(q, ", passedbyvalue);\n"); - else - appendPQExpBuffer(q, ");\n"); + appendPQExpBuffer(q, ",\n PASSEDBYVALUE"); + + appendPQExpBuffer(q, "\n);\n"); (*deps)[depIdx++] = NULL; /* End of List */ @@ -3077,7 +3038,7 @@ dumpOneBaseType(Archive *fout, TypeInfo *tinfo, /*** Dump Type Comments ***/ resetPQExpBuffer(q); - appendPQExpBuffer(q, "TYPE %s", fmtId(tinfo->typname, force_quotes)); + appendPQExpBuffer(q, "TYPE %s", fmtId(tinfo->typname)); dumpComment(fout, q->data, tinfo->typnamespace->nspname, tinfo->usename, tinfo->oid, "pg_type", 0, NULL); @@ -3149,13 +3110,13 @@ dumpOneDomain(Archive *fout, TypeInfo *tinfo) /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "DROP DOMAIN %s.", - fmtId(tinfo->typnamespace->nspname, force_quotes)); + fmtId(tinfo->typnamespace->nspname)); appendPQExpBuffer(delq, "%s RESTRICT;\n", - fmtId(tinfo->typname, force_quotes)); + fmtId(tinfo->typname)); appendPQExpBuffer(q, "CREATE DOMAIN %s AS %s", - fmtId(tinfo->typname, force_quotes), + fmtId(tinfo->typname), typdefn); /* Depends on the base type */ @@ -3179,7 +3140,7 @@ dumpOneDomain(Archive *fout, TypeInfo *tinfo) /*** Dump Domain Comments ***/ resetPQExpBuffer(q); - appendPQExpBuffer(q, "DOMAIN %s", fmtId(tinfo->typname, force_quotes)); + appendPQExpBuffer(q, "DOMAIN %s", fmtId(tinfo->typname)); dumpComment(fout, q->data, tinfo->typnamespace->nspname, tinfo->usename, tinfo->oid, "pg_type", 0, NULL); @@ -3244,13 +3205,13 @@ dumpOneCompositeType(Archive *fout, TypeInfo *tinfo) /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "DROP TYPE %s.", - fmtId(tinfo->typnamespace->nspname, force_quotes)); + fmtId(tinfo->typnamespace->nspname)); appendPQExpBuffer(delq, "%s RESTRICT;\n", - fmtId(tinfo->typname, force_quotes)); + fmtId(tinfo->typname)); appendPQExpBuffer(q, "CREATE TYPE %s AS (", - fmtId(tinfo->typname, force_quotes)); + fmtId(tinfo->typname)); for (i = 0; i < ntups; i++) { @@ -3278,7 +3239,7 @@ dumpOneCompositeType(Archive *fout, TypeInfo *tinfo) /*** Dump Type Comments ***/ resetPQExpBuffer(q); - appendPQExpBuffer(q, "TYPE %s", fmtId(tinfo->typname, force_quotes)); + appendPQExpBuffer(q, "TYPE %s", fmtId(tinfo->typname)); dumpComment(fout, q->data, tinfo->typnamespace->nspname, tinfo->usename, tinfo->oid, "pg_type", 0, NULL); @@ -3440,24 +3401,23 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs) (*deps)[depIdx++] = strdup(lanplcallfoid); appendPQExpBuffer(delqry, "DROP PROCEDURAL LANGUAGE %s;\n", - fmtId(lanname, force_quotes)); + fmtId(lanname)); appendPQExpBuffer(defqry, "CREATE %sPROCEDURAL LANGUAGE %s", (PQgetvalue(res, i, i_lanpltrusted)[0] == 't') ? "TRUSTED " : "", - fmtId(lanname, force_quotes)); + fmtId(lanname)); appendPQExpBuffer(defqry, " HANDLER %s", - fmtId(finfo[fidx].proname, force_quotes)); + fmtId(finfo[fidx].proname)); if (strcmp(lanvalidator, "0")!=0) { appendPQExpBuffer(defqry, " VALIDATOR "); /* Cope with possibility that validator is in different schema */ if (finfo[vidx].pronamespace != finfo[fidx].pronamespace) appendPQExpBuffer(defqry, "%s.", - fmtId(finfo[vidx].pronamespace->nspname, - force_quotes)); + fmtId(finfo[vidx].pronamespace->nspname)); appendPQExpBuffer(defqry, "%s", - fmtId(finfo[vidx].proname, force_quotes)); + fmtId(finfo[vidx].proname)); (*deps)[depIdx++] = strdup(lanvalidator); } appendPQExpBuffer(defqry, ";\n"); @@ -3471,7 +3431,7 @@ dumpProcLangs(Archive *fout, FuncInfo finfo[], int numFuncs) if (!aclsSkip) { - char *tmp = strdup(fmtId(lanname, force_quotes)); + char *tmp = strdup(fmtId(lanname)); dumpACL(fout, "LANGUAGE", tmp, lanname, finfo[fidx].pronamespace->nspname, NULL, lanacl, lanoid); @@ -3521,16 +3481,16 @@ format_function_signature(FuncInfo *finfo, bool honor_quotes) initPQExpBuffer(&fn); if (honor_quotes) - appendPQExpBuffer(&fn, "%s(", fmtId(finfo->proname, force_quotes)); + appendPQExpBuffer(&fn, "%s (", fmtId(finfo->proname)); else - appendPQExpBuffer(&fn, "%s(", finfo->proname); + appendPQExpBuffer(&fn, "%s (", finfo->proname); for (j = 0; j < finfo->nargs; j++) { char *typname; typname = getFormattedTypeName(finfo->argtypes[j], zeroAsOpaque); appendPQExpBuffer(&fn, "%s%s", - (j > 0) ? "," : "", + (j > 0) ? ", " : "", typname); free(typname); } @@ -3655,11 +3615,11 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo) if (strcmp(probin, "-") != 0) { appendPQExpBuffer(asPart, "AS "); - formatStringLiteral(asPart, probin, CONV_ALL); + appendStringLiteral(asPart, probin, true); if (strcmp(prosrc, "-") != 0) { appendPQExpBuffer(asPart, ", "); - formatStringLiteral(asPart, prosrc, PASS_LFTAB); + appendStringLiteral(asPart, prosrc, false); } } else @@ -3667,7 +3627,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo) if (strcmp(prosrc, "-") != 0) { appendPQExpBuffer(asPart, "AS "); - formatStringLiteral(asPart, prosrc, PASS_LFTAB); + appendStringLiteral(asPart, prosrc, false); } } @@ -3676,17 +3636,17 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo) /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delqry, "DROP FUNCTION %s.%s;\n", - fmtId(finfo->pronamespace->nspname, force_quotes), + fmtId(finfo->pronamespace->nspname), funcsig); rettypename = getFormattedTypeName(finfo->prorettype, zeroAsOpaque); appendPQExpBuffer(q, "CREATE FUNCTION %s ", funcsig); - appendPQExpBuffer(q, "RETURNS %s%s %s LANGUAGE %s", + appendPQExpBuffer(q, "RETURNS %s%s\n %s\n LANGUAGE %s", (proretset[0] == 't') ? "SETOF " : "", rettypename, asPart->data, - fmtId(lanname, force_quotes)); + fmtId(lanname)); free(rettypename); @@ -4006,7 +3966,7 @@ dumpOneOpr(Archive *fout, OprInfo *oprinfo, oprltcmpop = PQgetvalue(res, 0, i_oprltcmpop); oprgtcmpop = PQgetvalue(res, 0, i_oprgtcmpop); - appendPQExpBuffer(details, "PROCEDURE = %s ", + appendPQExpBuffer(details, " PROCEDURE = %s", convertRegProcReference(oprcode)); appendPQExpBuffer(oprid, "%s (", @@ -4022,8 +3982,8 @@ dumpOneOpr(Archive *fout, OprInfo *oprinfo, if (g_fout->remoteVersion >= 70100) name = oprleft; else - name = fmtId(oprleft, force_quotes); - appendPQExpBuffer(details, ",\n\tLEFTARG = %s ", name); + name = fmtId(oprleft); + appendPQExpBuffer(details, ",\n LEFTARG = %s", name); appendPQExpBuffer(oprid, "%s", name); } else @@ -4035,8 +3995,8 @@ dumpOneOpr(Archive *fout, OprInfo *oprinfo, if (g_fout->remoteVersion >= 70100) name = oprright; else - name = fmtId(oprright, force_quotes); - appendPQExpBuffer(details, ",\n\tRIGHTARG = %s ", name); + name = fmtId(oprright); + appendPQExpBuffer(details, ",\n RIGHTARG = %s", name); appendPQExpBuffer(oprid, ", %s)", name); } else @@ -4044,45 +4004,45 @@ dumpOneOpr(Archive *fout, OprInfo *oprinfo, name = convertOperatorReference(oprcom, g_oprinfo, numOperators); if (name) - appendPQExpBuffer(details, ",\n\tCOMMUTATOR = %s ", name); + appendPQExpBuffer(details, ",\n COMMUTATOR = %s", name); name = convertOperatorReference(oprnegate, g_oprinfo, numOperators); if (name) - appendPQExpBuffer(details, ",\n\tNEGATOR = %s ", name); + appendPQExpBuffer(details, ",\n NEGATOR = %s", name); if (strcmp(oprcanhash, "t") == 0) - appendPQExpBuffer(details, ",\n\tHASHES"); + appendPQExpBuffer(details, ",\n HASHES"); name = convertRegProcReference(oprrest); if (name) - appendPQExpBuffer(details, ",\n\tRESTRICT = %s ", name); + appendPQExpBuffer(details, ",\n RESTRICT = %s", name); name = convertRegProcReference(oprjoin); if (name) - appendPQExpBuffer(details, ",\n\tJOIN = %s ", name); + appendPQExpBuffer(details, ",\n JOIN = %s", name); name = convertOperatorReference(oprlsortop, g_oprinfo, numOperators); if (name) - appendPQExpBuffer(details, ",\n\tSORT1 = %s ", name); + appendPQExpBuffer(details, ",\n SORT1 = %s", name); name = convertOperatorReference(oprrsortop, g_oprinfo, numOperators); if (name) - appendPQExpBuffer(details, ",\n\tSORT2 = %s ", name); + appendPQExpBuffer(details, ",\n SORT2 = %s", name); name = convertOperatorReference(oprltcmpop, g_oprinfo, numOperators); if (name) - appendPQExpBuffer(details, ",\n\tLTCMP = %s ", name); + appendPQExpBuffer(details, ",\n LTCMP = %s", name); name = convertOperatorReference(oprgtcmpop, g_oprinfo, numOperators); if (name) - appendPQExpBuffer(details, ",\n\tGTCMP = %s ", name); + appendPQExpBuffer(details, ",\n GTCMP = %s", name); /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "DROP OPERATOR %s.%s;\n", - fmtId(oprinfo->oprnamespace->nspname, force_quotes), + fmtId(oprinfo->oprnamespace->nspname), oprid->data); - appendPQExpBuffer(q, "CREATE OPERATOR %s (%s);\n", + appendPQExpBuffer(q, "CREATE OPERATOR %s (\n%s\n);\n", oprinfo->oprname, details->data); ArchiveEntry(fout, oprinfo->oid, oprinfo->oprname, @@ -4146,7 +4106,7 @@ convertRegProcReference(const char *proc) } /* REGPROC before 7.3 does not quote its result */ - return fmtId(proc, false); + return fmtId(proc); } /* @@ -4300,26 +4260,26 @@ dumpOneOpclass(Archive *fout, OpclassInfo *opcinfo) /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "DROP OPERATOR CLASS %s", - fmtId(opcinfo->opcnamespace->nspname, force_quotes)); + fmtId(opcinfo->opcnamespace->nspname)); appendPQExpBuffer(delq, ".%s", - fmtId(opcinfo->opcname, force_quotes)); + fmtId(opcinfo->opcname)); appendPQExpBuffer(delq, " USING %s;\n", - fmtId(amname, force_quotes)); + fmtId(amname)); /* Build the fixed portion of the CREATE command */ - appendPQExpBuffer(q, "CREATE OPERATOR CLASS %s\n\t", - fmtId(opcinfo->opcname, force_quotes)); + appendPQExpBuffer(q, "CREATE OPERATOR CLASS %s\n ", + fmtId(opcinfo->opcname)); if (strcmp(opcdefault, "t") == 0) appendPQExpBuffer(q, "DEFAULT "); - appendPQExpBuffer(q, "FOR TYPE %s USING %s AS\n\t", + appendPQExpBuffer(q, "FOR TYPE %s USING %s AS\n ", opcintype, - fmtId(amname, force_quotes)); + fmtId(amname)); needComma = false; if (strcmp(opckeytype, "-") != 0) { - appendPQExpBuffer(q, "STORAGE\t%s", + appendPQExpBuffer(q, "STORAGE %s", opckeytype); needComma = true; } @@ -4359,12 +4319,12 @@ dumpOneOpclass(Archive *fout, OpclassInfo *opcinfo) amopopr = PQgetvalue(res, i, i_amopopr); if (needComma) - appendPQExpBuffer(q, " ,\n\t"); + appendPQExpBuffer(q, " ,\n "); - appendPQExpBuffer(q, "OPERATOR\t%s\t%s", + appendPQExpBuffer(q, "OPERATOR %s %s", amopstrategy, amopopr); if (strcmp(amopreqcheck, "t") == 0) - appendPQExpBuffer(q, "\tRECHECK"); + appendPQExpBuffer(q, " RECHECK"); needComma = true; } @@ -4402,9 +4362,9 @@ dumpOneOpclass(Archive *fout, OpclassInfo *opcinfo) amproc = PQgetvalue(res, i, i_amproc); if (needComma) - appendPQExpBuffer(q, " ,\n\t"); + appendPQExpBuffer(q, " ,\n "); - appendPQExpBuffer(q, "FUNCTION\t%s\t%s", + appendPQExpBuffer(q, "FUNCTION %s %s", amprocnum, amproc); needComma = true; @@ -4412,7 +4372,7 @@ dumpOneOpclass(Archive *fout, OpclassInfo *opcinfo) PQclear(res); - appendPQExpBuffer(q, " ;\n"); + appendPQExpBuffer(q, ";\n"); ArchiveEntry(fout, opcinfo->oid, opcinfo->opcname, opcinfo->opcnamespace->nspname, opcinfo->usename, @@ -4463,7 +4423,7 @@ format_aggregate_signature(AggInfo *agginfo, Archive *fout, bool honor_quotes) initPQExpBuffer(&buf); if (honor_quotes) appendPQExpBuffer(&buf, "%s", - fmtId(agginfo->aggname, force_quotes)); + fmtId(agginfo->aggname)); else appendPQExpBuffer(&buf, "%s", agginfo->aggname); @@ -4483,7 +4443,7 @@ format_aggregate_signature(AggInfo *agginfo, Archive *fout, bool honor_quotes) appendPQExpBuffer(&buf, "(*)"); else appendPQExpBuffer(&buf, "(%s)", - fmtId(agginfo->fmtbasetype, force_quotes)); + fmtId(agginfo->fmtbasetype)); } return buf.data; @@ -4630,7 +4590,7 @@ dumpOneAgg(Archive *fout, AggInfo *agginfo) if (g_fout->remoteVersion >= 70300) { /* If using 7.3's regproc or regtype, data is already quoted */ - appendPQExpBuffer(details, "BASETYPE = %s, SFUNC = %s, STYPE = %s", + appendPQExpBuffer(details, " BASETYPE = %s,\n SFUNC = %s,\n STYPE = %s", anybasetype ? "'any'" : agginfo->fmtbasetype, aggtransfn, aggtranstype); @@ -4638,42 +4598,42 @@ dumpOneAgg(Archive *fout, AggInfo *agginfo) else if (g_fout->remoteVersion >= 70100) { /* format_type quotes, regproc does not */ - appendPQExpBuffer(details, "BASETYPE = %s, SFUNC = %s, STYPE = %s", + appendPQExpBuffer(details, " BASETYPE = %s,\n SFUNC = %s,\n STYPE = %s", anybasetype ? "'any'" : agginfo->fmtbasetype, - fmtId(aggtransfn, force_quotes), + fmtId(aggtransfn), aggtranstype); } else { /* need quotes all around */ - appendPQExpBuffer(details, "BASETYPE = %s, ", + appendPQExpBuffer(details, " BASETYPE = %s,\n", anybasetype ? "'any'" : - fmtId(agginfo->fmtbasetype, force_quotes)); - appendPQExpBuffer(details, "SFUNC = %s, ", - fmtId(aggtransfn, force_quotes)); - appendPQExpBuffer(details, "STYPE = %s", - fmtId(aggtranstype, force_quotes)); + fmtId(agginfo->fmtbasetype)); + appendPQExpBuffer(details, " SFUNC = %s,\n", + fmtId(aggtransfn)); + appendPQExpBuffer(details, " STYPE = %s", + fmtId(aggtranstype)); } if (!PQgetisnull(res, 0, i_agginitval)) { - appendPQExpBuffer(details, ", INITCOND = "); - formatStringLiteral(details, agginitval, CONV_ALL); + appendPQExpBuffer(details, ",\n INITCOND = "); + appendStringLiteral(details, agginitval, true); } if (strcmp(aggfinalfn, "-") != 0) { - appendPQExpBuffer(details, ", FINALFUNC = %s", + appendPQExpBuffer(details, ",\n FINALFUNC = %s", aggfinalfn); } /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "DROP AGGREGATE %s.%s;\n", - fmtId(agginfo->aggnamespace->nspname, force_quotes), + fmtId(agginfo->aggnamespace->nspname), aggsig); - appendPQExpBuffer(q, "CREATE AGGREGATE %s ( %s );\n", - fmtId(agginfo->aggname, force_quotes), + appendPQExpBuffer(q, "CREATE AGGREGATE %s (\n%s\n);\n", + fmtId(agginfo->aggname), details->data); ArchiveEntry(fout, agginfo->oid, aggsig_tag, @@ -4859,10 +4819,10 @@ dumpACL(Archive *fout, const char *type, const char *name, /* NB: only one fmtId per appendPQExpBuffer! */ appendPQExpBuffer(sql, "REVOKE ALL ON %s %s FROM ", type, name); - appendPQExpBuffer(sql, "%s;\n", fmtId(tok, force_quotes)); + appendPQExpBuffer(sql, "%s;\n", fmtId(tok)); appendPQExpBuffer(sql, "GRANT %s ON %s %s TO ", priv, type, name); - appendPQExpBuffer(sql, "%s;\n", fmtId(tok, force_quotes)); + appendPQExpBuffer(sql, "%s;\n", fmtId(tok)); } } else @@ -4879,10 +4839,9 @@ dumpACL(Archive *fout, const char *type, const char *name, } else if (strncmp(tok, "group ", strlen("group ")) == 0) appendPQExpBuffer(sql, "GROUP %s;\n", - fmtId(tok + strlen("group "), - force_quotes)); + fmtId(tok + strlen("group "))); else - appendPQExpBuffer(sql, "%s;\n", fmtId(tok, force_quotes)); + appendPQExpBuffer(sql, "%s;\n", fmtId(tok)); } } else @@ -4897,10 +4856,9 @@ dumpACL(Archive *fout, const char *type, const char *name, } else if (strncmp(tok, "group ", strlen("group ")) == 0) appendPQExpBuffer(sql, "GROUP %s;\n", - fmtId(tok + strlen("group "), - force_quotes)); + fmtId(tok + strlen("group "))); else - appendPQExpBuffer(sql, "%s;\n", fmtId(tok, force_quotes)); + appendPQExpBuffer(sql, "%s;\n", fmtId(tok)); } free(priv); } @@ -4912,7 +4870,7 @@ dumpACL(Archive *fout, const char *type, const char *name, { appendPQExpBuffer(sql, "REVOKE ALL ON %s %s FROM ", type, name); - appendPQExpBuffer(sql, "%s;\n", fmtId(usename, force_quotes)); + appendPQExpBuffer(sql, "%s;\n", fmtId(usename)); } ArchiveEntry(fout, objoid, tag, nspname, usename ? usename : "", @@ -4926,7 +4884,7 @@ dumpACL(Archive *fout, const char *type, const char *name, static void dumpTableACL(Archive *fout, TableInfo *tbinfo) { - char *tmp = strdup(fmtId(tbinfo->relname, force_quotes)); + char *tmp = strdup(fmtId(tbinfo->relname)); dumpACL(fout, "TABLE", tmp, tbinfo->relname, tbinfo->relnamespace->nspname, tbinfo->usename, tbinfo->relacl, tbinfo->viewoid != NULL ? tbinfo->viewoid : tbinfo->oid); @@ -5028,7 +4986,7 @@ dumpOneTable(Archive *fout, TableInfo *tbinfo, TableInfo *g_tblinfo) "(select oid from pg_rewrite where " " rulename=('_RET' || viewname)::name) as view_oid" " from pg_views where viewname = "); - formatStringLiteral(query, tbinfo->relname, CONV_ALL); + appendStringLiteral(query, tbinfo->relname, true); appendPQExpBuffer(query, ";"); } @@ -5074,12 +5032,12 @@ dumpOneTable(Archive *fout, TableInfo *tbinfo, TableInfo *g_tblinfo) /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "DROP VIEW %s.", - fmtId(tbinfo->relnamespace->nspname, force_quotes)); + fmtId(tbinfo->relnamespace->nspname)); appendPQExpBuffer(delq, "%s;\n", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); - appendPQExpBuffer(q, "CREATE VIEW %s AS %s\n", - fmtId(tbinfo->relname, force_quotes), viewdef); + appendPQExpBuffer(q, "CREATE VIEW %s AS\n %s\n", + fmtId(tbinfo->relname), viewdef); PQclear(res); @@ -5093,9 +5051,9 @@ dumpOneTable(Archive *fout, TableInfo *tbinfo, TableInfo *g_tblinfo) if (tbinfo->adef_expr[j] != NULL && !tbinfo->inhAttrDef[j]) { appendPQExpBuffer(q, "ALTER TABLE %s ", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); appendPQExpBuffer(q, "ALTER COLUMN %s SET DEFAULT %s;\n", - fmtId(tbinfo->attnames[j], force_quotes), + fmtId(tbinfo->attnames[j]), tbinfo->adef_expr[j]); } } @@ -5114,12 +5072,12 @@ dumpOneTable(Archive *fout, TableInfo *tbinfo, TableInfo *g_tblinfo) /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "DROP TABLE %s.", - fmtId(tbinfo->relnamespace->nspname, force_quotes)); + fmtId(tbinfo->relnamespace->nspname)); appendPQExpBuffer(delq, "%s;\n", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); - appendPQExpBuffer(q, "CREATE TABLE %s (\n\t", - fmtId(tbinfo->relname, force_quotes)); + appendPQExpBuffer(q, "CREATE TABLE %s (", + fmtId(tbinfo->relname)); actual_atts = 0; for (j = 0; j < tbinfo->numatts; j++) { @@ -5128,11 +5086,12 @@ dumpOneTable(Archive *fout, TableInfo *tbinfo, TableInfo *g_tblinfo) { /* Format properly if not first attr */ if (actual_atts > 0) - appendPQExpBuffer(q, ",\n\t"); + appendPQExpBuffer(q, ","); + appendPQExpBuffer(q, "\n "); /* Attr name & type */ appendPQExpBuffer(q, "%s ", - fmtId(tbinfo->attnames[j], force_quotes)); + fmtId(tbinfo->attnames[j])); /* If no format_type, fake it */ if (g_fout->remoteVersion >= 70100) @@ -5232,11 +5191,11 @@ dumpOneTable(Archive *fout, TableInfo *tbinfo, TableInfo *g_tblinfo) const char *expr = PQgetvalue(res2, j, i_consrc); if (actual_atts + j > 0) - appendPQExpBuffer(q, ",\n\t"); + appendPQExpBuffer(q, ",\n "); if (name[0] != '$') appendPQExpBuffer(q, "CONSTRAINT %s ", - fmtId(name, force_quotes)); + fmtId(name)); appendPQExpBuffer(q, "CHECK (%s)", expr); } PQclear(res2); @@ -5265,10 +5224,9 @@ dumpOneTable(Archive *fout, TableInfo *tbinfo, TableInfo *g_tblinfo) appendPQExpBuffer(q, ", "); if (parentRel->relnamespace != tbinfo->relnamespace) appendPQExpBuffer(q, "%s.", - fmtId(parentRel->relnamespace->nspname, - force_quotes)); + fmtId(parentRel->relnamespace->nspname)); appendPQExpBuffer(q, "%s", - fmtId(parentRel->relname, force_quotes)); + fmtId(parentRel->relname)); } appendPQExpBuffer(q, ")"); } @@ -5289,9 +5247,9 @@ dumpOneTable(Archive *fout, TableInfo *tbinfo, TableInfo *g_tblinfo) !tbinfo->attisdropped[j]) { appendPQExpBuffer(q, "ALTER TABLE ONLY %s ", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); appendPQExpBuffer(q, "ALTER COLUMN %s ", - fmtId(tbinfo->attnames[j], force_quotes)); + fmtId(tbinfo->attnames[j])); appendPQExpBuffer(q, "SET STATISTICS %d;\n", tbinfo->attstattarget[j]); } @@ -5476,10 +5434,10 @@ dumpIndexes(Archive *fout, TableInfo *tblinfo, int numTables) parseNumericArray(PQgetvalue(res, j, i_indkey), indkeys, indnkeys); - appendPQExpBuffer(q, "ALTER TABLE ONLY %s ", - fmtId(tbinfo->relname, force_quotes)); - appendPQExpBuffer(q, "ADD CONSTRAINT %s %s (", - fmtId(indexrelname, force_quotes), + appendPQExpBuffer(q, "ALTER TABLE ONLY %s\n", + fmtId(tbinfo->relname)); + appendPQExpBuffer(q, " ADD CONSTRAINT %s %s (", + fmtId(indexrelname), contype == 'p' ? "PRIMARY KEY" : "UNIQUE"); for (k = 0; k < indnkeys; k++) @@ -5493,18 +5451,18 @@ dumpIndexes(Archive *fout, TableInfo *tblinfo, int numTables) appendPQExpBuffer(q, "%s%s", (k == 0) ? "" : ", ", - fmtId(attname, force_quotes)); + fmtId(attname)); } appendPQExpBuffer(q, ");\n"); /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "ALTER TABLE ONLY %s.", - fmtId(tbinfo->relnamespace->nspname, force_quotes)); + fmtId(tbinfo->relnamespace->nspname)); appendPQExpBuffer(delq, "%s ", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); appendPQExpBuffer(delq, "DROP CONSTRAINT %s;\n", - fmtId(indexrelname, force_quotes)); + fmtId(indexrelname)); ArchiveEntry(fout, indexreloid, indexrelname, @@ -5525,9 +5483,9 @@ dumpIndexes(Archive *fout, TableInfo *tblinfo, int numTables) /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delq, "DROP INDEX %s.", - fmtId(tbinfo->relnamespace->nspname, force_quotes)); + fmtId(tbinfo->relnamespace->nspname)); appendPQExpBuffer(delq, "%s;\n", - fmtId(indexrelname, force_quotes)); + fmtId(indexrelname)); ArchiveEntry(fout, indexreloid, indexrelname, @@ -5541,7 +5499,7 @@ dumpIndexes(Archive *fout, TableInfo *tblinfo, int numTables) /* Dump Index Comments */ resetPQExpBuffer(q); appendPQExpBuffer(q, "INDEX %s", - fmtId(indexrelname, force_quotes)); + fmtId(indexrelname)); dumpComment(fout, q->data, tbinfo->relnamespace->nspname, tbinfo->usename, @@ -5630,7 +5588,7 @@ findLastBuiltinOid_V71(const char *dbname) resetPQExpBuffer(query); appendPQExpBuffer(query, "SELECT datlastsysoid from pg_database where datname = "); - formatStringLiteral(query, dbname, CONV_ALL); + appendStringLiteral(query, dbname, true); res = PQexec(g_conn, query->data); if (res == NULL || @@ -5715,7 +5673,7 @@ dumpOneSequence(Archive *fout, TableInfo *tbinfo, appendPQExpBuffer(query, "SELECT sequence_name, last_value, increment_by, max_value, " "min_value, cache_value, is_cycled, is_called from %s", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); res = PQexec(g_conn, query->data); if (!res || PQresultStatus(res) != PGRES_TUPLES_OK) @@ -5764,18 +5722,18 @@ dumpOneSequence(Archive *fout, TableInfo *tbinfo, /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delqry, "DROP SEQUENCE %s.", - fmtId(tbinfo->relnamespace->nspname, force_quotes)); + fmtId(tbinfo->relnamespace->nspname)); appendPQExpBuffer(delqry, "%s;\n", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); resetPQExpBuffer(query); appendPQExpBuffer(query, - "CREATE SEQUENCE %s start %s increment %s " - "maxvalue %s minvalue %s cache %s%s;\n", - fmtId(tbinfo->relname, force_quotes), + "CREATE SEQUENCE %s\n START %s\n INCREMENT %s\n" + " MAXVALUE %s\n MINVALUE %s\n CACHE %s%s;\n", + fmtId(tbinfo->relname), (called ? minv : last), incby, maxv, minv, cache, - (cycled ? " cycle" : "")); + (cycled ? "\n CYCLE" : "")); ArchiveEntry(fout, tbinfo->oid, tbinfo->relname, tbinfo->relnamespace->nspname, tbinfo->usename, @@ -5788,7 +5746,7 @@ dumpOneSequence(Archive *fout, TableInfo *tbinfo, { resetPQExpBuffer(query); appendPQExpBuffer(query, "SELECT pg_catalog.setval ("); - formatStringLiteral(query, fmtId(tbinfo->relname, force_quotes), CONV_ALL); + appendStringLiteral(query, fmtId(tbinfo->relname), true); appendPQExpBuffer(query, ", %s, %s);\n", last, (called ? "true" : "false")); @@ -5804,7 +5762,7 @@ dumpOneSequence(Archive *fout, TableInfo *tbinfo, /* Dump Sequence Comments */ resetPQExpBuffer(query); - appendPQExpBuffer(query, "SEQUENCE %s", fmtId(tbinfo->relname, force_quotes)); + appendPQExpBuffer(query, "SEQUENCE %s", fmtId(tbinfo->relname)); dumpComment(fout, query->data, tbinfo->relnamespace->nspname, tbinfo->usename, tbinfo->oid, "pg_class", 0, NULL); @@ -5887,20 +5845,20 @@ dumpConstraints(Archive *fout, TableInfo *tblinfo, int numTables) const char *conDef = PQgetvalue(res, j, i_condef); resetPQExpBuffer(query); - appendPQExpBuffer(query, "ALTER TABLE ONLY %s ", - fmtId(tbinfo->relname, force_quotes)); - appendPQExpBuffer(query, "ADD CONSTRAINT %s %s;\n", - fmtId(conName, force_quotes), + appendPQExpBuffer(query, "ALTER TABLE ONLY %s\n", + fmtId(tbinfo->relname)); + appendPQExpBuffer(query, " ADD CONSTRAINT %s %s;\n", + fmtId(conName), conDef); /* DROP must be fully qualified in case same name appears in pg_catalog */ resetPQExpBuffer(delqry); appendPQExpBuffer(delqry, "ALTER TABLE ONLY %s.", - fmtId(tbinfo->relnamespace->nspname, force_quotes)); + fmtId(tbinfo->relnamespace->nspname)); appendPQExpBuffer(delqry, "%s ", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); appendPQExpBuffer(delqry, "DROP CONSTRAINT %s;\n", - fmtId(conName, force_quotes)); + fmtId(conName)); ArchiveEntry(fout, conOid, conName, @@ -5912,9 +5870,9 @@ dumpConstraints(Archive *fout, TableInfo *tblinfo, int numTables) resetPQExpBuffer(query); appendPQExpBuffer(query, "CONSTRAINT %s ", - fmtId(conName, force_quotes)); + fmtId(conName)); appendPQExpBuffer(query, "ON %s", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); dumpComment(fout, query->data, tbinfo->relnamespace->nspname, tbinfo->usename, @@ -6061,24 +6019,24 @@ dumpTriggers(Archive *fout, TableInfo *tblinfo, int numTables) resetPQExpBuffer(delqry); /* DROP must be fully qualified in case same name appears in pg_catalog */ appendPQExpBuffer(delqry, "DROP TRIGGER %s ", - fmtId(tgname, force_quotes)); + fmtId(tgname)); appendPQExpBuffer(delqry, "ON %s.", - fmtId(tbinfo->relnamespace->nspname, force_quotes)); + fmtId(tbinfo->relnamespace->nspname)); appendPQExpBuffer(delqry, "%s;\n", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); resetPQExpBuffer(query); if (tgisconstraint) { appendPQExpBuffer(query, "CREATE CONSTRAINT TRIGGER "); - appendPQExpBuffer(query, fmtId(PQgetvalue(res, j, i_tgconstrname), force_quotes)); + appendPQExpBuffer(query, fmtId(PQgetvalue(res, j, i_tgconstrname))); } else { appendPQExpBuffer(query, "CREATE TRIGGER "); - appendPQExpBuffer(query, fmtId(tgname, force_quotes)); + appendPQExpBuffer(query, fmtId(tgname)); } - appendPQExpBufferChar(query, ' '); + appendPQExpBuffer(query, "\n "); /* Trigger type */ findx = 0; if (TRIGGER_FOR_BEFORE(tgtype)) @@ -6105,8 +6063,8 @@ dumpTriggers(Archive *fout, TableInfo *tblinfo, int numTables) else appendPQExpBuffer(query, " UPDATE"); } - appendPQExpBuffer(query, " ON %s ", - fmtId(tbinfo->relname, force_quotes)); + appendPQExpBuffer(query, " ON %s\n", + fmtId(tbinfo->relname)); if (tgisconstraint) { @@ -6124,30 +6082,30 @@ dumpTriggers(Archive *fout, TableInfo *tblinfo, int numTables) /* If we are using regclass, name is already quoted */ if (g_fout->remoteVersion >= 70300) - appendPQExpBuffer(query, " FROM %s", + appendPQExpBuffer(query, " FROM %s\n ", PQgetvalue(res, j, i_tgconstrrelname)); else - appendPQExpBuffer(query, " FROM %s", - fmtId(PQgetvalue(res, j, i_tgconstrrelname), force_quotes)); + appendPQExpBuffer(query, " FROM %s\n ", + fmtId(PQgetvalue(res, j, i_tgconstrrelname))); } if (!tgdeferrable) - appendPQExpBuffer(query, " NOT"); - appendPQExpBuffer(query, " DEFERRABLE INITIALLY "); + appendPQExpBuffer(query, "NOT "); + appendPQExpBuffer(query, "DEFERRABLE INITIALLY "); if (tginitdeferred) - appendPQExpBuffer(query, "DEFERRED"); + appendPQExpBuffer(query, "DEFERRED\n"); else - appendPQExpBuffer(query, "IMMEDIATE"); + appendPQExpBuffer(query, "IMMEDIATE\n"); } - appendPQExpBuffer(query, " FOR EACH ROW"); + appendPQExpBuffer(query, " FOR EACH ROW\n "); /* In 7.3, result of regproc is already quoted */ if (g_fout->remoteVersion >= 70300) - appendPQExpBuffer(query, " EXECUTE PROCEDURE %s (", + appendPQExpBuffer(query, "EXECUTE PROCEDURE %s (", tgfname); else - appendPQExpBuffer(query, " EXECUTE PROCEDURE %s (", - fmtId(tgfname, force_quotes)); + appendPQExpBuffer(query, "EXECUTE PROCEDURE %s (", + fmtId(tgfname)); for (findx = 0; findx < tgnargs; findx++) { const char *s; @@ -6196,9 +6154,9 @@ dumpTriggers(Archive *fout, TableInfo *tblinfo, int numTables) resetPQExpBuffer(query); appendPQExpBuffer(query, "TRIGGER %s ", - fmtId(tgname, force_quotes)); + fmtId(tgname)); appendPQExpBuffer(query, "ON %s", - fmtId(tbinfo->relname, force_quotes)); + fmtId(tbinfo->relname)); dumpComment(fout, query->data, tbinfo->relnamespace->nspname, tbinfo->usename, @@ -6221,6 +6179,7 @@ dumpRules(Archive *fout, TableInfo *tblinfo, int numTables) int i, t; PQExpBuffer query = createPQExpBuffer(); + PQExpBuffer cmd = createPQExpBuffer(); int i_definition; int i_oid; int i_rulename; @@ -6267,7 +6226,7 @@ dumpRules(Archive *fout, TableInfo *tblinfo, int numTables) " pg_rewrite.oid, pg_rewrite.rulename " "FROM pg_rewrite, pg_class, pg_rules " "WHERE pg_class.relname = "); - formatStringLiteral(query, tbinfo->relname, CONV_ALL); + appendStringLiteral(query, tbinfo->relname, true); appendPQExpBuffer(query, " AND pg_rewrite.ev_class = pg_class.oid " " AND pg_rules.tablename = pg_class.relname " @@ -6295,20 +6254,21 @@ dumpRules(Archive *fout, TableInfo *tblinfo, int numTables) for (i = 0; i < nrules; i++) { + printfPQExpBuffer(cmd, "%s\n", PQgetvalue(res, i, i_definition)); ArchiveEntry(fout, PQgetvalue(res, i, i_oid), PQgetvalue(res, i, i_rulename), tbinfo->relnamespace->nspname, tbinfo->usename, "RULE", NULL, - PQgetvalue(res, i, i_definition), + cmd->data, "", /* Del */ NULL, NULL, NULL); /* Dump rule comments */ resetPQExpBuffer(query); - appendPQExpBuffer(query, "RULE %s", fmtId(PQgetvalue(res, i, i_rulename), force_quotes)); - appendPQExpBuffer(query, " ON %s", fmtId(tbinfo->relname, force_quotes)); + appendPQExpBuffer(query, "RULE %s", fmtId(PQgetvalue(res, i, i_rulename))); + appendPQExpBuffer(query, " ON %s", fmtId(tbinfo->relname)); dumpComment(fout, query->data, tbinfo->relnamespace->nspname, tbinfo->usename, @@ -6320,6 +6280,7 @@ dumpRules(Archive *fout, TableInfo *tblinfo, int numTables) } destroyPQExpBuffer(query); + destroyPQExpBuffer(cmd); } /* @@ -6353,7 +6314,7 @@ selectSourceSchema(const char *schemaName) query = createPQExpBuffer(); appendPQExpBuffer(query, "SET search_path = %s", - fmtId(schemaName, force_quotes)); + fmtId(schemaName)); if (strcmp(schemaName, "pg_catalog") != 0) appendPQExpBuffer(query, ", pg_catalog"); res = PQexec(g_conn, query->data); @@ -6444,7 +6405,7 @@ getFormattedTypeName(const char *oid, OidOptions opts) else { /* may need to quote it */ - result = strdup(fmtId(PQgetvalue(res, 0, 0), false)); + result = strdup(fmtId(PQgetvalue(res, 0, 0))); } PQclear(res); @@ -6499,14 +6460,10 @@ myFormatType(const char *typname, int32 typmod) * char is an internal single-byte data type; Let's make sure we force * it through with quotes. - thomas 1998-12-13 */ - else if (!strcmp(typname, "char")) - { - appendPQExpBuffer(buf, "%s", fmtId(typname, true)); - } + else if (strcmp(typname, "char")==0) + appendPQExpBuffer(buf, "\"char\""); else - { - appendPQExpBuffer(buf, "%s", fmtId(typname, false)); - } + appendPQExpBuffer(buf, "%s", fmtId(typname)); result = strdup(buf->data); destroyPQExpBuffer(buf); @@ -6534,10 +6491,10 @@ fmtQualifiedId(const char *schema, const char *id) if (g_fout->remoteVersion >= 70300 && schema && *schema) { appendPQExpBuffer(id_return, "%s.", - fmtId(schema, force_quotes)); + fmtId(schema)); } appendPQExpBuffer(id_return, "%s", - fmtId(id, force_quotes)); + fmtId(id)); return id_return->data; } @@ -6574,8 +6531,8 @@ fmtCopyColumnList(const TableInfo* ti) if (attisdropped[i]) continue; if (needComma) - appendPQExpBuffer(q, ","); - appendPQExpBuffer(q, "%s", fmtId(attnames[i], force_quotes)); + appendPQExpBuffer(q, ", "); + appendPQExpBuffer(q, "%s", fmtId(attnames[i])); needComma = true; } appendPQExpBuffer(q, ")"); diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 02415a794dece25518f187e77de990717c5db105..b8fcfdc4ff53c0543b1186f4656c29369e549849 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: pg_dump.h,v 1.95 2002/08/15 16:36:06 momjian Exp $ + * $Id: pg_dump.h,v 1.96 2002/08/18 09:36:26 petere Exp $ * *------------------------------------------------------------------------- */ @@ -15,7 +15,6 @@ #define PG_DUMP_H #include "pg_backup.h" -#include "pqexpbuffer.h" /* * The data structures used to store system catalog information diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 439f05ed8ceb50550fd3970b61b3a59c1da75912..3918f33084accfff3f6b35318453d14a683dd71b 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1314,7 +1314,7 @@ SELECT tablename, rulename, definition FROM pg_rules tablename | rulename | definition ---------------+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pg_settings | pg_settings_n | CREATE RULE pg_settings_n AS ON UPDATE TO pg_settings DO INSTEAD NOTHING; - pg_settings | pg_settings_u | CREATE RULE pg_settings_u AS ON UPDATE TO pg_settings WHERE (new.name = old.name) DO SELECT set_config(old.name, new.setting, 'f'::boolean) AS set_config; + pg_settings | pg_settings_u | CREATE RULE pg_settings_u AS ON UPDATE TO pg_settings WHERE (new.name = old.name) DO SELECT set_config(old.name, new.setting, false) AS set_config; rtest_emp | rtest_emp_del | CREATE RULE rtest_emp_del AS ON DELETE TO rtest_emp DO INSERT INTO rtest_emplog (ename, who, "action", newsal, oldsal) VALUES (old.ename, "current_user"(), 'fired '::bpchar, '$0.00'::money, old.salary); rtest_emp | rtest_emp_ins | CREATE RULE rtest_emp_ins AS ON INSERT TO rtest_emp DO INSERT INTO rtest_emplog (ename, who, "action", newsal, oldsal) VALUES (new.ename, "current_user"(), 'hired '::bpchar, new.salary, '$0.00'::money); rtest_emp | rtest_emp_upd | CREATE RULE rtest_emp_upd AS ON UPDATE TO rtest_emp WHERE (new.salary <> old.salary) DO INSERT INTO rtest_emplog (ename, who, "action", newsal, oldsal) VALUES (new.ename, "current_user"(), 'honored '::bpchar, new.salary, old.salary);