* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/dependency.c,v 1.22 2003/02/16 02:30:37 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/dependency.c,v 1.23 2003/03/06 22:54:49 tgl Exp $
*
*-------------------------------------------------------------------------
*/
Relation depRel);
static bool recursiveDeletion(const ObjectAddress *object,
DropBehavior behavior,
+ int msglevel,
const ObjectAddress *callingObject,
ObjectAddresses *oktodelete,
Relation depRel);
static bool deleteDependentObjects(const ObjectAddress *object,
const char *objDescription,
DropBehavior behavior,
+ int msglevel,
ObjectAddresses *oktodelete,
Relation depRel);
static void doDeletion(const ObjectAddress *object);
findAutoDeletableObjects(object, &oktodelete, depRel);
- if (!recursiveDeletion(object, behavior, NULL, &oktodelete, depRel))
+ if (!recursiveDeletion(object, behavior, NOTICE,
+ NULL, &oktodelete, depRel))
elog(ERROR, "Cannot drop %s because other objects depend on it"
"\n\tUse DROP ... CASCADE to drop the dependent objects too",
objDescription);
* CASCADE.
*
* This is currently used only to clean out the contents of a schema
- * (namespace): the passed object is a namespace.
+ * (namespace): the passed object is a namespace. We normally want this
+ * to be done silently, so there's an option to suppress NOTICE messages.
*/
void
-deleteWhatDependsOn(const ObjectAddress *object)
+deleteWhatDependsOn(const ObjectAddress *object,
+ bool showNotices)
{
char *objDescription;
Relation depRel;
* stuff dependent on the given object.
*/
if (!deleteDependentObjects(object, objDescription,
- DROP_CASCADE, &oktodelete, depRel))
+ DROP_CASCADE,
+ showNotices ? NOTICE : DEBUG1,
+ &oktodelete, depRel))
elog(ERROR, "Failed to drop all objects depending on %s",
objDescription);
* depRel is the already-open pg_depend relation.
*
*
- * In RESTRICT mode, we perform all the deletions anyway, but elog a NOTICE
+ * In RESTRICT mode, we perform all the deletions anyway, but elog a message
* and return FALSE if we find a restriction violation. performDeletion
* will then abort the transaction to nullify the deletions. We have to
* do it this way to (a) report all the direct and indirect dependencies
static bool
recursiveDeletion(const ObjectAddress *object,
DropBehavior behavior,
+ int msglevel,
const ObjectAddress *callingObject,
ObjectAddresses *oktodelete,
Relation depRel)
getObjectDescription(&owningObject));
else if (behavior == DROP_RESTRICT)
{
- elog(NOTICE, "%s depends on %s",
+ elog(msglevel, "%s depends on %s",
getObjectDescription(&owningObject),
objDescription);
ok = false;
}
else
- elog(NOTICE, "Drop cascades to %s",
+ elog(msglevel, "Drop cascades to %s",
getObjectDescription(&owningObject));
- if (!recursiveDeletion(&owningObject, behavior,
- object,
- oktodelete, depRel))
+ if (!recursiveDeletion(&owningObject, behavior, msglevel,
+ object, oktodelete, depRel))
ok = false;
pfree(objDescription);
* constraint.
*/
if (!deleteDependentObjects(object, objDescription,
- behavior, oktodelete, depRel))
+ behavior, msglevel,
+ oktodelete, depRel))
ok = false;
/*
deleteDependentObjects(const ObjectAddress *object,
const char *objDescription,
DropBehavior behavior,
+ int msglevel,
ObjectAddresses *oktodelete,
Relation depRel)
{
getObjectDescription(&otherObject));
else if (behavior == DROP_RESTRICT)
{
- elog(NOTICE, "%s depends on %s",
+ elog(msglevel, "%s depends on %s",
getObjectDescription(&otherObject),
objDescription);
ok = false;
}
else
- elog(NOTICE, "Drop cascades to %s",
+ elog(msglevel, "Drop cascades to %s",
getObjectDescription(&otherObject));
- if (!recursiveDeletion(&otherObject, behavior,
- object,
- oktodelete, depRel))
+ if (!recursiveDeletion(&otherObject, behavior, msglevel,
+ object, oktodelete, depRel))
ok = false;
break;
case DEPENDENCY_AUTO:
elog(DEBUG1, "Drop auto-cascades to %s",
getObjectDescription(&otherObject));
- if (!recursiveDeletion(&otherObject, behavior,
- object,
- oktodelete, depRel))
+ if (!recursiveDeletion(&otherObject, behavior, msglevel,
+ object, oktodelete, depRel))
ok = false;
break;
case DEPENDENCY_PIN: