mirror of
https://github.com/postgres/postgres.git
synced 2025-04-25 21:42:33 +03:00
Fix bug with view locking code.
LockViewRecurese() obtains view relation using heap_open() and passes it to get_view_query() to get view info. It immediately closes the relation then uses the returned view info by calling LockViewRecurse_walker(). Since get_view_query() returns a pointer within the relcache, the relcache should be kept until LockViewRecurse_walker() returns. Otherwise the relation could point to a garbage memory area. Fix is moving the heap_close() call after LockViewRecurse_walker(). Problem reported by Tom Lane (buildfarm is unhappy, especially prion since it enables -DRELCACHE_FORCE_RELEASE cpp flag), fix by me.
This commit is contained in:
parent
3e256e5506
commit
1b26bd4089
@ -263,7 +263,6 @@ LockViewRecurse(Oid reloid, Oid root_reloid, LOCKMODE lockmode, bool nowait)
|
||||
|
||||
view = heap_open(reloid, NoLock);
|
||||
viewquery = get_view_query(view);
|
||||
heap_close(view, NoLock);
|
||||
|
||||
context.root_reloid = root_reloid;
|
||||
context.lockmode = lockmode;
|
||||
@ -272,6 +271,8 @@ LockViewRecurse(Oid reloid, Oid root_reloid, LOCKMODE lockmode, bool nowait)
|
||||
context.viewoid = reloid;
|
||||
|
||||
LockViewRecurse_walker((Node *) viewquery, &context);
|
||||
|
||||
heap_close(view, NoLock);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user