Here's a first draft patch for DROP ... IF EXISTS for the remaining cases, namely: LANGUAGE, TABLESPACE, TRIGGER OPERATOR CLASS, FUNCTION, AGGREGATE, OPERATOR, CAST and RULE.

comments welcome - working on tests/docs now.

cheers

andrew
Index: src/backend/commands/aggregatecmds.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/aggregatecmds.c,v
retrieving revision 1.31
diff -c -r1.31 aggregatecmds.c
*** src/backend/commands/aggregatecmds.c	22 Nov 2005 18:17:08 -0000	1.31
--- src/backend/commands/aggregatecmds.c	5 Feb 2006 14:29:51 -0000
***************
*** 180,186 ****
  	else
  		basetypeID = ANYOID;
  
! 	procOid = find_aggregate_func(aggName, basetypeID, false);
  
  	/*
  	 * Find the function tuple, do permissions and validity checks
--- 180,196 ----
  	else
  		basetypeID = ANYOID;
  
! 	procOid = find_aggregate_func(aggName, basetypeID, stmt->missing_ok);
! 
! 	if (stmt->missing_ok &&!OidIsValid(procOid) )
! 	{
! 		ereport(NOTICE,
! 				(errmsg("aggregate %s(%s) does not exist ... skipping",
! 						NameListToString(aggName),
! 						(aggType ? format_type_be(basetypeID): "*" ))));
! 
! 		return;
! 	}
  
  	/*
  	 * Find the function tuple, do permissions and validity checks
Index: src/backend/commands/functioncmds.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v
retrieving revision 1.70
diff -c -r1.70 functioncmds.c
*** src/backend/commands/functioncmds.c	21 Nov 2005 12:49:31 -0000	1.70
--- src/backend/commands/functioncmds.c	5 Feb 2006 14:29:51 -0000
***************
*** 687,693 ****
  	/*
  	 * Find the function, do permissions and validity checks
  	 */
! 	funcOid = LookupFuncNameTypeNames(functionName, argTypes, false);
  
  	tup = SearchSysCache(PROCOID,
  						 ObjectIdGetDatum(funcOid),
--- 687,703 ----
  	/*
  	 * Find the function, do permissions and validity checks
  	 */
! 	funcOid = LookupFuncNameTypeNames(functionName, argTypes, 
! 									  stmt->missing_ok);
! 
! 	if (stmt->missing_ok &&!OidIsValid(funcOid)) 
! 	{
! 		ereport(NOTICE,
! 				(errmsg("function %s(%s) does not exist ... skipping",
! 						NameListToString(functionName),
! 						NameListToString(argTypes))));
! 		return;
! 	}
  
  	tup = SearchSysCache(PROCOID,
  						 ObjectIdGetDatum(funcOid),
***************
*** 1402,1411 ****
  
  	sourcetypeid = LookupTypeName(stmt->sourcetype);
  	if (!OidIsValid(sourcetypeid))
! 		ereport(ERROR,
! 				(errcode(ERRCODE_UNDEFINED_OBJECT),
! 				 errmsg("source data type %s does not exist",
! 						TypeNameToString(stmt->sourcetype))));
  
  	targettypeid = LookupTypeName(stmt->targettype);
  	if (!OidIsValid(targettypeid))
--- 1412,1429 ----
  
  	sourcetypeid = LookupTypeName(stmt->sourcetype);
  	if (!OidIsValid(sourcetypeid))
! 	{
! 		if ( ! stmt->missing_ok )
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_OBJECT),
! 					 errmsg("source data type %s does not exist",
! 							TypeNameToString(stmt->sourcetype))));
! 		else
! 			ereport(NOTICE,
! 					(errmsg("source data type %s does not exist ... skipping",
! 							TypeNameToString(stmt->sourcetype))));
! 		return;
! 	}
  
  	targettypeid = LookupTypeName(stmt->targettype);
  	if (!OidIsValid(targettypeid))
