mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
Fix DROP OPERATOR to reset oprcom/oprnegate links to the dropped operator.
This avoids leaving dangling links in pg_operator; which while fairly harmless are also unsightly. While we're at it, simplify OperatorUpd, which went through heap_modify_tuple for no very good reason considering it had already made a tuple copy it could just scribble on. Roma Sokolov, reviewed by Tomas Vondra, additional hacking by Robert Haas and myself.
This commit is contained in:
@ -341,12 +341,32 @@ RemoveOperatorById(Oid operOid)
|
||||
{
|
||||
Relation relation;
|
||||
HeapTuple tup;
|
||||
Form_pg_operator op;
|
||||
|
||||
relation = heap_open(OperatorRelationId, RowExclusiveLock);
|
||||
|
||||
tup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operOid));
|
||||
if (!HeapTupleIsValid(tup)) /* should not happen */
|
||||
elog(ERROR, "cache lookup failed for operator %u", operOid);
|
||||
op = (Form_pg_operator) GETSTRUCT(tup);
|
||||
|
||||
/*
|
||||
* Reset links from commutator and negator, if any. In case of a
|
||||
* self-commutator or self-negator, this means we have to re-fetch the
|
||||
* updated tuple. (We could optimize away updates on the tuple we're
|
||||
* about to drop, but it doesn't seem worth convoluting the logic for.)
|
||||
*/
|
||||
if (OidIsValid(op->oprcom) || OidIsValid(op->oprnegate))
|
||||
{
|
||||
OperatorUpd(operOid, op->oprcom, op->oprnegate, true);
|
||||
if (operOid == op->oprcom || operOid == op->oprnegate)
|
||||
{
|
||||
ReleaseSysCache(tup);
|
||||
tup = SearchSysCache1(OPEROID, ObjectIdGetDatum(operOid));
|
||||
if (!HeapTupleIsValid(tup)) /* should not happen */
|
||||
elog(ERROR, "cache lookup failed for operator %u", operOid);
|
||||
}
|
||||
}
|
||||
|
||||
simple_heap_delete(relation, &tup->t_self);
|
||||
|
||||
|
Reference in New Issue
Block a user