mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Fix psql \d's query for identifying parent triggers.
The original coding (from c33869cc3
) failed with "more than one row
returned by a subquery used as an expression" if there were unrelated
triggers of the same tgname on parent partitioned tables. (That's
possible because statement-level triggers don't get inherited.) Fix
by applying LIMIT 1 after sorting the candidates by inheritance level.
Also, wrap the subquery in a CASE so that we don't have to execute it at
all when the trigger is visibly non-inherited. Aside from saving some
cycles, this avoids the need for a confusing and undocumented NULLIF().
While here, tweak the format of the emitted query to look a bit
nicer for "psql -E", and add some explanation of this subquery,
because it badly needs it.
Report and patch by Justin Pryzby (with some editing by me).
Back-patch to v13 where the faulty code came in.
Discussion: https://postgr.es/m/20211217154356.GJ17618@telsasoft.com
This commit is contained in:
@@ -2122,6 +2122,20 @@ Triggers:
|
||||
alter table trigpart attach partition trigpart3 FOR VALUES FROM (2000) to (3000); -- fail
|
||||
ERROR: trigger "trg1" for relation "trigpart3" already exists
|
||||
drop table trigpart3;
|
||||
-- check display of unrelated triggers
|
||||
create trigger samename after delete on trigpart execute function trigger_nothing();
|
||||
create trigger samename after delete on trigpart1 execute function trigger_nothing();
|
||||
\d trigpart1
|
||||
Table "public.trigpart1"
|
||||
Column | Type | Collation | Nullable | Default
|
||||
--------+---------+-----------+----------+---------
|
||||
a | integer | | |
|
||||
b | integer | | |
|
||||
Partition of: trigpart FOR VALUES FROM (0) TO (1000)
|
||||
Triggers:
|
||||
samename AFTER DELETE ON trigpart1 FOR EACH STATEMENT EXECUTE FUNCTION trigger_nothing()
|
||||
trg1 AFTER INSERT ON trigpart1 FOR EACH ROW EXECUTE FUNCTION trigger_nothing(), ON TABLE trigpart
|
||||
|
||||
drop table trigpart;
|
||||
drop function trigger_nothing();
|
||||
--
|
||||
|
@@ -1428,6 +1428,11 @@ create trigger trg1 after insert on trigpart3 for each row execute procedure tri
|
||||
alter table trigpart attach partition trigpart3 FOR VALUES FROM (2000) to (3000); -- fail
|
||||
drop table trigpart3;
|
||||
|
||||
-- check display of unrelated triggers
|
||||
create trigger samename after delete on trigpart execute function trigger_nothing();
|
||||
create trigger samename after delete on trigpart1 execute function trigger_nothing();
|
||||
\d trigpart1
|
||||
|
||||
drop table trigpart;
|
||||
drop function trigger_nothing();
|
||||
|
||||
|
Reference in New Issue
Block a user