Index: src/backend/commands/opclasscmds.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/opclasscmds.c,v
retrieving revision 1.41
diff -c -r1.41 opclasscmds.c
*** src/backend/commands/opclasscmds.c	13 Jan 2006 18:10:25 -0000	1.41
--- src/backend/commands/opclasscmds.c	5 Feb 2006 14:29:52 -0000
***************
*** 703,724 ****
  	{
  		/* Unqualified opclass name, so search the search path */
  		opcID = OpclassnameGetOpcid(amID, opcname);
  		if (!OidIsValid(opcID))
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_OBJECT),
! 					 errmsg("operator class \"%s\" does not exist for access method \"%s\"",
! 							opcname, stmt->amname)));
  		tuple = SearchSysCache(CLAOID,
  							   ObjectIdGetDatum(opcID),
  							   0, 0, 0);
  	}
  
  	if (!HeapTupleIsValid(tuple))
! 		ereport(ERROR,
! 				(errcode(ERRCODE_UNDEFINED_OBJECT),
! 				 errmsg("operator class \"%s\" does not exist for access method \"%s\"",
! 						NameListToString(stmt->opclassname), stmt->amname)));
  
  	opcID = HeapTupleGetOid(tuple);
  
  	/* Permission check: must own opclass or its namespace */
--- 703,743 ----
  	{
  		/* Unqualified opclass name, so search the search path */
  		opcID = OpclassnameGetOpcid(amID, opcname);
+ 
  		if (!OidIsValid(opcID))
! 		{
! 			if (! stmt -> missing_ok )
! 				ereport(ERROR,
! 						(errcode(ERRCODE_UNDEFINED_OBJECT),
! 						 errmsg("operator class \"%s\" does not exist for access method \"%s\"",
! 								opcname, stmt->amname)));
! 			else
! 				ereport(NOTICE,
! 						(errmsg("operator class \"%s\" does not exist for access method \"%s\"",
! 								opcname, stmt->amname)));
! 
! 			return;
! 		}
! 
  		tuple = SearchSysCache(CLAOID,
  							   ObjectIdGetDatum(opcID),
  							   0, 0, 0);
  	}
  
  	if (!HeapTupleIsValid(tuple))
! 	{
  
+ 		if (! stmt->missing_ok )
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("operator class \"%s\" does not exist for access method \"%s\"",
+ 							NameListToString(stmt->opclassname), stmt->amname)));
+ 		else
+ 			ereport(NOTICE,
+ 					(errmsg("operator class \"%s\" does not exist for access method \"%s\"",
+ 							NameListToString(stmt->opclassname), stmt->amname)));
+ 		return;
+ 	}
  	opcID = HeapTupleGetOid(tuple);
  
  	/* Permission check: must own opclass or its namespace */
Index: src/backend/commands/operatorcmds.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/operatorcmds.c,v
retrieving revision 1.27
diff -c -r1.27 operatorcmds.c
*** src/backend/commands/operatorcmds.c	21 Nov 2005 12:49:31 -0000	1.27
--- src/backend/commands/operatorcmds.c	5 Feb 2006 14:29:52 -0000
***************
*** 211,217 ****
  	ObjectAddress object;
  
  	operOid = LookupOperNameTypeNames(operatorName, typeName1, typeName2,
! 									  false);
  
  	tup = SearchSysCache(OPEROID,
  						 ObjectIdGetDatum(operOid),
--- 211,225 ----
  	ObjectAddress object;
  
  	operOid = LookupOperNameTypeNames(operatorName, typeName1, typeName2,
! 									  stmt->missing_ok);
! 
! 	if (stmt->missing_ok &&!OidIsValid(operOid) )
! 	{
! 		ereport(NOTICE,
! 				(errmsg("operator %s does not exist ... skipping",
! 						NameListToString(operatorName))));
! 		return;
! 	}
  
  	tup = SearchSysCache(OPEROID,
  						 ObjectIdGetDatum(operOid),
Index: src/backend/commands/proclang.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/proclang.c,v
retrieving revision 1.63
diff -c -r1.63 proclang.c
*** src/backend/commands/proclang.c	15 Oct 2005 02:49:15 -0000	1.63
--- src/backend/commands/proclang.c	5 Feb 2006 14:29:53 -0000
***************
*** 396,404 ****
  							 CStringGetDatum(languageName),
  							 0, 0, 0);
  	if (!HeapTupleIsValid(langTup))
! 		ereport(ERROR,
! 				(errcode(ERRCODE_UNDEFINED_OBJECT),
! 				 errmsg("language \"%s\" does not exist", languageName)));
  
  	object.classId = LanguageRelationId;
  	object.objectId = HeapTupleGetOid(langTup);
--- 396,413 ----
  							 CStringGetDatum(languageName),
  							 0, 0, 0);
  	if (!HeapTupleIsValid(langTup))
