8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-02-02 10:00:38 +01:00

Fixed bug #8084 : Partial index uniqueness violation

This commit is contained in:
Vlad Khorsun 2024-04-17 22:35:31 +03:00
parent cc6fe45010
commit 3726cf1867

View File

@ -1283,7 +1283,7 @@ void IDX_modify(thread_db* tdbb,
idx_e error_code = idx_e_ok;
IndexCondition condition(tdbb, &idx);
const auto checkResult = condition.check(new_rpb->rpb_record, &error_code);
auto checkResult = condition.check(new_rpb->rpb_record, &error_code);
if (error_code)
{
@ -1312,15 +1312,29 @@ void IDX_modify(thread_db* tdbb,
expression.reset();
if (newKey != orgKey)
if (newKey == orgKey)
{
insertion.iib_key = newKey;
// The new record satisfies index condition, check old record too:
// if it does not satisfies condition, key should be inserted into index
if ( (error_code = insert_key(tdbb, new_rpb->rpb_relation, new_rpb->rpb_record,
transaction, &window, &insertion, context)) )
checkResult = condition.check(org_rpb->rpb_record, &error_code);
if (error_code)
{
context.raise(tdbb, error_code, new_rpb->rpb_record);
CCH_RELEASE(tdbb, &window);
context.raise(tdbb, error_code, org_rpb->rpb_record);
}
fb_assert(checkResult.isAssigned());
if (checkResult.asBool())
continue;
}
insertion.iib_key = newKey;
if ( (error_code = insert_key(tdbb, new_rpb->rpb_relation, new_rpb->rpb_record,
transaction, &window, &insertion, context)) )
{
context.raise(tdbb, error_code, new_rpb->rpb_record);
}
}
}