vinyl: fix primary index uniqueness check being skipped on insert
Since we check uniqueness constraint before inserting anything into the transaction write set, we have to deal with the situation when a secondary index doesn't get updated. For example suppose there's tuple {1, 1, 1} stored in a space with the primary index over the first field and a unique secondary index over the second field. Then when processing REPLACE {1, 1, 2}, we will find {1, 1, 1} in the secondary index, but that doesn't mean that there's a duplicate key error - since the primary key parts of the old and new tuples coincide, the secondary index doesn't in fact get updated hence there's no conflict. However, if the operation was INSERT {1, 1, 2}, then there would be a conflict - by the primary index. Normally, we would detect such a conflict when checking the uniqueness constraint of the primary index, i.e. in vy_check_is_unique_primary(), but there's a case when this doesn't happen. The point is we can optimize out the primary index uniqueness constraint check in case the primary index key parts contain all parts of a unique secondary index, see #3154. In such a case we must fail vy_check_is_unique_secondary() even if the conflicting tuple has the same primary key parts. Fixes commit fc3834c0 ("vinyl: check key uniqueness before modifying tx write set") Closes #3643
Loading
Please register or sign in to comment