! 	{
! 		if (! stmt->missing_ok)
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_OBJECT),
! 					 errmsg("language \"%s\" does not exist", languageName)));
! 		else 
! 			ereport(NOTICE,
! 					(errmsg("language \"%s\" does not exist ... skipping", 
! 						   languageName)));
! 
! 		return;
! 	}
  
  	object.classId = LanguageRelationId;
  	object.objectId = HeapTupleGetOid(langTup);
Index: src/backend/commands/tablespace.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/tablespace.c,v
retrieving revision 1.29
diff -c -r1.29 tablespace.c
*** src/backend/commands/tablespace.c	19 Jan 2006 04:45:38 -0000	1.29
--- src/backend/commands/tablespace.c	5 Feb 2006 14:29:53 -0000
***************
*** 403,412 ****
  	tuple = heap_getnext(scandesc, ForwardScanDirection);
  
  	if (!HeapTupleIsValid(tuple))
! 		ereport(ERROR,
! 				(errcode(ERRCODE_UNDEFINED_OBJECT),
! 				 errmsg("tablespace \"%s\" does not exist",
! 						tablespacename)));
  
  	tablespaceoid = HeapTupleGetOid(tuple);
  
--- 403,427 ----
  	tuple = heap_getnext(scandesc, ForwardScanDirection);
  
  	if (!HeapTupleIsValid(tuple))
! 	{
! 		if ( ! stmt->missing_ok )
! 		{
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_OBJECT),
! 					 errmsg("tablespace \"%s\" does not exist",
! 							tablespacename)));
! 		}
! 		else
! 		{
! 			ereport(NOTICE,
! 					(errmsg("tablespace \"%s\" does not exist ... skipping",
! 							tablespacename)));
! 			/* XXX I assume I need one or both of these next two calls */
! 			heap_endscan(scandesc);
! 			heap_close(rel, NoLock);
! 		}
! 		return;
! 	}
  
  	tablespaceoid = HeapTupleGetOid(tuple);
  
Index: src/backend/commands/trigger.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/commands/trigger.c,v
retrieving revision 1.199
diff -c -r1.199 trigger.c
*** src/backend/commands/trigger.c	12 Jan 2006 21:48:52 -0000	1.199
--- src/backend/commands/trigger.c	5 Feb 2006 14:29:56 -0000
***************
*** 450,456 ****
   * DropTrigger - drop an individual trigger by name
   */
  void
! DropTrigger(Oid relid, const char *trigname, DropBehavior behavior)
  {
  	Relation	tgrel;
  	ScanKeyData skey[2];
--- 450,457 ----
   * DropTrigger - drop an individual trigger by name
   */
  void
! DropTrigger(Oid relid, const char *trigname, DropBehavior behavior, 
! 			bool missing_ok)
  {
  	Relation	tgrel;
  	ScanKeyData skey[2];
***************
*** 479,489 ****
  	tup = systable_getnext(tgscan);
  
  	if (!HeapTupleIsValid(tup))
! 		ereport(ERROR,
! 				(errcode(ERRCODE_UNDEFINED_OBJECT),
! 				 errmsg("trigger \"%s\" for table \"%s\" does not exist",
! 						trigname, get_rel_name(relid))));
! 
  	if (!pg_class_ownercheck(relid, GetUserId()))
  		aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,
  					   get_rel_name(relid));
--- 480,500 ----
  	tup = systable_getnext(tgscan);
  
  	if (!HeapTupleIsValid(tup))
! 	{
! 		if (! missing_ok)
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_OBJECT),
! 					 errmsg("trigger \"%s\" for table \"%s\" does not exist",
! 							trigname, get_rel_name(relid))));
! 		else
! 			ereport(NOTICE,
! 					(errmsg("trigger \"%s\" for table \"%s\" does not exist ... skipping",
! 							trigname, get_rel_name(relid))));
! 		/* cleanup */
! 		systable_endscan(tgscan);
! 		heap_close(tgrel, AccessShareLock);
! 		return;
! 	}
  	if (!pg_class_ownercheck(relid, GetUserId()))
  		aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CLASS,
  					   get_rel_name(relid));
