mirror of
https://github.com/postgres/postgres.git
synced 2025-07-05 07:21:24 +03:00
Check the relevant index element in ON CONFLICT unique index inference.
ON CONFLICT unique index inference had a thinko that could affect cases where the user-supplied inference clause required that an attribute match a particular (user specified) collation and/or opclass. infer_collation_opclass_match() has to check for opclass and/or collation matches and that the attribute is in the list of attributes or expressions known to be in the definition of the index under consideration. The bug was that these two conditions weren't necessarily evaluated for the same index attribute. Author: Peter Geoghegan Discussion: CAM3SWZR4uug=WvmGk7UgsqHn2MkEzy9YU-+8jKGO4JPhesyeWg@mail.gmail.com Backpatch: 9.5, where ON CONFLICT was introduced
This commit is contained in:
@ -141,6 +141,24 @@ drop index collation_index_key;
|
||||
drop index both_index_key;
|
||||
drop index both_index_expr_key;
|
||||
--
|
||||
-- Make sure that cross matching of attribute opclass/collation does not occur
|
||||
--
|
||||
create unique index cross_match on insertconflicttest(lower(fruit) collate "C", upper(fruit) text_pattern_ops);
|
||||
-- fails:
|
||||
explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) text_pattern_ops, upper(fruit) collate "C") do nothing;
|
||||
ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
|
||||
-- works:
|
||||
explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) collate "C", upper(fruit) text_pattern_ops) do nothing;
|
||||
QUERY PLAN
|
||||
-----------------------------------------
|
||||
Insert on insertconflicttest
|
||||
Conflict Resolution: NOTHING
|
||||
Conflict Arbiter Indexes: cross_match
|
||||
-> Result
|
||||
(4 rows)
|
||||
|
||||
drop index cross_match;
|
||||
--
|
||||
-- Single key tests
|
||||
--
|
||||
create unique index key_index on insertconflicttest(key);
|
||||
|
@ -57,6 +57,18 @@ drop index collation_index_key;
|
||||
drop index both_index_key;
|
||||
drop index both_index_expr_key;
|
||||
|
||||
--
|
||||
-- Make sure that cross matching of attribute opclass/collation does not occur
|
||||
--
|
||||
create unique index cross_match on insertconflicttest(lower(fruit) collate "C", upper(fruit) text_pattern_ops);
|
||||
|
||||
-- fails:
|
||||
explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) text_pattern_ops, upper(fruit) collate "C") do nothing;
|
||||
-- works:
|
||||
explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit) collate "C", upper(fruit) text_pattern_ops) do nothing;
|
||||
|
||||
drop index cross_match;
|
||||
|
||||
--
|
||||
-- Single key tests
|
||||
--
|
||||
|
Reference in New Issue
Block a user