=== Applying patches on top of PostgreSQL commit ID 89eafad297a9b01ad77cfc1ab93a433e0af894b0 === /etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider migrating to /etc/jail.conf. Sat Jun 6 07:34:22 UTC 2026 On branch cf/6703 nothing to commit, working tree clean === using 'git am' to apply patch ./v2-0001-fix-DELETE-UPDATE-FOR-PORTION-OF-with-rules.patch === Applying: fix DELETE/UPDATE FOR PORTION OF with rules Using index info to reconstruct a base tree... M src/backend/nodes/nodeFuncs.c M src/test/regress/expected/for_portion_of.out M src/test/regress/sql/for_portion_of.sql Falling back to patching base and 3-way merge... Auto-merging src/test/regress/sql/for_portion_of.sql CONFLICT (content): Merge conflict in src/test/regress/sql/for_portion_of.sql Auto-merging src/test/regress/expected/for_portion_of.out CONFLICT (content): Merge conflict in src/test/regress/expected/for_portion_of.out Auto-merging src/backend/nodes/nodeFuncs.c error: Failed to merge in the changes. hint: Use 'git am --show-current-patch=diff' to see the failed patch Patch failed at 0001 fix DELETE/UPDATE FOR PORTION OF with rules When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". === using patch(1) to apply patch ./v2-0001-fix-DELETE-UPDATE-FOR-PORTION-OF-with-rules.patch === patching file src/backend/nodes/nodeFuncs.c Hunk #1 FAILED at 2583. Hunk #2 succeeded at 2589 with fuzz 2 (offset -2 lines). 1 out of 2 hunks FAILED -- saving rejects to file src/backend/nodes/nodeFuncs.c.rej patching file src/test/regress/expected/for_portion_of.out Hunk #1 FAILED at 2097. 1 out of 1 hunk FAILED -- saving rejects to file src/test/regress/expected/for_portion_of.out.rej patching file src/test/regress/sql/for_portion_of.sql Hunk #1 succeeded at 1506 with fuzz 2 (offset 141 lines). Unstaged changes after reset: M src/backend/nodes/nodeFuncs.c M src/test/regress/sql/for_portion_of.sql Removing src/backend/nodes/nodeFuncs.c.rej Removing src/test/regress/expected/for_portion_of.out.rej === using 'git apply' to apply patch ./v2-0001-fix-DELETE-UPDATE-FOR-PORTION-OF-with-rules.patch === Applied patch to 'src/backend/nodes/nodeFuncs.c' cleanly. Applied patch to 'src/test/regress/expected/for_portion_of.out' with conflicts. Applied patch to 'src/test/regress/sql/for_portion_of.sql' with conflicts. U src/test/regress/expected/for_portion_of.out U src/test/regress/sql/for_portion_of.sql diff --cc src/test/regress/expected/for_portion_of.out index ff88879857e,0c0a205c44b..00000000000 --- a/src/test/regress/expected/for_portion_of.out +++ b/src/test/regress/expected/for_portion_of.out @@@ -2208,84 -2152,4 +2208,87 @@@ SELECT * FROM fpo_rule ORDER BY f1 (2 rows) DROP TABLE fpo_rule; ++<<<<<<< ours +-- UPDATE FOR PORTION OF with generated columns +-- The generated column depends on the range column, so it must be +-- recomputed when FOR PORTION OF narrows the range. +CREATE TABLE fpo_generated ( + id int, + valid_at int4range, + range_len int GENERATED ALWAYS AS (upper(valid_at) - lower(valid_at)) STORED, + range_lenv int GENERATED ALWAYS AS (upper(valid_at) - lower(valid_at)) +); +INSERT INTO fpo_generated (id, valid_at) VALUES (1, '[10,100)'); +SELECT * FROM fpo_generated ORDER BY valid_at; + id | valid_at | range_len | range_lenv +----+----------+-----------+------------ + 1 | [10,100) | 90 | 90 +(1 row) + +-- After the FOR PORTION OF (FPO) update, all three resulting rows +-- (leftover-before, updated, and leftover-after) must contain the correct +-- values for range_len and range_lenv. +UPDATE fpo_generated + FOR PORTION OF valid_at FROM 30 TO 70 + SET id = 2; +SELECT * FROM fpo_generated ORDER BY valid_at; + id | valid_at | range_len | range_lenv +----+----------+-----------+------------ + 1 | [10,30) | 20 | 20 + 2 | [30,70) | 40 | 40 + 1 | [70,100) | 30 | 30 +(3 rows) + +-- Also test with a generated column that references both a SET column +-- and the range column. +DROP TABLE fpo_generated; +CREATE TABLE fpo_generated ( + id int, + valid_at int4range, + id_plus_len int GENERATED ALWAYS AS (id + upper(valid_at) - lower(valid_at)) STORED, + id_plus_lenv int GENERATED ALWAYS AS (id + upper(valid_at) - lower(valid_at)) +); +INSERT INTO fpo_generated (id, valid_at) VALUES (1, '[10,100)'); +SELECT * FROM fpo_generated ORDER BY valid_at; + id | valid_at | id_plus_len | id_plus_lenv +----+----------+-------------+-------------- + 1 | [10,100) | 91 | 91 +(1 row) + +UPDATE fpo_generated + FOR PORTION OF valid_at FROM 30 TO 70 + SET id = 2; +SELECT * FROM fpo_generated ORDER BY valid_at; + id | valid_at | id_plus_len | id_plus_lenv +----+----------+-------------+-------------- + 1 | [10,30) | 21 | 21 + 2 | [30,70) | 42 | 42 + 1 | [70,100) | 31 | 31 +(3 rows) + +DROP TABLE fpo_generated; +-- Test that UPDATE OF colname triggers fire if colname is valid_at: +CREATE TABLE fpo_update_of_trigger ( + id int, + valid_at int4range +); +INSERT INTO fpo_update_of_trigger (id, valid_at) VALUES (1, '[10,100)'); +CREATE TRIGGER fpo_before_row1 + BEFORE UPDATE OF valid_at ON fpo_update_of_trigger + FOR EACH ROW EXECUTE PROCEDURE dump_trigger(false, false); +CREATE TRIGGER fpo_before_row2 + BEFORE UPDATE OF valid_at ON fpo_update_of_trigger + FOR EACH STATEMENT EXECUTE PROCEDURE dump_trigger(false, false); +UPDATE fpo_update_of_trigger + FOR PORTION OF valid_at FROM 30 TO 70 + SET id = 2; +NOTICE: fpo_before_row2: BEFORE UPDATE STATEMENT: +NOTICE: old: +NOTICE: new: +NOTICE: fpo_before_row1: BEFORE UPDATE ROW: +NOTICE: old: [10,100) +NOTICE: new: [30,70) +DROP TABLE fpo_update_of_trigger; ++======= ++>>>>>>> theirs RESET datestyle; diff --cc src/test/regress/sql/for_portion_of.sql index d61ad5dbe75,fd79a9b78e7..00000000000 --- a/src/test/regress/sql/for_portion_of.sql +++ b/src/test/regress/sql/for_portion_of.sql @@@ -1448,62 -1398,4 +1448,65 @@@ SELECT * FROM fpo_rule ORDER BY f1 DROP TABLE fpo_rule; ++<<<<<<< ours +-- UPDATE FOR PORTION OF with generated columns +-- The generated column depends on the range column, so it must be +-- recomputed when FOR PORTION OF narrows the range. +CREATE TABLE fpo_generated ( + id int, + valid_at int4range, + range_len int GENERATED ALWAYS AS (upper(valid_at) - lower(valid_at)) STORED, + range_lenv int GENERATED ALWAYS AS (upper(valid_at) - lower(valid_at)) +); +INSERT INTO fpo_generated (id, valid_at) VALUES (1, '[10,100)'); + +SELECT * FROM fpo_generated ORDER BY valid_at; + +-- After the FOR PORTION OF (FPO) update, all three resulting rows +-- (leftover-before, updated, and leftover-after) must contain the correct +-- values for range_len and range_lenv. +UPDATE fpo_generated + FOR PORTION OF valid_at FROM 30 TO 70 + SET id = 2; + +SELECT * FROM fpo_generated ORDER BY valid_at; + +-- Also test with a generated column that references both a SET column +-- and the range column. +DROP TABLE fpo_generated; +CREATE TABLE fpo_generated ( + id int, + valid_at int4range, + id_plus_len int GENERATED ALWAYS AS (id + upper(valid_at) - lower(valid_at)) STORED, + id_plus_lenv int GENERATED ALWAYS AS (id + upper(valid_at) - lower(valid_at)) +); + +INSERT INTO fpo_generated (id, valid_at) VALUES (1, '[10,100)'); +SELECT * FROM fpo_generated ORDER BY valid_at; + +UPDATE fpo_generated + FOR PORTION OF valid_at FROM 30 TO 70 + SET id = 2; +SELECT * FROM fpo_generated ORDER BY valid_at; +DROP TABLE fpo_generated; + +-- Test that UPDATE OF colname triggers fire if colname is valid_at: +CREATE TABLE fpo_update_of_trigger ( + id int, + valid_at int4range +); +INSERT INTO fpo_update_of_trigger (id, valid_at) VALUES (1, '[10,100)'); +CREATE TRIGGER fpo_before_row1 + BEFORE UPDATE OF valid_at ON fpo_update_of_trigger + FOR EACH ROW EXECUTE PROCEDURE dump_trigger(false, false); +CREATE TRIGGER fpo_before_row2 + BEFORE UPDATE OF valid_at ON fpo_update_of_trigger + FOR EACH STATEMENT EXECUTE PROCEDURE dump_trigger(false, false); +UPDATE fpo_update_of_trigger + FOR PORTION OF valid_at FROM 30 TO 70 + SET id = 2; +DROP TABLE fpo_update_of_trigger; + ++======= ++>>>>>>> theirs RESET datestyle;