Index: src/backend/nodes/copyfuncs.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v
retrieving revision 1.326
diff -c -r1.326 copyfuncs.c
*** src/backend/nodes/copyfuncs.c	4 Feb 2006 19:06:46 -0000	1.326
--- src/backend/nodes/copyfuncs.c	5 Feb 2006 14:29:57 -0000
***************
*** 2052,2057 ****
--- 2052,2058 ----
  	COPY_NODE_FIELD(aggname);
  	COPY_NODE_FIELD(aggtype);
  	COPY_SCALAR_FIELD(behavior);
+ 	COPY_SCALAR_FIELD(missing_ok);
  
  	return newnode;
  }
***************
*** 2064,2069 ****
--- 2065,2071 ----
  	COPY_NODE_FIELD(funcname);
  	COPY_NODE_FIELD(args);
  	COPY_SCALAR_FIELD(behavior);
+ 	COPY_SCALAR_FIELD(missing_ok);
  
  	return newnode;
  }
***************
*** 2076,2081 ****
--- 2078,2084 ----
  	COPY_NODE_FIELD(opname);
  	COPY_NODE_FIELD(args);
  	COPY_SCALAR_FIELD(behavior);
+ 	COPY_SCALAR_FIELD(missing_ok);
  
  	return newnode;
  }
***************
*** 2088,2093 ****
--- 2091,2097 ----
  	COPY_NODE_FIELD(opclassname);
  	COPY_STRING_FIELD(amname);
  	COPY_SCALAR_FIELD(behavior);
+ 	COPY_SCALAR_FIELD(missing_ok);
  
  	return newnode;
  }
***************
*** 2415,2420 ****
--- 2419,2425 ----
  	DropTableSpaceStmt *newnode = makeNode(DropTableSpaceStmt);
  
  	COPY_STRING_FIELD(tablespacename);
+ 	COPY_SCALAR_FIELD(missing_ok);
  
  	return newnode;
  }
***************
*** 2448,2453 ****
--- 2453,2459 ----
  	COPY_STRING_FIELD(property);
  	COPY_SCALAR_FIELD(removeType);
  	COPY_SCALAR_FIELD(behavior);
+ 	COPY_SCALAR_FIELD(missing_ok);
  
  	return newnode;
  }
***************
*** 2472,2477 ****
--- 2478,2484 ----
  
  	COPY_STRING_FIELD(plname);
  	COPY_SCALAR_FIELD(behavior);
+ 	COPY_SCALAR_FIELD(missing_ok);
  
  	return newnode;
  }
***************
*** 2607,2612 ****
--- 2614,2620 ----
  	COPY_NODE_FIELD(sourcetype);
  	COPY_NODE_FIELD(targettype);
  	COPY_SCALAR_FIELD(behavior);
+ 	COPY_SCALAR_FIELD(missing_ok);
  
  	return newnode;
  }
Index: src/backend/nodes/equalfuncs.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v
retrieving revision 1.262
diff -c -r1.262 equalfuncs.c
*** src/backend/nodes/equalfuncs.c	4 Feb 2006 19:06:46 -0000	1.262
--- src/backend/nodes/equalfuncs.c	5 Feb 2006 14:29:58 -0000
***************
*** 1007,1012 ****
--- 1007,1013 ----
  	COMPARE_NODE_FIELD(aggname);
  	COMPARE_NODE_FIELD(aggtype);
  	COMPARE_SCALAR_FIELD(behavior);
+ 	COMPARE_SCALAR_FIELD(missing_ok);
  
  	return true;
  }
***************
*** 1017,1022 ****
--- 1018,1024 ----
  	COMPARE_NODE_FIELD(funcname);
  	COMPARE_NODE_FIELD(args);
  	COMPARE_SCALAR_FIELD(behavior);
+ 	COMPARE_SCALAR_FIELD(missing_ok);
  
  	return true;
  }
***************
*** 1027,1032 ****
--- 1029,1035 ----
  	COMPARE_NODE_FIELD(opname);
  	COMPARE_NODE_FIELD(args);
  	COMPARE_SCALAR_FIELD(behavior);
