So the issue is null values in the index. I believe the loop should be
exiting after detecting a match in the index, but deciding not to throw an
error. This happens in 2 places. See the patch below. My understanding is
that if it reaches the point where the breaks happen then it must be a null
row entry of some kind (i.e. that is allowed to be non-unique in the index
according to the database mode), in which case it is ok to break and not
check any further.
The reason it effected me so much - to the point of looping over all rows
in the index - is the import process I was running is 2-pass, so it first
creates rows, and then it creates links between the rows, so a unique
foreign key column will initially be all nulls until the second pass.
regards,
Mike
Index: src/main/org/h2/mvstore/db/MVSecondaryIndex.java
===================================================================
--- src/main/org/h2/mvstore/db/MVSecondaryIndex.java (revision 7501)
+++ src/main/org/h2/mvstore/db/MVSecondaryIndex.java (working copy)
@@ -210,7 +210,7 @@
}
if (containsNullAndAllowMultipleNull(r2)) {
// this is allowed
- continue;
+ break;
}
if (map.isSameTransaction(k)) {
continue;
@@ -225,7 +225,7 @@
}
private void checkUnique(SearchRow row, TransactionMap<Value, Value>
map, ValueArray unique) {
- Iterator<Value> it = map.keyIterator(unique, true);
+ Iterator<Value> it = map.keyIterator(unique, true);
while (it.hasNext()) {
ValueArray k = (ValueArray) it.next();
SearchRow r2 = convertToSearchRow(k);
@@ -236,6 +236,7 @@
if (!containsNullAndAllowMultipleNull(r2)) {
throw getDuplicateKeyException(k.toString());
}
+ break;
}
}
}
--
You received this message because you are subscribed to the Google Groups "H2
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.