From 232d8fa3c47f9392cd1ad5112e032fafca0e950c Mon Sep 17 00:00:00 2001 From: Philip Warner Date: Sat, 14 Apr 2001 13:11:03 +0000 Subject: [PATCH] - Get view OID based on rule OID not base table OID - Fix crash due to null string pointer in some tar files with some libs --- src/bin/pg_dump/pg_backup_archiver.c | 24 +++++++++++++------- src/bin/pg_dump/pg_backup_archiver.h | 4 ++-- src/bin/pg_dump/pg_backup_tar.c | 7 +++--- src/bin/pg_dump/pg_dump.c | 34 ++++++++++++++++++++-------- src/bin/pg_dump/pg_dump.h | 7 +++++- 5 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 0962645344..af98a05dc3 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -15,7 +15,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.23 2001/04/01 05:42:50 pjw Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.24 2001/04/14 13:11:03 pjw Exp $ * * Modifications - 28-Jun-2000 - pjw@rhyme.com.au * @@ -73,7 +73,7 @@ static int _tocSortCompareByOIDNum(const void *p1, const void *p2); static int _tocSortCompareByIDNum(const void *p1, const void *p2); static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt, const int compression, ArchiveMode mode); -static int _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt); +static int _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData); static void _reconnectAsOwner(ArchiveHandle *AH, const char *dbname, TocEntry *te); static void _reconnectAsUser(ArchiveHandle *AH, const char *dbname, char *user); @@ -266,7 +266,7 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt) _reconnectAsOwner(AH, "-", te); ahlog(AH, 1, "Creating %s %s\n", te->desc, te->name); - _printTocEntry(AH, te, ropt); + _printTocEntry(AH, te, ropt, false); /* If we created a DB, connect to it... */ if (strcmp(te->desc, "DATABASE") == 0) @@ -286,8 +286,7 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt) die_horribly(AH, "%s: Unable to restore data from a compressed archive\n", progname); #endif - ahprintf(AH, "--\n-- Data for TOC Entry ID %d (OID %s) %s %s\n--\n\n", - te->id, te->oid, te->desc, te->name); + _printTocEntry(AH, te, ropt, true); /* * Maybe we can't do BLOBS, so check if this node is for BLOBS @@ -1869,10 +1868,19 @@ _reconnectAsOwner(ArchiveHandle *AH, const char *dbname, TocEntry *te) } static int -_printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt) +_printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isData) { - ahprintf(AH, "--\n-- TOC Entry ID %d (OID %s)\n--\n-- Name: %s Type: %s Owner: %s\n", - te->id, te->oid, te->name, te->desc, te->owner); + char *pfx; + + if (isData) + { + pfx = "Data for "; + } else { + pfx = ""; + } + + ahprintf(AH, "--\n-- %sTOC Entry ID %d (OID %s)\n--\n-- Name: %s Type: %s Owner: %s\n", + pfx, te->id, te->oid, te->name, te->desc, te->owner); if (AH->PrintExtraTocPtr !=NULL) (*AH->PrintExtraTocPtr) (AH, te); ahprintf(AH, "--\n\n"); diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h index 22e263b7b2..c9206af3b1 100644 --- a/src/bin/pg_dump/pg_backup_archiver.h +++ b/src/bin/pg_dump/pg_backup_archiver.h @@ -17,7 +17,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.30 2001/04/04 06:47:30 pjw Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.31 2001/04/14 13:11:03 pjw Exp $ * * Modifications - 28-Jun-2000 - pjw@rhyme.com.au * - Initial version. @@ -68,7 +68,7 @@ typedef z_stream *z_streamp; #define K_VERS_MAJOR 1 #define K_VERS_MINOR 5 -#define K_VERS_REV 2 +#define K_VERS_REV 3 /* Data block types */ #define BLK_DATA 1 diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index 67d7f14697..93afbefb54 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -16,7 +16,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.13 2001/04/01 05:42:51 pjw Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_tar.c,v 1.14 2001/04/14 13:11:03 pjw Exp $ * * Modifications - 28-Jun-2000 - pjw@rhyme.com.au * @@ -246,7 +246,7 @@ _ArchiveEntry(ArchiveHandle *AH, TocEntry *te) char fn[K_STD_BUF_SIZE]; ctx = (lclTocEntry *) malloc(sizeof(lclTocEntry)); - if (te->dataDumper) + if (te->dataDumper != NULL) { #ifdef HAVE_LIBZ if (AH->compression == 0) @@ -302,7 +302,8 @@ _PrintExtraToc(ArchiveHandle *AH, TocEntry *te) { lclTocEntry *ctx = (lclTocEntry *) te->formatData; - ahprintf(AH, "-- File: %s\n", ctx->filename); + if (ctx->filename != NULL) + ahprintf(AH, "-- File: %s\n", ctx->filename); } static void diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index d4c009e544..af8a8bc3ca 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.201 2001/04/05 02:50:01 tgl Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.202 2001/04/14 13:11:03 pjw Exp $ * * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb * @@ -2035,9 +2035,14 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs) PGresult *res2; resetPQExpBuffer(query); - appendPQExpBuffer(query, "SELECT pg_get_viewdef("); + appendPQExpBuffer(query, "SELECT definition as viewdef, "); + /* XXX 7.2 - replace with att from pg_views or some other generic source */ + appendPQExpBuffer(query, "(select oid from pg_rewrite where rulename='_RET'" + " || viewname) as view_oid from pg_views" + " where viewname = "); formatStringLiteral(query, tblinfo[i].relname, CONV_ALL); - appendPQExpBuffer(query, ") as viewdef"); + appendPQExpBuffer(query, ";"); + res2 = PQexec(g_conn, query->data); if (!res2 || PQresultStatus(res2) != PGRES_TUPLES_OK) { @@ -2051,18 +2056,26 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs) { if (PQntuples(res2) < 1) { - fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned no definitions", + fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned no definitions\n", tblinfo[i].relname); } else { - fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned more than 1 definition", + fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned more than 1 definition\n", tblinfo[i].relname); } exit_nicely(g_conn); } + if (PQgetisnull(res2, 0, 1)) + { + fprintf(stderr, "getTables(): SELECT (for VIEW %s) returned NULL oid\n", tblinfo[i].relname); + fprintf(stderr, "SELECT was: %s\n", query->data); + exit_nicely(g_conn); + } + tblinfo[i].viewdef = strdup(PQgetvalue(res2, 0, 0)); + tblinfo[i].viewoid = strdup(PQgetvalue(res2, 0, 1)); if (strlen(tblinfo[i].viewdef) == 0) { @@ -3739,6 +3752,7 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables, int numParents; int actual_atts; /* number of attrs in this CREATE statment */ char *reltypename; + char *objoid; /* First - dump SEQUENCEs */ if (tablename && strlen(tablename) > 0) @@ -3778,15 +3792,15 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables, if (tblinfo[i].viewdef != NULL) { reltypename = "VIEW"; - + objoid = tblinfo[i].viewoid; appendPQExpBuffer(delq, "DROP VIEW %s;\n", fmtId(tblinfo[i].relname, force_quotes)); - appendPQExpBuffer(q, "CREATE VIEW %s as %s", fmtId(tblinfo[i].relname, force_quotes), tblinfo[i].viewdef); + appendPQExpBuffer(q, "CREATE VIEW %s as %s\n", fmtId(tblinfo[i].relname, force_quotes), tblinfo[i].viewdef); } else { reltypename = "TABLE"; - + objoid = tblinfo[i].oid; parentRels = tblinfo[i].parentRels; numParents = tblinfo[i].numParents; @@ -3883,7 +3897,7 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables, if (!dataOnly) { - ArchiveEntry(fout, tblinfo[i].oid, tblinfo[i].relname, + ArchiveEntry(fout, objoid, tblinfo[i].relname, reltypename, NULL, q->data, delq->data, "", tblinfo[i].usename, NULL, NULL); @@ -4323,7 +4337,7 @@ findLastBuiltinOid(const char *dbname) if (res == NULL || PQresultStatus(res) != PGRES_TUPLES_OK) { - fprintf(stderr, "pg_dump: error in finding the last system OID"); + fprintf(stderr, "pg_dump: error in finding the last system OID. "); fprintf(stderr, "Explanation from backend: '%s'.\n", PQerrorMessage(g_conn)); exit_nicely(g_conn); } diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 8069a8f779..b10d40876d 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.61 2001/04/03 08:52:59 pjw Exp $ + * $Id: pg_dump.h,v 1.62 2001/04/14 13:11:03 pjw Exp $ * * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2 * @@ -88,6 +88,11 @@ typedef struct _tableInfo char *relname; char *relacl; char *viewdef; + char *viewoid; /* OID of view - should be >= oid of table + * important because views may be constructed + * manually from rules, and rule may ref things + * created after the base table was created. + */ bool sequence; int numatts; /* number of attributes */ int *inhAttrs; /* an array of flags, one for each -- 2.40.0