+ 	COMPARE_SCALAR_FIELD(missing_ok);
  
  	return true;
  }
***************
*** 1037,1042 ****
--- 1040,1046 ----
  	COMPARE_NODE_FIELD(opclassname);
  	COMPARE_STRING_FIELD(amname);
  	COMPARE_SCALAR_FIELD(behavior);
+ 	COMPARE_SCALAR_FIELD(missing_ok);
  
  	return true;
  }
***************
*** 1310,1315 ****
--- 1314,1320 ----
  _equalDropTableSpaceStmt(DropTableSpaceStmt *a, DropTableSpaceStmt *b)
  {
  	COMPARE_STRING_FIELD(tablespacename);
+ 	COMPARE_SCALAR_FIELD(missing_ok);
  
  	return true;
  }
***************
*** 1340,1345 ****
--- 1345,1351 ----
  	COMPARE_STRING_FIELD(property);
  	COMPARE_SCALAR_FIELD(removeType);
  	COMPARE_SCALAR_FIELD(behavior);
+ 	COMPARE_SCALAR_FIELD(missing_ok);
  
  	return true;
  }
***************
*** 1360,1365 ****
--- 1366,1372 ----
  {
  	COMPARE_STRING_FIELD(plname);
  	COMPARE_SCALAR_FIELD(behavior);
+ 	COMPARE_SCALAR_FIELD(missing_ok);
  
  	return true;
  }
***************
*** 1473,1478 ****
--- 1480,1486 ----
  	COMPARE_NODE_FIELD(sourcetype);
  	COMPARE_NODE_FIELD(targettype);
  	COMPARE_SCALAR_FIELD(behavior);
+ 	COMPARE_SCALAR_FIELD(missing_ok);
  
  	return true;
  }
Index: src/backend/parser/gram.y
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.526
diff -c -r2.526 gram.y
*** src/backend/parser/gram.y	4 Feb 2006 19:06:46 -0000	2.526
--- src/backend/parser/gram.y	5 Feb 2006 14:30:03 -0000
***************
*** 2390,2395 ****
--- 2390,2405 ----
  					DropPLangStmt *n = makeNode(DropPLangStmt);
  					n->plname = $4;
  					n->behavior = $5;
+ 					n->missing_ok = FALSE;
+ 					$$ = (Node *)n;
+ 				}
+             | DROP opt_procedural LANGUAGE IF_P EXISTS 
+ 			  ColId_or_Sconst opt_drop_behavior
+ 				{
+ 					DropPLangStmt *n = makeNode(DropPLangStmt);
+ 					n->plname = $6;
+ 					n->behavior = $7;
+ 					n->missing_ok = TRUE;
  					$$ = (Node *)n;
  				}
  		;
***************
*** 2434,2439 ****
--- 2444,2457 ----
  				{
  					DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
  					n->tablespacename = $3;
+ 					n->missing_ok = FALSE;
+ 					$$ = (Node *) n;
+ 				}
+              | DROP TABLESPACE IF_P EXISTS name
+ 				{
+ 					DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
+ 					n->tablespacename = $5;
+ 					n->missing_ok = TRUE;
  					$$ = (Node *) n;
  				}
  		;
***************
*** 2618,2623 ****
--- 2636,2652 ----
  					n->relation = $5;
  					n->property = $3;
  					n->behavior = $6;
+ 					n->missing_ok = FALSE;
+ 					n->removeType = OBJECT_TRIGGER;
+ 					$$ = (Node *) n;
+ 				}
+ 			| DROP TRIGGER IF_P EXISTS name ON qualified_name opt_drop_behavior
+ 				{
+ 					DropPropertyStmt *n = makeNode(DropPropertyStmt);
+ 					n->relation = $7;
+ 					n->property = $5;
+ 					n->behavior = $8;
+ 					n->missing_ok = TRUE;
  					n->removeType = OBJECT_TRIGGER;
  					$$ = (Node *) n;
  				}
***************
*** 2658,2663 ****
--- 2687,2693 ----
  					n->relation = NULL;
  					n->property = $3;
  					n->behavior = $4;
