@@ -143,7 +143,8 @@ bool QgsVectorLayerUtils::validateAttribute( const QgsVectorLayer* layer, const
143143 if ( attributeIndex < 0 || attributeIndex >= layer->fields ().count () )
144144 return false ;
145145
146- QgsField field = layer->fields ().at ( attributeIndex );
146+ QgsFields fields = layer->fields ();
147+ QgsField field = fields.at ( attributeIndex );
147148 QVariant value = feature.attribute ( attributeIndex );
148149 bool valid = true ;
149150 errors.clear ();
@@ -179,24 +180,46 @@ bool QgsVectorLayerUtils::validateAttribute( const QgsVectorLayer* layer, const
179180 && ( strength == QgsFieldConstraints::ConstraintStrengthNotSet || strength == constraints.constraintStrength ( QgsFieldConstraints::ConstraintNotNull ) )
180181 && ( origin == QgsFieldConstraints::ConstraintOriginNotSet || origin == constraints.constraintOrigin ( QgsFieldConstraints::ConstraintNotNull ) ) )
181182 {
182- valid = valid && !value.isNull ();
183+ bool exempt = false ;
184+ if ( fields.fieldOrigin ( attributeIndex ) == QgsFields::OriginProvider
185+ && constraints.constraintOrigin ( QgsFieldConstraints::ConstraintNotNull ) == QgsFieldConstraints::ConstraintOriginProvider )
186+ {
187+ int providerIdx = fields.fieldOriginIndex ( attributeIndex );
188+ exempt = layer->dataProvider ()->skipConstraintCheck ( providerIdx, QgsFieldConstraints::ConstraintNotNull, value );
189+ }
183190
184- if ( value. isNull () )
191+ if ( !exempt )
185192 {
186- errors << QObject::tr ( " value is NULL" );
193+ valid = valid && !value.isNull ();
194+
195+ if ( value.isNull () )
196+ {
197+ errors << QObject::tr ( " value is NULL" );
198+ }
187199 }
188200 }
189201
190202 if ( constraints.constraints () & QgsFieldConstraints::ConstraintUnique
191203 && ( strength == QgsFieldConstraints::ConstraintStrengthNotSet || strength == constraints.constraintStrength ( QgsFieldConstraints::ConstraintUnique ) )
192204 && ( origin == QgsFieldConstraints::ConstraintOriginNotSet || origin == constraints.constraintOrigin ( QgsFieldConstraints::ConstraintUnique ) ) )
193205 {
194- bool alreadyExists = QgsVectorLayerUtils::valueExists ( layer, attributeIndex, value, QgsFeatureIds () << feature.id () );
195- valid = valid && !alreadyExists;
206+ bool exempt = false ;
207+ if ( fields.fieldOrigin ( attributeIndex ) == QgsFields::OriginProvider
208+ && constraints.constraintOrigin ( QgsFieldConstraints::ConstraintNotNull ) == QgsFieldConstraints::ConstraintOriginProvider )
209+ {
210+ int providerIdx = fields.fieldOriginIndex ( attributeIndex );
211+ exempt = layer->dataProvider ()->skipConstraintCheck ( providerIdx, QgsFieldConstraints::ConstraintUnique, value );
212+ }
196213
197- if ( alreadyExists )
214+ if ( !exempt )
198215 {
199- errors << QObject::tr ( " value is not unique" );
216+ bool alreadyExists = QgsVectorLayerUtils::valueExists ( layer, attributeIndex, value, QgsFeatureIds () << feature.id () );
217+ valid = valid && !alreadyExists;
218+
219+ if ( alreadyExists )
220+ {
221+ errors << QObject::tr ( " value is not unique" );
222+ }
200223 }
201224 }
202225
0 commit comments