* 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)
{
}
else
{
- char buffer[40];
- char *mark;
char *dropStmt = pg_strdup(te->dropStmt);
- char *dropStmtPtr = dropStmt;
+ char *dropStmtOrig = dropStmt;
PQExpBuffer ftStmt = createPQExpBuffer();
/*
/*
* 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)
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);
}
}
}