* external sort if there is only 1 index. Otherwise,
* we could get in a situation where 1 sort reuses a
* wrapper that is still in use in another sort.
*/
boolean reuseWrappers = (numIndexes == 1);
final IndexRowGenerator indDes = cd.getIndexDescriptor();
Properties sortProperties = null;
String indexOrConstraintName = cd.getConglomerateName();
boolean deferred = false;
boolean deferrable = false;
UUID uniqueDeferrableConstraintId = null;
if (cd.isConstraint())
{
// so, the index is backing up a constraint
ConstraintDescriptor conDesc =
dd.getConstraintDescriptor(td, cd.getUUID());
indexOrConstraintName = conDesc.getConstraintName();
deferred = lcc.isEffectivelyDeferred(
lcc.getCurrentSQLSessionContext(activation),
conDesc.getUUID());
deferrable = conDesc.deferrable();
uniqueDeferrableConstraintId = conDesc.getUUID();
}
if (indDes.isUnique() || indDes.isUniqueDeferrable())
{
numColumnOrderings =
indDes.isUnique() ? baseColumnPositions.length :
baseColumnPositions.length + 1;
sortObserver =
new UniqueIndexSortObserver(
lcc,
uniqueDeferrableConstraintId,
false, // don't clone rows
deferrable,
deferred,
indexOrConstraintName,
indexRows[index],
reuseWrappers,
td.getName());
} else if (indDes.isUniqueWithDuplicateNulls())
{
numColumnOrderings = baseColumnPositions.length + 1;
// tell transaction controller to use the unique with
// duplicate nulls sorter, when making createSort() call.