From 8f0ee46dcb9dcf522cfa6475479ac8d67a9078fc Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 3 Aug 2001 19:43:05 +0000 Subject: [PATCH] Fix pg_dump so that comments on views are dumped in the proper sequence. Dump the alignment and storage information for user-defined types (how'd that manage to slip through the cracks?), and don't dump 'shell' types that don't have typisdefined set. Fix badly broken logic for dependencies of type definitions (did not work for more than one user-defined type...). Avoid memory leakage within pg_dump by being more careful to release storage used by PQExpBuffer objects. --- src/bin/pg_dump/pg_backup_db.c | 26 +++- src/bin/pg_dump/pg_dump.c | 220 +++++++++++++++++++++++---------- src/bin/pg_dump/pg_dump.h | 5 +- 3 files changed, 180 insertions(+), 71 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c index 51a05646cd..fc5864bc69 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.21 2001/07/03 20:21:48 petere Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v 1.22 2001/08/03 19:43:05 tgl Exp $ * * NOTES * @@ -207,6 +207,8 @@ UserIsSuperuser(ArchiveHandle *AH, char *user) } PQclear(res); + destroyPQExpBuffer(qry); + return isSuper; } @@ -678,7 +680,7 @@ ExecuteSqlCommandBuf(ArchiveHandle *AH, void *qryv, int bufLen) void FixupBlobRefs(ArchiveHandle *AH, char *tablename) { - PQExpBuffer tblQry = createPQExpBuffer(); + PQExpBuffer tblQry; PGresult *res, *uRes; int i, @@ -688,6 +690,8 @@ FixupBlobRefs(ArchiveHandle *AH, char *tablename) if (strcmp(tablename, BLOB_XREF_TABLE) == 0) return; + tblQry = createPQExpBuffer(); + appendPQExpBuffer(tblQry, "SELECT a.attname FROM pg_class c, pg_attribute a, pg_type t " " WHERE a.attnum > 0 AND a.attrelid = c.oid AND a.atttypid = t.oid " " AND t.typname = 'oid' AND c.relname = '%s';", tablename); @@ -699,10 +703,8 @@ FixupBlobRefs(ArchiveHandle *AH, char *tablename) if ((n = PQntuples(res)) == 0) { - /* We're done */ + /* nothing to do */ ahlog(AH, 1, "no OID type columns in table %s\n", tablename); - PQclear(res); - return; } for (i = 0; i < n; i++) @@ -741,7 +743,7 @@ FixupBlobRefs(ArchiveHandle *AH, char *tablename) } PQclear(res); - + destroyPQExpBuffer(tblQry); } /********** @@ -766,6 +768,8 @@ CreateBlobXrefTable(ArchiveHandle *AH) appendPQExpBuffer(qry, "Create Unique Index %s_ix on %s(oldOid)", BLOB_XREF_TABLE, BLOB_XREF_TABLE); ExecuteSqlCommand(AH, qry, "could not create index on BLOB cross reference table", true); + + destroyPQExpBuffer(qry); } void @@ -776,6 +780,8 @@ InsertBlobXref(ArchiveHandle *AH, int old, int new) appendPQExpBuffer(qry, "Insert Into %s(oldOid, newOid) Values (%d, %d);", BLOB_XREF_TABLE, old, new); ExecuteSqlCommand(AH, qry, "could not create BLOB cross reference entry", true); + + destroyPQExpBuffer(qry); } void @@ -787,6 +793,8 @@ StartTransaction(ArchiveHandle *AH) ExecuteSqlCommand(AH, qry, "could not start database transaction", false); AH->txActive = true; + + destroyPQExpBuffer(qry); } void @@ -799,6 +807,8 @@ StartTransactionXref(ArchiveHandle *AH) ExecuteSqlCommand(AH, qry, "could not start transaction for BLOB cross references", true); AH->blobTxActive = true; + + destroyPQExpBuffer(qry); } void @@ -810,6 +820,8 @@ CommitTransaction(ArchiveHandle *AH) ExecuteSqlCommand(AH, qry, "could not commit database transaction", false); AH->txActive = false; + + destroyPQExpBuffer(qry); } void @@ -821,4 +833,6 @@ CommitTransactionXref(ArchiveHandle *AH) ExecuteSqlCommand(AH, qry, "could not commit transaction for BLOB cross references", true); AH->blobTxActive = false; + + destroyPQExpBuffer(qry); } diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 1a18bb223c..c2bcbce445 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.216 2001/07/29 22:12:23 tgl Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.217 2001/08/03 19:43:05 tgl Exp $ * * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb * @@ -182,7 +182,8 @@ typedef enum _formatLiteralOptions /* only checks for 'opts == CONV_ALL' anyway. */ } formatLiteralOptions; -static void dumpComment(Archive *outfile, const char *target, const char *oid); +static void dumpComment(Archive *outfile, const char *target, const char *oid, + const char *((*deps)[])); static void dumpSequence(Archive *fout, TableInfo tbinfo, const bool schemaOnly, const bool dataOnly); static void dumpACL(Archive *fout, TableInfo tbinfo); static void dumpTriggers(Archive *fout, const char *tablename, @@ -571,6 +572,7 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv) archprintf(fout, ");\n"); } PQclear(res); + destroyPQExpBuffer(q); return 1; } @@ -1202,6 +1204,10 @@ dumpDatabase(Archive *AH) PQclear(res); + destroyPQExpBuffer(dbQry); + destroyPQExpBuffer(delQry); + destroyPQExpBuffer(creaQry); + return 1; } @@ -1298,6 +1304,9 @@ dumpBlobs(Archive *AH, char *junkOid, void *junkVal) } } while (PQntuples(res) > 0); + destroyPQExpBuffer(oidQry); + destroyPQExpBuffer(oidFetchQry); + return 1; } @@ -1331,7 +1340,10 @@ getTypes(int *numTypes) int i_typdelim; int i_typdefault; int i_typrelid; + int i_typalign; + int i_typstorage; int i_typbyval; + int i_typisdefined; int i_usename; int i_typedefn; @@ -1340,9 +1352,7 @@ getTypes(int *numTypes) /* * we include even the built-in types because those may be used as * array elements by user-defined types - */ - - /* + * * we filter out the built-in types when we dump out the types */ @@ -1350,14 +1360,14 @@ getTypes(int *numTypes) { appendPQExpBuffer(query, "SELECT pg_type.oid, typowner, typname, typlen, typprtlen, " "typinput, typoutput, typreceive, typsend, typelem, typdelim, " - "typdefault, typrelid, typbyval, " + "typdefault, typrelid, typalign, 'p'::char as typstorage, typbyval, typisdefined, " "(select usename from pg_user where typowner = usesysid) as usename, " "typname as typedefn " "from pg_type"); } else { appendPQExpBuffer(query, "SELECT pg_type.oid, typowner, typname, typlen, typprtlen, " "typinput, typoutput, typreceive, typsend, typelem, typdelim, " - "typdefault, typrelid, typbyval, " + "typdefault, typrelid, typalign, typstorage, typbyval, typisdefined, " "(select usename from pg_user where typowner = usesysid) as usename, " "format_type(pg_type.oid, NULL) as typedefn " "from pg_type"); @@ -1388,7 +1398,10 @@ getTypes(int *numTypes) i_typdelim = PQfnumber(res, "typdelim"); i_typdefault = PQfnumber(res, "typdefault"); i_typrelid = PQfnumber(res, "typrelid"); + i_typalign = PQfnumber(res, "typalign"); + i_typstorage = PQfnumber(res, "typstorage"); i_typbyval = PQfnumber(res, "typbyval"); + i_typisdefined = PQfnumber(res, "typisdefined"); i_usename = PQfnumber(res, "usename"); i_typedefn = PQfnumber(res, "typedefn"); @@ -1407,6 +1420,8 @@ getTypes(int *numTypes) tinfo[i].typdelim = strdup(PQgetvalue(res, i, i_typdelim)); tinfo[i].typdefault = strdup(PQgetvalue(res, i, i_typdefault)); tinfo[i].typrelid = strdup(PQgetvalue(res, i, i_typrelid)); + tinfo[i].typalign = strdup(PQgetvalue(res, i, i_typalign)); + tinfo[i].typstorage = strdup(PQgetvalue(res, i, i_typstorage)); tinfo[i].usename = strdup(PQgetvalue(res, i, i_usename)); tinfo[i].typedefn = strdup(PQgetvalue(res, i, i_typedefn)); @@ -1427,12 +1442,19 @@ getTypes(int *numTypes) tinfo[i].isArray = 1; else tinfo[i].isArray = 0; + + if (strcmp(PQgetvalue(res, i, i_typisdefined), "f") == 0) + tinfo[i].isDefined = 0; + else + tinfo[i].isDefined = 1; } *numTypes = ntups; PQclear(res); + destroyPQExpBuffer(query); + return tinfo; } @@ -1534,6 +1556,8 @@ getOperators(int *numOprs) PQclear(res); + destroyPQExpBuffer(query); + return oprinfo; } @@ -1570,8 +1594,14 @@ clearTypeInfo(TypeInfo *tp, int numTypes) free(tp[i].typdefault); if (tp[i].typrelid) free(tp[i].typrelid); + if (tp[i].typalign) + free(tp[i].typalign); + if (tp[i].typstorage) + free(tp[i].typstorage); if (tp[i].usename) free(tp[i].usename); + if (tp[i].typedefn) + free(tp[i].typedefn); } free(tp); } @@ -1893,6 +1923,8 @@ getAggregates(int *numAggs) PQclear(res); + destroyPQExpBuffer(query); + return agginfo; } @@ -2014,8 +2046,9 @@ getFuncs(int *numFuncs) PQclear(res); - return finfo; + destroyPQExpBuffer(query); + return finfo; } /* @@ -2610,8 +2643,10 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs) PQclear(res); - return tblinfo; + destroyPQExpBuffer(query); + destroyPQExpBuffer(delqry); + return tblinfo; } /* @@ -2664,6 +2699,9 @@ getInherits(int *numInherits) } PQclear(res); + + destroyPQExpBuffer(query); + return inhinfo; } @@ -2695,7 +2733,6 @@ getTableAttrs(TableInfo *tblinfo, int numTables) for (i = 0; i < numTables; i++) { - if (tblinfo[i].sequence) continue; @@ -2831,6 +2868,8 @@ getTableAttrs(TableInfo *tblinfo, int numTables) } PQclear(res); } + + destroyPQExpBuffer(q); } @@ -2937,6 +2976,9 @@ getIndexes(int *numIndexes) indinfo[i].indhaspred = strdup(PQgetvalue(res, i, i_indhaspred)); } PQclear(res); + + destroyPQExpBuffer(query); + return indinfo; } @@ -2947,16 +2989,17 @@ getIndexes(int *numIndexes) * oid handed to this routine. The routine takes a constant character * string for the target part of the object and the oid of the object * whose comments are to be dumped. It is perfectly acceptable - * to hand an oid to this routine which has not been commented. In - * addition, the routine takes the stdio FILE handle to which the - * output should be written. + * to hand an oid to this routine which has not been commented. Additional + * dependencies can be passed for the comment, too --- this is needed for + * VIEWs, whose comments are filed under the table OID but which are dumped + * in order by their rule OID. *------------------------------------------------------------------ */ static void -dumpComment(Archive *fout, const char *target, const char *oid) +dumpComment(Archive *fout, const char *target, const char *oid, + const char *((*deps)[])) { - PGresult *res; PQExpBuffer query; int i_description; @@ -2991,7 +3034,8 @@ dumpComment(Archive *fout, const char *target, const char *oid) formatStringLiteral(query, PQgetvalue(res, 0, i_description), PASS_LFTAB); appendPQExpBuffer(query, ";\n"); - ArchiveEntry(fout, oid, target, "COMMENT", NULL, query->data, "" /* Del */ , + ArchiveEntry(fout, oid, target, "COMMENT", deps, + query->data, "" /* Del */ , "" /* Copy */ , "" /* Owner */ , NULL, NULL); } @@ -2999,7 +3043,7 @@ dumpComment(Archive *fout, const char *target, const char *oid) /*** Clear the statement buffer and return ***/ PQclear(res); - + destroyPQExpBuffer(query); } /*------------------------------------------------------------------ @@ -3015,7 +3059,6 @@ dumpComment(Archive *fout, const char *target, const char *oid) void dumpDBComment(Archive *fout) { - PGresult *res; PQExpBuffer query; int i_oid; @@ -3043,13 +3086,13 @@ dumpDBComment(Archive *fout) i_oid = PQfnumber(res, "oid"); resetPQExpBuffer(query); appendPQExpBuffer(query, "DATABASE %s", fmtId(PQdb(g_conn), force_quotes)); - dumpComment(fout, query->data, PQgetvalue(res, 0, i_oid)); + dumpComment(fout, query->data, PQgetvalue(res, 0, i_oid), NULL); } /*** Clear the statement buffer and return ***/ PQclear(res); - + destroyPQExpBuffer(query); } /* @@ -3066,13 +3109,10 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs, PQExpBuffer delq = createPQExpBuffer(); int funcInd; const char *((*deps)[]); - int depIdx = 0; - - deps = malloc(sizeof(char*) * 10); + int depIdx; for (i = 0; i < numTypes; i++) { - /* skip all the builtin types */ if (atooid(tinfo[i].oid) <= g_last_builtin_oid) continue; @@ -3081,11 +3121,18 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs, if (atoi(tinfo[i].typrelid) != 0) continue; + /* skip undefined placeholder types */ + if (!tinfo[i].isDefined) + continue; + /* skip all array types that start w/ underscore */ if ((tinfo[i].typname[0] == '_') && (strcmp(tinfo[i].typinput, "array_in") == 0)) continue; + deps = malloc(sizeof(char*) * 10); + depIdx = 0; + /* * before we create a type, we need to create the input and output * functions for it, if they haven't been created already @@ -3104,6 +3151,7 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs, dumpOneFunc(fout, finfo, funcInd, tinfo, numTypes); } + resetPQExpBuffer(delq); appendPQExpBuffer(delq, "DROP TYPE %s;\n", fmtId(tinfo[i].typname, force_quotes)); resetPQExpBuffer(q); @@ -3133,8 +3181,6 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs, { write_msg(NULL, "notice: array type %s - type for elements (oid %s) is not dumped\n", tinfo[i].typname, tinfo[i].typelem); - resetPQExpBuffer(q); - resetPQExpBuffer(delq); continue; } @@ -3143,8 +3189,24 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs, (*deps)[depIdx++] = strdup(tinfo[i].typelem); } + + /* XXX these are all the aligns currently handled by DefineType */ + if (strcmp(tinfo[i].typalign, "i") == 0) + appendPQExpBuffer(q, ", alignment = int4"); + else if (strcmp(tinfo[i].typalign, "d") == 0) + appendPQExpBuffer(q, ", alignment = double"); + + if (strcmp(tinfo[i].typstorage, "p") == 0) + appendPQExpBuffer(q, ", storage = plain"); + if (strcmp(tinfo[i].typstorage, "e") == 0) + appendPQExpBuffer(q, ", storage = external"); + if (strcmp(tinfo[i].typstorage, "x") == 0) + appendPQExpBuffer(q, ", storage = extended"); + if (strcmp(tinfo[i].typstorage, "m") == 0) + appendPQExpBuffer(q, ", storage = main"); + if (tinfo[i].passedbyvalue) - appendPQExpBuffer(q, ",passedbyvalue);\n"); + appendPQExpBuffer(q, ", passedbyvalue);\n"); else appendPQExpBuffer(q, ");\n"); @@ -3156,13 +3218,13 @@ dumpTypes(Archive *fout, FuncInfo *finfo, int numFuncs, /*** Dump Type Comments ***/ resetPQExpBuffer(q); - resetPQExpBuffer(delq); appendPQExpBuffer(q, "TYPE %s", fmtId(tinfo[i].typname, force_quotes)); - dumpComment(fout, q->data, tinfo[i].oid); - - resetPQExpBuffer(q); + dumpComment(fout, q->data, tinfo[i].oid, NULL); } + + destroyPQExpBuffer(q); + destroyPQExpBuffer(delq); } /* @@ -3258,6 +3320,9 @@ dumpProcLangs(Archive *fout, FuncInfo *finfo, int numFuncs, PQclear(res); + destroyPQExpBuffer(query); + destroyPQExpBuffer(defqry); + destroyPQExpBuffer(delqry); } /* @@ -3290,11 +3355,11 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i, PQExpBuffer fn = createPQExpBuffer(); PQExpBuffer delqry = createPQExpBuffer(); PQExpBuffer fnlist = createPQExpBuffer(); - int j; PQExpBuffer asPart = createPQExpBuffer(); char func_lang[NAMEDATALEN + 1]; PGresult *res; int nlangs; + int j; int i_lanname; char query[256]; @@ -3304,9 +3369,9 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i, char *rettypename; if (finfo[i].dumped) - return; - else - finfo[i].dumped = 1; + goto done; + + finfo[i].dumped = 1; /* becomeUser(fout, finfo[i].usename); */ @@ -3370,12 +3435,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i, write_msg(NULL, "reason: data type name of argument %d (oid %s) not found\n", j, finfo[i].argtypes[j]); - resetPQExpBuffer(q); - resetPQExpBuffer(fn); - resetPQExpBuffer(delqry); - resetPQExpBuffer(fnlist); - resetPQExpBuffer(asPart); - return; + goto done; } appendPQExpBuffer(fn, "%s%s", @@ -3399,12 +3459,7 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i, write_msg(NULL, "reason: name of return data type (oid %s) not found\n", finfo[i].prorettype); - resetPQExpBuffer(q); - resetPQExpBuffer(fn); - resetPQExpBuffer(delqry); - resetPQExpBuffer(fnlist); - resetPQExpBuffer(asPart); - return; + goto done; } resetPQExpBuffer(q); @@ -3445,8 +3500,14 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i, appendPQExpBuffer(q, "FUNCTION %s ", fmtId(finfo[i].proname, force_quotes)); appendPQExpBuffer(q, "( %s )", fnlist->data); - dumpComment(fout, q->data, finfo[i].oid); - + dumpComment(fout, q->data, finfo[i].oid, NULL); + +done: + destroyPQExpBuffer(q); + destroyPQExpBuffer(fn); + destroyPQExpBuffer(delqry); + destroyPQExpBuffer(fnlist); + destroyPQExpBuffer(asPart); } /* @@ -3617,6 +3678,17 @@ dumpOprs(Archive *fout, OprInfo *oprinfo, int numOperators, ArchiveEntry(fout, oprinfo[i].oid, oprinfo[i].oprname, "OPERATOR", NULL, q->data, delq->data, "", oprinfo[i].usename, NULL, NULL); } + + destroyPQExpBuffer(q); + destroyPQExpBuffer(delq); + destroyPQExpBuffer(leftarg); + destroyPQExpBuffer(rightarg); + destroyPQExpBuffer(commutator); + destroyPQExpBuffer(negator); + destroyPQExpBuffer(restrictor); + destroyPQExpBuffer(join); + destroyPQExpBuffer(sort1); + destroyPQExpBuffer(sort2); } /* @@ -3723,9 +3795,13 @@ dumpAggs(Archive *fout, AggInfo *agginfo, int numAggs, resetPQExpBuffer(q); appendPQExpBuffer(q, "AGGREGATE %s %s", agginfo[i].aggname, findTypeByOid(tinfo, numTypes, agginfo[i].aggbasetype, zeroAsOpaque + useBaseTypeName)); - dumpComment(fout, q->data, agginfo[i].oid); - + dumpComment(fout, q->data, agginfo[i].oid, NULL); } + + destroyPQExpBuffer(q); + destroyPQExpBuffer(delq); + destroyPQExpBuffer(aggSig); + destroyPQExpBuffer(details); } /* @@ -3981,6 +4057,7 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables, int actual_atts; /* number of attrs in this CREATE statment */ char *reltypename; char *objoid; + const char *((*commentDeps)[]); /* First - dump SEQUENCEs */ if (tablename && strlen(tablename) > 0) @@ -4023,12 +4100,15 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables, objoid = tblinfo[i].viewoid; appendPQExpBuffer(delq, "DROP VIEW %s;\n", fmtId(tblinfo[i].relname, force_quotes)); appendPQExpBuffer(q, "CREATE VIEW %s as %s\n", fmtId(tblinfo[i].relname, force_quotes), tblinfo[i].viewdef); - + commentDeps = malloc(sizeof(char*) * 2); + (*commentDeps)[0] = strdup(objoid); + (*commentDeps)[1] = NULL; /* end of list */ } else { reltypename = "TABLE"; objoid = tblinfo[i].oid; + commentDeps = NULL; parentRels = tblinfo[i].parentRels; numParents = tblinfo[i].numParents; @@ -4148,17 +4228,20 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables, appendPQExpBuffer(q, "COLUMN %s", fmtId(tblinfo[i].relname, force_quotes)); appendPQExpBuffer(q, "."); appendPQExpBuffer(q, "%s", fmtId(tblinfo[i].attnames[j], force_quotes)); - dumpComment(fout, q->data, tblinfo[i].attoids[j]); + dumpComment(fout, q->data, tblinfo[i].attoids[j], NULL); } /* Dump Table Comments */ resetPQExpBuffer(q); appendPQExpBuffer(q, "%s %s", reltypename, fmtId(tblinfo[i].relname, force_quotes)); - dumpComment(fout, q->data, tblinfo[i].oid); + dumpComment(fout, q->data, tblinfo[i].oid, commentDeps); } } + + destroyPQExpBuffer(q); + destroyPQExpBuffer(delq); } static PQExpBuffer @@ -4237,16 +4320,15 @@ dumpIndexes(Archive *fout, IndInfo *indinfo, int numIndexes, k; int tableInd; PQExpBuffer attlist = createPQExpBuffer(); + PQExpBuffer q = createPQExpBuffer(); + PQExpBuffer delq = createPQExpBuffer(); + PQExpBuffer id1 = createPQExpBuffer(); + PQExpBuffer id2 = createPQExpBuffer(); char *classname[INDEX_MAX_KEYS]; char *funcname; /* the name of the function to comput the * index key from */ int indclass; int nclass; - - PQExpBuffer q = createPQExpBuffer(), - delq = createPQExpBuffer(), - id1 = createPQExpBuffer(), - id2 = createPQExpBuffer(); PGresult *res; for (i = 0; i < numIndexes; i++) @@ -4475,11 +4557,16 @@ dumpIndexes(Archive *fout, IndInfo *indinfo, int numIndexes, /* Dump Index Comments */ resetPQExpBuffer(q); appendPQExpBuffer(q, "INDEX %s", id1->data); - dumpComment(fout, q->data, indinfo[i].indexreloid); + dumpComment(fout, q->data, indinfo[i].indexreloid, NULL); } } + destroyPQExpBuffer(attlist); + destroyPQExpBuffer(q); + destroyPQExpBuffer(delq); + destroyPQExpBuffer(id1); + destroyPQExpBuffer(id2); } /* @@ -4640,6 +4727,7 @@ findLastBuiltinOid_V71(const char *dbname) } last_oid = atooid(PQgetvalue(res, 0, PQfnumber(res, "datlastsysoid"))); PQclear(res); + destroyPQExpBuffer(query); return last_oid; } @@ -4722,7 +4810,6 @@ dumpSequence(Archive *fout, TableInfo tbinfo, const bool schemaOnly, const bool exit_nicely(); } - last = atoi(PQgetvalue(res, 0, 1)); incby = atoi(PQgetvalue(res, 0, 2)); maxv = atoi(PQgetvalue(res, 0, 3)); @@ -4779,8 +4866,11 @@ dumpSequence(Archive *fout, TableInfo tbinfo, const bool schemaOnly, const bool resetPQExpBuffer(query); appendPQExpBuffer(query, "SEQUENCE %s", fmtId(tbinfo.relname, force_quotes)); - dumpComment(fout, query->data, tbinfo.oid); + dumpComment(fout, query->data, tbinfo.oid, NULL); } + + destroyPQExpBuffer(query); + destroyPQExpBuffer(delqry); } @@ -4804,7 +4894,7 @@ dumpTriggers(Archive *fout, const char *tablename, ArchiveEntry(fout, tblinfo[i].triggers[j].oid, tblinfo[i].triggers[j].tgname, "TRIGGER", NULL, tblinfo[i].triggers[j].tgsrc, "", "", tblinfo[i].usename, NULL, NULL); - dumpComment(fout, tblinfo[i].triggers[j].tgcomment, tblinfo[i].triggers[j].oid); + dumpComment(fout, tblinfo[i].triggers[j].tgcomment, tblinfo[i].triggers[j].oid, NULL); } } } @@ -4883,10 +4973,12 @@ dumpRules(Archive *fout, const char *tablename, resetPQExpBuffer(query); appendPQExpBuffer(query, "RULE %s", fmtId(PQgetvalue(res, i, i_rulename), force_quotes)); - dumpComment(fout, query->data, PQgetvalue(res, i, i_oid)); + dumpComment(fout, query->data, PQgetvalue(res, i, i_oid), NULL); } PQclear(res); } + + destroyPQExpBuffer(query); } diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 180b7f87ef..5ddbcf3631 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-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: pg_dump.h,v 1.67 2001/07/17 00:30:35 tgl Exp $ + * $Id: pg_dump.h,v 1.68 2001/08/03 19:43:05 tgl Exp $ * * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2 * @@ -49,10 +49,13 @@ typedef struct _typeInfo char *typdelim; char *typdefault; char *typrelid; + char *typalign; + char *typstorage; char *usename; char *typedefn; int passedbyvalue; int isArray; + int isDefined; } TypeInfo; typedef struct _funcInfo -- 2.40.0