@ -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 ) ;
}
}
}