+ 					n->missing_ok = FALSE; /* fix if we implement assertions */
  					n->removeType = OBJECT_TRIGGER; /* XXX */
  					ereport(ERROR,
  							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
***************
*** 2842,2847 ****
--- 2872,2888 ----
  					n->opclassname = $4;
  					n->amname = $6;
  					n->behavior = $7;
+ 					n->missing_ok = FALSE;
+ 					$$ = (Node *) n;
+ 				}
+ 			| DROP OPERATOR CLASS IF_P EXISTS any_name 
+ 			  USING access_method opt_drop_behavior
+ 				{
+ 					RemoveOpClassStmt *n = makeNode(RemoveOpClassStmt);
+ 					n->opclassname = $6;
+ 					n->amname = $8;
+ 					n->behavior = $9;
+ 					n->missing_ok = TRUE;
  					$$ = (Node *) n;
  				}
  		;
***************
*** 3845,3850 ****
--- 3886,3901 ----
  					n->funcname = $3;
  					n->args = extractArgTypes($4);
  					n->behavior = $5;
+ 					n->missing_ok = FALSE;
+ 					$$ = (Node *)n;
+ 				}
+ 			| DROP FUNCTION IF_P EXISTS func_name func_args opt_drop_behavior
+ 				{
+ 					RemoveFuncStmt *n = makeNode(RemoveFuncStmt);
+ 					n->funcname = $5;
+ 					n->args = extractArgTypes($6);
+ 					n->behavior = $7;
+ 					n->missing_ok = TRUE;
  					$$ = (Node *)n;
  				}
  		;
***************
*** 3856,3861 ****
--- 3907,3923 ----
  						n->aggname = $3;
  						n->aggtype = $5;
  						n->behavior = $7;
+ 						n->missing_ok = FALSE;
+ 						$$ = (Node *)n;
+ 				}
+ 			| DROP AGGREGATE IF_P EXISTS func_name '(' aggr_argtype ')' 
+ 			  opt_drop_behavior
+ 				{
+ 						RemoveAggrStmt *n = makeNode(RemoveAggrStmt);
+ 						n->aggname = $5;
+ 						n->aggtype = $7;
+ 						n->behavior = $9;
+ 						n->missing_ok = TRUE;
  						$$ = (Node *)n;
  				}
  		;
***************
*** 3872,3877 ****
--- 3934,3950 ----
  					n->opname = $3;
  					n->args = $5;
  					n->behavior = $7;
+ 					n->missing_ok = FALSE;
+ 					$$ = (Node *)n;
+ 				}
+ 			| DROP OPERATOR IF_P EXISTS any_operator '(' oper_argtypes ')' 
+ 			  opt_drop_behavior
+ 				{
+ 					RemoveOperStmt *n = makeNode(RemoveOperStmt);
+ 					n->opname = $5;
+ 					n->args = $7;
+ 					n->behavior = $9;
+ 					n->missing_ok = TRUE;
  					$$ = (Node *)n;
  				}
  		;
***************
*** 3940,3945 ****
--- 4013,4028 ----
  					n->sourcetype = $4;
  					n->targettype = $6;
  					n->behavior = $8;
+ 					n->missing_ok = FALSE;
+ 					$$ = (Node *)n;
+ 				}
+ 		| DROP CAST IF_P EXISTS '(' Typename AS Typename ')' opt_drop_behavior
+ 				{
+ 					DropCastStmt *n = makeNode(DropCastStmt);
+ 					n->sourcetype = $6;
+ 					n->targettype = $8;
+ 					n->behavior = $10;
+ 					n->missing_ok = TRUE;
  					$$ = (Node *)n;
  				}
  		;
***************
*** 4367,4372 ****
--- 4450,4466 ----
  					n->relation = $5;
  					n->property = $3;
  					n->behavior = $6;
+ 					n->missing_ok = FALSE;
+ 					n->removeType = OBJECT_RULE;
+ 					$$ = (Node *) n;
+ 				}
+ 			| DROP RULE IF_P EXISTS name ON qualified_name opt_drop_behavior
+ 				{
+ 					DropPropertyStmt *n = makeNode(DropPropertyStmt);
+ 					n->relation = $7;
+ 					n->property = $5;
+ 					n->behavior = $8;
+ 					n->missing_ok = TRUE;
  					n->removeType = OBJECT_RULE;
  					$$ = (Node *) n;
  				}
