@@ -393,9 +393,13 @@ QgsFeature QgsVectorLayerUtils::createFeature( const QgsVectorLayer *layer, cons
393
393
v = attributes.value ( idx );
394
394
}
395
395
396
+ // Cache unique values
397
+ QSet<QVariant> uniqueValues { layer->uniqueValues ( idx ) };
398
+
396
399
// 2. client side default expression
397
400
// note - deliberately not using else if!
398
- if ( ( !v.isValid () || ( fields.at ( idx ).constraints ().constraints () & QgsFieldConstraints::ConstraintUnique && QgsVectorLayerUtils::valueExists ( layer, idx, v ) ) )
401
+ if ( ( !v.isValid () || ( fields.at ( idx ).constraints ().constraints () & QgsFieldConstraints::ConstraintUnique
402
+ && uniqueValues.contains ( v ) ) )
399
403
&& layer->defaultValueDefinition ( idx ).isValid () )
400
404
{
401
405
// client side default expression set - takes precedence over all. Why? Well, this is the only default
@@ -406,7 +410,8 @@ QgsFeature QgsVectorLayerUtils::createFeature( const QgsVectorLayer *layer, cons
406
410
407
411
// 3. provider side default value clause
408
412
// note - not an else if deliberately. Users may return null from a default value expression to fallback to provider defaults
409
- if ( ( !v.isValid () || ( fields.at ( idx ).constraints ().constraints () & QgsFieldConstraints::ConstraintUnique && QgsVectorLayerUtils::valueExists ( layer, idx, v ) ) )
413
+ if ( ( !v.isValid () || ( fields.at ( idx ).constraints ().constraints () & QgsFieldConstraints::ConstraintUnique
414
+ && uniqueValues.contains ( v ) ) )
410
415
&& fields.fieldOrigin ( idx ) == QgsFields::OriginProvider )
411
416
{
412
417
int providerIndex = fields.fieldOriginIndex ( idx );
@@ -420,7 +425,8 @@ QgsFeature QgsVectorLayerUtils::createFeature( const QgsVectorLayer *layer, cons
420
425
421
426
// 4. provider side default literal
422
427
// note - deliberately not using else if!
423
- if ( ( !v.isValid () || ( checkUnique && fields.at ( idx ).constraints ().constraints () & QgsFieldConstraints::ConstraintUnique && QgsVectorLayerUtils::valueExists ( layer, idx, v ) ) )
428
+ if ( ( !v.isValid () || ( checkUnique && fields.at ( idx ).constraints ().constraints () & QgsFieldConstraints::ConstraintUnique
429
+ && uniqueValues.contains ( v ) ) )
424
430
&& fields.fieldOrigin ( idx ) == QgsFields::OriginProvider )
425
431
{
426
432
int providerIndex = fields.fieldOriginIndex ( idx );
@@ -444,7 +450,7 @@ QgsFeature QgsVectorLayerUtils::createFeature( const QgsVectorLayer *layer, cons
444
450
// value if the constraint is violated
445
451
if ( checkUnique && fields.at ( idx ).constraints ().constraints () & QgsFieldConstraints::ConstraintUnique )
446
452
{
447
- if ( QgsVectorLayerUtils::valueExists ( layer, idx, v ) )
453
+ if ( uniqueValues. contains ( v ) )
448
454
{
449
455
// unique constraint violated
450
456
QVariant uniqueValue = QgsVectorLayerUtils::createUniqueValue ( layer, idx, v );
0 commit comments