]> granicus.if.org Git - postgresql/commitdiff
Move resetting of currSchema to a spot where it's not vulnerable to getting
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 24 Nov 2007 20:26:49 +0000 (20:26 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 24 Nov 2007 20:26:49 +0000 (20:26 +0000)
missed in possible future partial-drop scenarios.  Improve comment.
Per report from Zoltan Boszormenyi.

src/bin/pg_dump/pg_backup_archiver.c

index 32e172b133f55caf6f42292a94a8e00edaa4b04e..a636407431072330ad73e7e60142761a0d6a6c66 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *             $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.150 2007/11/24 17:45:32 momjian Exp $
+ *             $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.151 2007/11/24 20:26:49 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -245,23 +245,24 @@ RestoreArchive(Archive *AHX, RestoreOptions *ropt)
                                _selectOutputSchema(AH, te->namespace);
                                /* Drop it */
                                ahprintf(AH, "%s", te->dropStmt);
-                               if (strcmp(te->desc, "SCHEMA") == 0)
-                               {
-                                       /*
-                                        * If we dropped a schema, we know we are going to be
-                                        * creating one later so don't remember the current one
-                                        * so we try later. The previous 'search_path' setting
-                                        * might have failed because the schema didn't exist
-                                        * (and now it certainly doesn't exist), so force
-                                        * search_path to be set as part of the next operation
-                                        * and it might succeed.
-                                        */
-                                       if (AH->currSchema)
-                                               free(AH->currSchema);
-                                       AH->currSchema = strdup("");
-                               }
                        }
                }
+
+               /*
+                * _selectOutputSchema may have set currSchema to reflect the effect
+                * of a "SET search_path" command it emitted.  However, by now we may
+                * have dropped that schema; or it might not have existed in the first
+                * place.  In either case the effective value of search_path will not
+                * be what we think.  Forcibly reset currSchema so that we will
+                * re-establish the search_path setting when needed (after creating
+                * the schema).
+                *
+                * If we treated users as pg_dump'able objects then we'd need to reset
+                * currUser here too.
+                */
+               if (AH->currSchema)
+                       free(AH->currSchema);
+               AH->currSchema = strdup("");
        }
 
        /*