aboutsummaryrefslogtreecommitdiff
path: root/contrib/lo
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2020-03-09 09:22:22 +0100
committerPeter Eisentraut <peter@eisentraut.org>2020-03-09 09:34:55 +0100
commit71d60e2aa05157efec28393b15c0b0b9fc1b210c (patch)
tree535e192f42bee56fb4978b003cbd22e099ea2f46 /contrib/lo
parent8f152b6c50c764d4c300e73a535da88cd1b18fa5 (diff)
downloadpostgresql-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.out8
-rw-r--r--contrib/lo/lo.c3
-rw-r--r--contrib/lo/sql/lo.sql5
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);