diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 1fc7f10b2d2..b89bd99e49f 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -521,7 +521,6 @@ RestoreArchive(Archive *AHX) * knows how to do it, without depending on * te->dropStmt; use that. For other objects we need * to parse the command. - * */ if (strncmp(te->desc, "BLOB", 4) == 0) { @@ -529,10 +528,8 @@ RestoreArchive(Archive *AHX) } else { - char buffer[40]; - char *mark; char *dropStmt = pg_strdup(te->dropStmt); - char *dropStmtPtr = dropStmt; + char *dropStmtOrig = dropStmt; PQExpBuffer ftStmt = createPQExpBuffer(); /* @@ -549,18 +546,28 @@ RestoreArchive(Archive *AHX) /* * ALTER TABLE..ALTER COLUMN..DROP DEFAULT does * not support the IF EXISTS clause, and therefore - * we simply emit the original command for such - * objects. For other objects, we need to extract - * the first part of the DROP which includes the - * object type. Most of the time this matches + * we simply emit the original command for DEFAULT + * objects (modulo the adjustment made above). + * + * If we used CREATE OR REPLACE VIEW as a means of + * quasi-dropping an ON SELECT rule, that should + * be emitted unchanged as well. + * + * For other object types, we need to extract the + * first part of the DROP which includes the + * object type. Most of the time this matches * te->desc, so search for that; however for the * different kinds of CONSTRAINTs, we know to * search for hardcoded "DROP CONSTRAINT" instead. */ - if (strcmp(te->desc, "DEFAULT") == 0) + if (strcmp(te->desc, "DEFAULT") == 0 || + strncmp(dropStmt, "CREATE OR REPLACE VIEW", 22) == 0) appendPQExpBufferStr(ftStmt, dropStmt); else { + char buffer[40]; + char *mark; + if (strcmp(te->desc, "CONSTRAINT") == 0 || strcmp(te->desc, "CHECK CONSTRAINT") == 0 || strcmp(te->desc, "FK CONSTRAINT") == 0) @@ -570,19 +577,28 @@ RestoreArchive(Archive *AHX) te->desc); mark = strstr(dropStmt, buffer); - Assert(mark != NULL); - *mark = '\0'; - appendPQExpBuffer(ftStmt, "%s%s IF EXISTS%s", - dropStmt, buffer, - mark + strlen(buffer)); + if (mark) + { + *mark = '\0'; + appendPQExpBuffer(ftStmt, "%s%s IF EXISTS%s", + dropStmt, buffer, + mark + strlen(buffer)); + } + else + { + /* complain and emit unmodified command */ + write_msg(modulename, + "WARNING: could not find where to insert IF EXISTS in statement \"%s\"\n", + dropStmtOrig); + appendPQExpBufferStr(ftStmt, dropStmt); + } } ahprintf(AH, "%s", ftStmt->data); destroyPQExpBuffer(ftStmt); - - pg_free(dropStmtPtr); + pg_free(dropStmtOrig); } } }