diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2020-03-09 09:22:22 +0100 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2020-03-09 09:34:55 +0100 |
commit | 71d60e2aa05157efec28393b15c0b0b9fc1b210c (patch) | |
tree | 535e192f42bee56fb4978b003cbd22e099ea2f46 /contrib/lo | |
parent | 8f152b6c50c764d4c300e73a535da88cd1b18fa5 (diff) | |
download | postgresql-71d60e2aa05157efec28393b15c0b0b9fc1b210c.tar.gz postgresql-71d60e2aa05157efec28393b15c0b0b9fc1b210c.zip |
Add tg_updatedcols to TriggerData
This allows a trigger function to determine for an UPDATE trigger
which columns were actually updated. This allows some optimizations
in generic trigger functions such as lo_manage and
tsvector_update_trigger.
Reviewed-by: Daniel Gustafsson <daniel@yesql.se>
Discussion: https://www.postgresql.org/message-id/flat/11c5f156-67a9-0fb5-8200-2a8018eb2e0c@2ndquadrant.com
Diffstat (limited to 'contrib/lo')
-rw-r--r-- | contrib/lo/expected/lo.out | 8 | ||||
-rw-r--r-- | contrib/lo/lo.c | 3 | ||||
-rw-r--r-- | contrib/lo/sql/lo.sql | 5 |
3 files changed, 15 insertions, 1 deletions
diff --git a/contrib/lo/expected/lo.out b/contrib/lo/expected/lo.out index f7104aee3f0..c63e4b1c704 100644 --- a/contrib/lo/expected/lo.out +++ b/contrib/lo/expected/lo.out @@ -36,6 +36,14 @@ SELECT lo_get(43214); \x (1 row) +-- test updating of unrelated column +UPDATE image SET title = 'beautiful picture' WHERE title = 'beautiful image'; +SELECT lo_get(43214); + lo_get +-------- + \x +(1 row) + DELETE FROM image; SELECT lo_get(43214); ERROR: large object 43214 does not exist diff --git a/contrib/lo/lo.c b/contrib/lo/lo.c index 4585923ee2b..b9847081db6 100644 --- a/contrib/lo/lo.c +++ b/contrib/lo/lo.c @@ -74,7 +74,8 @@ lo_manage(PG_FUNCTION_ARGS) * Here, if the value of the monitored attribute changes, then the large * object associated with the original value is unlinked. */ - if (newtuple != NULL) + if (newtuple != NULL && + bms_is_member(attnum - FirstLowInvalidHeapAttributeNumber, trigdata->tg_updatedcols)) { char *orig = SPI_getvalue(trigtuple, tupdesc, attnum); char *newv = SPI_getvalue(newtuple, tupdesc, attnum); diff --git a/contrib/lo/sql/lo.sql b/contrib/lo/sql/lo.sql index 34ba6f00ec0..77039509245 100644 --- a/contrib/lo/sql/lo.sql +++ b/contrib/lo/sql/lo.sql @@ -18,6 +18,11 @@ UPDATE image SET raster = 43214 WHERE title = 'beautiful image'; SELECT lo_get(43213); SELECT lo_get(43214); +-- test updating of unrelated column +UPDATE image SET title = 'beautiful picture' WHERE title = 'beautiful image'; + +SELECT lo_get(43214); + DELETE FROM image; SELECT lo_get(43214); |