Index: src/backend/rewrite/rewriteRemove.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v
retrieving revision 1.63
diff -c -r1.63 rewriteRemove.c
*** src/backend/rewrite/rewriteRemove.c	15 Oct 2005 02:49:24 -0000	1.63
--- src/backend/rewrite/rewriteRemove.c	5 Feb 2006 14:30:04 -0000
***************
*** 34,40 ****
   * Delete a rule given its name.
   */
  void
! RemoveRewriteRule(Oid owningRel, const char *ruleName, DropBehavior behavior)
  {
  	HeapTuple	tuple;
  	Oid			eventRelationOid;
--- 34,41 ----
   * Delete a rule given its name.
   */
  void
! RemoveRewriteRule(Oid owningRel, const char *ruleName, DropBehavior behavior,
! 				  bool missing_ok)
  {
  	HeapTuple	tuple;
  	Oid			eventRelationOid;
***************
*** 53,63 ****
  	 * complain if no rule with such name exists
  	 */
  	if (!HeapTupleIsValid(tuple))
! 		ereport(ERROR,
! 				(errcode(ERRCODE_UNDEFINED_OBJECT),
! 				 errmsg("rule \"%s\" for relation \"%s\" does not exist",
! 						ruleName, get_rel_name(owningRel))));
! 
  	/*
  	 * Verify user has appropriate permissions.
  	 */
--- 54,71 ----
  	 * complain if no rule with such name exists
  	 */
  	if (!HeapTupleIsValid(tuple))
! 	{
! 		if (! missing_ok)
! 			ereport(ERROR,
! 					(errcode(ERRCODE_UNDEFINED_OBJECT),
! 					 errmsg("rule \"%s\" for relation \"%s\" does not exist",
! 							ruleName, get_rel_name(owningRel))));
! 		else
! 			ereport(NOTICE,
! 					(errmsg("rule \"%s\" for relation \"%s\" does not exist ... skipping",
! 							ruleName, get_rel_name(owningRel))));
! 		return;
! 	}
  	/*
  	 * Verify user has appropriate permissions.
  	 */
Index: src/backend/tcop/utility.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/tcop/utility.c,v
retrieving revision 1.250
diff -c -r1.250 utility.c
*** src/backend/tcop/utility.c	29 Nov 2005 01:25:49 -0000	1.250
--- src/backend/tcop/utility.c	5 Feb 2006 14:30:05 -0000
***************
*** 972,983 ****
  					case OBJECT_RULE:
  						/* RemoveRewriteRule checks permissions */
  						RemoveRewriteRule(relId, stmt->property,
! 										  stmt->behavior);
  						break;
  					case OBJECT_TRIGGER:
  						/* DropTrigger checks permissions */
  						DropTrigger(relId, stmt->property,
! 									stmt->behavior);
  						break;
  					default:
  						elog(ERROR, "unrecognized object type: %d",
--- 972,983 ----
  					case OBJECT_RULE:
  						/* RemoveRewriteRule checks permissions */
  						RemoveRewriteRule(relId, stmt->property,
! 										  stmt->behavior, stmt->missing_ok);
  						break;
  					case OBJECT_TRIGGER:
  						/* DropTrigger checks permissions */
  						DropTrigger(relId, stmt->property,
! 									stmt->behavior, stmt->missing_ok);
  						break;
  					default:
  						elog(ERROR, "unrecognized object type: %d",
Index: src/include/commands/trigger.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/commands/trigger.h,v
retrieving revision 1.56
diff -c -r1.56 trigger.h
*** src/include/commands/trigger.h	15 Oct 2005 02:49:44 -0000	1.56
--- src/include/commands/trigger.h	5 Feb 2006 14:30:06 -0000
***************
*** 108,114 ****
  extern Oid	CreateTrigger(CreateTrigStmt *stmt, bool forConstraint);
  
  extern void DropTrigger(Oid relid, const char *trigname,
! 			DropBehavior behavior);
  extern void RemoveTriggerById(Oid trigOid);
  
  extern void renametrig(Oid relid, const char *oldname, const char *newname);
--- 108,114 ----
  extern Oid	CreateTrigger(CreateTrigStmt *stmt, bool forConstraint);
  
  extern void DropTrigger(Oid relid, const char *trigname,
! 			DropBehavior behavior, bool missing_ok);
  extern void RemoveTriggerById(Oid trigOid);
  
  extern void renametrig(Oid relid, const char *oldname, const char *newname);
Index: src/include/nodes/parsenodes.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/nodes/parsenodes.h,v
retrieving revision 1.300
diff -c -r1.300 parsenodes.h
*** src/include/nodes/parsenodes.h	4 Feb 2006 19:06:46 -0000	1.300
--- src/include/nodes/parsenodes.h	5 Feb 2006 14:30:07 -0000
***************
*** 1103,1108 ****
--- 1103,1109 ----
  {
  	NodeTag		type;
  	char	   *tablespacename;
+ 	bool		missing_ok;		/* skip error if tablespace is missing? */
  } DropTableSpaceStmt;
  
  /* ----------------------
***************
*** 1146,1151 ****
--- 1147,1153 ----
  {
  	NodeTag		type;
  	char	   *plname;			/* PL name */
+ 	bool		missing_ok;		/* skip error if language is missing? */
  	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
  } DropPLangStmt;
  
***************
*** 1298,1303 ****
--- 1300,1306 ----
  	RangeVar   *relation;		/* owning relation */
  	char	   *property;		/* name of rule, trigger, etc */
  	ObjectType	removeType;		/* OBJECT_RULE or OBJECT_TRIGGER */
+ 	bool		missing_ok;		/* skip error if object is missing? */
  	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
  } DropPropertyStmt;
  
***************
*** 1444,1449 ****
--- 1447,1453 ----
  	NodeTag		type;
  	List	   *aggname;		/* aggregate to drop */
  	TypeName   *aggtype;		/* TypeName for input datatype, or NULL */
+ 	bool		missing_ok;		/* skip error if a role is missing? */
  	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
  } RemoveAggrStmt;
  
***************
*** 1456,1461 ****
--- 1460,1466 ----
  	NodeTag		type;
  	List	   *funcname;		/* function to drop */
  	List	   *args;			/* types of the arguments */
+ 	bool		missing_ok;		/* skip error if function is missing? */
  	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
  } RemoveFuncStmt;
  
