aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/functioncmds.c
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2006-06-16 20:23:45 +0000
committerAndrew Dunstan <andrew@dunslane.net>2006-06-16 20:23:45 +0000
commitbbcd01692bff099117f5afb0fe2d1ad182621766 (patch)
tree07aebd51aac35be3e0e4471cbff7595a35350d67 /src/backend/commands/functioncmds.c
parente79cc2db00501fb29e3e0225182147192e830fa1 (diff)
downloadpostgresql-bbcd01692bff099117f5afb0fe2d1ad182621766.tar.gz
postgresql-bbcd01692bff099117f5afb0fe2d1ad182621766.zip
DROP ... IF EXISTS for the following cases:
language, tablespace, trigger, rule, opclass, function, aggregate. operator, and cast.
Diffstat (limited to 'src/backend/commands/functioncmds.c')
-rw-r--r--src/backend/commands/functioncmds.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index 96929a0d6c4..b37e2e86324 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.74 2006/04/15 17:45:34 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.75 2006/06/16 20:23:44 adunstan Exp $
*
* DESCRIPTION
* These routines take the parse tree and pick out the
@@ -687,7 +687,16 @@ RemoveFunction(RemoveFuncStmt *stmt)
/*
* Find the function, do permissions and validity checks
*/
- funcOid = LookupFuncNameTypeNames(functionName, argTypes, false);
+ 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),
@@ -1377,6 +1386,7 @@ DropCast(DropCastStmt *stmt)
HeapTuple tuple;
ObjectAddress object;
+ /* when dropping a cast, the types must exist even if you use IF EXISTS */
sourcetypeid = typenameTypeId(NULL, stmt->sourcetype);
targettypeid = typenameTypeId(NULL, stmt->targettype);
@@ -1385,11 +1395,23 @@ DropCast(DropCastStmt *stmt)
ObjectIdGetDatum(targettypeid),
0, 0);
if (!HeapTupleIsValid(tuple))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("cast from type %s to type %s does not exist",
- TypeNameToString(stmt->sourcetype),
- TypeNameToString(stmt->targettype))));
+ {
+ if (! stmt->missing_ok)
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("cast from type %s to type %s does not exist",
+ TypeNameToString(stmt->sourcetype),
+ TypeNameToString(stmt->targettype))));
+ else
+ ereport(NOTICE,
+ (errmsg("cast from type %s to type %s does not exist ... skipping",
+ TypeNameToString(stmt->sourcetype),
+ TypeNameToString(stmt->targettype))));
+
+ return;
+ }
+
+
/* Permission check */
if (!pg_type_ownercheck(sourcetypeid, GetUserId())