Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a052f6c

Browse files
committed
Forbid DROP SCHEMA on temporary namespaces
This operation was possible for the owner of the schema or a superuser. Down to 9.4, doing this operation would cause inconsistencies in a session whose temporary schema was dropped, particularly if trying to create new temporary objects after the drop. A more annoying consequence is a crash of autovacuum on an assertion failure when logging information about an orphaned temp table dropped. Note that because of 246a6c8 (present in v11~), which has made the removal of orphaned temporary tables more aggressive, the failure could be triggered more easily, but it is possible to reproduce down to 9.4. Reported-by: Mahendra Singh, Prabhat Sahu Author: Michael Paquier Reviewed-by: Kyotaro Horiguchi, Mahendra Singh Discussion: https://postgr.es/m/CAKYtNAr9Zq=1-ww4etHo-VCC-k120YxZy5OS01VkaLPaDbv2tg@mail.gmail.com Backpatch-through: 9.4
1 parent 7854e07 commit a052f6c

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

src/backend/commands/dropcmds.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,21 @@ RemoveObjects(DropStmt *stmt)
101101
errhint("Use DROP AGGREGATE to drop aggregate functions.")));
102102
}
103103

104+
/*
105+
* Prevent the drop of a temporary schema, be it owned by the current
106+
* session or another backend as this would mess up with the callback
107+
* registered to clean up temporary objects at the end of a session.
108+
* Note also that the creation of any follow-up temporary object would
109+
* result in inconsistencies within the session whose temporary schema
110+
* has been dropped.
111+
*/
112+
if (stmt->removeType == OBJECT_SCHEMA &&
113+
isAnyTempNamespace(address.objectId))
114+
ereport(ERROR,
115+
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
116+
errmsg("cannot drop temporary schema \"%s\"",
117+
get_namespace_name(address.objectId))));
118+
104119
/* Check permissions. */
105120
namespaceId = get_object_namespace(&address);
106121
if (!OidIsValid(namespaceId) ||

0 commit comments

Comments
 (0)