]> granicus.if.org Git - postgresql/commitdiff
Adjust lo type in contrib during pg_restore so that pg_restore could
authorHiroshi Inoue <inoue@tpf.co.jp>
Fri, 3 Jan 2003 18:05:02 +0000 (18:05 +0000)
committerHiroshi Inoue <inoue@tpf.co.jp>
Fri, 3 Jan 2003 18:05:02 +0000 (18:05 +0000)
reload the type.

src/bin/pg_dump/pg_backup_archiver.c

index 3fa0b904ecc87714d31f49dc710f63b2ed3938b5..e978edb17ed8b544c0325db5b1ca32e6f353685c 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.63 2002/11/23 03:59:08 momjian Exp $
+ *             $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.64 2003/01/03 18:05:02 inoue Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -122,6 +122,85 @@ CloseArchive(Archive *AHX)
                die_horribly(AH, modulename, "could not close the output file in CloseArchive\n");
 }
 
+/*
+ *      Adjust lo type in contrib for 7.3 or later.
+ *     There must be a cast between lo and oid.        
+ */
+static void
+Adjust_lo_type(ArchiveHandle *AH)
+{
+       PGresult   *res;
+
+       /*
+        *      The cast function lo(oid) should be immutable.
+        *      If it's volatile it should be changed to
+        *      be immutable and the cast (oid as lo)
+        *      should be created. 
+        */
+       res = PQexec(AH->blobConnection, "begin;"
+                       "update pg_proc set provolatile = 'i'"
+                       " where proname = 'lo'"
+                       " and pronargs = 1"
+                       " and provolatile = 'v'"
+                       " and prorettype in (select oid from pg_type where typname = 'lo')"
+                       " and proargtypes[0] in (select oid from pg_type where typname = 'oid')");
+
+       if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+               die_horribly(AH, modulename, "could not adjust lo(oid) function");
+       if (strcmp(PQcmdTuples(res), "1") == 0)
+       {
+               PQclear(res);
+               /* create cast */
+               res = PQexec(AH->blobConnection, "create cast"
+                       " (oid as lo) with function lo(oid) as implicit;commit");
+               if (!res)
+                       die_horribly(AH, modulename, "couldn't create cast (oid as lo)");
+       }
+       else
+       {
+               PQclear(res);
+               /* The change is needless */
+               res = PQexec(AH->blobConnection, "rollback");
+               if (!res)
+                       die_horribly(AH, modulename, "rollback error");
+       }
+       PQclear(res);
+
+       /*      
+        *      The cast function oid(lo) should be immutable.
+        *      If it's volatile it should be changed to
+        *      be immutable and the cast (lo as oid)
+        *      should be created. 
+        */
+       res = PQexec(AH->blobConnection, "begin;"
+                       "update pg_proc set provolatile = 'i'"
+                       " where proname = 'oid'"
+                       " and provolatile = 'v'"
+                       " and pronargs = 1"
+                       " and prorettype in (select oid from pg_type where typname = 'oid')"
+                       " and proargtypes[0] in (select oid from pg_type where typname = 'lo')");
+       if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
+               die_horribly(AH, modulename, "could not adjust oid(lo) function");
+       if (strcmp(PQcmdTuples(res), "1") == 0)
+       {
+               PQclear(res);
+               /* create cast */
+               res = PQexec(AH->blobConnection, "create cast"
+                       " (lo as oid) with function oid(lo) as implicit;commit");
+               if (!res)
+                       die_horribly(AH, modulename, "couldn't create cast (lo as oid)");
+       }
+       else
+       {
+               PQclear(res);
+               /* the change is needless */
+               res = PQexec(AH->blobConnection, "rollback");
+               if (!res)
+                       die_horribly(AH, modulename, "rollback error");
+       }
+       PQclear(res);
+}
+
 /* Public */
 void
 RestoreArchive(Archive *AHX, RestoreOptions *ropt)
@@ -357,6 +436,7 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
                /* NULL parameter means disable ALL user triggers */
                _disableTriggersIfNecessary(AH, NULL, ropt);
 
+               Adjust_lo_type(AH);
                te = AH->toc->next;
                while (te != AH->toc)
                {