***************
*** 1468,1473 ****
--- 1473,1479 ----
  	NodeTag		type;
  	List	   *opname;			/* operator to drop */
  	List	   *args;			/* types of the arguments */
+ 	bool		missing_ok;		/* skip error if operator is missing? */
  	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
  } RemoveOperStmt;
  
***************
*** 1480,1485 ****
--- 1486,1492 ----
  	NodeTag		type;
  	List	   *opclassname;	/* qualified name (list of Value strings) */
  	char	   *amname;			/* name of index AM opclass is for */
+ 	bool		missing_ok;		/* skip error if opclass is missing? */
  	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
  } RemoveOpClassStmt;
  
***************
*** 1837,1842 ****
--- 1844,1850 ----
  	NodeTag		type;
  	TypeName   *sourcetype;
  	TypeName   *targettype;
+ 	bool		missing_ok;		/* skip error if cast is missing? */
  	DropBehavior behavior;
  } DropCastStmt;
  
Index: src/include/rewrite/rewriteRemove.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/rewrite/rewriteRemove.h,v
retrieving revision 1.20
diff -c -r1.20 rewriteRemove.h
*** src/include/rewrite/rewriteRemove.h	31 Dec 2004 22:03:41 -0000	1.20
--- src/include/rewrite/rewriteRemove.h	5 Feb 2006 14:30:07 -0000
***************
*** 18,24 ****
  
  
  extern void RemoveRewriteRule(Oid owningRel, const char *ruleName,
! 				  DropBehavior behavior);
  extern void RemoveRewriteRuleById(Oid ruleOid);
  
  #endif   /* REWRITEREMOVE_H */
--- 18,24 ----
  
  
  extern void RemoveRewriteRule(Oid owningRel, const char *ruleName,
! 				  DropBehavior behavior, bool missing_ok);
  extern void RemoveRewriteRuleById(Oid ruleOid);
  
  #endif   /* REWRITEREMOVE_H */
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to