From 232d8fa3c47f9392cd1ad5112e032fafca0e950c Mon Sep 17 00:00:00 2001
From: Philip Warner <pjw@rhyme.com.au>
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 09626453441..af98a05dc3c 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 22e263b7b25..c9206af3b10 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 67d7f146977..93afbefb548 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 d4c009e544a..af8a8bc3ca8 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 8069a8f779b..b10d40876d2 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
-- 
GitLab