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 */