diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2014-01-23 14:40:29 -0300 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2014-01-23 14:40:29 -0300 |
commit | b152c6cd0de1827ba58756e24e18110cf902182a (patch) | |
tree | 82d0ced551764509a60014e9996f3b4d634b4071 /src/backend/commands/tablecmds.c | |
parent | 9f80f4835a55a1cbffcda5d23a617917f3286c14 (diff) | |
download | postgresql-b152c6cd0de1827ba58756e24e18110cf902182a.tar.gz postgresql-b152c6cd0de1827ba58756e24e18110cf902182a.zip |
Make DROP IF EXISTS more consistently not fail
Some cases were still reporting errors and aborting, instead of a NOTICE
that the object was being skipped. This makes it more difficult to
cleanly handle pg_dump --clean, so change that to instead skip missing
objects properly.
Per bug #7873 reported by Dave Rolsky; apparently this affects a large
number of users.
Authors: Pavel Stehule and Dean Rasheed. Some tweaks by Álvaro Herrera
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r-- | src/backend/commands/tablecmds.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 26a4613c474..08b037e501f 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -690,10 +690,28 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId) * non-existent relation */ static void -DropErrorMsgNonExistent(const char *relname, char rightkind, bool missing_ok) +DropErrorMsgNonExistent(RangeVar *rel, char rightkind, bool missing_ok) { const struct dropmsgstrings *rentry; + if (rel->schemaname != NULL && + !OidIsValid(LookupNamespaceNoError(rel->schemaname))) + { + if (!missing_ok) + { + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema \"%s\" does not exist", rel->schemaname))); + } + else + { + ereport(NOTICE, + (errmsg("schema \"%s\" does not exist, skipping", + rel->schemaname))); + } + return; + } + for (rentry = dropmsgstringarray; rentry->kind != '\0'; rentry++) { if (rentry->kind == rightkind) @@ -702,11 +720,11 @@ DropErrorMsgNonExistent(const char *relname, char rightkind, bool missing_ok) { ereport(ERROR, (errcode(rentry->nonexistent_code), - errmsg(rentry->nonexistent_msg, relname))); + errmsg(rentry->nonexistent_msg, rel->relname))); } else { - ereport(NOTICE, (errmsg(rentry->skipping_msg, relname))); + ereport(NOTICE, (errmsg(rentry->skipping_msg, rel->relname))); break; } } @@ -845,7 +863,7 @@ RemoveRelations(DropStmt *drop) /* Not there? */ if (!OidIsValid(relOid)) { - DropErrorMsgNonExistent(rel->relname, relkind, drop->missing_ok); + DropErrorMsgNonExistent(rel, relkind, drop->missing_ok); continue; } |