diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 68e9f84672549231fd3f258cf39b142abd9ff3e3..bcf071ea8a0635bbd5a11aa3328a6d8d4846e9af 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.214 2004/05/05 04:48:46 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.215 2004/05/07 19:12:26 neilc Exp $ * *------------------------------------------------------------------------- */ @@ -99,8 +99,12 @@ static const struct msgstrings msgstringarray[] = { }; +/* + * Emit the right error message for a "DROP" command issued on a + * relation of the wrong type + */ static void -DropErrorMsg(char *relname, char wrongkind, char rightkind) +DropErrorMsgWrongType(char *relname, char wrongkind, char rightkind) { const struct msgstrings *rentry; const struct msgstrings *wentry; @@ -121,24 +125,37 @@ DropErrorMsg(char *relname, char wrongkind, char rightkind) (wentry->kind != '\0') ? errhint(wentry->drophint_msg) : 0)); } +/* + * Emit the right error message for a "DROP" command issued on a + * non-existent relation + */ static void -CheckDropPermissions(RangeVar *rel, char rightkind) +DropErrorMsgNonExistent(RangeVar *rel, char rightkind) { const struct msgstrings *rentry; - Oid relOid; - HeapTuple tuple; - Form_pg_class classform; for (rentry = msgstringarray; rentry->kind != '\0'; rentry++) + { if (rentry->kind == rightkind) - break; - Assert(rentry->kind != '\0'); + ereport(ERROR, + (errcode(rentry->nonexistent_code), + errmsg(rentry->nonexistent_msg, rel->relname))); + } + + Assert(false); /* Should be impossible */ +} + +static void +CheckDropPermissions(RangeVar *rel, char rightkind) +{ + Oid relOid; + HeapTuple tuple; + Form_pg_class classform; relOid = RangeVarGetRelid(rel, true); if (!OidIsValid(relOid)) - ereport(ERROR, - (errcode(rentry->nonexistent_code), - errmsg(rentry->nonexistent_msg, rel->relname))); + DropErrorMsgNonExistent(rel, rightkind); + tuple = SearchSysCache(RELOID, ObjectIdGetDatum(relOid), 0, 0, 0); @@ -148,7 +165,8 @@ CheckDropPermissions(RangeVar *rel, char rightkind) classform = (Form_pg_class) GETSTRUCT(tuple); if (classform->relkind != rightkind) - DropErrorMsg(rel->relname, classform->relkind, rightkind); + DropErrorMsgWrongType(rel->relname, classform->relkind, + rightkind); /* Allow DROP to either table owner or schema owner */ if (!pg_class_ownercheck(relOid, GetUserId()) &&