=== Applying patches on top of PostgreSQL commit ID 4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 === /etc/rc.d/jail: WARNING: Per-jail configuration via jail_* variables is obsolete. Please consider migrating to /etc/jail.conf. Sun Dec 14 14:14:21 UTC 2025 On branch cf/5667 nothing to commit, working tree clean === using 'git am' to apply patch ./v6-0001-index-on-virtual-generated-column.patch === Applying: index on virtual generated column Using index info to reconstruct a base tree... M doc/src/sgml/catalogs.sgml M src/backend/catalog/index.c M src/backend/commands/indexcmds.c M src/backend/commands/tablecmds.c M src/backend/parser/parse_utilcmd.c M src/backend/utils/adt/ruleutils.c M src/include/catalog/index.h M src/include/nodes/execnodes.h M src/test/regress/expected/collate.icu.utf8.out M src/test/regress/expected/generated_virtual.out M src/test/regress/sql/collate.icu.utf8.sql M src/test/regress/sql/generated_virtual.sql Falling back to patching base and 3-way merge... Auto-merging src/test/regress/sql/generated_virtual.sql CONFLICT (content): Merge conflict in src/test/regress/sql/generated_virtual.sql Auto-merging src/test/regress/sql/collate.icu.utf8.sql CONFLICT (content): Merge conflict in src/test/regress/sql/collate.icu.utf8.sql Auto-merging src/test/regress/expected/generated_virtual.out CONFLICT (content): Merge conflict in src/test/regress/expected/generated_virtual.out Auto-merging src/test/regress/expected/collate.icu.utf8.out CONFLICT (content): Merge conflict in src/test/regress/expected/collate.icu.utf8.out Auto-merging src/include/nodes/execnodes.h Auto-merging src/include/catalog/index.h Auto-merging src/backend/utils/adt/ruleutils.c Auto-merging src/backend/parser/parse_utilcmd.c Auto-merging src/backend/commands/tablecmds.c Auto-merging src/backend/commands/indexcmds.c Auto-merging src/backend/catalog/index.c Auto-merging doc/src/sgml/catalogs.sgml error: Failed to merge in the changes. hint: Use 'git am --show-current-patch=diff' to see the failed patch Patch failed at 0001 index on virtual generated column 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". Unstaged changes after reset: M contrib/pageinspect/expected/btree.out M contrib/pageinspect/sql/btree.sql M doc/src/sgml/catalogs.sgml M src/backend/catalog/index.c M src/backend/commands/indexcmds.c M src/backend/commands/tablecmds.c M src/backend/parser/parse_utilcmd.c M src/backend/utils/adt/ruleutils.c M src/include/catalog/index.h M src/include/catalog/pg_index.h M src/include/nodes/execnodes.h M src/test/regress/expected/collate.icu.utf8.out M src/test/regress/expected/fast_default.out M src/test/regress/expected/generated_virtual.out M src/test/regress/sql/collate.icu.utf8.sql M src/test/regress/sql/fast_default.sql M src/test/regress/sql/generated_virtual.sql === using patch(1) to apply patch ./v6-0001-index-on-virtual-generated-column.patch === patching file contrib/pageinspect/expected/btree.out patching file contrib/pageinspect/sql/btree.sql patching file doc/src/sgml/catalogs.sgml Hunk #1 succeeded at 4592 (offset 3 lines). patching file src/backend/catalog/index.c patching file src/backend/commands/indexcmds.c Hunk #1 succeeded at 53 (offset -1 lines). Hunk #2 succeeded at 90 (offset -1 lines). Hunk #3 succeeded at 188 (offset -1 lines). Hunk #4 succeeded at 221 (offset -1 lines). Hunk #5 succeeded at 267 (offset -1 lines). Hunk #6 succeeded at 918 (offset -1 lines). Hunk #7 succeeded at 979 (offset -1 lines). Hunk #8 succeeded at 1141 (offset -1 lines). Hunk #9 succeeded at 1150 (offset -1 lines). Hunk #10 succeeded at 1170 (offset -1 lines). Hunk #11 succeeded at 1313 (offset -1 lines). Hunk #12 succeeded at 1360 (offset -1 lines). Hunk #13 succeeded at 1421 (offset -1 lines). Hunk #14 succeeded at 1498 (offset -1 lines). patching file src/backend/commands/tablecmds.c Hunk #1 succeeded at 8716 (offset 64 lines). Hunk #2 succeeded at 14895 (offset 64 lines). Hunk #3 succeeded at 20726 (offset 92 lines). Hunk #4 succeeded at 20740 (offset 92 lines). Hunk #5 succeeded at 20811 (offset 92 lines). patching file src/backend/parser/parse_utilcmd.c Hunk #1 succeeded at 1705 (offset 2 lines). Hunk #2 succeeded at 1713 (offset 2 lines). Hunk #3 succeeded at 1749 (offset 2 lines). Hunk #4 succeeded at 1885 (offset 2 lines). patching file src/backend/utils/adt/ruleutils.c patching file src/include/catalog/index.h patching file src/include/catalog/pg_index.h patching file src/include/nodes/execnodes.h Hunk #1 succeeded at 174 (offset -2 lines). patching file src/test/regress/expected/collate.icu.utf8.out Hunk #1 FAILED at 2690. 1 out of 1 hunk FAILED -- saving rejects to file src/test/regress/expected/collate.icu.utf8.out.rej patching file src/test/regress/expected/fast_default.out patching file src/test/regress/expected/generated_virtual.out Hunk #1 succeeded at 745 (offset 6 lines). Hunk #2 succeeded at 1532 (offset 21 lines). Hunk #3 FAILED at 1856. 1 out of 3 hunks FAILED -- saving rejects to file src/test/regress/expected/generated_virtual.out.rej patching file src/test/regress/sql/collate.icu.utf8.sql Hunk #1 succeeded at 513 with fuzz 2 (offset -484 lines). patching file src/test/regress/sql/fast_default.sql patching file src/test/regress/sql/generated_virtual.sql Hunk #2 succeeded at 394 (offset 4 lines). Hunk #3 FAILED at 949. 1 out of 3 hunks FAILED -- saving rejects to file src/test/regress/sql/generated_virtual.sql.rej Unstaged changes after reset: M contrib/pageinspect/expected/btree.out M contrib/pageinspect/sql/btree.sql M doc/src/sgml/catalogs.sgml M src/backend/catalog/index.c M src/backend/commands/indexcmds.c M src/backend/commands/tablecmds.c M src/backend/parser/parse_utilcmd.c M src/backend/utils/adt/ruleutils.c M src/include/catalog/index.h M src/include/catalog/pg_index.h M src/include/nodes/execnodes.h M src/test/regress/expected/fast_default.out M src/test/regress/expected/generated_virtual.out M src/test/regress/sql/collate.icu.utf8.sql M src/test/regress/sql/fast_default.sql M src/test/regress/sql/generated_virtual.sql Removing src/test/regress/expected/collate.icu.utf8.out.rej Removing src/test/regress/expected/generated_virtual.out.rej Removing src/test/regress/sql/generated_virtual.sql.rej === using 'git apply' to apply patch ./v6-0001-index-on-virtual-generated-column.patch === Applied patch to 'contrib/pageinspect/expected/btree.out' cleanly. Applied patch to 'contrib/pageinspect/sql/btree.sql' cleanly. Applied patch to 'doc/src/sgml/catalogs.sgml' cleanly. Applied patch to 'src/backend/catalog/index.c' cleanly. Applied patch to 'src/backend/commands/indexcmds.c' cleanly. Applied patch to 'src/backend/commands/tablecmds.c' cleanly. Applied patch to 'src/backend/parser/parse_utilcmd.c' cleanly. Applied patch to 'src/backend/utils/adt/ruleutils.c' cleanly. Applied patch to 'src/include/catalog/index.h' cleanly. Applied patch to 'src/include/catalog/pg_index.h' cleanly. Applied patch to 'src/include/nodes/execnodes.h' cleanly. Applied patch to 'src/test/regress/expected/collate.icu.utf8.out' with conflicts. Applied patch to 'src/test/regress/expected/fast_default.out' cleanly. Applied patch to 'src/test/regress/expected/generated_virtual.out' with conflicts. Applied patch to 'src/test/regress/sql/collate.icu.utf8.sql' with conflicts. Applied patch to 'src/test/regress/sql/fast_default.sql' cleanly. Applied patch to 'src/test/regress/sql/generated_virtual.sql' with conflicts. U src/test/regress/expected/collate.icu.utf8.out U src/test/regress/expected/generated_virtual.out U src/test/regress/sql/collate.icu.utf8.sql U src/test/regress/sql/generated_virtual.sql diff --cc src/test/regress/expected/collate.icu.utf8.out index 8023014fe63,4b1ccb7c072..00000000000 --- a/src/test/regress/expected/collate.icu.utf8.out +++ b/src/test/regress/expected/collate.icu.utf8.out @@@ -2701,55 -2690,17 +2701,69 @@@ SELECT * FROM t5 ORDER BY c ASC, a ASC 3 | d1 | d1 (3 rows) ++<<<<<<< ours +-- Check that DEFAULT expressions in SQL/JSON functions use the same collation +-- as the RETURNING type. Mismatched collations should raise an error. +CREATE DOMAIN d1 AS text COLLATE case_insensitive; +CREATE DOMAIN d2 AS text COLLATE "C"; +SELECT JSON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT ('C' COLLATE "C") COLLATE case_insensitive ON EMPTY) = 'a'; -- true + ?column? +---------- + t +(1 row) + +SELECT JSON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT 'C' ON EMPTY) = 'a'; -- true + ?column? +---------- + t +(1 row) + +SELECT JSON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT 'C'::d2 ON EMPTY) = 'a'; -- error +ERROR: collation of DEFAULT expression conflicts with RETURNING clause +LINE 1: ...ON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT 'C'::d2 ON... + ^ +DETAIL: "C" versus "case_insensitive" +SELECT JSON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT 'C' COLLATE "C" ON EMPTY) = 'a'; -- error +ERROR: collation of DEFAULT expression conflicts with RETURNING clause +LINE 1: ...ON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT 'C' COLLAT... + ^ +DETAIL: "C" versus "case_insensitive" +SELECT JSON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A' ON EMPTY) = 'a'; -- true + ?column? +---------- + t +(1 row) + +SELECT JSON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A' COLLATE case_insensitive ON EMPTY) = 'a'; -- true + ?column? +---------- + t +(1 row) + +SELECT JSON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A'::d2 ON EMPTY) = 'a'; -- error +ERROR: collation of DEFAULT expression conflicts with RETURNING clause +LINE 1: ...ON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A'::d2 ON... + ^ +DETAIL: "C" versus "case_insensitive" +SELECT JSON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A' COLLATE "C" ON EMPTY) = 'a'; -- error +ERROR: collation of DEFAULT expression conflicts with RETURNING clause +LINE 1: ...ON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A' COLLAT... + ^ +DETAIL: "C" versus "case_insensitive" +DROP DOMAIN d1, d2; ++======= + CREATE INDEX t5_idx1 ON t5 USING btree((c COLLATE "POSIX")); + CREATE INDEX t5_idx2 ON t5 USING btree((c)); + SELECT indexrelid::regclass, indrelid::regclass, indnatts, indattrgenerated, indcollation[0]::regcollation + FROM pg_index + WHERE indrelid = 't5'::regclass ORDER BY indexrelid; + indexrelid | indrelid | indnatts | indattrgenerated | indcollation + ------------+----------+----------+------------------+-------------- + t5_idx1 | t5 | 1 | 3 | "POSIX" + t5_idx2 | t5 | 1 | 3 | "C" + (2 rows) + ++>>>>>>> theirs -- cleanup RESET search_path; SET client_min_messages TO warning; diff --cc src/test/regress/expected/generated_virtual.out index dde325e46c6,3ce22db95fc..00000000000 --- a/src/test/regress/expected/generated_virtual.out +++ b/src/test/regress/expected/generated_virtual.out @@@ -1658,28 -1856,17 +1878,45 @@@ select 1 from gtest32 t1 where exist (1 row) drop table gtest32; ++<<<<<<< ours +-- Ensure that virtual generated columns in constraint expressions are expanded +create table gtest33 (a int, b int generated always as (a * 2) virtual not null, check (b > 10)); +set constraint_exclusion to on; +-- should get a dummy Result, not a seq scan +explain (costs off) +select * from gtest33 where b < 10; + QUERY PLAN +----------------------------- + Result + Replaces: Scan on gtest33 + One-Time Filter: false +(3 rows) + +-- should get a dummy Result, not a seq scan +explain (costs off) +select * from gtest33 where b is null; + QUERY PLAN +----------------------------- + Result + Replaces: Scan on gtest33 + One-Time Filter: false +(3 rows) + +reset constraint_exclusion; +drop table gtest33; ++======= + -- sanity check of system catalog + -- If the index is based on a virtual generated column, then the corresponding + -- attribute's attgenerated should be 'v'. + select pi.indrelid::regclass, pa.attnum, + pa.attname, + pa.attgenerated + from pg_index pi, unnest(indattrgenerated) sub(a), pg_attribute pa + where 0 <> a + and pa.attrelid = pi.indrelid and pa.attnum = sub.a + and (pa.attgenerated <> 'v' or pi.indnatts <> pi.indnkeyatts); + indrelid | attnum | attname | attgenerated + ----------+--------+---------+-------------- + (0 rows) + ++>>>>>>> theirs diff --cc src/test/regress/sql/collate.icu.utf8.sql index b6c54503d21,7b2725f8ba5..00000000000 --- a/src/test/regress/sql/collate.icu.utf8.sql +++ b/src/test/regress/sql/collate.icu.utf8.sql @@@ -1000,19 -997,11 +1000,27 @@@ INSERT INTO t5 (a, b) values (1, 'D1') -- rewriting.) SELECT * FROM t5 ORDER BY c ASC, a ASC; ++<<<<<<< ours +-- Check that DEFAULT expressions in SQL/JSON functions use the same collation +-- as the RETURNING type. Mismatched collations should raise an error. +CREATE DOMAIN d1 AS text COLLATE case_insensitive; +CREATE DOMAIN d2 AS text COLLATE "C"; +SELECT JSON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT ('C' COLLATE "C") COLLATE case_insensitive ON EMPTY) = 'a'; -- true +SELECT JSON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT 'C' ON EMPTY) = 'a'; -- true +SELECT JSON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT 'C'::d2 ON EMPTY) = 'a'; -- error +SELECT JSON_VALUE('{"a": "A"}', '$.a' RETURNING d1 DEFAULT 'C' COLLATE "C" ON EMPTY) = 'a'; -- error +SELECT JSON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A' ON EMPTY) = 'a'; -- true +SELECT JSON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A' COLLATE case_insensitive ON EMPTY) = 'a'; -- true +SELECT JSON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A'::d2 ON EMPTY) = 'a'; -- error +SELECT JSON_VALUE('{"a": "A"}', '$.c' RETURNING d1 DEFAULT 'A' COLLATE "C" ON EMPTY) = 'a'; -- error +DROP DOMAIN d1, d2; ++======= + CREATE INDEX t5_idx1 ON t5 USING btree((c COLLATE "POSIX")); + CREATE INDEX t5_idx2 ON t5 USING btree((c)); + SELECT indexrelid::regclass, indrelid::regclass, indnatts, indattrgenerated, indcollation[0]::regcollation + FROM pg_index + WHERE indrelid = 't5'::regclass ORDER BY indexrelid; ++>>>>>>> theirs -- cleanup RESET search_path; diff --cc src/test/regress/sql/generated_virtual.sql index 2911439776c,76a6b70739e..00000000000 --- a/src/test/regress/sql/generated_virtual.sql +++ b/src/test/regress/sql/generated_virtual.sql @@@ -876,17 -950,13 +957,30 @@@ select 1 from gtest32 t1 where exist drop table gtest32; ++<<<<<<< ours +-- Ensure that virtual generated columns in constraint expressions are expanded +create table gtest33 (a int, b int generated always as (a * 2) virtual not null, check (b > 10)); +set constraint_exclusion to on; + +-- should get a dummy Result, not a seq scan +explain (costs off) +select * from gtest33 where b < 10; + +-- should get a dummy Result, not a seq scan +explain (costs off) +select * from gtest33 where b is null; + +reset constraint_exclusion; +drop table gtest33; ++======= + -- sanity check of system catalog + -- If the index is based on a virtual generated column, then the corresponding + -- attribute's attgenerated should be 'v'. + select pi.indrelid::regclass, pa.attnum, + pa.attname, + pa.attgenerated + from pg_index pi, unnest(indattrgenerated) sub(a), pg_attribute pa + where 0 <> a + and pa.attrelid = pi.indrelid and pa.attnum = sub.a + and (pa.attgenerated <> 'v' or pi.indnatts <> pi.indnkeyatts); ++>>>>>>> theirs